mirror of
https://github.com/doitsujin/dxvk.git
synced 2025-04-01 09:25:24 +02:00
[dxvk] Compute attachment usage mask for each pipeline instance
This commit is contained in:
parent
97cff85280
commit
bd27980ae8
@ -1193,7 +1193,7 @@ namespace dxvk {
|
|||||||
this->logPipelineState(LogLevel::Error, state);
|
this->logPipelineState(LogLevel::Error, state);
|
||||||
|
|
||||||
m_stats->numGraphicsPipelines += 1;
|
m_stats->numGraphicsPipelines += 1;
|
||||||
return &(*m_pipelines.emplace(state, baseHandle, fastHandle));
|
return &(*m_pipelines.emplace(state, baseHandle, fastHandle, computeAttachmentMask(state)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -1487,6 +1487,57 @@ namespace dxvk {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
DxvkAttachmentMask DxvkGraphicsPipeline::computeAttachmentMask(
|
||||||
|
const DxvkGraphicsPipelineStateInfo& state) const {
|
||||||
|
// Scan color attachments first, we only need to check if any given
|
||||||
|
// attachment is accessed by the shader and has a non-zero write mask.
|
||||||
|
DxvkAttachmentMask result = { };
|
||||||
|
|
||||||
|
if (m_shaders.fs) {
|
||||||
|
uint32_t colorMask = m_shaders.fs->info().outputMask;
|
||||||
|
|
||||||
|
for (auto i : bit::BitMask(colorMask)) {
|
||||||
|
if (state.writesRenderTarget(i))
|
||||||
|
result.trackColorWrite(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check depth buffer access
|
||||||
|
auto depthFormat = state.rt.getDepthStencilFormat();
|
||||||
|
|
||||||
|
if (depthFormat) {
|
||||||
|
auto dsReadable = lookupFormatInfo(depthFormat)->aspectMask;
|
||||||
|
auto dsWritable = dsReadable & ~state.rt.getDepthStencilReadOnlyAspects();
|
||||||
|
|
||||||
|
if (dsReadable & VK_IMAGE_ASPECT_DEPTH_BIT) {
|
||||||
|
if (state.ds.enableDepthBoundsTest())
|
||||||
|
result.trackDepthRead();
|
||||||
|
|
||||||
|
if (state.ds.enableDepthTest()) {
|
||||||
|
result.trackDepthRead();
|
||||||
|
|
||||||
|
if (state.ds.enableDepthWrite() && (dsWritable & VK_IMAGE_ASPECT_DEPTH_BIT))
|
||||||
|
result.trackDepthWrite();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dsReadable & VK_IMAGE_ASPECT_STENCIL_BIT) {
|
||||||
|
if (state.ds.enableStencilTest()) {
|
||||||
|
auto f = state.dsFront.state(dsWritable & VK_IMAGE_ASPECT_STENCIL_BIT);
|
||||||
|
auto b = state.dsBack.state(dsWritable & VK_IMAGE_ASPECT_STENCIL_BIT);
|
||||||
|
|
||||||
|
result.trackStencilRead();
|
||||||
|
|
||||||
|
if (f.writeMask | b.writeMask)
|
||||||
|
result.trackStencilWrite();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
bool DxvkGraphicsPipeline::validatePipelineState(
|
bool DxvkGraphicsPipeline::validatePipelineState(
|
||||||
const DxvkGraphicsPipelineStateInfo& state,
|
const DxvkGraphicsPipelineStateInfo& state,
|
||||||
bool trusted) const {
|
bool trusted) const {
|
||||||
|
@ -351,6 +351,7 @@ namespace dxvk {
|
|||||||
struct DxvkGraphicsPipelineHandle {
|
struct DxvkGraphicsPipelineHandle {
|
||||||
VkPipeline handle = VK_NULL_HANDLE;
|
VkPipeline handle = VK_NULL_HANDLE;
|
||||||
DxvkGraphicsPipelineType type = DxvkGraphicsPipelineType::FastPipeline;
|
DxvkGraphicsPipelineType type = DxvkGraphicsPipelineType::FastPipeline;
|
||||||
|
DxvkAttachmentMask attachments = { };
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -365,16 +366,19 @@ namespace dxvk {
|
|||||||
DxvkGraphicsPipelineInstance(
|
DxvkGraphicsPipelineInstance(
|
||||||
const DxvkGraphicsPipelineStateInfo& state_,
|
const DxvkGraphicsPipelineStateInfo& state_,
|
||||||
VkPipeline baseHandle_,
|
VkPipeline baseHandle_,
|
||||||
VkPipeline fastHandle_)
|
VkPipeline fastHandle_,
|
||||||
|
DxvkAttachmentMask attachments_)
|
||||||
: state (state_),
|
: state (state_),
|
||||||
baseHandle (baseHandle_),
|
baseHandle (baseHandle_),
|
||||||
fastHandle (fastHandle_),
|
fastHandle (fastHandle_),
|
||||||
isCompiling (fastHandle_ != VK_NULL_HANDLE) { }
|
isCompiling (fastHandle_ != VK_NULL_HANDLE),
|
||||||
|
attachments (attachments_) { }
|
||||||
|
|
||||||
DxvkGraphicsPipelineStateInfo state;
|
DxvkGraphicsPipelineStateInfo state;
|
||||||
std::atomic<VkPipeline> baseHandle = { VK_NULL_HANDLE };
|
std::atomic<VkPipeline> baseHandle = { VK_NULL_HANDLE };
|
||||||
std::atomic<VkPipeline> fastHandle = { VK_NULL_HANDLE };
|
std::atomic<VkPipeline> fastHandle = { VK_NULL_HANDLE };
|
||||||
std::atomic<VkBool32> isCompiling = { VK_FALSE };
|
std::atomic<VkBool32> isCompiling = { VK_FALSE };
|
||||||
|
DxvkAttachmentMask attachments = { };
|
||||||
|
|
||||||
DxvkGraphicsPipelineHandle getHandle() const {
|
DxvkGraphicsPipelineHandle getHandle() const {
|
||||||
// Find a pipeline handle to use. If no optimized pipeline has
|
// Find a pipeline handle to use. If no optimized pipeline has
|
||||||
@ -382,6 +386,7 @@ namespace dxvk {
|
|||||||
DxvkGraphicsPipelineHandle result;
|
DxvkGraphicsPipelineHandle result;
|
||||||
result.handle = fastHandle.load(std::memory_order_acquire);
|
result.handle = fastHandle.load(std::memory_order_acquire);
|
||||||
result.type = DxvkGraphicsPipelineType::FastPipeline;
|
result.type = DxvkGraphicsPipelineType::FastPipeline;
|
||||||
|
result.attachments = attachments;
|
||||||
|
|
||||||
if (likely(fastHandle))
|
if (likely(fastHandle))
|
||||||
return result;
|
return result;
|
||||||
@ -667,6 +672,9 @@ namespace dxvk {
|
|||||||
|
|
||||||
uint32_t computeSpecConstantMask() const;
|
uint32_t computeSpecConstantMask() const;
|
||||||
|
|
||||||
|
DxvkAttachmentMask computeAttachmentMask(
|
||||||
|
const DxvkGraphicsPipelineStateInfo& state) const;
|
||||||
|
|
||||||
bool validatePipelineState(
|
bool validatePipelineState(
|
||||||
const DxvkGraphicsPipelineStateInfo& state,
|
const DxvkGraphicsPipelineStateInfo& state,
|
||||||
bool trusted) const;
|
bool trusted) const;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user