Skip to content

Commit

Permalink
added 16 byte aligned fixed point ubo structures ivec4 and uvec4
Browse files Browse the repository at this point in the history
  • Loading branch information
lshoek committed Jun 21, 2022
1 parent fe7cec6 commit f512a44
Show file tree
Hide file tree
Showing 11 changed files with 155 additions and 11 deletions.
8 changes: 8 additions & 0 deletions modules/naprender/src/bufferbinding.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,14 @@ RTTI_BEGIN_CLASS(nap::BufferBindingVec4)
RTTI_PROPERTY("Buffer", &nap::BufferBindingVec4::mBuffer, nap::rtti::EPropertyMetaData::Required)
RTTI_END_CLASS

RTTI_BEGIN_CLASS(nap::BufferBindingIVec4)
RTTI_PROPERTY("Buffer", &nap::BufferBindingIVec4::mBuffer, nap::rtti::EPropertyMetaData::Required)
RTTI_END_CLASS

RTTI_BEGIN_CLASS(nap::BufferBindingUVec4)
RTTI_PROPERTY("Buffer", &nap::BufferBindingUVec4::mBuffer, nap::rtti::EPropertyMetaData::Required)
RTTI_END_CLASS

RTTI_BEGIN_CLASS(nap::BufferBindingMat4)
RTTI_PROPERTY("Buffer", &nap::BufferBindingMat4::mBuffer, nap::rtti::EPropertyMetaData::Required)
RTTI_END_CLASS
Expand Down
2 changes: 2 additions & 0 deletions modules/naprender/src/bufferbinding.h
Original file line number Diff line number Diff line change
Expand Up @@ -177,6 +177,8 @@ namespace nap
using BufferBindingVec2 = TypedBufferBindingNumeric<glm::vec2>;
using BufferBindingVec3 = TypedBufferBindingNumeric<glm::vec3>;
using BufferBindingVec4 = TypedBufferBindingNumeric<glm::vec4>;
using BufferBindingIVec4 = TypedBufferBindingNumeric<glm::ivec4>;
using BufferBindingUVec4 = TypedBufferBindingNumeric<glm::uvec4>;
using BufferBindingMat4 = TypedBufferBindingNumeric<glm::mat4>;


Expand Down
18 changes: 18 additions & 0 deletions modules/naprender/src/bufferbindinginstance.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,14 @@ RTTI_BEGIN_CLASS_NO_DEFAULT_CONSTRUCTOR(nap::BufferBindingVec4Instance)
RTTI_CONSTRUCTOR(const std::string&, const nap::ShaderVariableValueArrayDeclaration&, const nap::BufferBindingChangedCallback&)
RTTI_END_CLASS

RTTI_BEGIN_CLASS_NO_DEFAULT_CONSTRUCTOR(nap::BufferBindingIVec4Instance)
RTTI_CONSTRUCTOR(const std::string&, const nap::ShaderVariableValueArrayDeclaration&, const nap::BufferBindingChangedCallback&)
RTTI_END_CLASS

RTTI_BEGIN_CLASS_NO_DEFAULT_CONSTRUCTOR(nap::BufferBindingUVec4Instance)
RTTI_CONSTRUCTOR(const std::string&, const nap::ShaderVariableValueArrayDeclaration&, const nap::BufferBindingChangedCallback&)
RTTI_END_CLASS

