[GPU] Ownership-transfer-based RT cache, 3x3 resolution scaling
The ROV path is also disabled by default because of lower performance
This commit is contained in:
@@ -20,11 +20,11 @@
|
||||
#include "xenia/base/assert.h"
|
||||
#include "xenia/gpu/command_processor.h"
|
||||
#include "xenia/gpu/d3d12/d3d12_graphics_system.h"
|
||||
#include "xenia/gpu/d3d12/d3d12_render_target_cache.h"
|
||||
#include "xenia/gpu/d3d12/d3d12_shared_memory.h"
|
||||
#include "xenia/gpu/d3d12/deferred_command_list.h"
|
||||
#include "xenia/gpu/d3d12/pipeline_cache.h"
|
||||
#include "xenia/gpu/d3d12/primitive_converter.h"
|
||||
#include "xenia/gpu/d3d12/render_target_cache.h"
|
||||
#include "xenia/gpu/d3d12/texture_cache.h"
|
||||
#include "xenia/gpu/draw_util.h"
|
||||
#include "xenia/gpu/dxbc_shader.h"
|
||||
@@ -131,7 +131,7 @@ class D3D12CommandProcessor : public CommandProcessor {
|
||||
// descriptors, this must only be used to allocate SRVs, otherwise it won't
|
||||
// work on Nvidia Fermi (root signature creation will fail)!
|
||||
bool RequestOneUseSingleViewDescriptors(
|
||||
uint32_t count, ui::d3d12::util::DescriptorCPUGPUHandlePair* handles_out);
|
||||
uint32_t count, ui::d3d12::util::DescriptorCpuGpuHandlePair* handles_out);
|
||||
// These are needed often, so they are always allocated.
|
||||
enum class SystemBindlessView : uint32_t {
|
||||
kSharedMemoryRawSRV,
|
||||
@@ -149,6 +149,7 @@ class D3D12CommandProcessor : public CommandProcessor {
|
||||
kEdramR32G32B32A32UintSRV,
|
||||
kEdramRawUAV,
|
||||
kEdramR32UintUAV,
|
||||
kEdramR32G32UintUAV,
|
||||
kEdramR32G32B32A32UintUAV,
|
||||
|
||||
kGammaRampNormalSRV,
|
||||
@@ -164,16 +165,18 @@ class D3D12CommandProcessor : public CommandProcessor {
|
||||
|
||||
kCount,
|
||||
};
|
||||
ui::d3d12::util::DescriptorCPUGPUHandlePair GetSystemBindlessViewHandlePair(
|
||||
ui::d3d12::util::DescriptorCpuGpuHandlePair GetSystemBindlessViewHandlePair(
|
||||
SystemBindlessView view) const;
|
||||
ui::d3d12::util::DescriptorCPUGPUHandlePair
|
||||
ui::d3d12::util::DescriptorCpuGpuHandlePair
|
||||
GetSharedMemoryUintPow2BindlessSRVHandlePair(
|
||||
uint32_t element_size_bytes_pow2) const;
|
||||
ui::d3d12::util::DescriptorCPUGPUHandlePair
|
||||
ui::d3d12::util::DescriptorCpuGpuHandlePair
|
||||
GetSharedMemoryUintPow2BindlessUAVHandlePair(
|
||||
uint32_t element_size_bytes_pow2) const;
|
||||
ui::d3d12::util::DescriptorCPUGPUHandlePair
|
||||
ui::d3d12::util::DescriptorCpuGpuHandlePair
|
||||
GetEdramUintPow2BindlessSRVHandlePair(uint32_t element_size_bytes_pow2) const;
|
||||
ui::d3d12::util::DescriptorCpuGpuHandlePair
|
||||
GetEdramUintPow2BindlessUAVHandlePair(uint32_t element_size_bytes_pow2) const;
|
||||
|
||||
// Returns a single temporary GPU-side buffer within a submission for tasks
|
||||
// like texture untiling and resolving.
|
||||
@@ -185,19 +188,20 @@ class D3D12CommandProcessor : public CommandProcessor {
|
||||
void ReleaseScratchGPUBuffer(ID3D12Resource* buffer,
|
||||
D3D12_RESOURCE_STATES new_state);
|
||||
|
||||
// Sets the current SSAA sample positions, needs to be done before setting
|
||||
// render targets or copying to depth render targets.
|
||||
void SetSamplePositions(xenos::MsaaSamples sample_positions);
|
||||
|
||||
// Returns a pipeline with deferred creation by its handle. May return nullptr
|
||||
// if failed to create the pipeline.
|
||||
ID3D12PipelineState* GetD3D12PipelineByHandle(void* handle) const {
|
||||
return pipeline_cache_->GetD3D12PipelineByHandle(handle);
|
||||
}
|
||||
|
||||
// Sets the current pipeline to a compute one. This is for cache invalidation
|
||||
// primarily. A submission must be open.
|
||||
void SetComputePipeline(ID3D12PipelineState* pipeline);
|
||||
// Sets the current cached values to external ones. This is for cache
|
||||
// invalidation primarily. A submission must be open.
|
||||
void SetExternalPipeline(ID3D12PipelineState* pipeline);
|
||||
void SetExternalGraphicsRootSignature(ID3D12RootSignature* root_signature);
|
||||
void SetViewport(const D3D12_VIEWPORT& viewport);
|
||||
void SetScissorRect(const D3D12_RECT& scissor_rect);
|
||||
void SetStencilReference(uint32_t stencil_ref);
|
||||
void SetPrimitiveTopology(D3D12_PRIMITIVE_TOPOLOGY primitive_topology);
|
||||
|
||||
// For the pipeline cache to call when binding layout UIDs may be reused.
|
||||
void NotifyShaderBindingsLayoutUIDsInvalidated();
|
||||
@@ -351,12 +355,13 @@ class D3D12CommandProcessor : public CommandProcessor {
|
||||
void UpdateFixedFunctionState(const draw_util::ViewportInfo& viewport_info,
|
||||
const draw_util::Scissor& scissor,
|
||||
bool primitive_polygonal);
|
||||
void UpdateSystemConstantValues(
|
||||
bool shared_memory_is_uav, bool primitive_polygonal,
|
||||
uint32_t line_loop_closing_index, xenos::Endian index_endian,
|
||||
const draw_util::ViewportInfo& viewport_info, uint32_t pixel_size_x,
|
||||
uint32_t pixel_size_y, uint32_t used_texture_mask, uint32_t color_mask,
|
||||
const RenderTargetCache::PipelineRenderTarget render_targets[4]);
|
||||
void UpdateSystemConstantValues(bool shared_memory_is_uav,
|
||||
bool primitive_polygonal,
|
||||
uint32_t line_loop_closing_index,
|
||||
xenos::Endian index_endian,
|
||||
const draw_util::ViewportInfo& viewport_info,
|
||||
uint32_t used_texture_mask,
|
||||
uint32_t color_mask);
|
||||
bool UpdateBindings(const D3D12Shader* vertex_shader,
|
||||
const D3D12Shader* pixel_shader,
|
||||
ID3D12RootSignature* root_signature);
|
||||
@@ -418,10 +423,8 @@ class D3D12CommandProcessor : public CommandProcessor {
|
||||
// bindful - mainly because of CopyDescriptorsSimple, which takes the majority
|
||||
// of UpdateBindings time, and that's outside the emulator's control even).
|
||||
bool bindless_resources_used_ = false;
|
||||
// Should a rasterizer-ordered UAV of the EDRAM buffer with format conversion
|
||||
// and blending performed in pixel shaders be used instead of host render
|
||||
// targets.
|
||||
bool edram_rov_used_ = false;
|
||||
|
||||
std::unique_ptr<D3D12RenderTargetCache> render_target_cache_;
|
||||
|
||||
std::unique_ptr<ui::d3d12::D3D12UploadBufferPool> constant_buffer_pool_;
|
||||
|
||||
@@ -491,8 +494,6 @@ class D3D12CommandProcessor : public CommandProcessor {
|
||||
|
||||
std::unique_ptr<TextureCache> texture_cache_;
|
||||
|
||||
std::unique_ptr<RenderTargetCache> render_target_cache_;
|
||||
|
||||
std::unique_ptr<PrimitiveConverter> primitive_converter_;
|
||||
|
||||
// Mip 0 contains the normal gamma ramp (256 entries), mip 1 contains the PWL
|
||||
@@ -508,10 +509,9 @@ class D3D12CommandProcessor : public CommandProcessor {
|
||||
static constexpr uint32_t kSwapTextureWidth = 1280;
|
||||
static constexpr uint32_t kSwapTextureHeight = 720;
|
||||
std::pair<uint32_t, uint32_t> GetSwapTextureSize() const {
|
||||
if (texture_cache_->IsResolutionScale2X()) {
|
||||
return std::make_pair(kSwapTextureWidth * 2, kSwapTextureHeight * 2);
|
||||
}
|
||||
return std::make_pair(kSwapTextureWidth, kSwapTextureHeight);
|
||||
uint32_t resolution_scale = texture_cache_->GetDrawResolutionScale();
|
||||
return std::make_pair(kSwapTextureWidth * resolution_scale,
|
||||
kSwapTextureHeight * resolution_scale);
|
||||
}
|
||||
ID3D12Resource* swap_texture_ = nullptr;
|
||||
D3D12_PLACED_SUBRESOURCE_FOOTPRINT swap_texture_copy_footprint_;
|
||||
@@ -549,9 +549,6 @@ class D3D12CommandProcessor : public CommandProcessor {
|
||||
bool ff_blend_factor_update_needed_;
|
||||
bool ff_stencil_ref_update_needed_;
|
||||
|
||||
// Current SSAA sample positions (to be updated by the render target cache).
|
||||
xenos::MsaaSamples current_sample_positions_;
|
||||
|
||||
// Currently bound pipeline, either a graphics pipeline from the pipeline
|
||||
// cache (with potentially deferred creation - current_external_pipeline_ is
|
||||
// nullptr in this case) or a non-Xenos graphics or compute pipeline
|
||||
|
||||
Reference in New Issue
Block a user