blob: a6a2f84f2368c7411b8d031d8517ff10fa647b5c [file] [log] [blame]
egdaniel9cb63402016-06-23 08:37:05 -07001/*
2* Copyright 2016 Google Inc.
3*
4* Use of this source code is governed by a BSD-style license that can be
5* found in the LICENSE file.
6*/
7
8#include "GrGpuCommandBuffer.h"
9
Robert Phillips9bee2e52017-05-29 12:37:20 -040010#include "GrContext.h"
robertphillips28a838e2016-06-23 14:07:00 -070011#include "GrCaps.h"
csmartdalton29df7602016-08-31 11:55:52 -070012#include "GrFixedClip.h"
egdaniel9cb63402016-06-23 08:37:05 -070013#include "GrGpu.h"
Brian Salomon2a55c8e2017-05-09 09:57:19 -040014#include "GrMesh.h"
egdaniel9cb63402016-06-23 08:37:05 -070015#include "GrPrimitiveProcessor.h"
16#include "GrRenderTarget.h"
17#include "SkRect.h"
18
Brian Osman9a9baae2018-11-05 15:06:26 -050019void GrGpuRTCommandBuffer::clear(const GrFixedClip& clip, const SkPMColor4f& color) {
Robert Phillips4912d902018-04-27 12:09:35 -040020 SkASSERT(fRenderTarget);
21
Robert Phillips19e51dc2017-08-09 09:30:51 -040022 this->onClear(clip, color);
egdaniel9cb63402016-06-23 08:37:05 -070023}
24
Greg Daniel500d58b2017-08-24 15:59:33 -040025void GrGpuRTCommandBuffer::clearStencilClip(const GrFixedClip& clip, bool insideStencilMask) {
Robert Phillips19e51dc2017-08-09 09:30:51 -040026 this->onClearStencilClip(clip, insideStencilMask);
egdaniel9cb63402016-06-23 08:37:05 -070027}
28
Brian Salomon49348902018-06-26 09:12:38 -040029bool GrGpuRTCommandBuffer::draw(const GrPrimitiveProcessor& primProc, const GrPipeline& pipeline,
30 const GrPipeline::FixedDynamicState* fixedDynamicState,
31 const GrPipeline::DynamicStateArrays* dynamicStateArrays,
32 const GrMesh meshes[], int meshCount, const SkRect& bounds) {
Chris Daltonbca46e22017-05-15 11:03:26 -060033#ifdef SK_DEBUG
Brian Salomon92be2f72018-06-19 14:33:47 -040034 SkASSERT(!primProc.hasInstanceAttributes() || this->gpu()->caps()->instanceAttribSupport());
Chris Daltonbca46e22017-05-15 11:03:26 -060035 for (int i = 0; i < meshCount; ++i) {
Chris Daltonb894c2b2017-06-14 12:39:19 -060036 SkASSERT(!GrPrimTypeRequiresGeometryShaderSupport(meshes[i].primitiveType()) ||
Chris Dalton3809bab2017-06-13 10:55:06 -060037 this->gpu()->caps()->shaderCaps()->geometryShaderSupport());
Brian Salomon92be2f72018-06-19 14:33:47 -040038 SkASSERT(primProc.hasVertexAttributes() == meshes[i].hasVertexData());
39 SkASSERT(primProc.hasInstanceAttributes() == meshes[i].isInstanced());
Chris Daltonbca46e22017-05-15 11:03:26 -060040 }
41#endif
Brian Salomond818ebf2018-07-02 14:08:49 +000042 SkASSERT(!pipeline.isScissorEnabled() || fixedDynamicState ||
Brian Salomon49348902018-06-26 09:12:38 -040043 (dynamicStateArrays && dynamicStateArrays->fScissorRects));
44
Robert Phillips6be756b2018-01-16 15:07:54 -050045 auto resourceProvider = this->gpu()->getContext()->contextPriv().resourceProvider();
Chris Daltonbca46e22017-05-15 11:03:26 -060046
Brian Salomon7eae3e02018-08-07 14:02:38 +000047 if (pipeline.isBad()) {
Robert Phillipsa91e0b72017-05-01 13:12:20 -040048 return false;
49 }
Brian Salomonf7232642018-09-19 08:58:08 -040050 if (fixedDynamicState && fixedDynamicState->fPrimitiveProcessorTextures) {
51 for (int i = 0; i < primProc.numTextureSamplers(); ++i) {
52 if (!fixedDynamicState->fPrimitiveProcessorTextures[i]->instantiate(resourceProvider)) {
53 return false;
54 }
55 }
56 }
57 if (dynamicStateArrays && dynamicStateArrays->fPrimitiveProcessorTextures) {
58 int n = primProc.numTextureSamplers() * meshCount;
59 const auto* textures = dynamicStateArrays->fPrimitiveProcessorTextures;
60 for (int i = 0; i < n; ++i) {
61 if (!textures[i]->instantiate(resourceProvider)) {
62 return false;
63 }
Brian Salomon7eae3e02018-08-07 14:02:38 +000064 }
Greg Daniel9a51a862018-11-30 10:18:14 -050065#ifdef SK_DEBUG
66 SkASSERT(meshCount >= 1);
67 const GrTextureProxy* const* primProcProxies =
68 dynamicStateArrays->fPrimitiveProcessorTextures;
69 for (int i = 0; i < primProc.numTextureSamplers(); ++i) {
70 const GrBackendFormat& format = primProcProxies[i]->backendFormat();
71 GrTextureType type = primProcProxies[i]->textureType();
72 GrPixelConfig config = primProcProxies[i]->config();
73 for (int j = 1; j < meshCount; ++j) {
74 const GrTextureProxy* testProxy =
75 primProcProxies[j*primProc.numTextureSamplers() + i];
76 SkASSERT(testProxy->backendFormat() == format);
77 SkASSERT(testProxy->textureType() == type);
78 SkASSERT(testProxy->config() == config);
79 }
80 }
81#endif
82
Brian Salomon7eae3e02018-08-07 14:02:38 +000083 }
Robert Phillipsa91e0b72017-05-01 13:12:20 -040084
Brian Salomon92be2f72018-06-19 14:33:47 -040085 if (primProc.numVertexAttributes() > this->gpu()->caps()->maxVertexAttributes()) {
egdaniel9cb63402016-06-23 08:37:05 -070086 this->gpu()->stats()->incNumFailedDraws();
87 return false;
88 }
Brian Salomon49348902018-06-26 09:12:38 -040089 this->onDraw(primProc, pipeline, fixedDynamicState, dynamicStateArrays, meshes, meshCount,
90 bounds);
egdaniel9cb63402016-06-23 08:37:05 -070091 return true;
92}