summaryrefslogtreecommitdiff
path: root/src/shader_recompiler/backend
diff options
context:
space:
mode:
authorGravatar ameerj2021-06-01 00:07:14 -0400
committerGravatar ameerj2021-07-22 21:51:37 -0400
commit59576b82a8c06943e6b9fafbff6ed1884a4132a7 (patch)
tree68f1a4b587e5283524940466aafd1e1d4e3d6155 /src/shader_recompiler/backend
parentglsl: Implement tessellation shaders (diff)
downloadyuzu-59576b82a8c06943e6b9fafbff6ed1884a4132a7.tar.gz
yuzu-59576b82a8c06943e6b9fafbff6ed1884a4132a7.tar.xz
yuzu-59576b82a8c06943e6b9fafbff6ed1884a4132a7.zip
glsl: Fix precise variable declaration
and add some more separation in the shader for better debugability when dumped
Diffstat (limited to 'src/shader_recompiler/backend')
-rw-r--r--src/shader_recompiler/backend/glsl/emit_context.cpp3
-rw-r--r--src/shader_recompiler/backend/glsl/emit_glsl.cpp12
-rw-r--r--src/shader_recompiler/backend/glsl/var_alloc.cpp34
3 files changed, 25 insertions, 24 deletions
diff --git a/src/shader_recompiler/backend/glsl/emit_context.cpp b/src/shader_recompiler/backend/glsl/emit_context.cpp
index 01403ca17..2375b7a06 100644
--- a/src/shader_recompiler/backend/glsl/emit_context.cpp
+++ b/src/shader_recompiler/backend/glsl/emit_context.cpp
@@ -150,7 +150,7 @@ void SetupOutPerVertex(Stage stage, const Info& info, std::string& header) {
150 if (info.stores_clip_distance) { 150 if (info.stores_clip_distance) {
151 header += "float gl_ClipDistance[];"; 151 header += "float gl_ClipDistance[];";
152 } 152 }
153 header += "};"; 153 header += "};\n";
154} 154}
155} // namespace 155} // namespace
156 156
@@ -223,6 +223,7 @@ EmitContext::EmitContext(IR::Program& program, Bindings& bindings, const Profile
223 header += declaration; 223 header += declaration;
224 } 224 }
225 } 225 }
226 header += "\n";
226 DefineConstantBuffers(bindings); 227 DefineConstantBuffers(bindings);
227 DefineStorageBuffers(bindings); 228 DefineStorageBuffers(bindings);
228 SetupImages(bindings); 229 SetupImages(bindings);
diff --git a/src/shader_recompiler/backend/glsl/emit_glsl.cpp b/src/shader_recompiler/backend/glsl/emit_glsl.cpp
index f467d978c..bfc42e1b4 100644
--- a/src/shader_recompiler/backend/glsl/emit_glsl.cpp
+++ b/src/shader_recompiler/backend/glsl/emit_glsl.cpp
@@ -180,13 +180,15 @@ void DefineVariables(const EmitContext& ctx, std::string& header) {
180 const auto type{static_cast<GlslVarType>(i)}; 180 const auto type{static_cast<GlslVarType>(i)};
181 const auto& tracker{ctx.var_alloc.GetUseTracker(type)}; 181 const auto& tracker{ctx.var_alloc.GetUseTracker(type)};
182 const auto type_name{ctx.var_alloc.GetGlslType(type)}; 182 const auto type_name{ctx.var_alloc.GetGlslType(type)};
183 const auto precise{
184 (type == GlslVarType::PrecF32 || type == GlslVarType::PrecF64) ? "precise " : ""};
183 // Temps/return types that are never used are stored at index 0 185 // Temps/return types that are never used are stored at index 0
184 if (tracker.uses_temp) { 186 if (tracker.uses_temp) {
185 header += fmt::format("{}{}={}(0);", type_name, ctx.var_alloc.Representation(0, type), 187 header += fmt::format("{}{} {}={}(0);", precise, type_name,
186 type_name); 188 ctx.var_alloc.Representation(0, type), type_name);
187 } 189 }
188 for (u32 index = 1; index <= tracker.num_used; ++index) { 190 for (u32 index = 1; index <= tracker.num_used; ++index) {
189 header += fmt::format("{}{}={}(0);", type_name, 191 header += fmt::format("{}{} {}={}(0);", precise, type_name,
190 ctx.var_alloc.Representation(index, type), type_name); 192 ctx.var_alloc.Representation(index, type), type_name);
191 } 193 }
192 } 194 }
@@ -198,7 +200,7 @@ std::string EmitGLSL(const Profile& profile, const RuntimeInfo& runtime_info, IR
198 EmitContext ctx{program, bindings, profile, runtime_info}; 200 EmitContext ctx{program, bindings, profile, runtime_info};
199 Precolor(program); 201 Precolor(program);
200 EmitCode(ctx, program); 202 EmitCode(ctx, program);
201 const std::string version{fmt::format("#version 450{}\n", GlslVersionSpecifier(ctx))}; 203 const std::string version{fmt::format("#version 460{}\n", GlslVersionSpecifier(ctx))};
202 ctx.header.insert(0, version); 204 ctx.header.insert(0, version);
203 if (program.local_memory_size > 0) { 205 if (program.local_memory_size > 0) {
204 ctx.header += fmt::format("uint lmem[{}];", program.local_memory_size / 4); 206 ctx.header += fmt::format("uint lmem[{}];", program.local_memory_size / 4);
@@ -206,7 +208,7 @@ std::string EmitGLSL(const Profile& profile, const RuntimeInfo& runtime_info, IR
206 if (program.shared_memory_size > 0) { 208 if (program.shared_memory_size > 0) {
207 ctx.header += fmt::format("shared uint smem[{}];", program.shared_memory_size / 4); 209 ctx.header += fmt::format("shared uint smem[{}];", program.shared_memory_size / 4);
208 } 210 }
209 ctx.header += "void main(){\n"; 211 ctx.header += "\nvoid main(){\n";
210 if (program.stage == Stage::VertexA || program.stage == Stage::VertexB) { 212 if (program.stage == Stage::VertexA || program.stage == Stage::VertexB) {
211 ctx.header += "gl_Position = vec4(0.0f, 0.0f, 0.0f, 1.0f);"; 213 ctx.header += "gl_Position = vec4(0.0f, 0.0f, 0.0f, 1.0f);";
212 // TODO: Properly resolve attribute issues 214 // TODO: Properly resolve attribute issues
diff --git a/src/shader_recompiler/backend/glsl/var_alloc.cpp b/src/shader_recompiler/backend/glsl/var_alloc.cpp
index 2ecdec7f2..1ab64add4 100644
--- a/src/shader_recompiler/backend/glsl/var_alloc.cpp
+++ b/src/shader_recompiler/backend/glsl/var_alloc.cpp
@@ -202,37 +202,35 @@ GlslVarType VarAlloc::RegType(IR::Type type) const {
202std::string VarAlloc::GetGlslType(GlslVarType type) const { 202std::string VarAlloc::GetGlslType(GlslVarType type) const {
203 switch (type) { 203 switch (type) {
204 case GlslVarType::U1: 204 case GlslVarType::U1:
205 return "bool "; 205 return "bool";
206 case GlslVarType::F16x2: 206 case GlslVarType::F16x2:
207 return "f16vec2 "; 207 return "f16vec2";
208 case GlslVarType::U32: 208 case GlslVarType::U32:
209 return "uint "; 209 return "uint";
210 case GlslVarType::S32: 210 case GlslVarType::S32:
211 return "int "; 211 return "int";
212 case GlslVarType::F32: 212 case GlslVarType::F32:
213 return "float "; 213 case GlslVarType::PrecF32:
214 return "float";
214 case GlslVarType::S64: 215 case GlslVarType::S64:
215 return "int64_t "; 216 return "int64_t";
216 case GlslVarType::U64: 217 case GlslVarType::U64:
217 return "uint64_t "; 218 return "uint64_t";
218 case GlslVarType::F64: 219 case GlslVarType::F64:
219 return "double "; 220 case GlslVarType::PrecF64:
221 return "double";
220 case GlslVarType::U32x2: 222 case GlslVarType::U32x2:
221 return "uvec2 "; 223 return "uvec2";
222 case GlslVarType::F32x2: 224 case GlslVarType::F32x2:
223 return "vec2 "; 225 return "vec2";
224 case GlslVarType::U32x3: 226 case GlslVarType::U32x3:
225 return "uvec3 "; 227 return "uvec3";
226 case GlslVarType::F32x3: 228 case GlslVarType::F32x3:
227 return "vec3 "; 229 return "vec3";
228 case GlslVarType::U32x4: 230 case GlslVarType::U32x4:
229 return "uvec4 "; 231 return "uvec4";
230 case GlslVarType::F32x4: 232 case GlslVarType::F32x4:
231 return "vec4 "; 233 return "vec4";
232 case GlslVarType::PrecF32:
233 return "precise float ";
234 case GlslVarType::PrecF64:
235 return "precise double ";
236 case GlslVarType::Void: 234 case GlslVarType::Void:
237 return ""; 235 return "";
238 default: 236 default: