#include "gtest/gtest.h" #include "kompute/Kompute.hpp" #include "fmt/ranges.h" TEST(TestPushConstants, TestConstantsAlgoDispatchOverride) { { std::string shader(R"( #version 450 #extension GL_EXT_shader_atomic_float: enable layout(push_constant) uniform PushConstants { float x; float y; float z; } pcs; layout (local_size_x = 1) in; layout(set = 0, binding = 0) buffer a { float pa[]; }; void main() { atomicAdd(pa[0], pcs.x); atomicAdd(pa[1], pcs.y); atomicAdd(pa[2], pcs.z); })"); std::vector spirv = kp::Shader::compile_source(shader); std::shared_ptr sq = nullptr; { kp::Manager mgr(0, {}, { "VK_EXT_shader_atomic_float", "SPV_EXT_shader_atomic_float_add" }); std::shared_ptr tensor = mgr.tensor({ 0, 0, 0 }); std::shared_ptr algo = mgr.algorithm({ tensor }, spirv, kp::Workgroup({ 1 }), {}, { 0.0, 0.0, 0.0 }); sq = mgr.sequence() ->record({ tensor }) ->record(algo, kp::Constants{ 0.1, 0.2, 0.3 }) ->record(algo, kp::Constants{ 0.3, 0.2, 0.1 }) ->record({ tensor }) ->eval(); EXPECT_EQ(tensor->data(), kp::Constants({ 0.4, 0.4, 0.4 })); } } } TEST(TestPushConstants, TestConstantsAlgoDispatchNoOverride) { { std::string shader(R"( #version 450 #extension GL_EXT_shader_atomic_float: enable layout(push_constant) uniform PushConstants { float x; float y; float z; } pcs; layout (local_size_x = 1) in; layout(set = 0, binding = 0) buffer a { float pa[]; }; void main() { atomicAdd(pa[0], pcs.x); atomicAdd(pa[1], pcs.y); atomicAdd(pa[2], pcs.z); })"); std::vector spirv = kp::Shader::compile_source(shader); std::shared_ptr sq = nullptr; { kp::Manager mgr(0, {}, { "VK_EXT_shader_atomic_float", "SPV_EXT_shader_atomic_float_add" }); std::shared_ptr tensor = mgr.tensor({ 0, 0, 0 }); std::shared_ptr algo = mgr.algorithm({ tensor }, spirv, kp::Workgroup({ 1 }), {}, { 0.1, 0.2, 0.3 }); sq = mgr.sequence() ->record({ tensor }) ->record(algo) ->record(algo, kp::Constants{ 0.3, 0.2, 0.1 }) ->record({ tensor }) ->eval(); EXPECT_EQ(tensor->data(), kp::Constants({ 0.4, 0.4, 0.4 })); } } } TEST(TestPushConstants, TestConstantsWrongSize) { { std::string shader(R"( #version 450 #extension GL_EXT_shader_atomic_float: enable layout(push_constant) uniform PushConstants { float x; float y; float z; } pcs; layout (local_size_x = 1) in; layout(set = 0, binding = 0) buffer a { float pa[]; }; void main() { atomicAdd(pa[0], pcs.x); atomicAdd(pa[1], pcs.y); atomicAdd(pa[2], pcs.z); })"); std::vector spirv = kp::Shader::compile_source(shader); std::shared_ptr sq = nullptr; { kp::Manager mgr(0, {}, { "VK_EXT_shader_atomic_float", "SPV_EXT_shader_atomic_float_add" }); std::shared_ptr tensor = mgr.tensor({ 0, 0, 0 }); std::shared_ptr algo = mgr.algorithm({ tensor }, spirv, kp::Workgroup({ 1 }), {}, { 0.0 }); sq = mgr.sequence() ->record({ tensor }); EXPECT_THROW(sq->record(algo, kp::Constants{ 0.1, 0.2, 0.3 }), std::runtime_error); } } }