summaryrefslogtreecommitdiff
path: root/src/video_core/renderer_opengl
diff options
context:
space:
mode:
authorGravatar ReinUsesLisp2019-10-28 02:31:05 -0300
committerGravatar ReinUsesLisp2019-10-29 20:53:48 -0300
commita993df1ee294b861eef4f35fccabeecd05754f2a (patch)
tree04150cb66c138c75f6a4fc47218bb2255af7e234 /src/video_core/renderer_opengl
parentMerge pull request #3004 from ReinUsesLisp/maxwell3d-cleanup (diff)
downloadyuzu-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.cpp19
-rw-r--r--src/video_core/renderer_opengl/gl_shader_decompiler.cpp12
-rw-r--r--src/video_core/renderer_opengl/gl_shader_decompiler.h3
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
83struct ShaderEntries { 83struct 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};