diff options
| author | 2019-09-05 16:03:46 -0400 | |
|---|---|---|
| committer | 2019-09-05 16:03:46 -0400 | |
| commit | 4ee99496392b59a1de4dcb2868b9a15769e4da19 (patch) | |
| tree | 1e313f424f818c2c31c85003a2c77c7ddd81cd2a /src | |
| parent | Merge pull request #2833 from ReinUsesLisp/fix-stencil (diff) | |
| parent | gl_shader_cache: Remove special casing for geometry shaders (diff) | |
| download | yuzu-4ee99496392b59a1de4dcb2868b9a15769e4da19.tar.gz yuzu-4ee99496392b59a1de4dcb2868b9a15769e4da19.tar.xz yuzu-4ee99496392b59a1de4dcb2868b9a15769e4da19.zip | |
Merge pull request #2804 from ReinUsesLisp/remove-gs-special
gl_shader_cache: Remove special casing for geometry shaders
Diffstat (limited to '')
| -rw-r--r-- | src/video_core/renderer_opengl/gl_shader_cache.cpp | 68 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_shader_cache.h | 21 |
2 files changed, 9 insertions, 80 deletions
diff --git a/src/video_core/renderer_opengl/gl_shader_cache.cpp b/src/video_core/renderer_opengl/gl_shader_cache.cpp index cf6a5cddf..909ccb82c 100644 --- a/src/video_core/renderer_opengl/gl_shader_cache.cpp +++ b/src/video_core/renderer_opengl/gl_shader_cache.cpp | |||
| @@ -348,23 +348,16 @@ Shader CachedShader::CreateKernelFromCache(const ShaderParameters& params, | |||
| 348 | } | 348 | } |
| 349 | 349 | ||
| 350 | std::tuple<GLuint, BaseBindings> CachedShader::GetProgramHandle(const ProgramVariant& variant) { | 350 | std::tuple<GLuint, BaseBindings> CachedShader::GetProgramHandle(const ProgramVariant& variant) { |
| 351 | GLuint handle{}; | 351 | const auto [entry, is_cache_miss] = programs.try_emplace(variant); |
| 352 | if (program_type == ProgramType::Geometry) { | 352 | auto& program = entry->second; |
| 353 | handle = GetGeometryShader(variant); | 353 | if (is_cache_miss) { |
| 354 | } else { | 354 | program = TryLoadProgram(variant); |
| 355 | const auto [entry, is_cache_miss] = programs.try_emplace(variant); | 355 | if (!program) { |
| 356 | auto& program = entry->second; | 356 | program = SpecializeShader(code, entries, program_type, variant); |
| 357 | if (is_cache_miss) { | 357 | disk_cache.SaveUsage(GetUsage(variant)); |
| 358 | program = TryLoadProgram(variant); | ||
| 359 | if (!program) { | ||
| 360 | program = SpecializeShader(code, entries, program_type, variant); | ||
| 361 | disk_cache.SaveUsage(GetUsage(variant)); | ||
| 362 | } | ||
| 363 | |||
| 364 | LabelGLObject(GL_PROGRAM, program->handle, cpu_addr); | ||
| 365 | } | 358 | } |
| 366 | 359 | ||
| 367 | handle = program->handle; | 360 | LabelGLObject(GL_PROGRAM, program->handle, cpu_addr); |
| 368 | } | 361 | } |
| 369 | 362 | ||
| 370 | auto base_bindings = variant.base_bindings; | 363 | auto base_bindings = variant.base_bindings; |
| @@ -375,52 +368,9 @@ std::tuple<GLuint, BaseBindings> CachedShader::GetProgramHandle(const ProgramVar | |||
| 375 | base_bindings.gmem += static_cast<u32>(entries.global_memory_entries.size()); | 368 | base_bindings.gmem += static_cast<u32>(entries.global_memory_entries.size()); |
| 376 | base_bindings.sampler += static_cast<u32>(entries.samplers.size()); | 369 | base_bindings.sampler += static_cast<u32>(entries.samplers.size()); |
| 377 | 370 | ||
| 378 | return {handle, base_bindings}; | 371 | return {program->handle, base_bindings}; |
| 379 | } | 372 | } |
| 380 | 373 | ||
| 381 | GLuint CachedShader::GetGeometryShader(const ProgramVariant& variant) { | ||
| 382 | const auto [entry, is_cache_miss] = geometry_programs.try_emplace(variant); | ||
| 383 | auto& programs = entry->second; | ||
| 384 | |||
| 385 | switch (variant.primitive_mode) { | ||
| 386 | case GL_POINTS: | ||
| 387 | return LazyGeometryProgram(programs.points, variant); | ||
| 388 | case GL_LINES: | ||
| 389 | case GL_LINE_STRIP: | ||
| 390 | return LazyGeometryProgram(programs.lines, variant); | ||
| 391 | case GL_LINES_ADJACENCY: | ||
| 392 | case GL_LINE_STRIP_ADJACENCY: | ||
| 393 | return LazyGeometryProgram(programs.lines_adjacency, variant); | ||
| 394 | case GL_TRIANGLES: | ||
| 395 | case GL_TRIANGLE_STRIP: | ||
| 396 | case GL_TRIANGLE_FAN: | ||
| 397 | return LazyGeometryProgram(programs.triangles, variant); | ||
| 398 | case GL_TRIANGLES_ADJACENCY: | ||
| 399 | case GL_TRIANGLE_STRIP_ADJACENCY: | ||
| 400 | return LazyGeometryProgram(programs.triangles_adjacency, variant); | ||
| 401 | default: | ||
| 402 | UNREACHABLE_MSG("Unknown primitive mode."); | ||
| 403 | return LazyGeometryProgram(programs.points, variant); | ||
| 404 | } | ||
| 405 | } | ||
| 406 | |||
| 407 | GLuint CachedShader::LazyGeometryProgram(CachedProgram& target_program, | ||
| 408 | const ProgramVariant& variant) { | ||
| 409 | if (target_program) { | ||
| 410 | return target_program->handle; | ||
| 411 | } | ||
| 412 | const auto [glsl_name, debug_name, vertices] = GetPrimitiveDescription(variant.primitive_mode); | ||
| 413 | target_program = TryLoadProgram(variant); | ||
| 414 | if (!target_program) { | ||
| 415 | target_program = SpecializeShader(code, entries, program_type, variant); | ||
| 416 | disk_cache.SaveUsage(GetUsage(variant)); | ||
| 417 | } | ||
| 418 | |||
| 419 | LabelGLObject(GL_PROGRAM, target_program->handle, cpu_addr, debug_name); | ||
| 420 | |||
| 421 | return target_program->handle; | ||
| 422 | }; | ||
| 423 | |||
| 424 | CachedProgram CachedShader::TryLoadProgram(const ProgramVariant& variant) const { | 374 | CachedProgram CachedShader::TryLoadProgram(const ProgramVariant& variant) const { |
| 425 | const auto found = precompiled_programs.find(GetUsage(variant)); | 375 | const auto found = precompiled_programs.find(GetUsage(variant)); |
| 426 | if (found == precompiled_programs.end()) { | 376 | if (found == precompiled_programs.end()) { |
diff --git a/src/video_core/renderer_opengl/gl_shader_cache.h b/src/video_core/renderer_opengl/gl_shader_cache.h index 2c8faf855..de195cc5d 100644 --- a/src/video_core/renderer_opengl/gl_shader_cache.h +++ b/src/video_core/renderer_opengl/gl_shader_cache.h | |||
| @@ -86,22 +86,6 @@ private: | |||
| 86 | explicit CachedShader(const ShaderParameters& params, ProgramType program_type, | 86 | explicit CachedShader(const ShaderParameters& params, ProgramType program_type, |
| 87 | GLShader::ProgramResult result); | 87 | GLShader::ProgramResult result); |
| 88 | 88 | ||
| 89 | // Geometry programs. These are needed because GLSL needs an input topology but it's not | ||
| 90 | // declared by the hardware. Workaround this issue by generating a different shader per input | ||
| 91 | // topology class. | ||
| 92 | struct GeometryPrograms { | ||
| 93 | CachedProgram points; | ||
| 94 | CachedProgram lines; | ||
| 95 | CachedProgram lines_adjacency; | ||
| 96 | CachedProgram triangles; | ||
| 97 | CachedProgram triangles_adjacency; | ||
| 98 | }; | ||
| 99 | |||
| 100 | GLuint GetGeometryShader(const ProgramVariant& variant); | ||
| 101 | |||
| 102 | /// Generates a geometry shader or returns one that already exists. | ||
| 103 | GLuint LazyGeometryProgram(CachedProgram& target_program, const ProgramVariant& variant); | ||
| 104 | |||
| 105 | CachedProgram TryLoadProgram(const ProgramVariant& variant) const; | 89 | CachedProgram TryLoadProgram(const ProgramVariant& variant) const; |
| 106 | 90 | ||
| 107 | ShaderDiskCacheUsage GetUsage(const ProgramVariant& variant) const; | 91 | ShaderDiskCacheUsage GetUsage(const ProgramVariant& variant) const; |
| @@ -117,11 +101,6 @@ private: | |||
| 117 | std::size_t shader_length{}; | 101 | std::size_t shader_length{}; |
| 118 | 102 | ||
| 119 | std::unordered_map<ProgramVariant, CachedProgram> programs; | 103 | std::unordered_map<ProgramVariant, CachedProgram> programs; |
| 120 | std::unordered_map<ProgramVariant, GeometryPrograms> geometry_programs; | ||
| 121 | |||
| 122 | std::unordered_map<u32, GLuint> cbuf_resource_cache; | ||
| 123 | std::unordered_map<u32, GLuint> gmem_resource_cache; | ||
| 124 | std::unordered_map<u32, GLint> uniform_cache; | ||
| 125 | }; | 104 | }; |
| 126 | 105 | ||
| 127 | class ShaderCacheOpenGL final : public RasterizerCache<Shader> { | 106 | class ShaderCacheOpenGL final : public RasterizerCache<Shader> { |