summaryrefslogtreecommitdiff
path: root/src/shader_recompiler/backend/glsl/emit_context.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/shader_recompiler/backend/glsl/emit_context.cpp')
-rw-r--r--src/shader_recompiler/backend/glsl/emit_context.cpp52
1 files changed, 20 insertions, 32 deletions
diff --git a/src/shader_recompiler/backend/glsl/emit_context.cpp b/src/shader_recompiler/backend/glsl/emit_context.cpp
index ae5ac752d..ecc7335ba 100644
--- a/src/shader_recompiler/backend/glsl/emit_context.cpp
+++ b/src/shader_recompiler/backend/glsl/emit_context.cpp
@@ -433,8 +433,7 @@ void EmitContext::DefineHelperFunctions() {
433} 433}
434 434
435std::string EmitContext::DefineGlobalMemoryFunctions() { 435std::string EmitContext::DefineGlobalMemoryFunctions() {
436 const auto define_body{[&](std::string& func, size_t index, u32 num_components, 436 const auto define_body{[&](std::string& func, size_t index, std::string_view return_statement) {
437 std::string_view return_statement) {
438 const auto& ssbo{info.storage_buffers_descriptors[index]}; 437 const auto& ssbo{info.storage_buffers_descriptors[index]};
439 const u32 size_cbuf_offset{ssbo.cbuf_offset + 8}; 438 const u32 size_cbuf_offset{ssbo.cbuf_offset + 8};
440 const auto ssbo_addr{fmt::format("ssbo_addr{}", index)}; 439 const auto ssbo_addr{fmt::format("ssbo_addr{}", index)};
@@ -458,42 +457,31 @@ std::string EmitContext::DefineGlobalMemoryFunctions() {
458 func += comparison; 457 func += comparison;
459 458
460 const auto ssbo_name{fmt::format("{}_ssbo{}", stage_name, index)}; 459 const auto ssbo_name{fmt::format("{}_ssbo{}", stage_name, index)};
461 switch (num_components) { 460 func += fmt::format(return_statement, ssbo_name, ssbo_addr);
462 case 1:
463 func += fmt::format(return_statement, ssbo_name, ssbo_addr);
464 break;
465 case 2:
466 func += fmt::format(return_statement, ssbo_name, ssbo_addr, ssbo_name, ssbo_addr);
467 break;
468 case 4:
469 func += fmt::format(return_statement, ssbo_name, ssbo_addr, ssbo_name, ssbo_addr,
470 ssbo_name, ssbo_addr, ssbo_name, ssbo_addr);
471 break;
472 }
473 }}; 461 }};
474 std::string write_func{"void WriteGlobal32(uint64_t addr,uint data){\n"}; 462 std::string write_func{"void WriteGlobal32(uint64_t addr,uint data){"};
475 std::string write_func_64{"void WriteGlobal64(uint64_t addr,uvec2 data){\n"}; 463 std::string write_func_64{"void WriteGlobal64(uint64_t addr,uvec2 data){"};
476 std::string write_func_128{"void WriteGlobal128(uint64_t addr,uvec4 data){\n"}; 464 std::string write_func_128{"void WriteGlobal128(uint64_t addr,uvec4 data){"};
477 std::string load_func{"uint LoadGlobal32(uint64_t addr){\n"}; 465 std::string load_func{"uint LoadGlobal32(uint64_t addr){"};
478 std::string load_func_64{"uvec2 LoadGlobal64(uint64_t addr){\n"}; 466 std::string load_func_64{"uvec2 LoadGlobal64(uint64_t addr){"};
479 std::string load_func_128{"uvec4 LoadGlobal128(uint64_t addr){\n"}; 467 std::string load_func_128{"uvec4 LoadGlobal128(uint64_t addr){"};
480 const size_t num_buffers{info.storage_buffers_descriptors.size()}; 468 const size_t num_buffers{info.storage_buffers_descriptors.size()};
481 for (size_t index = 0; index < num_buffers; ++index) { 469 for (size_t index = 0; index < num_buffers; ++index) {
482 if (!info.nvn_buffer_used[index]) { 470 if (!info.nvn_buffer_used[index]) {
483 continue; 471 continue;
484 } 472 }
485 define_body(write_func, index, 1, "{}[uint(addr-{})>>2]=data;return;}}"); 473 define_body(write_func, index, "{0}[uint(addr-{1})>>2]=data;return;}}");
486 define_body(write_func_64, index, 2, 474 define_body(write_func_64, index,
487 "{}[uint(addr-{})>>2]=data.x;{}[uint(addr-{}+4)>>2]=data.y;return;}}"); 475 "{0}[uint(addr-{1})>>2]=data.x;{0}[uint(addr-{1}+4)>>2]=data.y;return;}}");
488 define_body(write_func_128, index, 4, 476 define_body(write_func_128, index,
489 "{}[uint(addr-{})>>2]=data.x;{}[uint(addr-{}+4)>>2]=data.y;{}[uint(" 477 "{0}[uint(addr-{1})>>2]=data.x;{0}[uint(addr-{1}+4)>>2]=data.y;{0}[uint("
490 "addr-{}+8)>>2]=data.z;{}[uint(addr-{}+12)>>2]=data.w;return;}}"); 478 "addr-{1}+8)>>2]=data.z;{0}[uint(addr-{1}+12)>>2]=data.w;return;}}");
491 define_body(load_func, index, 1, "return {}[uint(addr-{})>>2];}}"); 479 define_body(load_func, index, "return {0}[uint(addr-{1})>>2];}}");
492 define_body(load_func_64, index, 2, 480 define_body(load_func_64, index,
493 "return uvec2({}[uint(addr-{})>>2],{}[uint(addr-{}+4)>>2]);}}"); 481 "return uvec2({0}[uint(addr-{1})>>2],{0}[uint(addr-{1}+4)>>2]);}}");
494 define_body(load_func_128, index, 4, 482 define_body(load_func_128, index,
495 "return uvec4({}[uint(addr-{})>>2],{}[uint(addr-{}+4)>>2],{}[" 483 "return uvec4({0}[uint(addr-{1})>>2],{0}[uint(addr-{1}+4)>>2],{0}["
496 "uint(addr-{}+8)>>2],{}[uint(addr-{}+12)>>2]);}}"); 484 "uint(addr-{1}+8)>>2],{0}[uint(addr-{1}+12)>>2]);}}");
497 } 485 }
498 write_func += "}"; 486 write_func += "}";
499 write_func_64 += "}"; 487 write_func_64 += "}";