shader: Implement texture buffers
This commit is contained in:
parent
dcaf0e9150
commit
1f3eb601ac
10 changed files with 158 additions and 39 deletions
|
@ -93,6 +93,9 @@ public:
|
|||
for ([[maybe_unused]] const auto& desc : info.texture_descriptors) {
|
||||
Add(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, stage);
|
||||
}
|
||||
for (const auto& desc : info.texture_buffer_descriptors) {
|
||||
Add(VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER, stage);
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
|
@ -146,6 +149,8 @@ inline VideoCommon::ImageViewType CastType(Shader::TextureType type) {
|
|||
case Shader::TextureType::ColorArrayCube:
|
||||
case Shader::TextureType::ShadowArrayCube:
|
||||
return VideoCommon::ImageViewType::CubeArray;
|
||||
case Shader::TextureType::Buffer:
|
||||
break;
|
||||
}
|
||||
UNREACHABLE_MSG("Invalid texture type {}", type);
|
||||
return {};
|
||||
|
@ -161,6 +166,11 @@ inline void PushImageDescriptors(const Shader::Info& info, const VkSampler* samp
|
|||
update_descriptor_queue.AddSampledImage(vk_image_view, sampler);
|
||||
++index;
|
||||
}
|
||||
for (const auto& desc : info.texture_buffer_descriptors) {
|
||||
ImageView& image_view{texture_cache.GetImageView(image_view_ids[index])};
|
||||
update_descriptor_queue.AddTexelBuffer(image_view.BufferView());
|
||||
++index;
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace Vulkan
|
||||
|
|
|
@ -93,20 +93,23 @@ void ComputePipeline::Configure(Tegra::Engines::KeplerCompute& kepler_compute,
|
|||
const auto& launch_desc{kepler_compute.launch_description};
|
||||
const auto& cbufs{launch_desc.const_buffer_config};
|
||||
const bool via_header_index{launch_desc.linked_tsc};
|
||||
for (const auto& desc : info.texture_descriptors) {
|
||||
const u32 cbuf_index{desc.cbuf_index};
|
||||
const u32 cbuf_offset{desc.cbuf_offset};
|
||||
const auto read_handle{[&](u32 cbuf_index, u32 cbuf_offset) {
|
||||
ASSERT(((launch_desc.const_buffer_enable_mask >> cbuf_index) & 1) != 0);
|
||||
|
||||
const GPUVAddr addr{cbufs[cbuf_index].Address() + cbuf_offset};
|
||||
const u32 raw_handle{gpu_memory.Read<u32>(addr)};
|
||||
|
||||
const TextureHandle handle(raw_handle, via_header_index);
|
||||
return TextureHandle(raw_handle, via_header_index);
|
||||
}};
|
||||
for (const auto& desc : info.texture_descriptors) {
|
||||
const TextureHandle handle{read_handle(desc.cbuf_index, desc.cbuf_offset)};
|
||||
image_view_indices.push_back(handle.image);
|
||||
|
||||
Sampler* const sampler = texture_cache.GetComputeSampler(handle.sampler);
|
||||
samplers.push_back(sampler->Handle());
|
||||
}
|
||||
for (const auto& desc : info.texture_buffer_descriptors) {
|
||||
const TextureHandle handle{read_handle(desc.cbuf_index, desc.cbuf_offset)};
|
||||
image_view_indices.push_back(handle.image);
|
||||
}
|
||||
const std::span indices_span(image_view_indices.data(), image_view_indices.size());
|
||||
texture_cache.FillComputeImageViews(indices_span, image_view_ids);
|
||||
|
||||
|
|
|
@ -169,19 +169,23 @@ void GraphicsPipeline::Configure(bool is_indexed) {
|
|||
++index;
|
||||
}
|
||||
const auto& cbufs{maxwell3d.state.shader_stages[stage].const_buffers};
|
||||
for (const auto& desc : info.texture_descriptors) {
|
||||
const u32 cbuf_index{desc.cbuf_index};
|
||||
const u32 cbuf_offset{desc.cbuf_offset};
|
||||
const auto read_handle{[&](u32 cbuf_index, u32 cbuf_offset) {
|
||||
ASSERT(cbufs[cbuf_index].enabled);
|
||||
const GPUVAddr addr{cbufs[cbuf_index].address + cbuf_offset};
|
||||
const u32 raw_handle{gpu_memory.Read<u32>(addr)};
|
||||
|
||||
const TextureHandle handle(raw_handle, via_header_index);
|
||||
return TextureHandle(raw_handle, via_header_index);
|
||||
}};
|
||||
for (const auto& desc : info.texture_descriptors) {
|
||||
const TextureHandle handle{read_handle(desc.cbuf_index, desc.cbuf_offset)};
|
||||
image_view_indices.push_back(handle.image);
|
||||
|
||||
Sampler* const sampler{texture_cache.GetGraphicsSampler(handle.sampler)};
|
||||
samplers.push_back(sampler->Handle());
|
||||
}
|
||||
for (const auto& desc : info.texture_buffer_descriptors) {
|
||||
const TextureHandle handle{read_handle(desc.cbuf_index, desc.cbuf_offset)};
|
||||
image_view_indices.push_back(handle.image);
|
||||
}
|
||||
}
|
||||
const std::span indices_span(image_view_indices.data(), image_view_indices.size());
|
||||
buffer_cache.UpdateGraphicsBuffers(is_indexed);
|
||||
|
|
|
@ -212,7 +212,7 @@ protected:
|
|||
case Tegra::Texture::TextureType::Texture2DArray:
|
||||
return Shader::TextureType::ColorArray2D;
|
||||
case Tegra::Texture::TextureType::Texture1DBuffer:
|
||||
throw Shader::NotImplementedException("Texture buffer");
|
||||
return Shader::TextureType::Buffer;
|
||||
case Tegra::Texture::TextureType::TextureCubeArray:
|
||||
return Shader::TextureType::ColorArrayCube;
|
||||
default:
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue