diff options
Diffstat (limited to 'src/shader_recompiler/backend/glsl')
6 files changed, 106 insertions, 69 deletions
diff --git a/src/shader_recompiler/backend/glsl/emit_context.cpp b/src/shader_recompiler/backend/glsl/emit_context.cpp index fd0113c8d..26969a26d 100644 --- a/src/shader_recompiler/backend/glsl/emit_context.cpp +++ b/src/shader_recompiler/backend/glsl/emit_context.cpp | |||
| @@ -118,11 +118,6 @@ EmitContext::EmitContext(IR::Program& program, Bindings& bindings, const Profile | |||
| 118 | DefineStorageBuffers(bindings); | 118 | DefineStorageBuffers(bindings); |
| 119 | SetupImages(bindings); | 119 | SetupImages(bindings); |
| 120 | DefineHelperFunctions(); | 120 | DefineHelperFunctions(); |
| 121 | |||
| 122 | header += "void main(){\n"; | ||
| 123 | if (stage == Stage::VertexA || stage == Stage::VertexB) { | ||
| 124 | Add("gl_Position = vec4(0.0f, 0.0f, 0.0f, 1.0f);"); | ||
| 125 | } | ||
| 126 | } | 121 | } |
| 127 | 122 | ||
| 128 | void EmitContext::SetupExtensions(std::string&) { | 123 | void EmitContext::SetupExtensions(std::string&) { |
diff --git a/src/shader_recompiler/backend/glsl/emit_glsl.cpp b/src/shader_recompiler/backend/glsl/emit_glsl.cpp index f9ad71f92..bac4b830d 100644 --- a/src/shader_recompiler/backend/glsl/emit_glsl.cpp +++ b/src/shader_recompiler/backend/glsl/emit_glsl.cpp | |||
| @@ -180,6 +180,16 @@ std::string EmitGLSL(const Profile& profile, const RuntimeInfo& runtime_info, IR | |||
| 180 | EmitCode(ctx, program); | 180 | EmitCode(ctx, program); |
| 181 | const std::string version{fmt::format("#version 450{}\n", GlslVersionSpecifier(ctx))}; | 181 | const std::string version{fmt::format("#version 450{}\n", GlslVersionSpecifier(ctx))}; |
| 182 | ctx.header.insert(0, version); | 182 | ctx.header.insert(0, version); |
| 183 | if (program.local_memory_size > 0) { | ||
| 184 | ctx.header += fmt::format("uint lmem[{}];", program.local_memory_size / 4); | ||
| 185 | } | ||
| 186 | if (program.shared_memory_size > 0) { | ||
| 187 | ctx.header += fmt::format("shared uint smem[{}];", program.shared_memory_size / 4); | ||
| 188 | } | ||
| 189 | ctx.header += "void main(){\n"; | ||
| 190 | if (program.stage == Stage::VertexA || program.stage == Stage::VertexB) { | ||
| 191 | ctx.header += "gl_Position = vec4(0.0f, 0.0f, 0.0f, 1.0f);"; | ||
| 192 | } | ||
| 183 | for (size_t index = 0; index < ctx.reg_alloc.num_used_registers; ++index) { | 193 | for (size_t index = 0; index < ctx.reg_alloc.num_used_registers; ++index) { |
| 184 | ctx.header += fmt::format("{} R{};", ctx.reg_alloc.reg_types[index], index); | 194 | ctx.header += fmt::format("{} R{};", ctx.reg_alloc.reg_types[index], index); |
| 185 | } | 195 | } |
diff --git a/src/shader_recompiler/backend/glsl/emit_glsl_context_get_set.cpp b/src/shader_recompiler/backend/glsl/emit_glsl_context_get_set.cpp index 4bb20b8fa..46ce413bf 100644 --- a/src/shader_recompiler/backend/glsl/emit_glsl_context_get_set.cpp +++ b/src/shader_recompiler/backend/glsl/emit_glsl_context_get_set.cpp | |||
| @@ -201,4 +201,12 @@ void EmitLocalInvocationId(EmitContext& ctx, IR::Inst& inst) { | |||
| 201 | ctx.AddU32x3("{}=gl_LocalInvocationID;", inst); | 201 | ctx.AddU32x3("{}=gl_LocalInvocationID;", inst); |
| 202 | } | 202 | } |
| 203 | 203 | ||
| 204 | void EmitLoadLocal(EmitContext& ctx, IR::Inst& inst, std::string_view word_offset) { | ||
| 205 | ctx.AddU32("{}=lmem[{}];", inst, word_offset); | ||
| 206 | } | ||
| 207 | |||
| 208 | void EmitWriteLocal(EmitContext& ctx, std::string_view word_offset, std::string_view value) { | ||
| 209 | ctx.Add("lmem[{}]={};", word_offset, value); | ||
| 210 | } | ||
| 211 | |||
| 204 | } // namespace Shader::Backend::GLSL | 212 | } // namespace Shader::Backend::GLSL |
diff --git a/src/shader_recompiler/backend/glsl/emit_glsl_instructions.h b/src/shader_recompiler/backend/glsl/emit_glsl_instructions.h index a1806b7f5..72d97c7e1 100644 --- a/src/shader_recompiler/backend/glsl/emit_glsl_instructions.h +++ b/src/shader_recompiler/backend/glsl/emit_glsl_instructions.h | |||
| @@ -92,7 +92,7 @@ void EmitInvocationId(EmitContext& ctx, IR::Inst& inst); | |||
| 92 | void EmitSampleId(EmitContext& ctx, IR::Inst& inst); | 92 | void EmitSampleId(EmitContext& ctx, IR::Inst& inst); |
| 93 | void EmitIsHelperInvocation(EmitContext& ctx); | 93 | void EmitIsHelperInvocation(EmitContext& ctx); |
| 94 | void EmitYDirection(EmitContext& ctx, IR::Inst& inst); | 94 | void EmitYDirection(EmitContext& ctx, IR::Inst& inst); |
| 95 | void EmitLoadLocal(EmitContext& ctx, std::string_view word_offset); | 95 | void EmitLoadLocal(EmitContext& ctx, IR::Inst& inst, std::string_view word_offset); |
| 96 | void EmitWriteLocal(EmitContext& ctx, std::string_view word_offset, std::string_view value); | 96 | void EmitWriteLocal(EmitContext& ctx, std::string_view word_offset, std::string_view value); |
| 97 | void EmitUndefU1(EmitContext& ctx, IR::Inst& inst); | 97 | void EmitUndefU1(EmitContext& ctx, IR::Inst& inst); |
| 98 | void EmitUndefU8(EmitContext& ctx, IR::Inst& inst); | 98 | void EmitUndefU8(EmitContext& ctx, IR::Inst& inst); |
| @@ -141,13 +141,13 @@ void EmitWriteStorage64(EmitContext& ctx, const IR::Value& binding, const IR::Va | |||
| 141 | std::string_view value); | 141 | std::string_view value); |
| 142 | void EmitWriteStorage128(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset, | 142 | void EmitWriteStorage128(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset, |
| 143 | std::string_view value); | 143 | std::string_view value); |
| 144 | void EmitLoadSharedU8(EmitContext& ctx, std::string_view offset); | 144 | void EmitLoadSharedU8(EmitContext& ctx, IR::Inst& inst, std::string_view offset); |
| 145 | void EmitLoadSharedS8(EmitContext& ctx, std::string_view offset); | 145 | void EmitLoadSharedS8(EmitContext& ctx, IR::Inst& inst, std::string_view offset); |
| 146 | void EmitLoadSharedU16(EmitContext& ctx, std::string_view offset); | 146 | void EmitLoadSharedU16(EmitContext& ctx, IR::Inst& inst, std::string_view offset); |
| 147 | void EmitLoadSharedS16(EmitContext& ctx, std::string_view offset); | 147 | void EmitLoadSharedS16(EmitContext& ctx, IR::Inst& inst, std::string_view offset); |
| 148 | void EmitLoadSharedU32(EmitContext& ctx, std::string_view offset); | 148 | void EmitLoadSharedU32(EmitContext& ctx, IR::Inst& inst, std::string_view offset); |
| 149 | void EmitLoadSharedU64(EmitContext& ctx, std::string_view offset); | 149 | void EmitLoadSharedU64(EmitContext& ctx, IR::Inst& inst, std::string_view offset); |
| 150 | void EmitLoadSharedU128(EmitContext& ctx, std::string_view offset); | 150 | void EmitLoadSharedU128(EmitContext& ctx, IR::Inst& inst, std::string_view offset); |
| 151 | void EmitWriteSharedU8(EmitContext& ctx, std::string_view offset, std::string_view value); | 151 | void EmitWriteSharedU8(EmitContext& ctx, std::string_view offset, std::string_view value); |
| 152 | void EmitWriteSharedU16(EmitContext& ctx, std::string_view offset, std::string_view value); | 152 | void EmitWriteSharedU16(EmitContext& ctx, std::string_view offset, std::string_view value); |
| 153 | void EmitWriteSharedU32(EmitContext& ctx, std::string_view offset, std::string_view value); | 153 | void EmitWriteSharedU32(EmitContext& ctx, std::string_view offset, std::string_view value); |
diff --git a/src/shader_recompiler/backend/glsl/emit_glsl_not_implemented.cpp b/src/shader_recompiler/backend/glsl/emit_glsl_not_implemented.cpp index 9af9ebeac..b182298b0 100644 --- a/src/shader_recompiler/backend/glsl/emit_glsl_not_implemented.cpp +++ b/src/shader_recompiler/backend/glsl/emit_glsl_not_implemented.cpp | |||
| @@ -224,14 +224,6 @@ void EmitYDirection(EmitContext& ctx, IR::Inst& inst) { | |||
| 224 | ctx.AddF32("{}=gl_FrontMaterial.ambient.a;", inst); | 224 | ctx.AddF32("{}=gl_FrontMaterial.ambient.a;", inst); |
| 225 | } | 225 | } |
| 226 | 226 | ||
| 227 | void EmitLoadLocal(EmitContext& ctx, std::string_view word_offset) { | ||
| 228 | NotImplemented(); | ||
| 229 | } | ||
| 230 | |||
| 231 | void EmitWriteLocal(EmitContext& ctx, std::string_view word_offset, std::string_view value) { | ||
| 232 | NotImplemented(); | ||
| 233 | } | ||
| 234 | |||
| 235 | void EmitUndefU1(EmitContext& ctx, IR::Inst& inst) { | 227 | void EmitUndefU1(EmitContext& ctx, IR::Inst& inst) { |
| 236 | ctx.AddU1("{}=false;", inst); | 228 | ctx.AddU1("{}=false;", inst); |
| 237 | } | 229 | } |
| @@ -308,54 +300,6 @@ void EmitWriteGlobal128(EmitContext& ctx, std::string_view address, std::string_ | |||
| 308 | NotImplemented(); | 300 | NotImplemented(); |
| 309 | } | 301 | } |
| 310 | 302 | ||
| 311 | void EmitLoadSharedU8(EmitContext& ctx, std::string_view offset) { | ||
| 312 | NotImplemented(); | ||
| 313 | } | ||
| 314 | |||
| 315 | void EmitLoadSharedS8(EmitContext& ctx, std::string_view offset) { | ||
| 316 | NotImplemented(); | ||
| 317 | } | ||
| 318 | |||
| 319 | void EmitLoadSharedU16(EmitContext& ctx, std::string_view offset) { | ||
| 320 | NotImplemented(); | ||
| 321 | } | ||
| 322 | |||
| 323 | void EmitLoadSharedS16(EmitContext& ctx, std::string_view offset) { | ||
| 324 | NotImplemented(); | ||
| 325 | } | ||
| 326 | |||
| 327 | void EmitLoadSharedU32(EmitContext& ctx, std::string_view offset) { | ||
| 328 | NotImplemented(); | ||
| 329 | } | ||
| 330 | |||
| 331 | void EmitLoadSharedU64(EmitContext& ctx, std::string_view offset) { | ||
| 332 | NotImplemented(); | ||
| 333 | } | ||
| 334 | |||
| 335 | void EmitLoadSharedU128(EmitContext& ctx, std::string_view offset) { | ||
| 336 | NotImplemented(); | ||
| 337 | } | ||
| 338 | |||
| 339 | void EmitWriteSharedU8(EmitContext& ctx, std::string_view offset, std::string_view value) { | ||
| 340 | NotImplemented(); | ||
| 341 | } | ||
| 342 | |||
| 343 | void EmitWriteSharedU16(EmitContext& ctx, std::string_view offset, std::string_view value) { | ||
| 344 | NotImplemented(); | ||
| 345 | } | ||
| 346 | |||
| 347 | void EmitWriteSharedU32(EmitContext& ctx, std::string_view offset, std::string_view value) { | ||
| 348 | NotImplemented(); | ||
| 349 | } | ||
| 350 | |||
| 351 | void EmitWriteSharedU64(EmitContext& ctx, std::string_view offset, std::string_view value) { | ||
| 352 | NotImplemented(); | ||
| 353 | } | ||
| 354 | |||
| 355 | void EmitWriteSharedU128(EmitContext& ctx, std::string_view offset, std::string_view value) { | ||
| 356 | NotImplemented(); | ||
| 357 | } | ||
| 358 | |||
| 359 | void EmitGetZeroFromOp(EmitContext& ctx) { | 303 | void EmitGetZeroFromOp(EmitContext& ctx) { |
| 360 | NotImplemented(); | 304 | NotImplemented(); |
| 361 | } | 305 | } |
diff --git a/src/shader_recompiler/backend/glsl/emit_glsl_shared_memory.cpp b/src/shader_recompiler/backend/glsl/emit_glsl_shared_memory.cpp index e69de29bb..8a4c69547 100644 --- a/src/shader_recompiler/backend/glsl/emit_glsl_shared_memory.cpp +++ b/src/shader_recompiler/backend/glsl/emit_glsl_shared_memory.cpp | |||
| @@ -0,0 +1,80 @@ | |||
| 1 | // Copyright 2021 yuzu Emulator Project | ||
| 2 | // Licensed under GPLv2 or any later version | ||
| 3 | // Refer to the license.txt file included. | ||
| 4 | |||
| 5 | #include <string_view> | ||
| 6 | |||
| 7 | #include "shader_recompiler/backend/glsl/emit_context.h" | ||
| 8 | #include "shader_recompiler/backend/glsl/emit_glsl_instructions.h" | ||
| 9 | #include "shader_recompiler/frontend/ir/value.h" | ||
| 10 | |||
| 11 | namespace Shader::Backend::GLSL { | ||
| 12 | void EmitLoadSharedU8([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] IR::Inst& inst, | ||
| 13 | [[maybe_unused]] std::string_view offset) { | ||
| 14 | ctx.AddU32("{}=bitfieldExtract(smem[{}/4],int({}%4)*8,8);", inst, offset, offset); | ||
| 15 | } | ||
| 16 | |||
| 17 | void EmitLoadSharedS8([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] IR::Inst& inst, | ||
| 18 | [[maybe_unused]] std::string_view offset) { | ||
| 19 | ctx.AddS32("{}=bitfieldExtract(int(smem[{}/4]),int({}%4)*8,8);", inst, offset, offset); | ||
| 20 | } | ||
| 21 | |||
| 22 | void EmitLoadSharedU16([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] IR::Inst& inst, | ||
| 23 | [[maybe_unused]] std::string_view offset) { | ||
| 24 | ctx.AddU32("{}=bitfieldExtract(smem[{}/4],int(({}/2)%2)*16,16);", inst, offset, offset); | ||
| 25 | } | ||
| 26 | |||
| 27 | void EmitLoadSharedS16([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] IR::Inst& inst, | ||
| 28 | [[maybe_unused]] std::string_view offset) { | ||
| 29 | ctx.AddS32("{}=bitfieldExtract(int(smem[{}/4]),int(({}/2)%2)*16,16);", inst, offset, offset); | ||
| 30 | } | ||
| 31 | |||
| 32 | void EmitLoadSharedU32([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] IR::Inst& inst, | ||
| 33 | [[maybe_unused]] std::string_view offset) { | ||
| 34 | ctx.AddU32("{}=smem[{}/4];", inst, offset); | ||
| 35 | } | ||
| 36 | |||
| 37 | void EmitLoadSharedU64([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] IR::Inst& inst, | ||
| 38 | [[maybe_unused]] std::string_view offset) { | ||
| 39 | ctx.AddU32x2("{}=uvec2(smem[{}/4],smem[({}+4)/4]);", inst, offset, offset); | ||
| 40 | } | ||
| 41 | |||
| 42 | void EmitLoadSharedU128([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] IR::Inst& inst, | ||
| 43 | [[maybe_unused]] std::string_view offset) { | ||
| 44 | ctx.AddU32x4("{}=uvec4(smem[{}/4],smem[({}+4)/4],smem[({}+8)/4],smem[({}+12)/4]);", inst, | ||
| 45 | offset, offset, offset, offset); | ||
| 46 | } | ||
| 47 | |||
| 48 | void EmitWriteSharedU8([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view offset, | ||
| 49 | [[maybe_unused]] std::string_view value) { | ||
| 50 | ctx.Add("smem[{}/4]=bitfieldInsert(smem[{}/4],{},int({}%4)*8,8);", offset, offset, value, | ||
| 51 | offset); | ||
| 52 | } | ||
| 53 | |||
| 54 | void EmitWriteSharedU16([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view offset, | ||
| 55 | [[maybe_unused]] std::string_view value) { | ||
| 56 | ctx.Add("smem[{}/4]=bitfieldInsert(smem[{}/4],{},int(({}/2)%2)*16,16);", offset, offset, value, | ||
| 57 | offset); | ||
| 58 | } | ||
| 59 | |||
| 60 | void EmitWriteSharedU32([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view offset, | ||
| 61 | [[maybe_unused]] std::string_view value) { | ||
| 62 | ctx.Add("smem[{}/4]={};", offset, value); | ||
| 63 | } | ||
| 64 | |||
| 65 | void EmitWriteSharedU64([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view offset, | ||
| 66 | [[maybe_unused]] std::string_view value) { | ||
| 67 | ctx.Add("smem[{}/4]={}.x;", offset, value); | ||
| 68 | ctx.Add("smem[({}+4)/4]={}.y;", offset, value); | ||
| 69 | } | ||
| 70 | |||
| 71 | void EmitWriteSharedU128([[maybe_unused]] EmitContext& ctx, | ||
| 72 | [[maybe_unused]] std::string_view offset, | ||
| 73 | [[maybe_unused]] std::string_view value) { | ||
| 74 | ctx.Add("smem[{}/4]={}.x;", offset, value); | ||
| 75 | ctx.Add("smem[({}+4)/4]={}.y;", offset, value); | ||
| 76 | ctx.Add("smem[({}+8)/4]={}.z;", offset, value); | ||
| 77 | ctx.Add("smem[({}+12)/4]={}.w;", offset, value); | ||
| 78 | } | ||
| 79 | |||
| 80 | } // namespace Shader::Backend::GLSL | ||