Use GrProgramInfo's primitiveType field
This improves the encapsulation of all the data required to make a program/pipeline w/in the GrProgramInfo class.
Bug: skia:9455
Change-Id: Ib41519c8ded9f27a7bbe787097a431b38ab101bd
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/253376
Commit-Queue: Robert Phillips <robertphillips@google.com>
Reviewed-by: Greg Daniel <egdaniel@google.com>
diff --git a/src/gpu/GrProgramDesc.cpp b/src/gpu/GrProgramDesc.cpp
index 6ef7e6f..8d995a3 100644
--- a/src/gpu/GrProgramDesc.cpp
+++ b/src/gpu/GrProgramDesc.cpp
@@ -191,8 +191,7 @@
}
bool GrProgramDesc::Build(GrProgramDesc* desc, const GrRenderTarget* renderTarget,
- const GrProgramInfo& programInfo, GrPrimitiveType primitiveType,
- GrGpu* gpu) {
+ const GrProgramInfo& programInfo, GrGpu* gpu) {
// The descriptor is used as a cache key. Thus when a field of the
// descriptor will not affect program generation (because of the attribute
// bindings in use or other descriptor field settings) it should be set
@@ -264,6 +263,8 @@
// Ensure enough bits.
SkASSERT(header->fProcessorFeatures == (int) programInfo.requestedFeatures());
header->fSnapVerticesToPixelCenters = programInfo.pipeline().snapVerticesToPixelCenters();
- header->fHasPointSize = (primitiveType == GrPrimitiveType::kPoints);
+ // The base descriptor only stores whether or not the primitiveType is kPoints. Backend-
+ // specific versions (e.g., Vulkan) require more detail
+ header->fHasPointSize = (programInfo.primitiveType() == GrPrimitiveType::kPoints);
return true;
}
diff --git a/src/gpu/GrProgramDesc.h b/src/gpu/GrProgramDesc.h
index 391bfe1..dea6131 100644
--- a/src/gpu/GrProgramDesc.h
+++ b/src/gpu/GrProgramDesc.h
@@ -31,11 +31,9 @@
* @param desc The built and finalized descriptor
* @param renderTarget The target of the draw
* @param programInfo Program information need to build the key
- * @param primitiveType Controls whether the shader will output a point size.
* @param gpu Pointer to the GrGpu object the program will be used with.
**/
- static bool Build(GrProgramDesc*, const GrRenderTarget*, const GrProgramInfo&,
- GrPrimitiveType, GrGpu*);
+ static bool Build(GrProgramDesc*, const GrRenderTarget*, const GrProgramInfo&, GrGpu*);
// This is strictly an OpenGL call since the other backends have additional data in their
// keys
diff --git a/src/gpu/dawn/GrDawnGpu.cpp b/src/gpu/dawn/GrDawnGpu.cpp
index ebb6653..6e24faa 100644
--- a/src/gpu/dawn/GrDawnGpu.cpp
+++ b/src/gpu/dawn/GrDawnGpu.cpp
@@ -88,10 +88,9 @@
static bool Build(Desc* desc,
GrRenderTarget* rt,
const GrProgramInfo& programInfo,
- GrPrimitiveType primitiveType,
bool hasDepthStencil,
GrGpu* gpu) {
- if (!GrProgramDesc::Build(desc, rt, programInfo, primitiveType, gpu)) {
+ if (!GrProgramDesc::Build(desc, rt, programInfo, gpu)) {
return false;
}
GrProcessorKeyBuilder b(&desc->key());
@@ -103,7 +102,7 @@
b.add32(rt->config());
b.add32(static_cast<int32_t>(hasDepthStencil));
b.add32(get_blend_info_key(pipeline));
- b.add32(static_cast<uint32_t>(primitiveType));
+ b.add32(static_cast<uint32_t>(programInfo.primitiveType()));
return true;
}
};
@@ -618,11 +617,10 @@
sk_sp<GrDawnProgram> GrDawnGpu::getOrCreateRenderPipeline(
GrRenderTarget* rt,
- const GrProgramInfo& programInfo,
- GrPrimitiveType primitiveType) {
+ const GrProgramInfo& programInfo) {
bool hasDepthStencil = rt->renderTargetPriv().getStencilAttachment() != nullptr;
Desc desc;
- if (!Desc::Build(&desc, rt, programInfo, primitiveType, hasDepthStencil, this)) {
+ if (!Desc::Build(&desc, rt, programInfo, hasDepthStencil, this)) {
return nullptr;
}
@@ -635,7 +633,7 @@
wgpu::TextureFormat stencilFormat = wgpu::TextureFormat::Depth24PlusStencil8;
sk_sp<GrDawnProgram> program = GrDawnProgramBuilder::Build(
- this, rt, programInfo, primitiveType, colorFormat,
+ this, rt, programInfo, colorFormat,
hasDepthStencil, stencilFormat, &desc);
fRenderPipelineCache.insert(desc, program);
return program;
diff --git a/src/gpu/dawn/GrDawnGpu.h b/src/gpu/dawn/GrDawnGpu.h
index 55d1154..23ab74c 100644
--- a/src/gpu/dawn/GrDawnGpu.h
+++ b/src/gpu/dawn/GrDawnGpu.h
@@ -86,9 +86,7 @@
sk_sp<GrSemaphore> prepareTextureForCrossContextUsage(GrTexture*) override;
- sk_sp<GrDawnProgram> getOrCreateRenderPipeline(GrRenderTarget*,
- const GrProgramInfo& programInfo,
- GrPrimitiveType primitiveType);
+ sk_sp<GrDawnProgram> getOrCreateRenderPipeline(GrRenderTarget*, const GrProgramInfo&);
wgpu::Sampler getOrCreateSampler(const GrSamplerState& samplerState);
diff --git a/src/gpu/dawn/GrDawnOpsRenderPass.cpp b/src/gpu/dawn/GrDawnOpsRenderPass.cpp
index b0f4b1c..a061da1 100644
--- a/src/gpu/dawn/GrDawnOpsRenderPass.cpp
+++ b/src/gpu/dawn/GrDawnOpsRenderPass.cpp
@@ -141,11 +141,8 @@
fPassEncoder.SetScissorRect(rect.x(), rect.y(), rect.width(), rect.height());
}
-void GrDawnOpsRenderPass::applyState(const GrProgramInfo& programInfo,
- const GrPrimitiveType primitiveType) {
- sk_sp<GrDawnProgram> program = fGpu->getOrCreateRenderPipeline(fRenderTarget,
- programInfo,
- primitiveType);
+void GrDawnOpsRenderPass::applyState(const GrProgramInfo& programInfo) {
+ sk_sp<GrDawnProgram> program = fGpu->getOrCreateRenderPipeline(fRenderTarget, programInfo);
auto bindGroup = program->setData(fGpu, fRenderTarget, programInfo);
fPassEncoder.SetPipeline(program->fRenderPipeline);
fPassEncoder.SetBindGroup(0, bindGroup, 0, nullptr);
@@ -168,7 +165,8 @@
return;
}
for (int i = 0; i < meshCount; ++i) {
- applyState(programInfo, meshes[0].primitiveType());
+ SkASSERT(meshes[i].primitiveType() == programInfo.primitiveType());
+ this->applyState(programInfo);
meshes[i].sendToGpu(this);
}
}
diff --git a/src/gpu/dawn/GrDawnOpsRenderPass.h b/src/gpu/dawn/GrDawnOpsRenderPass.h
index 1573015..f0772c0 100644
--- a/src/gpu/dawn/GrDawnOpsRenderPass.h
+++ b/src/gpu/dawn/GrDawnOpsRenderPass.h
@@ -39,8 +39,7 @@
GrGpu* gpu() override;
void setScissorState(const GrProgramInfo&);
- void applyState(const GrProgramInfo& programInfo,
- const GrPrimitiveType primitiveType);
+ void applyState(const GrProgramInfo& programInfo);
void onDraw(const GrProgramInfo& programInfo,
const GrMesh mesh[],
diff --git a/src/gpu/dawn/GrDawnProgramBuilder.cpp b/src/gpu/dawn/GrDawnProgramBuilder.cpp
index e63cd9a..8c3a107 100644
--- a/src/gpu/dawn/GrDawnProgramBuilder.cpp
+++ b/src/gpu/dawn/GrDawnProgramBuilder.cpp
@@ -291,7 +291,6 @@
sk_sp<GrDawnProgram> GrDawnProgramBuilder::Build(GrDawnGpu* gpu,
GrRenderTarget* renderTarget,
const GrProgramInfo& programInfo,
- GrPrimitiveType primitiveType,
wgpu::TextureFormat colorFormat,
bool hasDepthStencil,
wgpu::TextureFormat depthStencilFormat,
@@ -415,7 +414,7 @@
rpDesc.vertexStage = vsDesc;
rpDesc.fragmentStage = &fsDesc;
rpDesc.vertexInput = &vertexInput;
- rpDesc.primitiveTopology = to_dawn_primitive_topology(primitiveType);
+ rpDesc.primitiveTopology = to_dawn_primitive_topology(programInfo.primitiveType());
if (hasDepthStencil) {
rpDesc.depthStencilState = &depthStencilState;
}
diff --git a/src/gpu/dawn/GrDawnProgramBuilder.h b/src/gpu/dawn/GrDawnProgramBuilder.h
index be36a83..b5706e8 100644
--- a/src/gpu/dawn/GrDawnProgramBuilder.h
+++ b/src/gpu/dawn/GrDawnProgramBuilder.h
@@ -70,13 +70,12 @@
class GrDawnProgramBuilder : public GrGLSLProgramBuilder {
public:
static sk_sp<GrDawnProgram> Build(GrDawnGpu*,
- GrRenderTarget* rt,
- const GrProgramInfo& programInfo,
- GrPrimitiveType primitiveType,
+ GrRenderTarget*,
+ const GrProgramInfo&,
wgpu::TextureFormat colorFormat,
bool hasDepthStencil,
wgpu::TextureFormat depthStencilFormat,
- GrProgramDesc* desc);
+ GrProgramDesc*);
const GrCaps* caps() const override;
GrGLSLUniformHandler* uniformHandler() override { return &fUniformHandler; }
const GrGLSLUniformHandler* uniformHandler() const override { return &fUniformHandler; }
diff --git a/src/gpu/gl/GrGLGpu.cpp b/src/gpu/gl/GrGLGpu.cpp
index 4221703..1b388c4 100644
--- a/src/gpu/gl/GrGLGpu.cpp
+++ b/src/gpu/gl/GrGLGpu.cpp
@@ -1660,12 +1660,9 @@
#endif
}
-bool GrGLGpu::flushGLState(GrRenderTarget* renderTarget,
- const GrProgramInfo& programInfo,
- GrPrimitiveType primitiveType) {
+bool GrGLGpu::flushGLState(GrRenderTarget* renderTarget, const GrProgramInfo& programInfo) {
- sk_sp<GrGLProgram> program(fProgramCache->refProgram(this, renderTarget, programInfo,
- primitiveType));
+ sk_sp<GrGLProgram> program(fProgramCache->refProgram(this, renderTarget, programInfo));
if (!program) {
GrCapsDebugf(this->caps(), "Failed to create program!\n");
return false;
@@ -2201,9 +2198,7 @@
SkASSERT(meshCount); // guaranteed by GrOpsRenderPass::draw
- GrPrimitiveType primitiveType = meshes[0].primitiveType();
-
- if (!this->flushGLState(renderTarget, programInfo, primitiveType)) {
+ if (!this->flushGLState(renderTarget, programInfo)) {
return;
}
@@ -2211,7 +2206,7 @@
bool hasDynamicPrimProcTextures = programInfo.hasDynamicPrimProcTextures();
for (int m = 0; m < meshCount; ++m) {
- SkASSERT(meshes[m].primitiveType() == primitiveType);
+ SkASSERT(meshes[m].primitiveType() == programInfo.primitiveType());
if (auto barrierType = programInfo.pipeline().xferBarrierType(renderTarget->asTexture(),
*this->caps())) {
diff --git a/src/gpu/gl/GrGLGpu.h b/src/gpu/gl/GrGLGpu.h
index 51aa250..e1ba41a 100644
--- a/src/gpu/gl/GrGLGpu.h
+++ b/src/gpu/gl/GrGLGpu.h
@@ -273,10 +273,7 @@
void setTextureUnit(int unitIdx);
// Flushes state from GrPipeline to GL. Returns false if the state couldn't be set.
- // willDrawPoints must be true if point primitives will be rendered after setting the GL state.
- // If DynamicStateArrays is not null then dynamicStateArraysLength is the number of dynamic
- // state entries in each array.
- bool flushGLState(GrRenderTarget*, const GrProgramInfo&, GrPrimitiveType);
+ bool flushGLState(GrRenderTarget*, const GrProgramInfo&);
void flushProgram(sk_sp<GrGLProgram>);
@@ -314,7 +311,7 @@
void abandon();
void reset();
- GrGLProgram* refProgram(GrGLGpu*, GrRenderTarget*, const GrProgramInfo&, GrPrimitiveType);
+ GrGLProgram* refProgram(GrGLGpu*, 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 592605e..08260c0 100644
--- a/src/gpu/gl/GrGLGpuProgramCache.cpp
+++ b/src/gpu/gl/GrGLGpuProgramCache.cpp
@@ -47,13 +47,12 @@
GrGLProgram* GrGLGpu::ProgramCache::refProgram(GrGLGpu* gpu,
GrRenderTarget* renderTarget,
- const GrProgramInfo& programInfo,
- GrPrimitiveType primitiveType) {
+ const GrProgramInfo& programInfo) {
// TODO: can this be unified between GL, Vk and Mtl?
// Get GrGLProgramDesc
GrProgramDesc desc;
- if (!GrProgramDesc::Build(&desc, renderTarget, programInfo, primitiveType, gpu)) {
+ if (!GrProgramDesc::Build(&desc, renderTarget, programInfo, gpu)) {
GrCapsDebugf(gpu->caps(), "Failed to gl program descriptor!\n");
return nullptr;
}
diff --git a/src/gpu/gl/GrGLPathRendering.cpp b/src/gpu/gl/GrGLPathRendering.cpp
index 9cce898..3d16543 100644
--- a/src/gpu/gl/GrGLPathRendering.cpp
+++ b/src/gpu/gl/GrGLPathRendering.cpp
@@ -115,7 +115,7 @@
const GrProgramInfo& programInfo,
const GrStencilSettings& stencilPassSettings,
const GrPath* path) {
- if (!this->gpu()->flushGLState(renderTarget, programInfo, GrPrimitiveType::kPath)) {
+ if (!this->gpu()->flushGLState(renderTarget, programInfo)) {
return;
}
diff --git a/src/gpu/mtl/GrMtlOpsRenderPass.h b/src/gpu/mtl/GrMtlOpsRenderPass.h
index 702bf29..a308bbe 100644
--- a/src/gpu/mtl/GrMtlOpsRenderPass.h
+++ b/src/gpu/mtl/GrMtlOpsRenderPass.h
@@ -44,7 +44,7 @@
private:
GrGpu* gpu() override { return fGpu; }
- GrMtlPipelineState* prepareDrawState(const GrProgramInfo&, GrPrimitiveType);
+ GrMtlPipelineState* prepareDrawState(const GrProgramInfo&);
void onDraw(const GrProgramInfo& programInfo,
const GrMesh mesh[],
diff --git a/src/gpu/mtl/GrMtlOpsRenderPass.mm b/src/gpu/mtl/GrMtlOpsRenderPass.mm
index 2a9448a..e60f655 100644
--- a/src/gpu/mtl/GrMtlOpsRenderPass.mm
+++ b/src/gpu/mtl/GrMtlOpsRenderPass.mm
@@ -51,14 +51,11 @@
fGpu->submitIndirectCommandBuffer(fRenderTarget, fOrigin, &iBounds);
}
-GrMtlPipelineState* GrMtlOpsRenderPass::prepareDrawState(const GrProgramInfo& programInfo,
- GrPrimitiveType primitiveType) {
+GrMtlPipelineState* GrMtlOpsRenderPass::prepareDrawState(const GrProgramInfo& programInfo) {
// TODO: resolve textures and regenerate mipmaps as needed
GrMtlPipelineState* pipelineState =
- fGpu->resourceProvider().findOrCreateCompatiblePipelineState(fRenderTarget,
- programInfo,
- primitiveType);
+ fGpu->resourceProvider().findOrCreateCompatiblePipelineState(fRenderTarget, programInfo);
if (!pipelineState) {
return nullptr;
}
@@ -76,8 +73,7 @@
SkASSERT(meshCount); // guaranteed by GrOpsRenderPass::draw
- GrPrimitiveType primitiveType = meshes[0].primitiveType();
- GrMtlPipelineState* pipelineState = this->prepareDrawState(programInfo, primitiveType);
+ GrMtlPipelineState* pipelineState = this->prepareDrawState(programInfo);
if (!pipelineState) {
return;
}
@@ -110,7 +106,7 @@
for (int i = 0; i < meshCount; ++i) {
const GrMesh& mesh = meshes[i];
SkASSERT(nil != fActiveRenderCmdEncoder);
- SkASSERT(mesh.primitiveType() == primitiveType);
+ SkASSERT(mesh.primitiveType() == programInfo.primitiveType());
if (hasDynamicScissors) {
GrMtlPipelineState::SetDynamicScissorRectState(fActiveRenderCmdEncoder, fRenderTarget,
diff --git a/src/gpu/mtl/GrMtlPipelineStateBuilder.h b/src/gpu/mtl/GrMtlPipelineStateBuilder.h
index fda1e65..0c360a1 100644
--- a/src/gpu/mtl/GrMtlPipelineStateBuilder.h
+++ b/src/gpu/mtl/GrMtlPipelineStateBuilder.h
@@ -36,8 +36,7 @@
*/
class Desc : public GrProgramDesc {
public:
- static bool Build(Desc*, GrRenderTarget*,
- const GrProgramInfo&, GrPrimitiveType, GrMtlGpu* gpu);
+ static bool Build(Desc*, GrRenderTarget*, const GrProgramInfo&, GrMtlGpu*);
size_t shaderKeyLength() const { return fShaderKeyLength; }
diff --git a/src/gpu/mtl/GrMtlPipelineStateBuilder.mm b/src/gpu/mtl/GrMtlPipelineStateBuilder.mm
index 0835894..8e78d0c 100644
--- a/src/gpu/mtl/GrMtlPipelineStateBuilder.mm
+++ b/src/gpu/mtl/GrMtlPipelineStateBuilder.mm
@@ -449,9 +449,8 @@
bool GrMtlPipelineStateBuilder::Desc::Build(Desc* desc,
GrRenderTarget* renderTarget,
const GrProgramInfo& programInfo,
- GrPrimitiveType primitiveType,
GrMtlGpu* gpu) {
- if (!GrProgramDesc::Build(desc, renderTarget, programInfo, primitiveType, gpu)) {
+ if (!GrProgramDesc::Build(desc, renderTarget, programInfo, gpu)) {
return false;
}
@@ -471,7 +470,7 @@
b.add32(programInfo.pipeline().getBlendInfoKey());
- b.add32((uint32_t)primitiveType);
+ b.add32((uint32_t)programInfo.primitiveType());
return true;
}
diff --git a/src/gpu/mtl/GrMtlResourceProvider.h b/src/gpu/mtl/GrMtlResourceProvider.h
index 0b8d219..c542145 100644
--- a/src/gpu/mtl/GrMtlResourceProvider.h
+++ b/src/gpu/mtl/GrMtlResourceProvider.h
@@ -25,8 +25,7 @@
GrMtlResourceProvider(GrMtlGpu* gpu);
GrMtlPipelineState* findOrCreateCompatiblePipelineState(GrRenderTarget*,
- const GrProgramInfo&,
- GrPrimitiveType);
+ const GrProgramInfo&);
// Finds or creates a compatible MTLDepthStencilState based on the GrStencilSettings.
GrMtlDepthStencil* findOrCreateCompatibleDepthStencilState(const GrStencilSettings&,
@@ -52,8 +51,7 @@
~PipelineStateCache();
void release();
- GrMtlPipelineState* refPipelineState(GrRenderTarget*, const GrProgramInfo&,
- GrPrimitiveType);
+ GrMtlPipelineState* refPipelineState(GrRenderTarget*, const GrProgramInfo&);
private:
struct Entry;
diff --git a/src/gpu/mtl/GrMtlResourceProvider.mm b/src/gpu/mtl/GrMtlResourceProvider.mm
index 9774d26..639a58f 100644
--- a/src/gpu/mtl/GrMtlResourceProvider.mm
+++ b/src/gpu/mtl/GrMtlResourceProvider.mm
@@ -39,9 +39,8 @@
GrMtlPipelineState* GrMtlResourceProvider::findOrCreateCompatiblePipelineState(
GrRenderTarget* renderTarget,
- const GrProgramInfo& programInfo,
- GrPrimitiveType primitiveType) {
- return fPipelineStateCache->refPipelineState(renderTarget, programInfo, primitiveType);
+ const GrProgramInfo& programInfo) {
+ return fPipelineStateCache->refPipelineState(renderTarget, programInfo);
}
////////////////////////////////////////////////////////////////////////////////////////////////
@@ -135,8 +134,7 @@
GrMtlPipelineState* GrMtlResourceProvider::PipelineStateCache::refPipelineState(
GrRenderTarget* renderTarget,
- const GrProgramInfo& programInfo,
- GrPrimitiveType primType) {
+ const GrProgramInfo& programInfo) {
#ifdef GR_PIPELINE_STATE_CACHE_STATS
++fTotalRequests;
#endif
@@ -144,7 +142,7 @@
// TODO: unify GL, VK and Mtl
// Get GrMtlProgramDesc
GrMtlPipelineStateBuilder::Desc desc;
- if (!GrMtlPipelineStateBuilder::Desc::Build(&desc, renderTarget, programInfo, primType, fGpu)) {
+ if (!GrMtlPipelineStateBuilder::Desc::Build(&desc, renderTarget, programInfo, fGpu)) {
GrCapsDebugf(fGpu->caps(), "Failed to build mtl program descriptor!\n");
return nullptr;
}
diff --git a/src/gpu/vk/GrVkOpsRenderPass.cpp b/src/gpu/vk/GrVkOpsRenderPass.cpp
index fe811c3..01ff901 100644
--- a/src/gpu/vk/GrVkOpsRenderPass.cpp
+++ b/src/gpu/vk/GrVkOpsRenderPass.cpp
@@ -461,7 +461,6 @@
GrVkPipelineState* GrVkOpsRenderPass::prepareDrawState(
const GrProgramInfo& programInfo,
- GrPrimitiveType primitiveType,
const SkIRect& renderPassScissorRect) {
GrVkCommandBuffer* currentCB = this->currentCommandBuffer();
SkASSERT(fCurrentRenderPass);
@@ -471,7 +470,6 @@
GrVkPipelineState* pipelineState =
fGpu->resourceProvider().findOrCreateCompatiblePipelineState(fRenderTarget,
programInfo,
- primitiveType,
compatibleRenderPass);
if (!pipelineState) {
return pipelineState;
@@ -574,9 +572,7 @@
scissorRect.roundOut(&renderPassScissorRect);
}
- GrPrimitiveType primitiveType = meshes[0].primitiveType();
- GrVkPipelineState* pipelineState = this->prepareDrawState(programInfo, primitiveType,
- renderPassScissorRect);
+ GrVkPipelineState* pipelineState = this->prepareDrawState(programInfo, renderPassScissorRect);
if (!pipelineState) {
return;
}
diff --git a/src/gpu/vk/GrVkOpsRenderPass.h b/src/gpu/vk/GrVkOpsRenderPass.h
index 784bc04..4ec59af 100644
--- a/src/gpu/vk/GrVkOpsRenderPass.h
+++ b/src/gpu/vk/GrVkOpsRenderPass.h
@@ -70,8 +70,7 @@
const GrGpuBuffer* vertexBuffer,
const GrGpuBuffer* instanceBuffer);
- GrVkPipelineState* prepareDrawState(const GrProgramInfo&, GrPrimitiveType,
- const SkIRect& renderPassScissorRect);
+ GrVkPipelineState* prepareDrawState(const GrProgramInfo&, const SkIRect& renderPassScissorRect);
void onDraw(const GrProgramInfo&, const GrMesh[], int meshCount,
const SkRect& bounds) override;
diff --git a/src/gpu/vk/GrVkPipeline.cpp b/src/gpu/vk/GrVkPipeline.cpp
index 031f856..8e46591 100644
--- a/src/gpu/vk/GrVkPipeline.cpp
+++ b/src/gpu/vk/GrVkPipeline.cpp
@@ -500,7 +500,7 @@
const GrProgramInfo& programInfo,
const GrStencilSettings& stencil,
VkPipelineShaderStageCreateInfo* shaderStageInfo, int shaderStageCount,
- GrPrimitiveType primitiveType, VkRenderPass compatibleRenderPass, VkPipelineLayout layout,
+ VkRenderPass compatibleRenderPass, VkPipelineLayout layout,
VkPipelineCache cache) {
VkPipelineVertexInputStateCreateInfo vertexInputInfo;
SkSTArray<2, VkVertexInputBindingDescription, true> bindingDescs;
@@ -512,7 +512,7 @@
setup_vertex_input_state(programInfo.primProc(), &vertexInputInfo, &bindingDescs, pAttribs);
VkPipelineInputAssemblyStateCreateInfo inputAssemblyInfo;
- setup_input_assembly_state(primitiveType, &inputAssemblyInfo);
+ setup_input_assembly_state(programInfo.primitiveType(), &inputAssemblyInfo);
VkPipelineDepthStencilStateCreateInfo depthStencilInfo;
setup_depth_stencil_state(stencil, programInfo.origin(), &depthStencilInfo);
diff --git a/src/gpu/vk/GrVkPipeline.h b/src/gpu/vk/GrVkPipeline.h
index ce33a49..fe0d283 100644
--- a/src/gpu/vk/GrVkPipeline.h
+++ b/src/gpu/vk/GrVkPipeline.h
@@ -29,7 +29,6 @@
const GrStencilSettings&,
VkPipelineShaderStageCreateInfo* shaderStageInfo,
int shaderStageCount,
- GrPrimitiveType primitiveType,
VkRenderPass compatibleRenderPass,
VkPipelineLayout layout,
VkPipelineCache cache);
diff --git a/src/gpu/vk/GrVkPipelineStateBuilder.cpp b/src/gpu/vk/GrVkPipelineStateBuilder.cpp
index bb3647d..578bdf1 100644
--- a/src/gpu/vk/GrVkPipelineStateBuilder.cpp
+++ b/src/gpu/vk/GrVkPipelineStateBuilder.cpp
@@ -25,7 +25,6 @@
GrRenderTarget* renderTarget,
const GrProgramInfo& programInfo,
const GrStencilSettings& stencil,
- GrPrimitiveType primitiveType,
Desc* desc,
VkRenderPass compatibleRenderPass) {
// ensure that we use "." as a decimal separator when creating SkSL code
@@ -39,7 +38,7 @@
return nullptr;
}
- return builder.finalize(stencil, primitiveType, compatibleRenderPass, desc);
+ return builder.finalize(stencil, compatibleRenderPass, desc);
}
GrVkPipelineStateBuilder::GrVkPipelineStateBuilder(GrVkGpu* gpu,
@@ -149,7 +148,6 @@
}
GrVkPipelineState* GrVkPipelineStateBuilder::finalize(const GrStencilSettings& stencil,
- GrPrimitiveType primitiveType,
VkRenderPass compatibleRenderPass,
Desc* desc) {
VkDescriptorSetLayout dsLayout[2];
@@ -294,7 +292,7 @@
}
}
GrVkPipeline* pipeline = resourceProvider.createPipeline(fProgramInfo, stencil,
- shaderStageInfo, numShaderStages, primitiveType, compatibleRenderPass, pipelineLayout);
+ shaderStageInfo, numShaderStages, compatibleRenderPass, pipelineLayout);
for (int i = 0; i < kGrShaderTypeCount; ++i) {
// This if check should not be needed since calling destroy on a VK_NULL_HANDLE is allowed.
// However this is causing a crash in certain drivers (e.g. NVidia).
@@ -329,9 +327,8 @@
GrRenderTarget* renderTarget,
const GrProgramInfo& programInfo,
const GrStencilSettings& stencil,
- GrPrimitiveType primitiveType,
GrVkGpu* gpu) {
- if (!GrProgramDesc::Build(desc, renderTarget, programInfo, primitiveType, gpu)) {
+ if (!GrProgramDesc::Build(desc, renderTarget, programInfo, gpu)) {
return false;
}
@@ -351,7 +348,8 @@
b.add32(programInfo.pipeline().getBlendInfoKey());
- b.add32((uint32_t)primitiveType);
+ // Vulkan requires the full primitive type as part of its key
+ b.add32((uint32_t)programInfo.primitiveType());
return true;
}
diff --git a/src/gpu/vk/GrVkPipelineStateBuilder.h b/src/gpu/vk/GrVkPipelineStateBuilder.h
index 0ba7fc5..76d057b 100644
--- a/src/gpu/vk/GrVkPipelineStateBuilder.h
+++ b/src/gpu/vk/GrVkPipelineStateBuilder.h
@@ -42,7 +42,6 @@
GrRenderTarget*,
const GrProgramInfo&,
const GrStencilSettings&,
- GrPrimitiveType primitiveType,
GrVkGpu* gpu);
size_t shaderKeyLength() const { return fShaderKeyLength; }
@@ -65,7 +64,6 @@
GrRenderTarget*,
const GrProgramInfo&,
const GrStencilSettings&,
- GrPrimitiveType,
Desc*,
VkRenderPass compatibleRenderPass);
@@ -80,7 +78,6 @@
GrVkPipelineStateBuilder(GrVkGpu*, GrRenderTarget*, const GrProgramInfo&, GrProgramDesc*);
GrVkPipelineState* finalize(const GrStencilSettings&,
- GrPrimitiveType primitiveType,
VkRenderPass compatibleRenderPass,
Desc*);
diff --git a/src/gpu/vk/GrVkPipelineStateCache.cpp b/src/gpu/vk/GrVkPipelineStateCache.cpp
index da6a69f..3bdf3fc 100644
--- a/src/gpu/vk/GrVkPipelineStateCache.cpp
+++ b/src/gpu/vk/GrVkPipelineStateCache.cpp
@@ -79,7 +79,6 @@
GrVkPipelineState* GrVkResourceProvider::PipelineStateCache::refPipelineState(
GrRenderTarget* renderTarget,
const GrProgramInfo& programInfo,
- GrPrimitiveType primitiveType,
VkRenderPass compatibleRenderPass) {
#ifdef GR_PIPELINE_STATE_CACHE_STATS
++fTotalRequests;
@@ -96,8 +95,7 @@
// TODO: can this be unified between GL, Vk and Mtl?
// Get GrVkProgramDesc
GrVkPipelineStateBuilder::Desc desc;
- if (!GrVkPipelineStateBuilder::Desc::Build(&desc, renderTarget, programInfo, stencil,
- primitiveType, fGpu)) {
+ if (!GrVkPipelineStateBuilder::Desc::Build(&desc, renderTarget, programInfo, stencil, fGpu)) {
GrCapsDebugf(fGpu->caps(), "Failed to build vk program descriptor!\n");
return nullptr;
}
@@ -108,8 +106,7 @@
++fCacheMisses;
#endif
GrVkPipelineState* pipelineState(GrVkPipelineStateBuilder::CreatePipelineState(
- fGpu, renderTarget, programInfo,
- stencil, primitiveType, &desc, compatibleRenderPass));
+ fGpu, renderTarget, programInfo, stencil, &desc, compatibleRenderPass));
if (!pipelineState) {
return nullptr;
}
diff --git a/src/gpu/vk/GrVkResourceProvider.cpp b/src/gpu/vk/GrVkResourceProvider.cpp
index c869029..96bdaa8 100644
--- a/src/gpu/vk/GrVkResourceProvider.cpp
+++ b/src/gpu/vk/GrVkResourceProvider.cpp
@@ -95,12 +95,11 @@
const GrStencilSettings& stencil,
VkPipelineShaderStageCreateInfo* shaderStageInfo,
int shaderStageCount,
- GrPrimitiveType primitiveType,
VkRenderPass compatibleRenderPass,
VkPipelineLayout layout) {
return GrVkPipeline::Create(fGpu, programInfo, stencil, shaderStageInfo,
- shaderStageCount, primitiveType, compatibleRenderPass,
- layout, this->pipelineCache());
+ shaderStageCount, compatibleRenderPass, layout,
+ this->pipelineCache());
}
// To create framebuffers, we first need to create a simple RenderPass that is
@@ -227,10 +226,8 @@
GrVkPipelineState* GrVkResourceProvider::findOrCreateCompatiblePipelineState(
GrRenderTarget* renderTarget,
const GrProgramInfo& programInfo,
- GrPrimitiveType primitiveType,
VkRenderPass compatibleRenderPass) {
- return fPipelineStateCache->refPipelineState(renderTarget, programInfo,
- primitiveType, compatibleRenderPass);
+ return fPipelineStateCache->refPipelineState(renderTarget, programInfo, compatibleRenderPass);
}
void GrVkResourceProvider::getSamplerDescriptorSetHandle(VkDescriptorType type,
diff --git a/src/gpu/vk/GrVkResourceProvider.h b/src/gpu/vk/GrVkResourceProvider.h
index 9cafcb4..8449a88 100644
--- a/src/gpu/vk/GrVkResourceProvider.h
+++ b/src/gpu/vk/GrVkResourceProvider.h
@@ -47,7 +47,6 @@
const GrStencilSettings& stencil,
VkPipelineShaderStageCreateInfo* shaderStageInfo,
int shaderStageCount,
- GrPrimitiveType primitiveType,
VkRenderPass compatibleRenderPass,
VkPipelineLayout layout);
@@ -113,7 +112,6 @@
GrVkPipelineState* findOrCreateCompatiblePipelineState(
GrRenderTarget*,
const GrProgramInfo&,
- GrPrimitiveType,
VkRenderPass compatibleRenderPass);
void getSamplerDescriptorSetHandle(VkDescriptorType type,
@@ -194,7 +192,6 @@
void release();
GrVkPipelineState* refPipelineState(GrRenderTarget*,
const GrProgramInfo&,
- GrPrimitiveType,
VkRenderPass compatibleRenderPass);
private: