Fix caching of dirty uniforms on GrD3DPipelineState.
Change-Id: Ibf68103e8e47d3cd13b12a97da3b9131dbdbfd38 Reviewed-on: https://skia-review.googlesource.com/c/skia/+/297857 Reviewed-by: Jim Van Verth <jvanverth@google.com> Commit-Queue: Greg Daniel <egdaniel@google.com>
This commit is contained in:
parent
579e63af00
commit
a581a8b800
@ -49,6 +49,9 @@ public:
|
|||||||
SK_ABORT("Only supported in NVPR, which is only available in GL");
|
SK_ABORT("Only supported in NVPR, which is only available in GL");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// For the uniform data to be dirty so that we will reupload on the next use.
|
||||||
|
void markDirty() { fUniformsDirty = true; }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
struct Uniform {
|
struct Uniform {
|
||||||
uint32_t fOffset;
|
uint32_t fOffset;
|
||||||
|
@ -126,6 +126,10 @@ bool GrD3DGpu::submitDirectCommandList(SyncQueue sync) {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// We just submitted the command list so make sure all GrD3DPipelineState's mark their cached
|
||||||
|
// uniform data as dirty.
|
||||||
|
fResourceProvider.markPipelineStateUniformsDirty();
|
||||||
|
|
||||||
new (fOutstandingCommandLists.push_back()) OutstandingCommandList(
|
new (fOutstandingCommandLists.push_back()) OutstandingCommandList(
|
||||||
std::move(fCurrentDirectCommandList), ++fCurrentFenceValue);
|
std::move(fCurrentDirectCommandList), ++fCurrentFenceValue);
|
||||||
|
|
||||||
|
@ -61,6 +61,11 @@ public:
|
|||||||
void bindBuffers(GrD3DGpu*, const GrBuffer* indexBuffer, const GrBuffer* instanceBuffer,
|
void bindBuffers(GrD3DGpu*, const GrBuffer* indexBuffer, const GrBuffer* instanceBuffer,
|
||||||
const GrBuffer* vertexBuffer, GrD3DDirectCommandList* commandList);
|
const GrBuffer* vertexBuffer, GrD3DDirectCommandList* commandList);
|
||||||
|
|
||||||
|
// We can only cache non dirty uniform values until we submit a command list. After that, the
|
||||||
|
// next frame will get a completely different uniform buffer and/or offset into the buffer. Thus
|
||||||
|
// we need a way to mark them all as dirty during submit.
|
||||||
|
void markUniformsDirty() { fDataManager.markDirty(); }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/**
|
/**
|
||||||
* We use the RT's size and origin to adjust from Skia device space to d3d normalized device
|
* We use the RT's size and origin to adjust from Skia device space to d3d normalized device
|
||||||
|
@ -33,7 +33,7 @@ GrD3DPipelineStateDataManager::GrD3DPipelineStateDataManager(const UniformInfoAr
|
|||||||
D3D12_GPU_VIRTUAL_ADDRESS GrD3DPipelineStateDataManager::uploadConstants(GrD3DGpu* gpu) {
|
D3D12_GPU_VIRTUAL_ADDRESS GrD3DPipelineStateDataManager::uploadConstants(GrD3DGpu* gpu) {
|
||||||
if (fUniformsDirty) {
|
if (fUniformsDirty) {
|
||||||
fConstantBufferAddress = gpu->resourceProvider().uploadConstantData(fUniformData.get(),
|
fConstantBufferAddress = gpu->resourceProvider().uploadConstantData(fUniformData.get(),
|
||||||
fUniformSize);
|
fUniformSize);
|
||||||
fUniformsDirty = false;
|
fUniformsDirty = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -252,3 +252,10 @@ sk_sp<GrD3DPipelineState> GrD3DResourceProvider::PipelineStateCache::refPipeline
|
|||||||
}
|
}
|
||||||
return (*entry)->fPipelineState;
|
return (*entry)->fPipelineState;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void GrD3DResourceProvider::PipelineStateCache::markPipelineStateUniformsDirty() {
|
||||||
|
fMap.foreach ([](const GrProgramDesc*, std::unique_ptr<Entry>* entry) {
|
||||||
|
(*entry)->fPipelineState->markUniformsDirty();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@ -64,6 +64,8 @@ public:
|
|||||||
D3D12_GPU_VIRTUAL_ADDRESS uploadConstantData(void* data, size_t size);
|
D3D12_GPU_VIRTUAL_ADDRESS uploadConstantData(void* data, size_t size);
|
||||||
void prepForSubmit();
|
void prepForSubmit();
|
||||||
|
|
||||||
|
void markPipelineStateUniformsDirty() { fPipelineStateCache->markPipelineStateUniformsDirty(); }
|
||||||
|
|
||||||
#if GR_TEST_UTILS
|
#if GR_TEST_UTILS
|
||||||
void resetShaderCacheForTesting() const { fPipelineStateCache->release(); }
|
void resetShaderCacheForTesting() const { fPipelineStateCache->release(); }
|
||||||
#endif
|
#endif
|
||||||
@ -81,6 +83,8 @@ private:
|
|||||||
void release();
|
void release();
|
||||||
sk_sp<GrD3DPipelineState> refPipelineState(GrRenderTarget*, const GrProgramInfo&);
|
sk_sp<GrD3DPipelineState> refPipelineState(GrRenderTarget*, const GrProgramInfo&);
|
||||||
|
|
||||||
|
void markPipelineStateUniformsDirty();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
struct Entry;
|
struct Entry;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user