diff options
| author | 2019-10-28 02:31:05 -0300 | |
|---|---|---|
| committer | 2019-10-29 20:53:48 -0300 | |
| commit | a993df1ee294b861eef4f35fccabeecd05754f2a (patch) | |
| tree | 04150cb66c138c75f6a4fc47218bb2255af7e234 /src/video_core/renderer_opengl | |
| parent | Merge pull request #3004 from ReinUsesLisp/maxwell3d-cleanup (diff) | |
| download | yuzu-a993df1ee294b861eef4f35fccabeecd05754f2a.tar.gz yuzu-a993df1ee294b861eef4f35fccabeecd05754f2a.tar.xz yuzu-a993df1ee294b861eef4f35fccabeecd05754f2a.zip | |
shader/node: Unpack bindless texture encoding
Bindless textures were using u64 to pack the buffer and offset from
where they come from. Drop this in favor of separated entries in the
struct.
Remove the usage of std::set in favor of std::list (it's not std::vector
to avoid reference invalidations) for samplers and images.
Diffstat (limited to 'src/video_core/renderer_opengl')
| -rw-r--r-- | src/video_core/renderer_opengl/gl_rasterizer.cpp | 19 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_shader_decompiler.cpp | 12 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_shader_decompiler.h | 3 |
3 files changed, 14 insertions, 20 deletions
diff --git a/src/video_core/renderer_opengl/gl_rasterizer.cpp b/src/video_core/renderer_opengl/gl_rasterizer.cpp index 43032e9a7..35fc094a8 100644 --- a/src/video_core/renderer_opengl/gl_rasterizer.cpp +++ b/src/video_core/renderer_opengl/gl_rasterizer.cpp | |||
| @@ -973,10 +973,9 @@ TextureBufferUsage RasterizerOpenGL::SetupDrawTextures(Maxwell::ShaderStage stag | |||
| 973 | if (!entry.IsBindless()) { | 973 | if (!entry.IsBindless()) { |
| 974 | return maxwell3d.GetStageTexture(stage, entry.GetOffset()); | 974 | return maxwell3d.GetStageTexture(stage, entry.GetOffset()); |
| 975 | } | 975 | } |
| 976 | const auto cbuf = entry.GetBindlessCBuf(); | 976 | const auto shader_type = static_cast<Tegra::Engines::ShaderType>(stage); |
| 977 | Tegra::Texture::TextureHandle tex_handle; | 977 | const Tegra::Texture::TextureHandle tex_handle = |
| 978 | Tegra::Engines::ShaderType shader_type = static_cast<Tegra::Engines::ShaderType>(stage); | 978 | maxwell3d.AccessConstBuffer32(shader_type, entry.GetBuffer(), entry.GetOffset()); |
| 979 | tex_handle.raw = maxwell3d.AccessConstBuffer32(shader_type, cbuf.first, cbuf.second); | ||
| 980 | return maxwell3d.GetTextureInfo(tex_handle); | 979 | return maxwell3d.GetTextureInfo(tex_handle); |
| 981 | }(); | 980 | }(); |
| 982 | 981 | ||
| @@ -1004,10 +1003,8 @@ TextureBufferUsage RasterizerOpenGL::SetupComputeTextures(const Shader& kernel) | |||
| 1004 | if (!entry.IsBindless()) { | 1003 | if (!entry.IsBindless()) { |
| 1005 | return compute.GetTexture(entry.GetOffset()); | 1004 | return compute.GetTexture(entry.GetOffset()); |
| 1006 | } | 1005 | } |
| 1007 | const auto cbuf = entry.GetBindlessCBuf(); | 1006 | const Tegra::Texture::TextureHandle tex_handle = compute.AccessConstBuffer32( |
| 1008 | Tegra::Texture::TextureHandle tex_handle; | 1007 | Tegra::Engines::ShaderType::Compute, entry.GetBuffer(), entry.GetOffset()); |
| 1009 | tex_handle.raw = compute.AccessConstBuffer32(Tegra::Engines::ShaderType::Compute, | ||
| 1010 | cbuf.first, cbuf.second); | ||
| 1011 | return compute.GetTextureInfo(tex_handle); | 1008 | return compute.GetTextureInfo(tex_handle); |
| 1012 | }(); | 1009 | }(); |
| 1013 | 1010 | ||
| @@ -1050,10 +1047,8 @@ void RasterizerOpenGL::SetupComputeImages(const Shader& shader) { | |||
| 1050 | if (!entry.IsBindless()) { | 1047 | if (!entry.IsBindless()) { |
| 1051 | return compute.GetTexture(entry.GetOffset()).tic; | 1048 | return compute.GetTexture(entry.GetOffset()).tic; |
| 1052 | } | 1049 | } |
| 1053 | const auto cbuf = entry.GetBindlessCBuf(); | 1050 | const Tegra::Texture::TextureHandle tex_handle = compute.AccessConstBuffer32( |
| 1054 | Tegra::Texture::TextureHandle tex_handle; | 1051 | Tegra::Engines::ShaderType::Compute, entry.GetBuffer(), entry.GetOffset()); |
| 1055 | tex_handle.raw = compute.AccessConstBuffer32(Tegra::Engines::ShaderType::Compute, | ||
| 1056 | cbuf.first, cbuf.second); | ||
| 1057 | return compute.GetTextureInfo(tex_handle).tic; | 1052 | return compute.GetTextureInfo(tex_handle).tic; |
| 1058 | }(); | 1053 | }(); |
| 1059 | SetupImage(bindpoint, tic, entry); | 1054 | SetupImage(bindpoint, tic, entry); |
diff --git a/src/video_core/renderer_opengl/gl_shader_decompiler.cpp b/src/video_core/renderer_opengl/gl_shader_decompiler.cpp index 030550c53..92ee8459e 100644 --- a/src/video_core/renderer_opengl/gl_shader_decompiler.cpp +++ b/src/video_core/renderer_opengl/gl_shader_decompiler.cpp | |||
| @@ -735,7 +735,7 @@ private: | |||
| 735 | 735 | ||
| 736 | void DeclareImages() { | 736 | void DeclareImages() { |
| 737 | const auto& images{ir.GetImages()}; | 737 | const auto& images{ir.GetImages()}; |
| 738 | for (const auto& [offset, image] : images) { | 738 | for (const auto& image : images) { |
| 739 | std::string qualifier = "coherent volatile"; | 739 | std::string qualifier = "coherent volatile"; |
| 740 | if (image.IsRead() && !image.IsWritten()) { | 740 | if (image.IsRead() && !image.IsWritten()) { |
| 741 | qualifier += " readonly"; | 741 | qualifier += " readonly"; |
| @@ -2466,16 +2466,16 @@ ShaderEntries GetEntries(const VideoCommon::Shader::ShaderIR& ir) { | |||
| 2466 | entries.const_buffers.emplace_back(cbuf.second.GetMaxOffset(), cbuf.second.IsIndirect(), | 2466 | entries.const_buffers.emplace_back(cbuf.second.GetMaxOffset(), cbuf.second.IsIndirect(), |
| 2467 | cbuf.first); | 2467 | cbuf.first); |
| 2468 | } | 2468 | } |
| 2469 | for (const auto& [base, usage] : ir.GetGlobalMemory()) { | ||
| 2470 | entries.global_memory_entries.emplace_back(base.cbuf_index, base.cbuf_offset, usage.is_read, | ||
| 2471 | usage.is_written); | ||
| 2472 | } | ||
| 2469 | for (const auto& sampler : ir.GetSamplers()) { | 2473 | for (const auto& sampler : ir.GetSamplers()) { |
| 2470 | entries.samplers.emplace_back(sampler); | 2474 | entries.samplers.emplace_back(sampler); |
| 2471 | } | 2475 | } |
| 2472 | for (const auto& [offset, image] : ir.GetImages()) { | 2476 | for (const auto& image : ir.GetImages()) { |
| 2473 | entries.images.emplace_back(image); | 2477 | entries.images.emplace_back(image); |
| 2474 | } | 2478 | } |
| 2475 | for (const auto& [base, usage] : ir.GetGlobalMemory()) { | ||
| 2476 | entries.global_memory_entries.emplace_back(base.cbuf_index, base.cbuf_offset, usage.is_read, | ||
| 2477 | usage.is_written); | ||
| 2478 | } | ||
| 2479 | entries.clip_distances = ir.GetClipDistances(); | 2479 | entries.clip_distances = ir.GetClipDistances(); |
| 2480 | entries.shader_length = ir.GetLength(); | 2480 | entries.shader_length = ir.GetLength(); |
| 2481 | return entries; | 2481 | return entries; |
diff --git a/src/video_core/renderer_opengl/gl_shader_decompiler.h b/src/video_core/renderer_opengl/gl_shader_decompiler.h index fead2a51e..b1e75e6cc 100644 --- a/src/video_core/renderer_opengl/gl_shader_decompiler.h +++ b/src/video_core/renderer_opengl/gl_shader_decompiler.h | |||
| @@ -82,10 +82,9 @@ private: | |||
| 82 | 82 | ||
| 83 | struct ShaderEntries { | 83 | struct ShaderEntries { |
| 84 | std::vector<ConstBufferEntry> const_buffers; | 84 | std::vector<ConstBufferEntry> const_buffers; |
| 85 | std::vector<GlobalMemoryEntry> global_memory_entries; | ||
| 85 | std::vector<SamplerEntry> samplers; | 86 | std::vector<SamplerEntry> samplers; |
| 86 | std::vector<SamplerEntry> bindless_samplers; | ||
| 87 | std::vector<ImageEntry> images; | 87 | std::vector<ImageEntry> images; |
| 88 | std::vector<GlobalMemoryEntry> global_memory_entries; | ||
| 89 | std::array<bool, Maxwell::NumClipDistances> clip_distances{}; | 88 | std::array<bool, Maxwell::NumClipDistances> clip_distances{}; |
| 90 | std::size_t shader_length{}; | 89 | std::size_t shader_length{}; |
| 91 | }; | 90 | }; |