Reland "Cleanup program building a bit"
This reverts commit 77fdf66946d2a498945394fe0b7cb06e3895aa5f.
Reason for revert: Skia-Dawn breakage should not be a tree closer.
Original change's description:
> Revert "Cleanup program building a bit"
>
> This reverts commit 4777e3addec478786dcbb68035c5e11c82479b9f.
>
> Reason for revert: This CL is breaking the build on Linux FYI SkiaRenderer Dawn Release
>
> Original change's description:
> > Cleanup program building a bit
> >
> > This CL:
> > now passes the GrProgramDesc as a const&
> > returns GrGLProgram as an sk_sp
> > makes the parameter ordering more consistent
> > makes GrVkPipelineState no longer ref-counted
> >
> > This is pulled out of the DDL pre-compile CL which touches this portion of the code.
> >
> > Bug: skia:9455
> > Change-Id: Id4d06f93450e276de5a2662be330ae9523026244
> > Reviewed-on: https://skia-review.googlesource.com/c/skia/+/268777
> > Reviewed-by: Greg Daniel <egdaniel@google.com>
> > Commit-Queue: Robert Phillips <robertphillips@google.com>
>
> TBR=egdaniel@google.com,robertphillips@google.com
>
> # Not skipping CQ checks because original CL landed > 1 day ago.
>
> Bug: skia:9455
> Change-Id: I7019d9876b68576274e87c3b2e6bbbf9695522ba
> Reviewed-on: https://skia-review.googlesource.com/c/skia/+/269261
> Reviewed-by: Austin Eng <enga@google.com>
> Reviewed-by: Kenneth Russell <kbr@google.com>
> Reviewed-by: Stephen White <senorblanco@chromium.org>
> Commit-Queue: Stephen White <senorblanco@chromium.org>
> Auto-Submit: Austin Eng <enga@google.com>
TBR=egdaniel@google.com,robertphillips@google.com,senorblanco@chromium.org,kbr@google.com,enga@google.com
Change-Id: I62f6d38a8ac351e411f4605425caec3b4783fd70
No-Presubmit: true
No-Tree-Checks: true
No-Try: true
Bug: skia:9455
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/269358
Reviewed-by: Stephen White <senorblanco@chromium.org>
Commit-Queue: Stephen White <senorblanco@chromium.org>
diff --git a/src/gpu/gl/GrGLGpu.cpp b/src/gpu/gl/GrGLGpu.cpp
index aa8498c..2f033f8 100644
--- a/src/gpu/gl/GrGLGpu.cpp
+++ b/src/gpu/gl/GrGLGpu.cpp
@@ -1817,7 +1817,7 @@
bool GrGLGpu::flushGLState(GrRenderTarget* renderTarget, const GrProgramInfo& programInfo) {
- sk_sp<GrGLProgram> program(fProgramCache->refProgram(this, renderTarget, programInfo));
+ sk_sp<GrGLProgram> program(fProgramCache->findOrCreateProgram(renderTarget, programInfo));
if (!program) {
GrCapsDebugf(this->caps(), "Failed to create program!\n");
return false;
diff --git a/src/gpu/gl/GrGLGpu.h b/src/gpu/gl/GrGLGpu.h
index 748eb34..3f63fb6 100644
--- a/src/gpu/gl/GrGLGpu.h
+++ b/src/gpu/gl/GrGLGpu.h
@@ -316,7 +316,7 @@
void abandon();
void reset();
- GrGLProgram* refProgram(GrGLGpu*, GrRenderTarget*, const GrProgramInfo&);
+ sk_sp<GrGLProgram> findOrCreateProgram(GrRenderTarget*, const GrProgramInfo&);
bool precompileShader(const SkData& key, const SkData& data);
private:
diff --git a/src/gpu/gl/GrGLGpuProgramCache.cpp b/src/gpu/gl/GrGLGpuProgramCache.cpp
index c5f9f2a..6453bde 100644
--- a/src/gpu/gl/GrGLGpuProgramCache.cpp
+++ b/src/gpu/gl/GrGLGpuProgramCache.cpp
@@ -45,14 +45,13 @@
fMap.reset();
}
-GrGLProgram* GrGLGpu::ProgramCache::refProgram(GrGLGpu* gpu,
- GrRenderTarget* renderTarget,
- const GrProgramInfo& programInfo) {
- const GrCaps& caps = *gpu->caps();
+sk_sp<GrGLProgram> GrGLGpu::ProgramCache::findOrCreateProgram(GrRenderTarget* renderTarget,
+ const GrProgramInfo& programInfo) {
+ const GrCaps& caps = *fGpu->caps();
GrProgramDesc desc = caps.makeDesc(renderTarget, programInfo);
if (!desc.isValid()) {
- GrCapsDebugf(gpu->caps(), "Failed to gl program descriptor!\n");
+ GrCapsDebugf(fGpu->caps(), "Failed to gl program descriptor!\n");
return nullptr;
}
@@ -61,26 +60,24 @@
// We've pre-compiled the GL program, but don't have the GrGLProgram scaffolding
const GrGLPrecompiledProgram* precompiledProgram = &((*entry)->fPrecompiledProgram);
SkASSERT(precompiledProgram->fProgramID != 0);
- GrGLProgram* program = GrGLProgramBuilder::CreateProgram(renderTarget, programInfo,
- &desc, fGpu,
- precompiledProgram);
- if (nullptr == program) {
+ (*entry)->fProgram = GrGLProgramBuilder::CreateProgram(fGpu, renderTarget, desc,
+ programInfo, precompiledProgram);
+ if (!(*entry)->fProgram) {
// Should we purge the program ID from the cache at this point?
SkDEBUGFAIL("Couldn't create program from precompiled program");
return nullptr;
}
- (*entry)->fProgram.reset(program);
} else if (!entry) {
// We have a cache miss
- GrGLProgram* program = GrGLProgramBuilder::CreateProgram(renderTarget, programInfo,
- &desc, fGpu);
- if (nullptr == program) {
+ sk_sp<GrGLProgram> program = GrGLProgramBuilder::CreateProgram(fGpu, renderTarget,
+ desc, programInfo);
+ if (!program) {
return nullptr;
}
- entry = fMap.insert(desc, std::unique_ptr<Entry>(new Entry(sk_sp<GrGLProgram>(program))));
+ entry = fMap.insert(desc, std::unique_ptr<Entry>(new Entry(std::move(program))));
}
- return SkRef((*entry)->fProgram.get());
+ return (*entry)->fProgram;
}
bool GrGLGpu::ProgramCache::precompileShader(const SkData& key, const SkData& data) {
diff --git a/src/gpu/gl/builders/GrGLProgramBuilder.cpp b/src/gpu/gl/builders/GrGLProgramBuilder.cpp
index 6c12794..012140f 100644
--- a/src/gpu/gl/builders/GrGLProgramBuilder.cpp
+++ b/src/gpu/gl/builders/GrGLProgramBuilder.cpp
@@ -45,21 +45,22 @@
cleanup_shaders(gpu, shaderIDs);
}
-GrGLProgram* GrGLProgramBuilder::CreateProgram(GrRenderTarget* renderTarget,
- const GrProgramInfo& programInfo,
- GrProgramDesc* desc,
+sk_sp<GrGLProgram> GrGLProgramBuilder::CreateProgram(
GrGLGpu* gpu,
+ GrRenderTarget* renderTarget,
+ const GrProgramDesc& desc,
+ const GrProgramInfo& programInfo,
const GrGLPrecompiledProgram* precompiledProgram) {
ATRACE_ANDROID_FRAMEWORK_ALWAYS("shader_compile");
GrAutoLocaleSetter als("C");
// create a builder. This will be handed off to effects so they can use it to add
// uniforms, varyings, textures, etc
- GrGLProgramBuilder builder(gpu, renderTarget, programInfo, desc);
+ GrGLProgramBuilder builder(gpu, renderTarget, desc, programInfo);
auto persistentCache = gpu->getContext()->priv().getPersistentCache();
if (persistentCache && !precompiledProgram) {
- sk_sp<SkData> key = SkData::MakeWithoutCopy(desc->asKey(), desc->keyLength());
+ sk_sp<SkData> key = SkData::MakeWithoutCopy(desc.asKey(), desc.keyLength());
builder.fCached = persistentCache->load(*key);
// the eventual end goal is to completely skip emitAndInstallProcs on a cache hit, but it's
// doing necessary setup in addition to generating the SkSL code. Currently we are only able
@@ -75,9 +76,9 @@
GrGLProgramBuilder::GrGLProgramBuilder(GrGLGpu* gpu,
GrRenderTarget* renderTarget,
- const GrProgramInfo& programInfo,
- GrProgramDesc* desc)
- : INHERITED(renderTarget, programInfo, desc)
+ const GrProgramDesc& desc,
+ const GrProgramInfo& programInfo)
+ : INHERITED(renderTarget, desc, programInfo)
, fGpu(gpu)
, fVaryingHandler(this)
, fUniformHandler(this)
@@ -159,7 +160,7 @@
if (!this->gpu()->getContext()->priv().getPersistentCache()) {
return;
}
- sk_sp<SkData> key = SkData::MakeWithoutCopy(this->desc()->asKey(), this->desc()->keyLength());
+ sk_sp<SkData> key = SkData::MakeWithoutCopy(this->desc().asKey(), this->desc().keyLength());
if (fGpu->glCaps().programBinarySupport()) {
// binary cache
GrGLsizei length = 0;
@@ -198,7 +199,7 @@
}
}
-GrGLProgram* GrGLProgramBuilder::finalize(const GrGLPrecompiledProgram* precompiledProgram) {
+sk_sp<GrGLProgram> GrGLProgramBuilder::finalize(const GrGLPrecompiledProgram* precompiledProgram) {
TRACE_EVENT0("skia.gpu", TRACE_FUNC);
// verify we can get a program id
@@ -541,22 +542,22 @@
}
}
-GrGLProgram* GrGLProgramBuilder::createProgram(GrGLuint programID) {
- return new GrGLProgram(fGpu,
- fUniformHandles,
- programID,
- fUniformHandler.fUniforms,
- fUniformHandler.fSamplers,
- fVaryingHandler.fPathProcVaryingInfos,
- std::move(fGeometryProcessor),
- std::move(fXferProcessor),
- std::move(fFragmentProcessors),
- fFragmentProcessorCnt,
- std::move(fAttributes),
- fVertexAttributeCnt,
- fInstanceAttributeCnt,
- fVertexStride,
- fInstanceStride);
+sk_sp<GrGLProgram> GrGLProgramBuilder::createProgram(GrGLuint programID) {
+ return sk_sp<GrGLProgram>(new GrGLProgram(fGpu,
+ fUniformHandles,
+ programID,
+ fUniformHandler.fUniforms,
+ fUniformHandler.fSamplers,
+ fVaryingHandler.fPathProcVaryingInfos,
+ std::move(fGeometryProcessor),
+ std::move(fXferProcessor),
+ std::move(fFragmentProcessors),
+ fFragmentProcessorCnt,
+ std::move(fAttributes),
+ fVertexAttributeCnt,
+ fInstanceAttributeCnt,
+ fVertexStride,
+ fInstanceStride));
}
bool GrGLProgramBuilder::PrecompileProgram(GrGLPrecompiledProgram* precompiledProgram,
diff --git a/src/gpu/gl/builders/GrGLProgramBuilder.h b/src/gpu/gl/builders/GrGLProgramBuilder.h
index 800c64a..baf319d 100644
--- a/src/gpu/gl/builders/GrGLProgramBuilder.h
+++ b/src/gpu/gl/builders/GrGLProgramBuilder.h
@@ -40,18 +40,15 @@
* The program implements what is specified in the stages given as input.
* After successful generation, the builder result objects are available
* to be used.
- * This function may modify the GrProgramDesc by setting the surface origin
- * key to 0 (unspecified) if it turns out the program does not care about
- * the surface origin.
* If a GL program has already been created, the program ID and inputs can
* be supplied to skip the shader compilation.
- * @return true if generation was successful.
+ * @return the created program if generation was successful.
*/
- static GrGLProgram* CreateProgram(GrRenderTarget*,
- const GrProgramInfo&,
- GrProgramDesc*,
- GrGLGpu*,
- const GrGLPrecompiledProgram* = nullptr);
+ static sk_sp<GrGLProgram> CreateProgram(GrGLGpu*,
+ GrRenderTarget*,
+ const GrProgramDesc&,
+ const GrProgramInfo&,
+ const GrGLPrecompiledProgram* = nullptr);
static bool PrecompileProgram(GrGLPrecompiledProgram*, GrGLGpu*, const SkData&);
@@ -60,7 +57,7 @@
GrGLGpu* gpu() const { return fGpu; }
private:
- GrGLProgramBuilder(GrGLGpu*, GrRenderTarget*, const GrProgramInfo&, GrProgramDesc*);
+ GrGLProgramBuilder(GrGLGpu*, GrRenderTarget*, const GrProgramDesc&, const GrProgramInfo&);
void addInputVars(const SkSL::Program::Inputs& inputs);
bool compileAndAttachShaders(const SkSL::String& glsl,
@@ -74,14 +71,14 @@
void storeShaderInCache(const SkSL::Program::Inputs& inputs, GrGLuint programID,
const SkSL::String shaders[], bool isSkSL,
SkSL::Program::Settings* settings);
- GrGLProgram* finalize(const GrGLPrecompiledProgram*);
+ sk_sp<GrGLProgram> finalize(const GrGLPrecompiledProgram*);
void bindProgramResourceLocations(GrGLuint programID);
bool checkLinkStatus(GrGLuint programID, GrContextOptions::ShaderErrorHandler* errorHandler,
SkSL::String* sksl[], const SkSL::String glsl[]);
void resolveProgramResourceLocations(GrGLuint programID, bool force);
// Subclasses create different programs
- GrGLProgram* createProgram(GrGLuint programID);
+ sk_sp<GrGLProgram> createProgram(GrGLuint programID);
GrGLSLUniformHandler* uniformHandler() override { return &fUniformHandler; }
const GrGLSLUniformHandler* uniformHandler() const override { return &fUniformHandler; }
diff --git a/src/gpu/glsl/GrGLSLProgramBuilder.cpp b/src/gpu/glsl/GrGLSLProgramBuilder.cpp
index 54b97fd..8cc1f06 100644
--- a/src/gpu/glsl/GrGLSLProgramBuilder.cpp
+++ b/src/gpu/glsl/GrGLSLProgramBuilder.cpp
@@ -21,15 +21,15 @@
const int GrGLSLProgramBuilder::kVarsPerBlock = 8;
GrGLSLProgramBuilder::GrGLSLProgramBuilder(GrRenderTarget* renderTarget,
- const GrProgramInfo& programInfo,
- const GrProgramDesc* desc)
+ const GrProgramDesc& desc,
+ const GrProgramInfo& programInfo)
: fVS(this)
, fGS(this)
, fFS(this)
, fStageIndex(-1)
, fRenderTarget(renderTarget)
- , fProgramInfo(programInfo)
, fDesc(desc)
+ , fProgramInfo(programInfo)
, fGeometryProcessor(nullptr)
, fXferProcessor(nullptr)
, fNumFragmentSamplers(0) {}
diff --git a/src/gpu/glsl/GrGLSLProgramBuilder.h b/src/gpu/glsl/GrGLSLProgramBuilder.h
index 99d6f8bc..de28bbd 100644
--- a/src/gpu/glsl/GrGLSLProgramBuilder.h
+++ b/src/gpu/glsl/GrGLSLProgramBuilder.h
@@ -57,7 +57,7 @@
return fRenderTarget->renderTargetPriv().getSampleLocations();
}
- const GrProgramDesc* desc() const { return fDesc; }
+ const GrProgramDesc& desc() const { return fDesc; }
void appendUniformDecls(GrShaderFlags visibility, SkString*) const;
@@ -104,10 +104,9 @@
int fStageIndex;
const GrRenderTarget* fRenderTarget; // TODO: remove this
+ const GrProgramDesc& fDesc;
const GrProgramInfo& fProgramInfo;
- const GrProgramDesc* fDesc;
-
GrGLSLBuiltinUniformHandles fUniformHandles;
std::unique_ptr<GrGLSLPrimitiveProcessor> fGeometryProcessor;
@@ -116,7 +115,7 @@
int fFragmentProcessorCnt;
protected:
- explicit GrGLSLProgramBuilder(GrRenderTarget*, const GrProgramInfo&, const GrProgramDesc*);
+ explicit GrGLSLProgramBuilder(GrRenderTarget*, const GrProgramDesc&, const GrProgramInfo&);
void addFeature(GrShaderFlags shaders, uint32_t featureBit, const char* extensionName);
diff --git a/src/gpu/mtl/GrMtlPipelineStateBuilder.h b/src/gpu/mtl/GrMtlPipelineStateBuilder.h
index 8a44de7..cd1d102 100644
--- a/src/gpu/mtl/GrMtlPipelineStateBuilder.h
+++ b/src/gpu/mtl/GrMtlPipelineStateBuilder.h
@@ -29,19 +29,19 @@
*
* The GrMtlPipelineState implements what is specified in the GrPipeline and
* GrPrimitiveProcessor as input. After successful generation, the builder result objects are
- * available to be used. This function may modify the program key by setting the surface origin
- * key to 0 (unspecified) if it turns out the program does not care about the surface origin.
- * @return true if generation was successful.
+ * available to be used.
+ * @return the created pipeline if generation was successful; nullptr otherwise
*/
static GrMtlPipelineState* CreatePipelineState(GrMtlGpu*,
GrRenderTarget*,
- const GrProgramInfo&,
- GrProgramDesc*);
+ const GrProgramDesc&,
+ const GrProgramInfo&);
private:
- GrMtlPipelineStateBuilder(GrMtlGpu*, GrRenderTarget*, const GrProgramInfo&, GrProgramDesc*);
+ GrMtlPipelineStateBuilder(GrMtlGpu*, GrRenderTarget*,
+ const GrProgramDesc&, const GrProgramInfo&);
- GrMtlPipelineState* finalize(GrRenderTarget*, const GrProgramInfo&, GrProgramDesc*);
+ GrMtlPipelineState* finalize(GrRenderTarget*, const GrProgramDesc&, const GrProgramInfo&);
const GrCaps* caps() const override;
@@ -52,7 +52,6 @@
id<MTLLibrary> generateMtlShaderLibrary(const SkSL::String& sksl,
SkSL::Program::Kind kind,
const SkSL::Program::Settings& settings,
- GrProgramDesc* desc,
SkSL::String* msl,
SkSL::Program::Inputs* inputs);
id<MTLLibrary> compileMtlShaderLibrary(const SkSL::String& shader,
diff --git a/src/gpu/mtl/GrMtlPipelineStateBuilder.mm b/src/gpu/mtl/GrMtlPipelineStateBuilder.mm
index 4c209ec..300d346 100644
--- a/src/gpu/mtl/GrMtlPipelineStateBuilder.mm
+++ b/src/gpu/mtl/GrMtlPipelineStateBuilder.mm
@@ -25,24 +25,25 @@
#error This file must be compiled with Arc. Use -fobjc-arc flag
#endif
-GrMtlPipelineState* GrMtlPipelineStateBuilder::CreatePipelineState(GrMtlGpu* gpu,
- GrRenderTarget* renderTarget,
- const GrProgramInfo& programInfo,
- GrProgramDesc* desc) {
+GrMtlPipelineState* GrMtlPipelineStateBuilder::CreatePipelineState(
+ GrMtlGpu* gpu,
+ GrRenderTarget* renderTarget,
+ const GrProgramDesc& desc,
+ const GrProgramInfo& programInfo) {
GrAutoLocaleSetter als("C");
- GrMtlPipelineStateBuilder builder(gpu, renderTarget, programInfo, desc);
+ GrMtlPipelineStateBuilder builder(gpu, renderTarget, desc, programInfo);
if (!builder.emitAndInstallProcs()) {
return nullptr;
}
- return builder.finalize(renderTarget, programInfo, desc);
+ return builder.finalize(renderTarget, desc, programInfo);
}
GrMtlPipelineStateBuilder::GrMtlPipelineStateBuilder(GrMtlGpu* gpu,
GrRenderTarget* renderTarget,
- const GrProgramInfo& programInfo,
- GrProgramDesc* desc)
- : INHERITED(renderTarget, programInfo, desc)
+ const GrProgramDesc& desc,
+ const GrProgramInfo& programInfo)
+ : INHERITED(renderTarget, desc, programInfo)
, fGpu(gpu)
, fUniformHandler(this)
, fVaryingHandler(this) {
@@ -91,8 +92,8 @@
// Here we shear off the Mtl-specific portion of the Desc in order to create the
// persistent key. This is because Mtl only caches the MSL code, not the fully compiled
// program, and that only depends on the base GrProgramDesc data.
- sk_sp<SkData> key = SkData::MakeWithoutCopy(this->desc()->asKey(),
- this->desc()->initialKeyLength());
+ sk_sp<SkData> key = SkData::MakeWithoutCopy(this->desc().asKey(),
+ this->desc().initialKeyLength());
sk_sp<SkData> data = GrPersistentCacheUtils::PackCachedShaders(isSkSL ? kSKSL_Tag : kMSL_Tag,
shaders,
inputs, kGrShaderTypeCount);
@@ -103,7 +104,6 @@
const SkSL::String& shader,
SkSL::Program::Kind kind,
const SkSL::Program::Settings& settings,
- GrProgramDesc* desc,
SkSL::String* msl,
SkSL::Program::Inputs* inputs) {
id<MTLLibrary> shaderLibrary = GrGenerateMtlShaderLibrary(fGpu, shader,
@@ -388,8 +388,8 @@
}
GrMtlPipelineState* GrMtlPipelineStateBuilder::finalize(GrRenderTarget* renderTarget,
- const GrProgramInfo& programInfo,
- GrProgramDesc* desc) {
+ const GrProgramDesc& desc,
+ const GrProgramInfo& programInfo) {
auto pipelineDescriptor = [[MTLRenderPipelineDescriptor alloc] init];
id<MTLLibrary> shaderLibraries[kGrShaderTypeCount];
@@ -414,7 +414,7 @@
// Here we shear off the Mtl-specific portion of the Desc in order to create the
// persistent key. This is because Mtl only caches the MSL code, not the fully compiled
// program, and that only depends on the base GrProgramDesc data.
- sk_sp<SkData> key = SkData::MakeWithoutCopy(desc->asKey(), desc->initialKeyLength());
+ sk_sp<SkData> key = SkData::MakeWithoutCopy(desc.asKey(), desc.initialKeyLength());
cached = persistentCache->load(*key);
if (cached) {
reader.setMemory(cached->data(), cached->size());
@@ -446,14 +446,12 @@
*sksl[kVertex_GrShaderType],
SkSL::Program::kVertex_Kind,
settings,
- desc,
&shaders[kVertex_GrShaderType],
&inputs[kVertex_GrShaderType]);
shaderLibraries[kFragment_GrShaderType] = this->generateMtlShaderLibrary(
*sksl[kFragment_GrShaderType],
SkSL::Program::kFragment_Kind,
settings,
- desc,
&shaders[kFragment_GrShaderType],
&inputs[kFragment_GrShaderType]);
diff --git a/src/gpu/mtl/GrMtlResourceProvider.mm b/src/gpu/mtl/GrMtlResourceProvider.mm
index 5fc220d..230aa69 100644
--- a/src/gpu/mtl/GrMtlResourceProvider.mm
+++ b/src/gpu/mtl/GrMtlResourceProvider.mm
@@ -153,7 +153,7 @@
++fCacheMisses;
#endif
GrMtlPipelineState* pipelineState(GrMtlPipelineStateBuilder::CreatePipelineState(
- fGpu, renderTarget, programInfo, &desc));
+ fGpu, renderTarget, desc, programInfo));
if (!pipelineState) {
return nullptr;
}
diff --git a/src/gpu/vk/GrVkPipelineState.h b/src/gpu/vk/GrVkPipelineState.h
index 20943e5..fbf50bd 100644
--- a/src/gpu/vk/GrVkPipelineState.h
+++ b/src/gpu/vk/GrVkPipelineState.h
@@ -32,7 +32,7 @@
* and other similar objects that are used along with the VkPipeline in the draw. This includes both
* allocating and freeing these objects, as well as updating their values.
*/
-class GrVkPipelineState : public SkRefCnt {
+class GrVkPipelineState {
public:
using UniformInfoArray = GrVkPipelineStateDataManager::UniformInfoArray;
using UniformHandle = GrGLSLProgramDataManager::UniformHandle;
diff --git a/src/gpu/vk/GrVkPipelineStateBuilder.cpp b/src/gpu/vk/GrVkPipelineStateBuilder.cpp
index 41dca29..aee60b8 100644
--- a/src/gpu/vk/GrVkPipelineStateBuilder.cpp
+++ b/src/gpu/vk/GrVkPipelineStateBuilder.cpp
@@ -23,28 +23,28 @@
GrVkPipelineState* GrVkPipelineStateBuilder::CreatePipelineState(
GrVkGpu* gpu,
GrRenderTarget* renderTarget,
+ const GrProgramDesc& desc,
const GrProgramInfo& programInfo,
- GrProgramDesc* desc,
VkRenderPass compatibleRenderPass) {
// ensure that we use "." as a decimal separator when creating SkSL code
GrAutoLocaleSetter als("C");
// create a builder. This will be handed off to effects so they can use it to add
// uniforms, varyings, textures, etc
- GrVkPipelineStateBuilder builder(gpu, renderTarget, programInfo, desc);
+ GrVkPipelineStateBuilder builder(gpu, renderTarget, desc, programInfo);
if (!builder.emitAndInstallProcs()) {
return nullptr;
}
- return builder.finalize(compatibleRenderPass, desc);
+ return builder.finalize(desc, compatibleRenderPass);
}
GrVkPipelineStateBuilder::GrVkPipelineStateBuilder(GrVkGpu* gpu,
GrRenderTarget* renderTarget,
- const GrProgramInfo& programInfo,
- GrProgramDesc* desc)
- : INHERITED(renderTarget, programInfo, desc)
+ const GrProgramDesc& desc,
+ const GrProgramInfo& programInfo)
+ : INHERITED(renderTarget, desc, programInfo)
, fGpu(gpu)
, fVaryingHandler(this)
, fUniformHandler(this) {}
@@ -66,7 +66,6 @@
VkShaderModule* shaderModule,
VkPipelineShaderStageCreateInfo* stageInfo,
const SkSL::Program::Settings& settings,
- GrProgramDesc* desc,
SkSL::String* outSPIRV,
SkSL::Program::Inputs* outInputs) {
if (!GrCompileVkShaderModule(fGpu, sksl, stage, shaderModule,
@@ -140,8 +139,8 @@
// program, and that only depends on the base GrProgramDesc data.
// The +4 is to include the kShader_PersistentCacheKeyType code the Vulkan backend adds
// to the key right after the base key.
- sk_sp<SkData> key = SkData::MakeWithoutCopy(this->desc()->asKey(),
- this->desc()->initialKeyLength()+4);
+ sk_sp<SkData> key = SkData::MakeWithoutCopy(this->desc().asKey(),
+ this->desc().initialKeyLength()+4);
sk_sp<SkData> data = GrPersistentCacheUtils::PackCachedShaders(isSkSL ? kSKSL_Tag : kSPIRV_Tag,
shaders,
@@ -149,8 +148,8 @@
this->gpu()->getContext()->priv().getPersistentCache()->store(*key, *data);
}
-GrVkPipelineState* GrVkPipelineStateBuilder::finalize(VkRenderPass compatibleRenderPass,
- GrProgramDesc* desc) {
+GrVkPipelineState* GrVkPipelineStateBuilder::finalize(const GrProgramDesc& desc,
+ VkRenderPass compatibleRenderPass) {
VkDescriptorSetLayout dsLayout[2];
VkPipelineLayout pipelineLayout;
VkShaderModule shaderModules[kGrShaderTypeCount] = { VK_NULL_HANDLE,
@@ -214,7 +213,7 @@
// program, and that only depends on the base GrProgramDesc data.
// The +4 is to include the kShader_PersistentCacheKeyType code the Vulkan backend adds
// to the key right after the base key.
- sk_sp<SkData> key = SkData::MakeWithoutCopy(desc->asKey(), desc->initialKeyLength()+4);
+ sk_sp<SkData> key = SkData::MakeWithoutCopy(desc.asKey(), desc.initialKeyLength()+4);
cached = persistentCache->load(*key);
if (cached) {
reader.setMemory(cached->data(), cached->size());
@@ -249,7 +248,6 @@
&shaderModules[kVertex_GrShaderType],
&shaderStageInfo[0],
settings,
- desc,
&shaders[kVertex_GrShaderType],
&inputs[kVertex_GrShaderType]);
@@ -258,7 +256,6 @@
&shaderModules[kFragment_GrShaderType],
&shaderStageInfo[1],
settings,
- desc,
&shaders[kFragment_GrShaderType],
&inputs[kFragment_GrShaderType]);
@@ -268,7 +265,6 @@
&shaderModules[kGeometry_GrShaderType],
&shaderStageInfo[2],
settings,
- desc,
&shaders[kGeometry_GrShaderType],
&inputs[kGeometry_GrShaderType]);
++numShaderStages;
diff --git a/src/gpu/vk/GrVkPipelineStateBuilder.h b/src/gpu/vk/GrVkPipelineStateBuilder.h
index b09b939..1eb5290 100644
--- a/src/gpu/vk/GrVkPipelineStateBuilder.h
+++ b/src/gpu/vk/GrVkPipelineStateBuilder.h
@@ -27,14 +27,12 @@
*
* The GrVkPipelineState implements what is specified in the GrPipeline and GrPrimitiveProcessor
* as input. After successful generation, the builder result objects are available to be used.
- * This function may modify the program key by setting the surface origin key to 0 (unspecified)
- * if it turns out the program does not care about the surface origin.
- * @return true if generation was successful.
+ * @return the created pipeline if generation was successful; nullptr otherwise
*/
static GrVkPipelineState* CreatePipelineState(GrVkGpu*,
GrRenderTarget*,
+ const GrProgramDesc&,
const GrProgramInfo&,
- GrProgramDesc*,
VkRenderPass compatibleRenderPass);
const GrCaps* caps() const override;
@@ -45,9 +43,9 @@
void finalizeFragmentSecondaryColor(GrShaderVar& outputColor) override;
private:
- GrVkPipelineStateBuilder(GrVkGpu*, GrRenderTarget*, const GrProgramInfo&, GrProgramDesc*);
+ GrVkPipelineStateBuilder(GrVkGpu*, GrRenderTarget*, const GrProgramDesc&, const GrProgramInfo&);
- GrVkPipelineState* finalize(VkRenderPass compatibleRenderPass, GrProgramDesc*);
+ GrVkPipelineState* finalize(const GrProgramDesc&, VkRenderPass compatibleRenderPass);
// returns number of shader stages
int loadShadersFromCache(SkReader32* cached, VkShaderModule outShaderModules[],
@@ -61,7 +59,6 @@
VkShaderModule* shaderModule,
VkPipelineShaderStageCreateInfo* stageInfo,
const SkSL::Program::Settings& settings,
- GrProgramDesc* desc,
SkSL::String* outSPIRV,
SkSL::Program::Inputs* outInputs);
diff --git a/src/gpu/vk/GrVkPipelineStateCache.cpp b/src/gpu/vk/GrVkPipelineStateCache.cpp
index 5e93eb0..a0f5ff4 100644
--- a/src/gpu/vk/GrVkPipelineStateCache.cpp
+++ b/src/gpu/vk/GrVkPipelineStateCache.cpp
@@ -68,7 +68,7 @@
fMap.reset();
}
-GrVkPipelineState* GrVkResourceProvider::PipelineStateCache::refPipelineState(
+GrVkPipelineState* GrVkResourceProvider::PipelineStateCache::findOrCreatePipelineState(
GrRenderTarget* renderTarget,
const GrProgramInfo& programInfo,
VkRenderPass compatibleRenderPass) {
@@ -95,7 +95,7 @@
++fCacheMisses;
#endif
GrVkPipelineState* pipelineState(GrVkPipelineStateBuilder::CreatePipelineState(
- fGpu, renderTarget, programInfo, &desc, compatibleRenderPass));
+ fGpu, renderTarget, desc, programInfo, compatibleRenderPass));
if (!pipelineState) {
return nullptr;
}
diff --git a/src/gpu/vk/GrVkResourceProvider.cpp b/src/gpu/vk/GrVkResourceProvider.cpp
index 0416fa6..2166f16 100644
--- a/src/gpu/vk/GrVkResourceProvider.cpp
+++ b/src/gpu/vk/GrVkResourceProvider.cpp
@@ -232,7 +232,8 @@
GrRenderTarget* renderTarget,
const GrProgramInfo& programInfo,
VkRenderPass compatibleRenderPass) {
- return fPipelineStateCache->refPipelineState(renderTarget, programInfo, compatibleRenderPass);
+ return fPipelineStateCache->findOrCreatePipelineState(renderTarget, programInfo,
+ compatibleRenderPass);
}
void GrVkResourceProvider::getSamplerDescriptorSetHandle(VkDescriptorType type,
diff --git a/src/gpu/vk/GrVkResourceProvider.h b/src/gpu/vk/GrVkResourceProvider.h
index 7c24d51..64b4f93 100644
--- a/src/gpu/vk/GrVkResourceProvider.h
+++ b/src/gpu/vk/GrVkResourceProvider.h
@@ -184,9 +184,9 @@
~PipelineStateCache();
void release();
- GrVkPipelineState* refPipelineState(GrRenderTarget*,
- const GrProgramInfo&,
- VkRenderPass compatibleRenderPass);
+ GrVkPipelineState* findOrCreatePipelineState(GrRenderTarget*,
+ const GrProgramInfo&,
+ VkRenderPass compatibleRenderPass);
private:
struct Entry;