summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/video_core/renderer_opengl/gl_shader_cache.cpp33
1 files changed, 14 insertions, 19 deletions
diff --git a/src/video_core/renderer_opengl/gl_shader_cache.cpp b/src/video_core/renderer_opengl/gl_shader_cache.cpp
index 270a9dc2b..de742d11c 100644
--- a/src/video_core/renderer_opengl/gl_shader_cache.cpp
+++ b/src/video_core/renderer_opengl/gl_shader_cache.cpp
@@ -112,25 +112,25 @@ constexpr GLenum GetGLShaderType(ShaderType shader_type) {
112} 112}
113 113
114/// Describes primitive behavior on geometry shaders 114/// Describes primitive behavior on geometry shaders
115constexpr std::tuple<const char*, const char*, u32> GetPrimitiveDescription(GLenum primitive_mode) { 115constexpr std::pair<const char*, u32> GetPrimitiveDescription(GLenum primitive_mode) {
116 switch (primitive_mode) { 116 switch (primitive_mode) {
117 case GL_POINTS: 117 case GL_POINTS:
118 return {"points", "Points", 1}; 118 return {"points", 1};
119 case GL_LINES: 119 case GL_LINES:
120 case GL_LINE_STRIP: 120 case GL_LINE_STRIP:
121 return {"lines", "Lines", 2}; 121 return {"lines", 2};
122 case GL_LINES_ADJACENCY: 122 case GL_LINES_ADJACENCY:
123 case GL_LINE_STRIP_ADJACENCY: 123 case GL_LINE_STRIP_ADJACENCY:
124 return {"lines_adjacency", "LinesAdj", 4}; 124 return {"lines_adjacency", 4};
125 case GL_TRIANGLES: 125 case GL_TRIANGLES:
126 case GL_TRIANGLE_STRIP: 126 case GL_TRIANGLE_STRIP:
127 case GL_TRIANGLE_FAN: 127 case GL_TRIANGLE_FAN:
128 return {"triangles", "Triangles", 3}; 128 return {"triangles", 3};
129 case GL_TRIANGLES_ADJACENCY: 129 case GL_TRIANGLES_ADJACENCY:
130 case GL_TRIANGLE_STRIP_ADJACENCY: 130 case GL_TRIANGLE_STRIP_ADJACENCY:
131 return {"triangles_adjacency", "TrianglesAdj", 6}; 131 return {"triangles_adjacency", 6};
132 default: 132 default:
133 return {"points", "Invalid", 1}; 133 return {"points", 1};
134 } 134 }
135} 135}
136 136
@@ -264,30 +264,25 @@ CachedProgram BuildShader(const Device& device, u64 unique_identifier, ShaderTyp
264 "#extension GL_NV_shader_thread_group : require\n" 264 "#extension GL_NV_shader_thread_group : require\n"
265 "#extension GL_NV_shader_thread_shuffle : require\n"; 265 "#extension GL_NV_shader_thread_shuffle : require\n";
266 } 266 }
267 source += '\n';
268 267
269 if (shader_type == ShaderType::Geometry) { 268 if (shader_type == ShaderType::Geometry) {
270 const auto [glsl_topology, debug_name, max_vertices] = 269 const auto [glsl_topology, max_vertices] = GetPrimitiveDescription(variant.primitive_mode);
271 GetPrimitiveDescription(variant.primitive_mode);
272
273 source += fmt::format("layout ({}) in;\n\n", glsl_topology);
274 source += fmt::format("#define MAX_VERTEX_INPUT {}\n", max_vertices); 270 source += fmt::format("#define MAX_VERTEX_INPUT {}\n", max_vertices);
271 source += fmt::format("layout ({}) in;\n", glsl_topology);
275 } 272 }
276 if (shader_type == ShaderType::Compute) { 273 if (shader_type == ShaderType::Compute) {
274 if (variant.local_memory_size > 0) {
275 source += fmt::format("#define LOCAL_MEMORY_SIZE {}\n",
276 Common::AlignUp(variant.local_memory_size, 4) / 4);
277 }
277 source += 278 source +=
278 fmt::format("layout (local_size_x = {}, local_size_y = {}, local_size_z = {}) in;\n", 279 fmt::format("layout (local_size_x = {}, local_size_y = {}, local_size_z = {}) in;\n",
279 variant.block_x, variant.block_y, variant.block_z); 280 variant.block_x, variant.block_y, variant.block_z);
280 281
281 if (variant.shared_memory_size > 0) { 282 if (variant.shared_memory_size > 0) {
282 // TODO(Rodrigo): We should divide by four here, but having a larger shared memory pool 283 // shared_memory_size is described in number of words
283 // avoids out of bound stores. Find out why shared memory size is being invalid.
284 source += fmt::format("shared uint smem[{}];\n", variant.shared_memory_size); 284 source += fmt::format("shared uint smem[{}];\n", variant.shared_memory_size);
285 } 285 }
286
287 if (variant.local_memory_size > 0) {
288 source += fmt::format("#define LOCAL_MEMORY_SIZE {}\n",
289 Common::AlignUp(variant.local_memory_size, 4) / 4);
290 }
291 } 286 }
292 287
293 source += '\n'; 288 source += '\n';