shader: Simplify indexed sampler usages
This commit is contained in:
parent
2b4cdb73b6
commit
1dda77d392
|
@ -36,6 +36,7 @@ namespace OpenGL {
|
||||||
|
|
||||||
using Maxwell = Tegra::Engines::Maxwell3D::Regs;
|
using Maxwell = Tegra::Engines::Maxwell3D::Regs;
|
||||||
|
|
||||||
|
using Tegra::Engines::ShaderType;
|
||||||
using VideoCore::Surface::PixelFormat;
|
using VideoCore::Surface::PixelFormat;
|
||||||
using VideoCore::Surface::SurfaceTarget;
|
using VideoCore::Surface::SurfaceTarget;
|
||||||
using VideoCore::Surface::SurfaceType;
|
using VideoCore::Surface::SurfaceType;
|
||||||
|
@ -56,8 +57,7 @@ namespace {
|
||||||
|
|
||||||
template <typename Engine, typename Entry>
|
template <typename Engine, typename Entry>
|
||||||
Tegra::Texture::FullTextureInfo GetTextureInfo(const Engine& engine, const Entry& entry,
|
Tegra::Texture::FullTextureInfo GetTextureInfo(const Engine& engine, const Entry& entry,
|
||||||
Tegra::Engines::ShaderType shader_type,
|
ShaderType shader_type, std::size_t index = 0) {
|
||||||
std::size_t index = 0) {
|
|
||||||
if (entry.IsBindless()) {
|
if (entry.IsBindless()) {
|
||||||
const Tegra::Texture::TextureHandle tex_handle =
|
const Tegra::Texture::TextureHandle tex_handle =
|
||||||
engine.AccessConstBuffer32(shader_type, entry.GetBuffer(), entry.GetOffset());
|
engine.AccessConstBuffer32(shader_type, entry.GetBuffer(), entry.GetOffset());
|
||||||
|
@ -910,37 +910,25 @@ void RasterizerOpenGL::SetupDrawTextures(std::size_t stage_index, const Shader&
|
||||||
const auto& maxwell3d = system.GPU().Maxwell3D();
|
const auto& maxwell3d = system.GPU().Maxwell3D();
|
||||||
u32 binding = device.GetBaseBindings(stage_index).sampler;
|
u32 binding = device.GetBaseBindings(stage_index).sampler;
|
||||||
for (const auto& entry : shader->GetShaderEntries().samplers) {
|
for (const auto& entry : shader->GetShaderEntries().samplers) {
|
||||||
const auto shader_type = static_cast<Tegra::Engines::ShaderType>(stage_index);
|
const auto shader_type = static_cast<ShaderType>(stage_index);
|
||||||
if (!entry.IsIndexed()) {
|
|
||||||
const auto texture = GetTextureInfo(maxwell3d, entry, shader_type);
|
|
||||||
SetupTexture(binding++, texture, entry);
|
|
||||||
} else {
|
|
||||||
for (std::size_t i = 0; i < entry.Size(); ++i) {
|
for (std::size_t i = 0; i < entry.Size(); ++i) {
|
||||||
const auto texture = GetTextureInfo(maxwell3d, entry, shader_type, i);
|
const auto texture = GetTextureInfo(maxwell3d, entry, shader_type, i);
|
||||||
SetupTexture(binding++, texture, entry);
|
SetupTexture(binding++, texture, entry);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
void RasterizerOpenGL::SetupComputeTextures(const Shader& kernel) {
|
void RasterizerOpenGL::SetupComputeTextures(const Shader& kernel) {
|
||||||
MICROPROFILE_SCOPE(OpenGL_Texture);
|
MICROPROFILE_SCOPE(OpenGL_Texture);
|
||||||
const auto& compute = system.GPU().KeplerCompute();
|
const auto& compute = system.GPU().KeplerCompute();
|
||||||
u32 binding = 0;
|
u32 binding = 0;
|
||||||
for (const auto& entry : kernel->GetShaderEntries().samplers) {
|
for (const auto& entry : kernel->GetShaderEntries().samplers) {
|
||||||
if (!entry.IsIndexed()) {
|
|
||||||
const auto texture =
|
|
||||||
GetTextureInfo(compute, entry, Tegra::Engines::ShaderType::Compute);
|
|
||||||
SetupTexture(binding++, texture, entry);
|
|
||||||
} else {
|
|
||||||
for (std::size_t i = 0; i < entry.Size(); ++i) {
|
for (std::size_t i = 0; i < entry.Size(); ++i) {
|
||||||
const auto texture =
|
const auto texture = GetTextureInfo(compute, entry, ShaderType::Compute, i);
|
||||||
GetTextureInfo(compute, entry, Tegra::Engines::ShaderType::Compute, i);
|
|
||||||
SetupTexture(binding++, texture, entry);
|
SetupTexture(binding++, texture, entry);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
void RasterizerOpenGL::SetupTexture(u32 binding, const Tegra::Texture::FullTextureInfo& texture,
|
void RasterizerOpenGL::SetupTexture(u32 binding, const Tegra::Texture::FullTextureInfo& texture,
|
||||||
const GLShader::SamplerEntry& entry) {
|
const GLShader::SamplerEntry& entry) {
|
||||||
|
|
|
@ -299,7 +299,7 @@ private:
|
||||||
u32 index{}; ///< Emulated index given for the this sampler.
|
u32 index{}; ///< Emulated index given for the this sampler.
|
||||||
u32 offset{}; ///< Offset in the const buffer from where the sampler is being read.
|
u32 offset{}; ///< Offset in the const buffer from where the sampler is being read.
|
||||||
u32 buffer{}; ///< Buffer where the bindless sampler is being read (unused on bound samplers).
|
u32 buffer{}; ///< Buffer where the bindless sampler is being read (unused on bound samplers).
|
||||||
u32 size{}; ///< Size of the sampler if indexed.
|
u32 size{1}; ///< Size of the sampler.
|
||||||
|
|
||||||
Tegra::Shader::TextureType type{}; ///< The type used to sample this texture (Texture2D, etc)
|
Tegra::Shader::TextureType type{}; ///< The type used to sample this texture (Texture2D, etc)
|
||||||
bool is_array{}; ///< Whether the texture is being sampled as an array texture or not.
|
bool is_array{}; ///< Whether the texture is being sampled as an array texture or not.
|
||||||
|
|
Reference in New Issue