summaryrefslogtreecommitdiff
path: root/src/shader_recompiler
diff options
context:
space:
mode:
Diffstat (limited to 'src/shader_recompiler')
-rw-r--r--src/shader_recompiler/backend/glsl/emit_context.cpp18
-rw-r--r--src/shader_recompiler/backend/glsl/emit_context.h1
-rw-r--r--src/shader_recompiler/backend/glsl/emit_glsl_context_get_set.cpp5
-rw-r--r--src/shader_recompiler/profile.h1
4 files changed, 17 insertions, 8 deletions
diff --git a/src/shader_recompiler/backend/glsl/emit_context.cpp b/src/shader_recompiler/backend/glsl/emit_context.cpp
index 58355d5e3..846d38bfc 100644
--- a/src/shader_recompiler/backend/glsl/emit_context.cpp
+++ b/src/shader_recompiler/backend/glsl/emit_context.cpp
@@ -148,23 +148,24 @@ std::string_view OutputPrimitive(OutputTopology topology) {
148 throw InvalidArgument("Invalid output topology {}", topology); 148 throw InvalidArgument("Invalid output topology {}", topology);
149} 149}
150 150
151void SetupOutPerVertex(Stage stage, const Info& info, std::string& header) { 151void SetupOutPerVertex(EmitContext& ctx, std::string& header) {
152 if (!StoresPerVertexAttributes(stage)) { 152 if (!StoresPerVertexAttributes(ctx.stage)) {
153 return; 153 return;
154 } 154 }
155 header += "out gl_PerVertex{"; 155 header += "out gl_PerVertex{";
156 header += "vec4 gl_Position;"; 156 header += "vec4 gl_Position;";
157 if (info.stores_point_size) { 157 if (ctx.info.stores_point_size) {
158 header += "float gl_PointSize;"; 158 header += "float gl_PointSize;";
159 } 159 }
160 if (info.stores_clip_distance) { 160 if (ctx.info.stores_clip_distance) {
161 header += "float gl_ClipDistance[];"; 161 header += "float gl_ClipDistance[];";
162 } 162 }
163 if (info.stores_viewport_index && stage != Stage::Geometry) { 163 if (ctx.info.stores_viewport_index && ctx.supports_viewport_layer &&
164 ctx.stage != Stage::Geometry) {
164 header += "int gl_ViewportIndex;"; 165 header += "int gl_ViewportIndex;";
165 } 166 }
166 header += "};\n"; 167 header += "};\n";
167 if (info.stores_viewport_index && stage == Stage::Geometry) { 168 if (ctx.info.stores_viewport_index && ctx.stage == Stage::Geometry) {
168 header += "out int gl_ViewportIndex;"; 169 header += "out int gl_ViewportIndex;";
169 } 170 }
170} 171}
@@ -173,6 +174,7 @@ void SetupOutPerVertex(Stage stage, const Info& info, std::string& header) {
173EmitContext::EmitContext(IR::Program& program, Bindings& bindings, const Profile& profile_, 174EmitContext::EmitContext(IR::Program& program, Bindings& bindings, const Profile& profile_,
174 const RuntimeInfo& runtime_info_) 175 const RuntimeInfo& runtime_info_)
175 : info{program.info}, profile{profile_}, runtime_info{runtime_info_} { 176 : info{program.info}, profile{profile_}, runtime_info{runtime_info_} {
177 supports_viewport_layer = profile.support_gl_vertex_viewport_layer;
176 SetupExtensions(header); 178 SetupExtensions(header);
177 stage = program.stage; 179 stage = program.stage;
178 switch (program.stage) { 180 switch (program.stage) {
@@ -206,7 +208,7 @@ EmitContext::EmitContext(IR::Program& program, Bindings& bindings, const Profile
206 program.workgroup_size[2]); 208 program.workgroup_size[2]);
207 break; 209 break;
208 } 210 }
209 SetupOutPerVertex(stage, info, header); 211 SetupOutPerVertex(*this, header);
210 for (size_t index = 0; index < info.input_generics.size(); ++index) { 212 for (size_t index = 0; index < info.input_generics.size(); ++index) {
211 const auto& generic{info.input_generics[index]}; 213 const auto& generic{info.input_generics[index]};
212 if (generic.used) { 214 if (generic.used) {
@@ -276,7 +278,7 @@ void EmitContext::SetupExtensions(std::string&) {
276 header += "#extension GL_ARB_gpu_shader_int64 : enable\n"; 278 header += "#extension GL_ARB_gpu_shader_int64 : enable\n";
277 } 279 }
278 } 280 }
279 if (info.stores_viewport_index && stage != Stage::Geometry) { 281 if (info.stores_viewport_index && supports_viewport_layer && stage != Stage::Geometry) {
280 header += "#extension GL_ARB_shader_viewport_layer_array : enable\n"; 282 header += "#extension GL_ARB_shader_viewport_layer_array : enable\n";
281 } 283 }
282} 284}
diff --git a/src/shader_recompiler/backend/glsl/emit_context.h b/src/shader_recompiler/backend/glsl/emit_context.h
index 5d48675e6..26a76f8a3 100644
--- a/src/shader_recompiler/backend/glsl/emit_context.h
+++ b/src/shader_recompiler/backend/glsl/emit_context.h
@@ -159,6 +159,7 @@ public:
159 159
160 bool uses_y_direction{}; 160 bool uses_y_direction{};
161 bool uses_cc_carry{}; 161 bool uses_cc_carry{};
162 bool supports_viewport_layer{};
162 163
163private: 164private:
164 void SetupExtensions(std::string& header); 165 void SetupExtensions(std::string& header);
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 c48492a17..ebaf50abd 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
@@ -226,6 +226,11 @@ void EmitSetAttribute(EmitContext& ctx, IR::Attribute attr, std::string_view val
226 ctx.Add("gl_Position.{}={};", swizzle, value); 226 ctx.Add("gl_Position.{}={};", swizzle, value);
227 break; 227 break;
228 case IR::Attribute::ViewportIndex: 228 case IR::Attribute::ViewportIndex:
229 if (ctx.stage != Stage::Geometry && !ctx.supports_viewport_layer) {
230 // LOG_WARNING(..., "Shader stores viewport index but device does not support viewport
231 // layer extension");
232 break;
233 }
229 ctx.Add("gl_ViewportIndex=floatBitsToInt({});", value); 234 ctx.Add("gl_ViewportIndex=floatBitsToInt({});", value);
230 break; 235 break;
231 case IR::Attribute::ClipDistance0: 236 case IR::Attribute::ClipDistance0:
diff --git a/src/shader_recompiler/profile.h b/src/shader_recompiler/profile.h
index 5d269368a..420117132 100644
--- a/src/shader_recompiler/profile.h
+++ b/src/shader_recompiler/profile.h
@@ -85,6 +85,7 @@ struct Profile {
85 bool support_derivative_control{}; 85 bool support_derivative_control{};
86 bool support_gl_nv_gpu_shader_5{}; 86 bool support_gl_nv_gpu_shader_5{};
87 bool support_gl_amd_gpu_shader_half_float{}; 87 bool support_gl_amd_gpu_shader_half_float{};
88 bool support_gl_vertex_viewport_layer{};
88 89
89 bool warp_size_potentially_larger_than_guest{}; 90 bool warp_size_potentially_larger_than_guest{};
90 91