From e4af049f95c93c174c3c817709e22ccec44b85e4 Mon Sep 17 00:00:00 2001 From: Kearwood Gilbert Date: Wed, 6 May 2026 23:46:10 -0700 Subject: [PATCH] Implemented shader reflection and binding for the bool data type. --- kraken/KRPipeline.cpp | 20 +++++++++++--------- kraken/KRShaderReflection.cpp | 2 ++ kraken/KRShaderReflection.h | 1 + 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/kraken/KRPipeline.cpp b/kraken/KRPipeline.cpp index 9117458..89b4eab 100644 --- a/kraken/KRPipeline.cpp +++ b/kraken/KRPipeline.cpp @@ -446,16 +446,18 @@ void KRPipeline::initPushConstantStage(ShaderStage stage, const SpvReflectShader pushConstants.size[iUniform] = member.size; if (member.type_description->op == SpvOpTypeVector && member.numeric.scalar.width == 32) { switch (member.numeric.vector.component_count) { - case 2: - pushConstants.type[iUniform] = ShaderValueType::type_vector2; - break; - case 3: - pushConstants.type[iUniform] = ShaderValueType::type_vector3; - break; - case 4: - pushConstants.type[iUniform] = ShaderValueType::type_vector4; - break; + case 2: + pushConstants.type[iUniform] = ShaderValueType::type_vector2; + break; + case 3: + pushConstants.type[iUniform] = ShaderValueType::type_vector3; + break; + case 4: + pushConstants.type[iUniform] = ShaderValueType::type_vector4; + break; } + } else if (member.type_description->op == SpvOpTypeBool) { + pushConstants.type[iUniform] = ShaderValueType::type_bool; } else if (member.type_description->op == SpvOpTypeFloat && member.numeric.scalar.width == 32) { pushConstants.type[iUniform] = ShaderValueType::type_float32; } else if (member.type_description->op == SpvOpTypeFloat && member.numeric.scalar.width == 64) { diff --git a/kraken/KRShaderReflection.cpp b/kraken/KRShaderReflection.cpp index 07c15dd..f79c07f 100644 --- a/kraken/KRShaderReflection.cpp +++ b/kraken/KRShaderReflection.cpp @@ -216,6 +216,8 @@ bool IsShaderValueName(int index, const char* szName) bool KRReflectedObject::getShaderValue(ShaderValue value, ShaderValueType type, void* output) const { switch (type) { + case ShaderValueType::type_bool: + return getShaderValue(value, static_cast(output)); case ShaderValueType::type_int32: return getShaderValue(value, static_cast(output)); case ShaderValueType::type_int64: diff --git a/kraken/KRShaderReflection.h b/kraken/KRShaderReflection.h index ffa2e07..b7712a8 100644 --- a/kraken/KRShaderReflection.h +++ b/kraken/KRShaderReflection.h @@ -40,6 +40,7 @@ class KRResourceBinding; enum class ShaderValueType : uint8_t { type_null = 0, + type_bool, type_int32, type_int64, type_float32,