| /* |
| * Copyright 2016 Google Inc. |
| * |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| |
| #include "GrGpuCommandBuffer.h" |
| |
| #include "GrContext.h" |
| #include "GrCaps.h" |
| #include "GrFixedClip.h" |
| #include "GrGpu.h" |
| #include "GrMesh.h" |
| #include "GrPrimitiveProcessor.h" |
| #include "GrRenderTarget.h" |
| #include "SkRect.h" |
| |
| void GrGpuRTCommandBuffer::clear(const GrFixedClip& clip, GrColor color) { |
| SkASSERT(fRenderTarget); |
| |
| this->onClear(clip, color); |
| } |
| |
| void GrGpuRTCommandBuffer::clearStencilClip(const GrFixedClip& clip, bool insideStencilMask) { |
| this->onClearStencilClip(clip, insideStencilMask); |
| } |
| |
| bool GrGpuRTCommandBuffer::draw(const GrPrimitiveProcessor& primProc, const GrPipeline& pipeline, |
| const GrPipeline::FixedDynamicState* fixedDynamicState, |
| const GrPipeline::DynamicStateArrays* dynamicStateArrays, |
| const GrMesh meshes[], int meshCount, const SkRect& bounds) { |
| #ifdef SK_DEBUG |
| SkASSERT(!primProc.hasInstanceAttributes() || this->gpu()->caps()->instanceAttribSupport()); |
| for (int i = 0; i < meshCount; ++i) { |
| SkASSERT(!GrPrimTypeRequiresGeometryShaderSupport(meshes[i].primitiveType()) || |
| this->gpu()->caps()->shaderCaps()->geometryShaderSupport()); |
| SkASSERT(primProc.hasVertexAttributes() == meshes[i].hasVertexData()); |
| SkASSERT(primProc.hasInstanceAttributes() == meshes[i].isInstanced()); |
| } |
| #endif |
| SkASSERT(!pipeline.isScissorEnabled() || fixedDynamicState || |
| (dynamicStateArrays && dynamicStateArrays->fScissorRects)); |
| |
| auto resourceProvider = this->gpu()->getContext()->contextPriv().resourceProvider(); |
| |
| if (pipeline.isBad()) { |
| return false; |
| } |
| if (fixedDynamicState && fixedDynamicState->fPrimitiveProcessorTextures) { |
| for (int i = 0; i < primProc.numTextureSamplers(); ++i) { |
| if (!fixedDynamicState->fPrimitiveProcessorTextures[i]->instantiate(resourceProvider)) { |
| return false; |
| } |
| } |
| } |
| if (dynamicStateArrays && dynamicStateArrays->fPrimitiveProcessorTextures) { |
| int n = primProc.numTextureSamplers() * meshCount; |
| const auto* textures = dynamicStateArrays->fPrimitiveProcessorTextures; |
| for (int i = 0; i < n; ++i) { |
| if (!textures[i]->instantiate(resourceProvider)) { |
| return false; |
| } |
| } |
| } |
| |
| if (primProc.numVertexAttributes() > this->gpu()->caps()->maxVertexAttributes()) { |
| this->gpu()->stats()->incNumFailedDraws(); |
| return false; |
| } |
| this->onDraw(primProc, pipeline, fixedDynamicState, dynamicStateArrays, meshes, meshCount, |
| bounds); |
| return true; |
| } |