From 2dab7a2b4807b8ff47f3ce1d049a6f3901322d5d Mon Sep 17 00:00:00 2001 From: kearwood Date: Tue, 2 Aug 2022 00:43:36 -0700 Subject: [PATCH] Moved many KRPipeline public members to private. Added KRPipeline::hasUniform to avoid accessing private members directly in KRMaterial. Added KRPipeline::setUniform overload, for setting an array of Matrix4's. --- kraken/KRMaterial.cpp | 6 +++--- kraken/KRPipeline.cpp | 22 ++++++++++++++++++++-- kraken/KRPipeline.h | 28 +++++++++++++++------------- 3 files changed, 38 insertions(+), 18 deletions(-) diff --git a/kraken/KRMaterial.cpp b/kraken/KRMaterial.cpp index 09fb6f2..4602b31 100755 --- a/kraken/KRMaterial.cpp +++ b/kraken/KRMaterial.cpp @@ -357,7 +357,7 @@ void KRMaterial::bind(const KRNode::RenderInfo& ri, ModelFormat modelFormat, __u pShader->setUniform(KRPipeline::KRENGINE_UNIFORM_RIM_POWER, rim_power); // Bind bones - if(pShader->m_pushConstants[0].offset[KRPipeline::KRENGINE_UNIFORM_BONE_TRANSFORMS] != -1) { + if(pShader->hasUniform(KRPipeline::KRENGINE_UNIFORM_BONE_TRANSFORMS)) { float bone_mats[256 * 16]; float *bone_mat_component = bone_mats; for(int bone_index=0; bone_index < bones.size(); bone_index++) { @@ -384,8 +384,8 @@ void KRMaterial::bind(const KRNode::RenderInfo& ri, ModelFormat modelFormat, __u *bone_mat_component++ = t[i]; } } - if(pShader->m_pushConstants[0].offset[KRPipeline::KRENGINE_UNIFORM_BONE_TRANSFORMS] != -1) { - glUniformMatrix4fv(pShader->m_pushConstants[0].offset[KRPipeline::KRENGINE_UNIFORM_BONE_TRANSFORMS], (GLsizei)bones.size(), GL_FALSE, bone_mats); + if(pShader->hasUniform(KRPipeline::KRENGINE_UNIFORM_BONE_TRANSFORMS)) { + pShader->setUniform(KRPipeline::KRENGINE_UNIFORM_BONE_TRANSFORMS, (Matrix4*)bone_mats, bones.size()); } } diff --git a/kraken/KRPipeline.cpp b/kraken/KRPipeline.cpp index 380abba..969643c 100644 --- a/kraken/KRPipeline.cpp +++ b/kraken/KRPipeline.cpp @@ -115,8 +115,10 @@ KRPipeline::KRPipeline(KRContext& context, KRSurface& surface, const PipelineInf , m_pushConstantBuffer(nullptr) , m_pushConstantBufferSize(0) { - memset(m_pushConstants[0].size, 0, KRENGINE_NUM_UNIFORMS); - memset(m_pushConstants[0].offset, 0, KRENGINE_NUM_UNIFORMS * sizeof(int)); + for (int i = 0; i < static_cast(ShaderStages::shaderStageCount); i++) { + memset(m_pushConstants[i].size, 0, KRENGINE_NUM_UNIFORMS); + memset(m_pushConstants[i].offset, 0, KRENGINE_NUM_UNIFORMS * sizeof(int)); + } m_pipelineLayout = nullptr; m_graphicsPipeline = nullptr; @@ -481,6 +483,16 @@ void KRPipeline::setUniform(int location, float value) } } +bool KRPipeline::hasUniform(int location) const +{ + for (int i = 0; i < static_cast(ShaderStages::shaderStageCount); i++) { + if (m_pushConstants[i].size) { + return true; + } + } + return false; +} + void KRPipeline::setUniform(int location, int value) { if (m_pushConstants[0].size[location] == sizeof(value)) { @@ -520,6 +532,12 @@ void KRPipeline::setUniform(int location, const Matrix4 &value) } } +void KRPipeline::setUniform(int location, const Matrix4* value, const size_t count) +{ + // TODO - Vulkan refactoring + // GLDEBUG(glUniformMatrix4fv(pShader->m_pushConstants[0].offset[KRPipeline::KRENGINE_UNIFORM_BONE_TRANSFORMS], (GLsizei)bones.size(), GL_FALSE, bone_mats)); +} + bool KRPipeline::bind(VkCommandBuffer& commandBuffer, KRCamera &camera, const KRViewport &viewport, const Matrix4 &matModel, const std::vector *point_lights, const std::vector *directional_lights, const std::vector *spot_lights, const KRNode::RenderPass &renderPass) { setUniform(KRENGINE_UNIFORM_ABSOLUTE_TIME, getContext().getAbsoluteTime()); diff --git a/kraken/KRPipeline.h b/kraken/KRPipeline.h index cd77f5e..7fb9f8e 100644 --- a/kraken/KRPipeline.h +++ b/kraken/KRPipeline.h @@ -293,7 +293,19 @@ public: shaderStageCount }; - static const char *KRENGINE_UNIFORM_NAMES[]; + bool hasUniform(int location) const; + void setUniform(int location, float value); + void setUniform(int location, int value); + void setUniform(int location, const Vector2 &value); + void setUniform(int location, const Vector3 &value); + void setUniform(int location, const Vector4 &value); + void setUniform(int location, const Matrix4 &value); + void setUniform(int location, const Matrix4* value, const size_t count); + + VkPipeline& getPipeline(); + +private: + static const char* KRENGINE_UNIFORM_NAMES[]; struct PushConstantStageInfo { @@ -304,19 +316,9 @@ public: uint8_t* m_pushConstantBuffer; int m_pushConstantBufferSize; - - char m_szKey[256]; - - void setUniform(int location, float value); - void setUniform(int location, int value); - void setUniform(int location, const Vector2 &value); - void setUniform(int location, const Vector3 &value); - void setUniform(int location, const Vector4 &value); - void setUniform(int location, const Matrix4 &value); - VkPipeline& getPipeline(); - -private: + char m_szKey[256]; + VkPipelineLayout m_pipelineLayout; VkPipeline m_graphicsPipeline; VkPipelineLayout m_pushConstantsLayout;