diff options
| author | 2021-06-03 22:25:06 -0400 | |
|---|---|---|
| committer | 2021-07-22 21:51:37 -0400 | |
| commit | 0a0b0a73d82057a309b6b0427c29c7e15e2b356f (patch) | |
| tree | 0982ab6ae4b27b69a97cad77beb551e9508d537e /src/shader_recompiler/backend/glsl/emit_context.cpp | |
| parent | glsl: Cleanup and address feedback (diff) | |
| download | yuzu-0a0b0a73d82057a309b6b0427c29c7e15e2b356f.tar.gz yuzu-0a0b0a73d82057a309b6b0427c29c7e15e2b356f.tar.xz yuzu-0a0b0a73d82057a309b6b0427c29c7e15e2b356f.zip | |
glsl: Fix <32-bit SSBO writes
and more cleanup
Diffstat (limited to 'src/shader_recompiler/backend/glsl/emit_context.cpp')
| -rw-r--r-- | src/shader_recompiler/backend/glsl/emit_context.cpp | 52 |
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 | ||
| 435 | std::string EmitContext::DefineGlobalMemoryFunctions() { | 435 | std::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 += "}"; |