RTTI_BEGIN_CLASS_NO_DEFAULT_CONSTRUCTOR(nap::BufferBindingMat4Instance)
RTTI_CONSTRUCTOR(const std::string&, const nap::ShaderVariableValueArrayDeclaration&, const nap::BufferBindingChangedCallback&)
RTTI_END_CLASS
Expand Down Expand Up @@ -159,6 +167,16 @@ namespace nap
return createBufferBindingInstance<BufferBindingVec4Instance, BufferBindingVec4, ShaderVariableValueArrayDeclaration>(
binding_name, binding, *value_array_declaration, bufferChangedCallback, errorState);
}
else if (value_array_declaration->mElementType == EShaderVariableValueType::IVec4)
{
return createBufferBindingInstance<BufferBindingIVec4Instance, BufferBindingIVec4, ShaderVariableValueArrayDeclaration>(
binding_name, binding, *value_array_declaration, bufferChangedCallback, errorState);
}
else if (value_array_declaration->mElementType == EShaderVariableValueType::UVec4)
{
return createBufferBindingInstance<BufferBindingUVec4Instance, BufferBindingUVec4, ShaderVariableValueArrayDeclaration>(
binding_name, binding, *value_array_declaration, bufferChangedCallback, errorState);
}
else if (value_array_declaration->mElementType == EShaderVariableValueType::Mat4)
{
return createBufferBindingInstance<BufferBindingMat4Instance, BufferBindingMat4, ShaderVariableValueArrayDeclaration>(
Expand Down
2 changes: 2 additions & 0 deletions modules/naprender/src/bufferbindinginstance.h
Original file line number Diff line number Diff line change
Expand Up @@ -316,6 +316,8 @@ namespace nap
using BufferBindingVec2Instance = TypedBufferBindingNumericInstance<glm::vec2>;
using BufferBindingVec3Instance = TypedBufferBindingNumericInstance<glm::vec3>;
using BufferBindingVec4Instance = TypedBufferBindingNumericInstance<glm::vec4>;
using BufferBindingIVec4Instance = TypedBufferBindingNumericInstance<glm::ivec4>;
using BufferBindingUVec4Instance = TypedBufferBindingNumericInstance<glm::uvec4>;
using BufferBindingMat4Instance = TypedBufferBindingNumericInstance<glm::mat4>;


Expand Down
10 changes: 10 additions & 0 deletions modules/naprender/src/materialinstance.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -328,6 +328,16 @@ namespace nap
auto* instance = static_cast<BufferBindingVec4Instance*>(&bindingInstance);
buffer_info.buffer = instance->getBuffer().getBuffer();
}
else if (bindingInstance.get_type() == RTTI_OF(BufferBindingIVec4Instance))
{
auto* instance = static_cast<BufferBindingIVec4Instance*>(&bindingInstance);
buffer_info.buffer = instance->getBuffer().getBuffer();
}
else if (bindingInstance.get_type() == RTTI_OF(BufferBindingUVec4Instance))
{
auto* instance = static_cast<BufferBindingUVec4Instance*>(&bindingInstance);
buffer_info.buffer = instance->getBuffer().getBuffer();
}
else if (bindingInstance.get_type() == RTTI_OF(BufferBindingMat4Instance))
{
auto* instance = static_cast<BufferBindingMat4Instance*>(&bindingInstance);
Expand Down
28 changes: 24 additions & 4 deletions modules/naprender/src/shader.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -397,9 +397,19 @@ static nap::EShaderVariableValueType getShaderVariableValueType(spirv_cross::SPI
switch (type.basetype)
{
case spirv_cross::SPIRType::Int:
return nap::EShaderVariableValueType::Int;
if (type.vecsize == 1 && type.columns == 1)
return nap::EShaderVariableValueType::Int;
else if (type.vecsize == 4 && type.columns == 1)
return nap::EShaderVariableValueType::IVec4;
else
return nap::EShaderVariableValueType::Unknown;
case spirv_cross::SPIRType::UInt:
return nap::EShaderVariableValueType::UInt;
if (type.vecsize == 1 && type.columns == 1)
return nap::EShaderVariableValueType::UInt;
else if (type.vecsize == 4 && type.columns == 1)
return nap::EShaderVariableValueType::UVec4;
else
return nap::EShaderVariableValueType::Unknown;
case spirv_cross::SPIRType::Float:
if (type.vecsize == 1 && type.columns == 1)
return nap::EShaderVariableValueType::Float;
Expand Down Expand Up @@ -428,9 +438,19 @@ static VkFormat getFormatFromType(spirv_cross::SPIRType type)
switch (type.basetype)
{
case spirv_cross::SPIRType::Int:
return VK_FORMAT_R32_SINT;
if (type.vecsize == 1 && type.columns == 1)
return VK_FORMAT_R32_SINT;
else if (type.vecsize == 4 && type.columns == 1)
return VK_FORMAT_R32G32B32A32_SINT;
else
return VK_FORMAT_UNDEFINED;
case spirv_cross::SPIRType::UInt:
return VK_FORMAT_R32_UINT;
if (type.vecsize == 1 && type.columns == 1)
return VK_FORMAT_R32_UINT;
else if (type.vecsize == 4 && type.columns == 1)
return VK_FORMAT_R32G32B32A32_UINT;
else
return VK_FORMAT_UNDEFINED;
case spirv_cross::SPIRType::Float:
if (type.vecsize == 1 && type.columns == 1)
return VK_FORMAT_R32_SFLOAT;
Expand Down
2 changes: 2 additions & 0 deletions modules/naprender/src/shadervariabledeclarations.h
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,8 @@ namespace nap
Vec2, ///< 2 float vector
Vec3, ///< 3 float vector
Vec4, ///< 4 float vector
IVec4, ///< 4 int vector
UVec4, ///< 4 uint vector
Mat2, ///< 2x2 float matrix
Mat3, ///< 3x3 float matrix
Mat4 ///< 4x4 float matrix
Expand Down
16 changes: 16 additions & 0 deletions modules/naprender/src/uniform.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,14 @@ RTTI_BEGIN_CLASS(nap::UniformUInt)
RTTI_PROPERTY("Value", &nap::UniformUInt::mValue, nap::rtti::EPropertyMetaData::Required)
RTTI_END_CLASS

RTTI_BEGIN_CLASS(nap::UniformIVec4)
RTTI_PROPERTY("Value", &nap::UniformIVec4::mValue, nap::rtti::EPropertyMetaData::Required)
RTTI_END_CLASS

RTTI_BEGIN_CLASS(nap::UniformUVec4)
RTTI_PROPERTY("Value", &nap::UniformUVec4::mValue, nap::rtti::EPropertyMetaData::Required)
RTTI_END_CLASS

RTTI_BEGIN_CLASS(nap::UniformInt)
RTTI_PROPERTY("Value", &nap::UniformInt::mValue, nap::rtti::EPropertyMetaData::Required)
RTTI_END_CLASS
Expand Down Expand Up @@ -74,6 +82,14 @@ RTTI_BEGIN_CLASS(nap::UniformVec4Array)
RTTI_PROPERTY("Values", &nap::UniformVec4Array::mValues, nap::rtti::EPropertyMetaData::Required)
RTTI_END_CLASS

RTTI_BEGIN_CLASS(nap::UniformIVec4Array)
RTTI_PROPERTY("Values", &nap::UniformIVec4Array::mValues, nap::rtti::EPropertyMetaData::Required)
RTTI_END_CLASS

RTTI_BEGIN_CLASS(nap::UniformUVec4Array)
RTTI_PROPERTY("Values", &nap::UniformUVec4Array::mValues, nap::rtti::EPropertyMetaData::Required)
RTTI_END_CLASS

RTTI_BEGIN_CLASS(nap::UniformMat4Array)
RTTI_PROPERTY("Values", &nap::UniformMat4Array::mValues, nap::rtti::EPropertyMetaData::Required)
RTTI_END_CLASS
Expand Down
4 changes: 4 additions & 0 deletions modules/naprender/src/uniform.h
Original file line number Diff line number Diff line change
Expand Up @@ -208,6 +208,8 @@ namespace nap
using UniformVec2 = TypedUniformValue<glm::vec2>;
using UniformVec3 = TypedUniformValue<glm::vec3>;
using UniformVec4 = TypedUniformValue<glm::vec4>;
using UniformIVec4 = TypedUniformValue<glm::ivec4>;
using UniformUVec4 = TypedUniformValue<glm::uvec4>;
using UniformMat4 = TypedUniformValue<glm::mat4>;


Expand All @@ -221,5 +223,7 @@ namespace nap
using UniformVec2Array = TypedUniformValueArray<glm::vec2>;
using UniformVec3Array = TypedUniformValueArray<glm::vec3>;
using UniformVec4Array = TypedUniformValueArray<glm::vec4>;
using UniformIVec4Array = TypedUniformValueArray<glm::ivec4>;
using UniformUVec4Array = TypedUniformValueArray<glm::uvec4>;
using UniformMat4Array = TypedUniformValueArray<glm::mat4>;
}
72 changes: 65 additions & 7 deletions modules/naprender/src/uniforminstance.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,16 @@ RTTI_BEGIN_CLASS_NO_DEFAULT_CONSTRUCTOR(nap::UniformVec4Instance)
RTTI_FUNCTION("setValue", &nap::UniformVec4Instance::setValue)
RTTI_END_CLASS

RTTI_BEGIN_CLASS_NO_DEFAULT_CONSTRUCTOR(nap::UniformIVec4Instance)
RTTI_CONSTRUCTOR(const nap::ShaderVariableValueDeclaration&)
RTTI_FUNCTION("setValue", &nap::UniformIVec4Instance::setValue)
RTTI_END_CLASS

RTTI_BEGIN_CLASS_NO_DEFAULT_CONSTRUCTOR(nap::UniformUVec4Instance)
RTTI_CONSTRUCTOR(const nap::ShaderVariableValueDeclaration&)
RTTI_FUNCTION("setValue", &nap::UniformUVec4Instance::setValue)
RTTI_END_CLASS

RTTI_BEGIN_CLASS_NO_DEFAULT_CONSTRUCTOR(nap::UniformMat4Instance)
RTTI_CONSTRUCTOR(const nap::ShaderVariableValueDeclaration&)
RTTI_FUNCTION("setValue", &nap::UniformMat4Instance::setValue)
Expand Down Expand Up @@ -90,6 +100,18 @@ RTTI_BEGIN_CLASS_NO_DEFAULT_CONSTRUCTOR(nap::UniformVec4ArrayInstance)
RTTI_FUNCTION("getNumElements", &nap::UniformVec4ArrayInstance::getNumElements)
RTTI_END_CLASS

RTTI_BEGIN_CLASS_NO_DEFAULT_CONSTRUCTOR(nap::UniformIVec4ArrayInstance)
RTTI_CONSTRUCTOR(const nap::ShaderVariableValueArrayDeclaration&)
RTTI_FUNCTION("setValue", &nap::UniformIVec4ArrayInstance::setValue)
RTTI_FUNCTION("getNumElements", &nap::UniformIVec4ArrayInstance::getNumElements)
RTTI_END_CLASS

RTTI_BEGIN_CLASS_NO_DEFAULT_CONSTRUCTOR(nap::UniformUVec4ArrayInstance)
RTTI_CONSTRUCTOR(const nap::ShaderVariableValueArrayDeclaration&)
RTTI_FUNCTION("setValue", &nap::UniformUVec4ArrayInstance::setValue)
RTTI_FUNCTION("getNumElements", &nap::UniformUVec4ArrayInstance::getNumElements)
RTTI_END_CLASS

RTTI_BEGIN_CLASS_NO_DEFAULT_CONSTRUCTOR(nap::UniformMat4ArrayInstance)
RTTI_CONSTRUCTOR(const nap::ShaderVariableValueArrayDeclaration&)
RTTI_FUNCTION("setValue", &nap::UniformMat4ArrayInstance::setValue)
Expand Down Expand Up @@ -140,43 +162,55 @@ namespace nap

if (value_array_declaration->mElementType == EShaderVariableValueType::UInt)
{
std::unique_ptr<UniformUIntArrayInstance> array_instance = std::make_unique<UniformUIntArrayInstance>(*value_array_declaration);
auto array_instance = std::make_unique<UniformUIntArrayInstance>(*value_array_declaration);
array_instance->getValues().resize(value_array_declaration->mNumElements);
return std::move(array_instance);
}
else if (value_array_declaration->mElementType == EShaderVariableValueType::Int)
{
std::unique_ptr<UniformIntArrayInstance> array_instance = std::make_unique<UniformIntArrayInstance>(*value_array_declaration);
auto array_instance = std::make_unique<UniformIntArrayInstance>(*value_array_declaration);
array_instance->getValues().resize(value_array_declaration->mNumElements);
return std::move(array_instance);
}
else if (value_array_declaration->mElementType == EShaderVariableValueType::Float)
{
std::unique_ptr<UniformFloatArrayInstance> array_instance = std::make_unique<UniformFloatArrayInstance>(*value_array_declaration);
auto array_instance = std::make_unique<UniformFloatArrayInstance>(*value_array_declaration);
array_instance->getValues().resize(value_array_declaration->mNumElements);
return std::move(array_instance);
}
else if (value_array_declaration->mElementType == EShaderVariableValueType::Vec2)
{
std::unique_ptr<UniformVec2ArrayInstance> array_instance = std::make_unique<UniformVec2ArrayInstance>(*value_array_declaration);
auto array_instance = std::make_unique<UniformVec2ArrayInstance>(*value_array_declaration);
array_instance->getValues().resize(value_array_declaration->mNumElements);
return std::move(array_instance);
}
else if (value_array_declaration->mElementType == EShaderVariableValueType::Vec3)
{
std::unique_ptr<UniformVec3ArrayInstance> array_instance = std::make_unique<UniformVec3ArrayInstance>(*value_array_declaration);
auto array_instance = std::make_unique<UniformVec3ArrayInstance>(*value_array_declaration);
array_instance->getValues().resize(value_array_declaration->mNumElements);
return std::move(array_instance);
}
else if (value_array_declaration->mElementType == EShaderVariableValueType::Vec4)
{
std::unique_ptr<UniformVec4ArrayInstance> array_instance = std::make_unique<UniformVec4ArrayInstance>(*value_array_declaration);
auto array_instance = std::make_unique<UniformVec4ArrayInstance>(*value_array_declaration);
array_instance->getValues().resize(value_array_declaration->mNumElements);
return std::move(array_instance);
}
else if (value_array_declaration->mElementType == EShaderVariableValueType::IVec4)
{
auto array_instance = std::make_unique<UniformIVec4ArrayInstance>(*value_array_declaration);
array_instance->getValues().resize(value_array_declaration->mNumElements);
return std::move(array_instance);
}
else if (value_array_declaration->mElementType == EShaderVariableValueType::UVec4)
{
auto array_instance = std::make_unique<UniformUVec4ArrayInstance>(*value_array_declaration);
array_instance->getValues().resize(value_array_declaration->mNumElements);
return std::move(array_instance);
}
else if (value_array_declaration->mElementType == EShaderVariableValueType::Mat4)
{
std::unique_ptr<UniformMat4ArrayInstance> array_instance = std::make_unique<UniformMat4ArrayInstance>(*value_array_declaration);
auto array_instance = std::make_unique<UniformMat4ArrayInstance>(*value_array_declaration);
array_instance->getValues().resize(value_array_declaration->mNumElements);
return std::move(array_instance);
}
Expand Down Expand Up @@ -214,6 +248,14 @@ namespace nap
{
return std::make_unique<UniformVec4Instance>(*value_declaration);
}
else if (value_declaration->mType == EShaderVariableValueType::IVec4)
{
return std::make_unique<UniformIVec4Instance>(*value_declaration);
}
else if (value_declaration->mType == EShaderVariableValueType::UVec4)
{
return std::make_unique<UniformUVec4Instance>(*value_declaration);
}
else if (value_declaration->mType == EShaderVariableValueType::Mat4)
{
return std::make_unique<UniformMat4Instance>(*value_declaration);
Expand Down Expand Up @@ -309,6 +351,14 @@ namespace nap
{
instance_value_array = createUniformValueInstance<UniformVec4ArrayInstance, UniformVec4Array>(resource, *value_declaration, errorState);
}
else if (value_declaration->mElementType == EShaderVariableValueType::IVec4)
{
instance_value_array = createUniformValueInstance<UniformIVec4ArrayInstance, UniformIVec4Array>(resource, *value_declaration, errorState);
}
else if (value_declaration->mElementType == EShaderVariableValueType::UVec4)
{
instance_value_array = createUniformValueInstance<UniformUVec4ArrayInstance, UniformUVec4Array>(resource, *value_declaration, errorState);
}
else if (value_declaration->mElementType == EShaderVariableValueType::Mat4)
{
instance_value_array = createUniformValueInstance<UniformMat4ArrayInstance, UniformMat4Array>(resource, *value_declaration, errorState);
Expand Down Expand Up @@ -371,6 +421,14 @@ namespace nap
{
value_instance = createUniformValueInstance<UniformVec4Instance, UniformVec4>(resource, *value_declaration, errorState);
}
else if (value_declaration->mType == EShaderVariableValueType::IVec4)
{
value_instance = createUniformValueInstance<UniformIVec4Instance, UniformIVec4>(resource, *value_declaration, errorState);
}
else if (value_declaration->mType == EShaderVariableValueType::UVec4)
{
value_instance = createUniformValueInstance<UniformUVec4Instance, UniformUVec4>(resource, *value_declaration, errorState);
}
else if (value_declaration->mType == EShaderVariableValueType::Mat4)
{
value_instance = createUniformValueInstance<UniformMat4Instance, UniformMat4>(resource, *value_declaration, errorState);
Expand Down
4 changes: 4 additions & 0 deletions modules/naprender/src/uniforminstance.h
Original file line number Diff line number Diff line change
Expand Up @@ -377,6 +377,8 @@ namespace nap
using UniformVec2Instance = TypedUniformValueInstance<glm::vec2>;
using UniformVec3Instance = TypedUniformValueInstance<glm::vec3>;
using UniformVec4Instance = TypedUniformValueInstance<glm::vec4>;
using UniformIVec4Instance = TypedUniformValueInstance<glm::ivec4>;
using UniformUVec4Instance = TypedUniformValueInstance<glm::uvec4>;
using UniformMat4Instance = TypedUniformValueInstance<glm::mat4>;


Expand All @@ -390,6 +392,8 @@ namespace nap
using UniformVec2ArrayInstance = TypedUniformValueArrayInstance<glm::vec2>;
using UniformVec3ArrayInstance = TypedUniformValueArrayInstance<glm::vec3>;
using UniformVec4ArrayInstance = TypedUniformValueArrayInstance<glm::vec4>;
using UniformIVec4ArrayInstance = TypedUniformValueArrayInstance<glm::ivec4>;
using UniformUVec4ArrayInstance = TypedUniformValueArrayInstance<glm::uvec4>;
using UniformMat4ArrayInstance = TypedUniformValueArrayInstance<glm::mat4>;


Expand Down

0 comments on commit f512a44

Please sign in to comment.