|
|
|
@ -760,61 +760,8 @@ Texture::TSCEntry Maxwell3D::GetTSCEntry(u32 tsc_index) const { |
|
|
|
return tsc_entry; |
|
|
|
} |
|
|
|
|
|
|
|
std::vector<Texture::FullTextureInfo> Maxwell3D::GetStageTextures(Regs::ShaderStage stage) const { |
|
|
|
std::vector<Texture::FullTextureInfo> textures; |
|
|
|
|
|
|
|
auto& fragment_shader = state.shader_stages[static_cast<std::size_t>(stage)]; |
|
|
|
auto& tex_info_buffer = fragment_shader.const_buffers[regs.tex_cb_index]; |
|
|
|
ASSERT(tex_info_buffer.enabled && tex_info_buffer.address != 0); |
|
|
|
|
|
|
|
GPUVAddr tex_info_buffer_end = tex_info_buffer.address + tex_info_buffer.size; |
|
|
|
|
|
|
|
// Offset into the texture constbuffer where the texture info begins.
|
|
|
|
static constexpr std::size_t TextureInfoOffset = 0x20; |
|
|
|
|
|
|
|
for (GPUVAddr current_texture = tex_info_buffer.address + TextureInfoOffset; |
|
|
|
current_texture < tex_info_buffer_end; current_texture += sizeof(Texture::TextureHandle)) { |
|
|
|
|
|
|
|
const Texture::TextureHandle tex_handle{memory_manager.Read<u32>(current_texture)}; |
|
|
|
|
|
|
|
Texture::FullTextureInfo tex_info{}; |
|
|
|
// TODO(Subv): Use the shader to determine which textures are actually accessed.
|
|
|
|
tex_info.index = |
|
|
|
static_cast<u32>(current_texture - tex_info_buffer.address - TextureInfoOffset) / |
|
|
|
sizeof(Texture::TextureHandle); |
|
|
|
|
|
|
|
// Load the TIC data.
|
|
|
|
auto tic_entry = GetTICEntry(tex_handle.tic_id); |
|
|
|
// TODO(Subv): Workaround for BitField's move constructor being deleted.
|
|
|
|
std::memcpy(&tex_info.tic, &tic_entry, sizeof(tic_entry)); |
|
|
|
|
|
|
|
// Load the TSC data
|
|
|
|
auto tsc_entry = GetTSCEntry(tex_handle.tsc_id); |
|
|
|
// TODO(Subv): Workaround for BitField's move constructor being deleted.
|
|
|
|
std::memcpy(&tex_info.tsc, &tsc_entry, sizeof(tsc_entry)); |
|
|
|
|
|
|
|
textures.push_back(tex_info); |
|
|
|
} |
|
|
|
|
|
|
|
return textures; |
|
|
|
} |
|
|
|
|
|
|
|
Texture::FullTextureInfo Maxwell3D::GetTextureInfo(const Texture::TextureHandle tex_handle, |
|
|
|
std::size_t offset) const { |
|
|
|
Texture::FullTextureInfo tex_info{}; |
|
|
|
tex_info.index = static_cast<u32>(offset); |
|
|
|
|
|
|
|
// Load the TIC data.
|
|
|
|
auto tic_entry = GetTICEntry(tex_handle.tic_id); |
|
|
|
// TODO(Subv): Workaround for BitField's move constructor being deleted.
|
|
|
|
std::memcpy(&tex_info.tic, &tic_entry, sizeof(tic_entry)); |
|
|
|
|
|
|
|
// Load the TSC data
|
|
|
|
auto tsc_entry = GetTSCEntry(tex_handle.tsc_id); |
|
|
|
// TODO(Subv): Workaround for BitField's move constructor being deleted.
|
|
|
|
std::memcpy(&tex_info.tsc, &tsc_entry, sizeof(tsc_entry)); |
|
|
|
|
|
|
|
return tex_info; |
|
|
|
Texture::FullTextureInfo Maxwell3D::GetTextureInfo(Texture::TextureHandle tex_handle) const { |
|
|
|
return Texture::FullTextureInfo{GetTICEntry(tex_handle.tic_id), GetTSCEntry(tex_handle.tsc_id)}; |
|
|
|
} |
|
|
|
|
|
|
|
Texture::FullTextureInfo Maxwell3D::GetStageTexture(Regs::ShaderStage stage, |
|
|
|
@ -830,7 +777,7 @@ Texture::FullTextureInfo Maxwell3D::GetStageTexture(Regs::ShaderStage stage, |
|
|
|
|
|
|
|
const Texture::TextureHandle tex_handle{memory_manager.Read<u32>(tex_info_address)}; |
|
|
|
|
|
|
|
return GetTextureInfo(tex_handle, offset); |
|
|
|
return GetTextureInfo(tex_handle); |
|
|
|
} |
|
|
|
|
|
|
|
u32 Maxwell3D::GetRegisterValue(u32 method) const { |
|
|
|
@ -867,7 +814,7 @@ SamplerDescriptor Maxwell3D::AccessBindlessSampler(ShaderType stage, u64 const_b |
|
|
|
const GPUVAddr tex_info_address = tex_info_buffer.address + offset; |
|
|
|
|
|
|
|
const Texture::TextureHandle tex_handle{memory_manager.Read<u32>(tex_info_address)}; |
|
|
|
const Texture::FullTextureInfo tex_info = GetTextureInfo(tex_handle, offset); |
|
|
|
const Texture::FullTextureInfo tex_info = GetTextureInfo(tex_handle); |
|
|
|
SamplerDescriptor result = SamplerDescriptor::FromTicTexture(tex_info.tic.texture_type.Value()); |
|
|
|
result.is_shadow.Assign(tex_info.tsc.depth_compare_enabled.Value()); |
|
|
|
return result; |
|
|
|
|