mirror of
https://git.suyu.dev/suyu/suyu.git
synced 2024-11-30 10:42:47 +01:00
Implement Bindless Handling on SetupTexture
This commit is contained in:
parent
fe392fff24
commit
7af82ca022
4 changed files with 34 additions and 18 deletions
|
@ -482,19 +482,8 @@ std::vector<Texture::FullTextureInfo> Maxwell3D::GetStageTextures(Regs::ShaderSt
|
||||||
return textures;
|
return textures;
|
||||||
}
|
}
|
||||||
|
|
||||||
Texture::FullTextureInfo Maxwell3D::GetStageTexture(Regs::ShaderStage stage,
|
Texture::FullTextureInfo Maxwell3D::GetTextureInfo(const Texture::TextureHandle tex_handle,
|
||||||
std::size_t offset) const {
|
std::size_t offset) const {
|
||||||
auto& shader = state.shader_stages[static_cast<std::size_t>(stage)];
|
|
||||||
auto& tex_info_buffer = shader.const_buffers[regs.tex_cb_index];
|
|
||||||
ASSERT(tex_info_buffer.enabled && tex_info_buffer.address != 0);
|
|
||||||
|
|
||||||
const GPUVAddr tex_info_address =
|
|
||||||
tex_info_buffer.address + offset * sizeof(Texture::TextureHandle);
|
|
||||||
|
|
||||||
ASSERT(tex_info_address < tex_info_buffer.address + tex_info_buffer.size);
|
|
||||||
|
|
||||||
const Texture::TextureHandle tex_handle{memory_manager.Read<u32>(tex_info_address)};
|
|
||||||
|
|
||||||
Texture::FullTextureInfo tex_info{};
|
Texture::FullTextureInfo tex_info{};
|
||||||
tex_info.index = static_cast<u32>(offset);
|
tex_info.index = static_cast<u32>(offset);
|
||||||
|
|
||||||
|
@ -511,6 +500,22 @@ Texture::FullTextureInfo Maxwell3D::GetStageTexture(Regs::ShaderStage stage,
|
||||||
return tex_info;
|
return tex_info;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Texture::FullTextureInfo Maxwell3D::GetStageTexture(Regs::ShaderStage stage,
|
||||||
|
std::size_t offset) const {
|
||||||
|
auto& shader = state.shader_stages[static_cast<std::size_t>(stage)];
|
||||||
|
auto& tex_info_buffer = shader.const_buffers[regs.tex_cb_index];
|
||||||
|
ASSERT(tex_info_buffer.enabled && tex_info_buffer.address != 0);
|
||||||
|
|
||||||
|
const GPUVAddr tex_info_address =
|
||||||
|
tex_info_buffer.address + offset * sizeof(Texture::TextureHandle);
|
||||||
|
|
||||||
|
ASSERT(tex_info_address < tex_info_buffer.address + tex_info_buffer.size);
|
||||||
|
|
||||||
|
const Texture::TextureHandle tex_handle{memory_manager.Read<u32>(tex_info_address)};
|
||||||
|
|
||||||
|
return GetTextureInfo(tex_handle, offset);
|
||||||
|
}
|
||||||
|
|
||||||
u32 Maxwell3D::GetRegisterValue(u32 method) const {
|
u32 Maxwell3D::GetRegisterValue(u32 method) const {
|
||||||
ASSERT_MSG(method < Regs::NUM_REGS, "Invalid Maxwell3D register");
|
ASSERT_MSG(method < Regs::NUM_REGS, "Invalid Maxwell3D register");
|
||||||
return regs.reg_array[method];
|
return regs.reg_array[method];
|
||||||
|
|
|
@ -1131,6 +1131,10 @@ public:
|
||||||
/// Write the value to the register identified by method.
|
/// Write the value to the register identified by method.
|
||||||
void CallMethod(const GPU::MethodCall& method_call);
|
void CallMethod(const GPU::MethodCall& method_call);
|
||||||
|
|
||||||
|
/// Given a Texture Handle, returns the TSC and TIC entries.
|
||||||
|
Texture::FullTextureInfo GetTextureInfo(const Texture::TextureHandle tex_handle,
|
||||||
|
std::size_t offset) const;
|
||||||
|
|
||||||
/// Returns a list of enabled textures for the specified shader stage.
|
/// Returns a list of enabled textures for the specified shader stage.
|
||||||
std::vector<Texture::FullTextureInfo> GetStageTextures(Regs::ShaderStage stage) const;
|
std::vector<Texture::FullTextureInfo> GetStageTextures(Regs::ShaderStage stage) const;
|
||||||
|
|
||||||
|
|
|
@ -985,7 +985,15 @@ void RasterizerOpenGL::SetupTextures(Maxwell::ShaderStage stage, const Shader& s
|
||||||
|
|
||||||
for (u32 bindpoint = 0; bindpoint < entries.size(); ++bindpoint) {
|
for (u32 bindpoint = 0; bindpoint < entries.size(); ++bindpoint) {
|
||||||
const auto& entry = entries[bindpoint];
|
const auto& entry = entries[bindpoint];
|
||||||
const auto texture = maxwell3d.GetStageTexture(stage, entry.GetOffset());
|
Tegra::Texture::FullTextureInfo texture;
|
||||||
|
if (!entry.IsBindless()) {
|
||||||
|
texture = maxwell3d.GetStageTexture(stage, entry.GetOffset());
|
||||||
|
} else {
|
||||||
|
const auto cbuf = entry.GetBindlessCBuf();
|
||||||
|
Tegra::Texture::TextureHandle tex_handle;
|
||||||
|
tex_handle.raw = const_buffer_accessor.access32(stage, cbuf.first, cbuf.second);
|
||||||
|
texture = maxwell3d.GetTextureInfo(tex_handle, entry.GetOffset());
|
||||||
|
}
|
||||||
const u32 current_bindpoint = base_bindings.sampler + bindpoint;
|
const u32 current_bindpoint = base_bindings.sampler + bindpoint;
|
||||||
|
|
||||||
texture_samplers[current_bindpoint].SyncWithConfig(texture.tsc);
|
texture_samplers[current_bindpoint].SyncWithConfig(texture.tsc);
|
||||||
|
|
|
@ -205,8 +205,8 @@ public:
|
||||||
// Use this constructor for bindless Samplers
|
// Use this constructor for bindless Samplers
|
||||||
explicit Sampler(u32 cbuf_index, u32 cbuf_offset, std::size_t index,
|
explicit Sampler(u32 cbuf_index, u32 cbuf_offset, std::size_t index,
|
||||||
Tegra::Shader::TextureType type, bool is_array, bool is_shadow)
|
Tegra::Shader::TextureType type, bool is_array, bool is_shadow)
|
||||||
: offset{(static_cast<u64>(cbuf_index) << 32) | cbuf_offset}, index{index}, type{type}, is_array{is_array},
|
: offset{(static_cast<u64>(cbuf_index) << 32) | cbuf_offset}, index{index}, type{type},
|
||||||
is_shadow{is_shadow}, is_bindless{true} {}
|
is_array{is_array}, is_shadow{is_shadow}, is_bindless{true} {}
|
||||||
|
|
||||||
// Use this only for serialization/deserialization
|
// Use this only for serialization/deserialization
|
||||||
explicit Sampler(std::size_t offset, std::size_t index, Tegra::Shader::TextureType type,
|
explicit Sampler(std::size_t offset, std::size_t index, Tegra::Shader::TextureType type,
|
||||||
|
@ -214,7 +214,6 @@ public:
|
||||||
: offset{offset}, index{index}, type{type}, is_array{is_array}, is_shadow{is_shadow},
|
: offset{offset}, index{index}, type{type}, is_array{is_array}, is_shadow{is_shadow},
|
||||||
is_bindless{is_bindless} {}
|
is_bindless{is_bindless} {}
|
||||||
|
|
||||||
|
|
||||||
std::size_t GetOffset() const {
|
std::size_t GetOffset() const {
|
||||||
return offset;
|
return offset;
|
||||||
}
|
}
|
||||||
|
@ -239,7 +238,7 @@ public:
|
||||||
return is_bindless;
|
return is_bindless;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::pair<u32, u32> GetBindlessCBuf() {
|
std::pair<u32, u32> GetBindlessCBuf() const {
|
||||||
return {offset >> 32, offset & 0x00000000FFFFFFFFULL};
|
return {offset >> 32, offset & 0x00000000FFFFFFFFULL};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue