Simplified specialization constants by limiting to floats2
This commit is contained in:
parent
7126cc47ff
commit
a7801cedd0
5 changed files with 358 additions and 470 deletions
|
|
@ -12,114 +12,6 @@ namespace kp {
|
|||
*/
|
||||
class Algorithm
|
||||
{
|
||||
public:
|
||||
// TODO: Move as internal struct of speccontainer
|
||||
class SpecializationConstant {
|
||||
public:
|
||||
SpecializationConstant(const SpecializationConstant& specializationConstant) {
|
||||
SPDLOG_DEBUG("Kompute SpecializationConstant copy constructor: {}", *((uint32_t*)specializationConstant.mInstanceData));
|
||||
this->mInstanceData = (char*)malloc(sizeof(uint32_t));
|
||||
memcpy(this->mInstanceData, specializationConstant.mInstanceData, sizeof(uint32_t));
|
||||
}
|
||||
// This class is required in absence of std::variant to ensure C++11 support
|
||||
SpecializationConstant(uint32_t val) {
|
||||
SPDLOG_DEBUG("Kompute SpecializationConstant uint32_t constructor: {}", val);
|
||||
this->mInstanceData = (char*)malloc(sizeof(uint32_t));
|
||||
memcpy(this->mInstanceData, &val, sizeof(uint32_t));
|
||||
}
|
||||
SpecializationConstant(float val) {
|
||||
SPDLOG_DEBUG("Kompute SpecializationConstant float constructor: {}", val);
|
||||
this->mInstanceData = (char*)malloc(sizeof(uint32_t));
|
||||
memcpy(this->mInstanceData, &val, sizeof(uint32_t));
|
||||
}
|
||||
~SpecializationConstant() {
|
||||
free(this->mInstanceData);
|
||||
}
|
||||
void *data() {
|
||||
return this->mInstanceData;
|
||||
}
|
||||
private:
|
||||
// We use char pointer to enable for pointer arithmetic
|
||||
char *mInstanceData = nullptr;
|
||||
};
|
||||
|
||||
class SpecializationContainer {
|
||||
public:
|
||||
SpecializationContainer() {
|
||||
SPDLOG_DEBUG("Kompute SpecializationContainer default initialiser");
|
||||
this->mFreeData = false;
|
||||
}
|
||||
|
||||
SpecializationContainer(const SpecializationContainer& specializationContainer)
|
||||
{
|
||||
SPDLOG_DEBUG("Kompute SpecializationContainer copy constructor, size: {}", specializationContainer.mSpecializationConstants.size());
|
||||
SpecializationContainer(specializationContainer.mSpecializationConstants);
|
||||
}
|
||||
|
||||
SpecializationContainer(std::vector<SpecializationConstant> instances) {
|
||||
SPDLOG_DEBUG("Kompute SpecializationContainer initialiser with instances size {}", instances.size());
|
||||
|
||||
static_assert(sizeof(uint32_t) == sizeof(float) && sizeof(uint32_t) == sizeof(char) * 4,
|
||||
"Kompute requires uint32_t and float to be of same size. Please report this to github.");
|
||||
|
||||
// totalMemorySize depends on instances being set so this needs to be set before
|
||||
this->mSpecializationConstants = instances;
|
||||
|
||||
// Data has then to be allocated in order to copy memory into it
|
||||
this->mData = (char*)malloc(this->totalMemorySize());
|
||||
|
||||
this->mFreeData = true;
|
||||
|
||||
for (size_t i = 0; i < this->size(); i++) {
|
||||
|
||||
memcpy(this->mData + (i * sizeof(uint32_t)), instances[i].data(), sizeof(uint32_t));
|
||||
}
|
||||
}
|
||||
|
||||
~SpecializationContainer() {
|
||||
SPDLOG_DEBUG("Kompute SpecializationContainer destructor started");
|
||||
|
||||
this->mSpecializationConstants.clear();
|
||||
|
||||
if (this->mFreeData) {
|
||||
SPDLOG_DEBUG("Kompute SpecializationContainer freeing data");
|
||||
this->mFreeData = false;
|
||||
free(this->mData);
|
||||
} else {
|
||||
SPDLOG_DEBUG("Kompute SpecializationContainer no data was freed");
|
||||
}
|
||||
|
||||
SPDLOG_DEBUG("kompute SpecializationContainer freed data");
|
||||
}
|
||||
|
||||
void *transferDataOwnership() {
|
||||
SPDLOG_DEBUG("Kompute SpecializationContainer data transfer ownership requested");
|
||||
this->mFreeData = false;
|
||||
return (void*)this->mData;
|
||||
}
|
||||
|
||||
uint32_t size() {
|
||||
return this->mSpecializationConstants.size();
|
||||
}
|
||||
|
||||
uint32_t totalMemorySize() {
|
||||
return this->instanceMemorySize() * this->size();
|
||||
}
|
||||
|
||||
uint32_t instanceMemorySize() {
|
||||
// At this point only variables accepted are uint32_t and float which are same size
|
||||
return sizeof(uint32_t);
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
std::vector<SpecializationConstant> mSpecializationConstants;
|
||||
bool mFreeData = false;
|
||||
// We use char pointer to enable for pointer arithmetic
|
||||
char *mData = nullptr;
|
||||
};
|
||||
private:
|
||||
// Private struct template which is then
|
||||
public:
|
||||
/**
|
||||
Base constructor for Algorithm. Should not be used unless explicit
|
||||
|
|
@ -136,7 +28,7 @@ public:
|
|||
*/
|
||||
Algorithm(std::shared_ptr<vk::Device> device,
|
||||
std::shared_ptr<vk::CommandBuffer> commandBuffer,
|
||||
const SpecializationContainer& specializationConstants = {});
|
||||
const std::vector<float>& specializationConstants = {});
|
||||
|
||||
/**
|
||||
* Initialiser for the shader data provided to the algorithm as well as
|
||||
|
|
@ -188,7 +80,7 @@ private:
|
|||
bool mFreePipeline = false;
|
||||
|
||||
// -------------- ALWAYS OWNED RESOURCES
|
||||
SpecializationContainer mSpecializationConstants;
|
||||
std::vector<float> mSpecializationConstants;
|
||||
|
||||
// Create util functions
|
||||
void createShaderModule(const std::vector<char>& shaderFileData);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue