summaryrefslogtreecommitdiffstats
path: root/src/shader_recompiler/backend/glsl/emit_glsl_context_get_set.cpp
diff options
context:
space:
mode:
authorameerj <52414509+ameerj@users.noreply.github.com>2021-05-27 06:26:16 +0200
committerameerj <52414509+ameerj@users.noreply.github.com>2021-07-23 03:51:36 +0200
commited14d31f663e126a8f9fe0ea8abff8e27c46248b (patch)
tree6bfe4bec1eda9960aef7c80dfa5926ab97984bd3 /src/shader_recompiler/backend/glsl/emit_glsl_context_get_set.cpp
parentglsl: textures wip (diff)
downloadyuzu-ed14d31f663e126a8f9fe0ea8abff8e27c46248b.tar
yuzu-ed14d31f663e126a8f9fe0ea8abff8e27c46248b.tar.gz
yuzu-ed14d31f663e126a8f9fe0ea8abff8e27c46248b.tar.bz2
yuzu-ed14d31f663e126a8f9fe0ea8abff8e27c46248b.tar.lz
yuzu-ed14d31f663e126a8f9fe0ea8abff8e27c46248b.tar.xz
yuzu-ed14d31f663e126a8f9fe0ea8abff8e27c46248b.tar.zst
yuzu-ed14d31f663e126a8f9fe0ea8abff8e27c46248b.zip
Diffstat (limited to 'src/shader_recompiler/backend/glsl/emit_glsl_context_get_set.cpp')
-rw-r--r--src/shader_recompiler/backend/glsl/emit_glsl_context_get_set.cpp68
1 files changed, 57 insertions, 11 deletions
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 441818c0b..796f01883 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
@@ -10,8 +10,18 @@
#include "shader_recompiler/profile.h"
namespace Shader::Backend::GLSL {
+namespace {
static constexpr std::string_view SWIZZLE{"xyzw"};
+u32 CbufIndex(u32 offset) {
+ return (offset / 4) % 4;
+}
+
+char OffsetSwizzle(u32 offset) {
+ return SWIZZLE[CbufIndex(offset)];
+}
+} // namespace
+
void EmitGetCbufU8([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] const IR::Value& binding,
[[maybe_unused]] const IR::Value& offset) {
throw NotImplementedException("GLSL");
@@ -34,22 +44,42 @@ void EmitGetCbufS16([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] const IR
void EmitGetCbufU32(EmitContext& ctx, IR::Inst& inst, const IR::Value& binding,
const IR::Value& offset) {
- const auto u32_offset{offset.U32()};
- const auto index{(u32_offset / 4) % 4};
- ctx.AddU32("{}=floatBitsToUint(cbuf{}[{}].{});", inst, binding.U32(), u32_offset / 16,
- SWIZZLE[index]);
+ if (offset.IsImmediate()) {
+ ctx.AddU32("{}=floatBitsToUint(cbuf{}[{}].{});", inst, binding.U32(), offset.U32() / 16,
+ OffsetSwizzle(offset.U32()));
+ } else {
+ const auto offset_var{ctx.reg_alloc.Consume(offset)};
+ ctx.AddU32("{}=floatBitsToUint(cbuf{}[{}/16][({}/4)%4]);", inst, binding.U32(), offset_var,
+ offset_var);
+ }
}
void EmitGetCbufF32(EmitContext& ctx, IR::Inst& inst, const IR::Value& binding,
const IR::Value& offset) {
- const auto u32_offset{offset.U32()};
- const auto index{(u32_offset / 4) % 4};
- ctx.AddF32("{}=cbuf{}[{}].{};", inst, binding.U32(), u32_offset / 16, SWIZZLE[index]);
+ if (offset.IsImmediate()) {
+ ctx.AddF32("{}=cbuf{}[{}].{};", inst, binding.U32(), offset.U32() / 16,
+ OffsetSwizzle(offset.U32()));
+ } else {
+ const auto offset_var{ctx.reg_alloc.Consume(offset)};
+ ctx.AddF32("{}=cbuf{}[{}/16][({}/4)%4];", inst, binding.U32(), offset_var, offset_var);
+ }
}
-void EmitGetCbufU32x2([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] const IR::Value& binding,
- [[maybe_unused]] const IR::Value& offset) {
- throw NotImplementedException("GLSL");
+void EmitGetCbufU32x2(EmitContext& ctx, IR::Inst& inst, const IR::Value& binding,
+ const IR::Value& offset) {
+ if (offset.IsImmediate()) {
+ const auto u32_offset{offset.U32()};
+ const auto index{(u32_offset / 4) % 4};
+ ctx.AddU32x2("{}=uvec2(floatBitsToUint(cbuf{}[{}].{}),floatBitsToUint(cbuf{}[{}].{}));",
+ inst, binding.U32(), offset.U32() / 16, OffsetSwizzle(offset.U32()),
+ binding.U32(), (offset.U32() + 1) / 16, OffsetSwizzle(offset.U32() + 1));
+ } else {
+ const auto offset_var{ctx.reg_alloc.Consume(offset)};
+ ctx.AddU32x2("{}=uvec2(floatBitsToUint(cbuf{}[{}/16][({}/"
+ "4)%4]),floatBitsToUint(cbuf{}[({}+1)/16][(({}+1/4))%4]));",
+ inst, binding.U32(), offset_var, offset_var, binding.U32(), offset_var,
+ offset_var);
+ }
}
void EmitGetAttribute(EmitContext& ctx, IR::Inst& inst, IR::Attribute attr,
@@ -66,7 +96,23 @@ void EmitGetAttribute(EmitContext& ctx, IR::Inst& inst, IR::Attribute attr,
case IR::Attribute::PositionY:
case IR::Attribute::PositionZ:
case IR::Attribute::PositionW:
- ctx.AddF32("{}=gl_Position.{};", inst, swizzle);
+ switch (ctx.stage) {
+ case Stage::VertexA:
+ case Stage::VertexB:
+ ctx.AddF32("{}=gl_Position.{};", inst, swizzle);
+ break;
+ case Stage::Fragment:
+ ctx.AddF32("{}=gl_FragCoord.{};", inst, swizzle);
+ break;
+ default:
+ throw NotImplementedException("Get Position for stage {}", ctx.stage);
+ }
+ break;
+ case IR::Attribute::InstanceId:
+ ctx.AddS32("{}=gl_InstanceID;", inst, ctx.attrib_name);
+ break;
+ case IR::Attribute::VertexId:
+ ctx.AddS32("{}=gl_VertexID;", inst, ctx.attrib_name);
break;
default:
fmt::print("Get attribute {}", attr);