mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-07-08 16:01:42 +12:00
rsx/common/d3d12: Use m_texture_dirty[i] to signal texture state change and avoid unecessary bind operation.
This commit is contained in:
parent
1f7a1e4078
commit
4efa2266e6
6 changed files with 53 additions and 26 deletions
|
@ -303,9 +303,24 @@ void D3D12GSRender::end()
|
||||||
get_current_resource_storage().command_list->SetPipelineState(std::get<0>(m_current_pso).Get());
|
get_current_resource_storage().command_list->SetPipelineState(std::get<0>(m_current_pso).Get());
|
||||||
|
|
||||||
std::chrono::time_point<std::chrono::system_clock> texture_duration_start = std::chrono::system_clock::now();
|
std::chrono::time_point<std::chrono::system_clock> texture_duration_start = std::chrono::system_clock::now();
|
||||||
if (std::get<2>(m_current_pso) > 0)
|
size_t texture_count = std::get<2>(m_current_pso);
|
||||||
|
if (texture_count > 0)
|
||||||
{
|
{
|
||||||
upload_and_bind_textures(get_current_resource_storage().command_list.Get(), currentDescriptorIndex + 3 + vertex_buffer_count, std::get<2>(m_current_pso) > 0);
|
upload_and_bind_textures(get_current_resource_storage().command_list.Get(), texture_count);
|
||||||
|
|
||||||
|
for (unsigned i = 0; i < texture_count; i++)
|
||||||
|
{
|
||||||
|
ID3D12Resource *tex_resource;
|
||||||
|
D3D12_SHADER_RESOURCE_VIEW_DESC srv;
|
||||||
|
std::tie(tex_resource, srv) = m_current_shader_resources[i];
|
||||||
|
m_device->CreateShaderResourceView(tex_resource, &srv,
|
||||||
|
CD3DX12_CPU_DESCRIPTOR_HANDLE(get_current_resource_storage().descriptors_heap->GetCPUDescriptorHandleForHeapStart())
|
||||||
|
.Offset((INT)currentDescriptorIndex + 3 + (INT)vertex_buffer_count + (INT)i, m_descriptor_stride_srv_cbv_uav)
|
||||||
|
);
|
||||||
|
m_device->CreateSampler(&m_current_samplers[i],
|
||||||
|
CD3DX12_CPU_DESCRIPTOR_HANDLE(get_current_resource_storage().sampler_descriptor_heap[get_current_resource_storage().sampler_descriptors_heap_index]->GetCPUDescriptorHandleForHeapStart())
|
||||||
|
.Offset((UINT)get_current_resource_storage().current_sampler_index + (UINT)i, m_descriptor_stride_samplers));
|
||||||
|
}
|
||||||
|
|
||||||
get_current_resource_storage().command_list->SetGraphicsRootDescriptorTable(0,
|
get_current_resource_storage().command_list->SetGraphicsRootDescriptorTable(0,
|
||||||
CD3DX12_GPU_DESCRIPTOR_HANDLE(get_current_resource_storage().descriptors_heap->GetGPUDescriptorHandleForHeapStart())
|
CD3DX12_GPU_DESCRIPTOR_HANDLE(get_current_resource_storage().descriptors_heap->GetGPUDescriptorHandleForHeapStart())
|
||||||
|
|
|
@ -127,6 +127,9 @@ private:
|
||||||
// Used to fill unused texture slot
|
// Used to fill unused texture slot
|
||||||
ID3D12Resource *m_dummy_texture;
|
ID3D12Resource *m_dummy_texture;
|
||||||
|
|
||||||
|
// Currently used shader resources / samplers descriptor
|
||||||
|
std::array<std::tuple<ID3D12Resource*, D3D12_SHADER_RESOURCE_VIEW_DESC>, 16> m_current_shader_resources = {};
|
||||||
|
std::array<D3D12_SAMPLER_DESC, 16> m_current_samplers = {};
|
||||||
public:
|
public:
|
||||||
D3D12GSRender();
|
D3D12GSRender();
|
||||||
virtual ~D3D12GSRender();
|
virtual ~D3D12GSRender();
|
||||||
|
@ -165,7 +168,7 @@ private:
|
||||||
* Create necessary resource view/sampler descriptors in the per frame storage struct.
|
* Create necessary resource view/sampler descriptors in the per frame storage struct.
|
||||||
* If the count of enabled texture is below texture_count, fills with dummy texture and sampler.
|
* If the count of enabled texture is below texture_count, fills with dummy texture and sampler.
|
||||||
*/
|
*/
|
||||||
void upload_and_bind_textures(ID3D12GraphicsCommandList *command_list, size_t descriptor_index, size_t texture_count);
|
void upload_and_bind_textures(ID3D12GraphicsCommandList *command_list, size_t texture_count);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates render target if necessary.
|
* Creates render target if necessary.
|
||||||
|
|
|
@ -171,12 +171,14 @@ D3D12_SHADER_RESOURCE_VIEW_DESC get_srv_descriptor_with_dimensions(const rsx::te
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void D3D12GSRender::upload_and_bind_textures(ID3D12GraphicsCommandList *command_list, size_t descriptor_index, size_t texture_count)
|
void D3D12GSRender::upload_and_bind_textures(ID3D12GraphicsCommandList *command_list, size_t texture_count)
|
||||||
{
|
{
|
||||||
size_t used_texture = 0;
|
for (u32 i = 0; i < 16; ++i)
|
||||||
|
{
|
||||||
|
if (!m_textures_dirty[i])
|
||||||
|
continue;
|
||||||
|
m_textures_dirty[i] = false;
|
||||||
|
|
||||||
for (u32 i = 0; i < rsx::limits::textures_count; ++i)
|
|
||||||
{
|
|
||||||
if (!textures[i].enabled())
|
if (!textures[i].enabled())
|
||||||
{
|
{
|
||||||
// Now fill remaining texture slots with dummy texture/sampler
|
// Now fill remaining texture slots with dummy texture/sampler
|
||||||
|
@ -190,21 +192,14 @@ void D3D12GSRender::upload_and_bind_textures(ID3D12GraphicsCommandList *command_
|
||||||
D3D12_SHADER_COMPONENT_MAPPING_FORCE_VALUE_0,
|
D3D12_SHADER_COMPONENT_MAPPING_FORCE_VALUE_0,
|
||||||
D3D12_SHADER_COMPONENT_MAPPING_FORCE_VALUE_0,
|
D3D12_SHADER_COMPONENT_MAPPING_FORCE_VALUE_0,
|
||||||
D3D12_SHADER_COMPONENT_MAPPING_FORCE_VALUE_0);
|
D3D12_SHADER_COMPONENT_MAPPING_FORCE_VALUE_0);
|
||||||
m_device->CreateShaderResourceView(m_dummy_texture, &shader_resource_view_desc,
|
m_current_shader_resources[i] = std::make_tuple(m_dummy_texture, shader_resource_view_desc);
|
||||||
CD3DX12_CPU_DESCRIPTOR_HANDLE(get_current_resource_storage().descriptors_heap->GetCPUDescriptorHandleForHeapStart())
|
|
||||||
.Offset((INT)descriptor_index + (INT)used_texture, m_descriptor_stride_srv_cbv_uav)
|
|
||||||
);
|
|
||||||
|
|
||||||
D3D12_SAMPLER_DESC sampler_desc = {};
|
D3D12_SAMPLER_DESC sampler_desc = {};
|
||||||
sampler_desc.Filter = D3D12_FILTER_MIN_MAG_MIP_POINT;
|
sampler_desc.Filter = D3D12_FILTER_MIN_MAG_MIP_POINT;
|
||||||
sampler_desc.AddressU = D3D12_TEXTURE_ADDRESS_MODE_WRAP;
|
sampler_desc.AddressU = D3D12_TEXTURE_ADDRESS_MODE_WRAP;
|
||||||
sampler_desc.AddressV = D3D12_TEXTURE_ADDRESS_MODE_WRAP;
|
sampler_desc.AddressV = D3D12_TEXTURE_ADDRESS_MODE_WRAP;
|
||||||
sampler_desc.AddressW = D3D12_TEXTURE_ADDRESS_MODE_WRAP;
|
sampler_desc.AddressW = D3D12_TEXTURE_ADDRESS_MODE_WRAP;
|
||||||
m_device->CreateSampler(&sampler_desc,
|
m_current_samplers[i] = sampler_desc;
|
||||||
CD3DX12_CPU_DESCRIPTOR_HANDLE(get_current_resource_storage().sampler_descriptor_heap[get_current_resource_storage().sampler_descriptors_heap_index]->GetCPUDescriptorHandleForHeapStart())
|
|
||||||
.Offset((INT)get_current_resource_storage().current_sampler_index + (INT)used_texture, m_descriptor_stride_samplers)
|
|
||||||
);
|
|
||||||
used_texture++;
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
size_t w = textures[i].width(), h = textures[i].height();
|
size_t w = textures[i].width(), h = textures[i].height();
|
||||||
|
@ -357,9 +352,7 @@ void D3D12GSRender::upload_and_bind_textures(ID3D12GraphicsCommandList *command_
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_device->CreateShaderResourceView(vram_texture, &shared_resource_view_desc,
|
m_current_shader_resources[i] = std::make_tuple(vram_texture, shared_resource_view_desc);
|
||||||
CD3DX12_CPU_DESCRIPTOR_HANDLE(get_current_resource_storage().descriptors_heap->GetCPUDescriptorHandleForHeapStart())
|
|
||||||
.Offset((UINT)descriptor_index + (UINT)used_texture, m_descriptor_stride_srv_cbv_uav));
|
|
||||||
|
|
||||||
if (get_current_resource_storage().current_sampler_index + 16 > 2048)
|
if (get_current_resource_storage().current_sampler_index + 16 > 2048)
|
||||||
{
|
{
|
||||||
|
@ -373,13 +366,7 @@ void D3D12GSRender::upload_and_bind_textures(ID3D12GraphicsCommandList *command_
|
||||||
};
|
};
|
||||||
command_list->SetDescriptorHeaps(2, descriptors);
|
command_list->SetDescriptorHeaps(2, descriptors);
|
||||||
}
|
}
|
||||||
m_device->CreateSampler(&get_sampler_desc(textures[i]),
|
m_current_samplers[i] = get_sampler_desc(textures[i]);
|
||||||
CD3DX12_CPU_DESCRIPTOR_HANDLE(get_current_resource_storage().sampler_descriptor_heap[get_current_resource_storage().sampler_descriptors_heap_index]->GetCPUDescriptorHandleForHeapStart())
|
|
||||||
.Offset((UINT)get_current_resource_storage().current_sampler_index + (UINT)used_texture, m_descriptor_stride_samplers));
|
|
||||||
|
|
||||||
used_texture++;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -278,6 +278,8 @@ namespace rsx
|
||||||
{
|
{
|
||||||
return on_access_violation(address, is_writing);
|
return on_access_violation(address, is_writing);
|
||||||
};
|
};
|
||||||
|
m_rtts_dirty = true;
|
||||||
|
memset(m_textures_dirty, -1, sizeof(m_textures_dirty));
|
||||||
}
|
}
|
||||||
|
|
||||||
thread::~thread()
|
thread::~thread()
|
||||||
|
|
|
@ -289,6 +289,7 @@ namespace rsx
|
||||||
std::vector<u32> inline_vertex_array;
|
std::vector<u32> inline_vertex_array;
|
||||||
|
|
||||||
bool m_rtts_dirty;
|
bool m_rtts_dirty;
|
||||||
|
bool m_textures_dirty[16];
|
||||||
protected:
|
protected:
|
||||||
std::array<u32, 4> get_color_surface_addresses() const;
|
std::array<u32, 4> get_color_surface_addresses() const;
|
||||||
u32 get_zeta_surface_address() const;
|
u32 get_zeta_surface_address() const;
|
||||||
|
|
|
@ -287,6 +287,15 @@ namespace rsx
|
||||||
{
|
{
|
||||||
rsx->m_rtts_dirty = true;
|
rsx->m_rtts_dirty = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<u32 index>
|
||||||
|
struct set_texture_dirty_bit
|
||||||
|
{
|
||||||
|
force_inline static void impl(thread* rsx, u32 arg)
|
||||||
|
{
|
||||||
|
rsx->m_textures_dirty[index] = true;
|
||||||
|
}
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace nv308a
|
namespace nv308a
|
||||||
|
@ -834,6 +843,16 @@ namespace rsx
|
||||||
bind<NV4097_SET_CONTEXT_DMA_COLOR_D, nv4097::set_surface_dirty_bit>();
|
bind<NV4097_SET_CONTEXT_DMA_COLOR_D, nv4097::set_surface_dirty_bit>();
|
||||||
bind<NV4097_SET_CONTEXT_DMA_ZETA, nv4097::set_surface_dirty_bit>();
|
bind<NV4097_SET_CONTEXT_DMA_ZETA, nv4097::set_surface_dirty_bit>();
|
||||||
bind<NV4097_SET_SURFACE_FORMAT, nv4097::set_surface_dirty_bit>();
|
bind<NV4097_SET_SURFACE_FORMAT, nv4097::set_surface_dirty_bit>();
|
||||||
|
bind_range<NV4097_SET_TEXTURE_OFFSET, 8, 16, nv4097::set_texture_dirty_bit>();
|
||||||
|
bind_range<NV4097_SET_TEXTURE_FORMAT, 8, 16, nv4097::set_texture_dirty_bit>();
|
||||||
|
bind_range<NV4097_SET_TEXTURE_ADDRESS, 8, 16, nv4097::set_texture_dirty_bit>();
|
||||||
|
bind_range<NV4097_SET_TEXTURE_CONTROL0, 8, 16, nv4097::set_texture_dirty_bit>();
|
||||||
|
bind_range<NV4097_SET_TEXTURE_CONTROL1, 8, 16, nv4097::set_texture_dirty_bit>();
|
||||||
|
bind_range<NV4097_SET_TEXTURE_CONTROL2, 8, 16, nv4097::set_texture_dirty_bit>();
|
||||||
|
bind_range<NV4097_SET_TEXTURE_CONTROL3, 1, 16, nv4097::set_texture_dirty_bit>();
|
||||||
|
bind_range<NV4097_SET_TEXTURE_FILTER, 8, 16, nv4097::set_texture_dirty_bit>();
|
||||||
|
bind_range<NV4097_SET_TEXTURE_IMAGE_RECT, 8, 16, nv4097::set_texture_dirty_bit>();
|
||||||
|
bind_range<NV4097_SET_TEXTURE_BORDER_COLOR, 8, 16, nv4097::set_texture_dirty_bit>();
|
||||||
|
|
||||||
//NV308A
|
//NV308A
|
||||||
bind_range<NV308A_COLOR, 1, 256, nv308a::color>();
|
bind_range<NV308A_COLOR, 1, 256, nv308a::color>();
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue