GrGLGpuCommandBuffer.h revision 2890fbfe1400b81e4d6af98d14dfe757fec93650
1066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel/* 2066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel* Copyright 2016 Google Inc. 3066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel* 4066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel* Use of this source code is governed by a BSD-style license that can be 5066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel* found in the LICENSE file. 6066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel*/ 7066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel 8066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel#ifndef GrGLGpuCommandBuffer_DEFINED 9066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel#define GrGLGpuCommandBuffer_DEFINED 10066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel 11066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel#include "GrGpuCommandBuffer.h" 12066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel 13466c7d65974a055ad361430e57f92584b09af0bdHal Canary#include "GrGLGpu.h" 14466c7d65974a055ad361430e57f92584b09af0bdHal Canary#include "GrGLRenderTarget.h" 15742e31de1599f3902810aecdf2e2e3eed3b40a09Brian Salomon#include "GrOpFlushState.h" 16066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel 17009e9af5549301be41cfbd9f286ad90842e4096bRobert Phillipsclass GrGLGpu; 1865a09274184ffd25d446352a96d3890ea7e625faGreg Danielclass GrGLRenderTarget; 1965a09274184ffd25d446352a96d3890ea7e625faGreg Daniel 20066df7ca911b65d416783f3bec6f4f1662948ad5egdanielclass GrGLGpuCommandBuffer : public GrGpuCommandBuffer { 219cb6340a62a5d748e4189d50e51fa527c8c80c03egdaniel/** 229cb6340a62a5d748e4189d50e51fa527c8c80c03egdaniel * We do not actually buffer up draws or do any work in the this class for GL. Instead commands 239cb6340a62a5d748e4189d50e51fa527c8c80c03egdaniel * are immediately sent to the gpu to execute. Thus all the commands in this class are simply 249cb6340a62a5d748e4189d50e51fa527c8c80c03egdaniel * pass through functions to corresponding calls in the GrGLGpu class. 259cb6340a62a5d748e4189d50e51fa527c8c80c03egdaniel */ 26066df7ca911b65d416783f3bec6f4f1662948ad5egdanielpublic: 27c293a29bc2fced15ac44a66efa813d42cb3f2e0bBrian Salomon GrGLGpuCommandBuffer(GrGLGpu* gpu) : fGpu(gpu), fRenderTarget(nullptr) {} 28066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel 29d3b65972aad96453ff4510caa3e25a2b847c6d1eBrian Salomon ~GrGLGpuCommandBuffer() override {} 30066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel 31066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel void end() override {} 32066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel 33c293a29bc2fced15ac44a66efa813d42cb3f2e0bBrian Salomon void discard(GrRenderTarget* rt) override { 34c293a29bc2fced15ac44a66efa813d42cb3f2e0bBrian Salomon GrGLRenderTarget* target = static_cast<GrGLRenderTarget*>(rt); 35c293a29bc2fced15ac44a66efa813d42cb3f2e0bBrian Salomon if (!fRenderTarget) { 36c293a29bc2fced15ac44a66efa813d42cb3f2e0bBrian Salomon fRenderTarget = target; 37c293a29bc2fced15ac44a66efa813d42cb3f2e0bBrian Salomon } 38c293a29bc2fced15ac44a66efa813d42cb3f2e0bBrian Salomon SkASSERT(target == fRenderTarget); 39c293a29bc2fced15ac44a66efa813d42cb3f2e0bBrian Salomon } 40066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel 41dbd11ec106e3726b09bf5d240c9fcbf6a671a570Greg Daniel void inlineUpload(GrOpFlushState* state, GrDrawOp::DeferredUploadFn& upload, 42dbd11ec106e3726b09bf5d240c9fcbf6a671a570Greg Daniel GrRenderTarget*) override { 4377b53f66bacd9a1d1c9df7d879a419b2abe069baGreg Daniel state->doUpload(upload); 4477b53f66bacd9a1d1c9df7d879a419b2abe069baGreg Daniel } 4577b53f66bacd9a1d1c9df7d879a419b2abe069baGreg Daniel 46066df7ca911b65d416783f3bec6f4f1662948ad5egdanielprivate: 479cb6340a62a5d748e4189d50e51fa527c8c80c03egdaniel GrGpu* gpu() override { return fGpu; } 4865a09274184ffd25d446352a96d3890ea7e625faGreg Daniel GrRenderTarget* renderTarget() override { return fRenderTarget; } 499cb6340a62a5d748e4189d50e51fa527c8c80c03egdaniel 5036a77ee494791989548b717515e3621b9c4ffe4eGreg Daniel void onSubmit() override {} 519cb6340a62a5d748e4189d50e51fa527c8c80c03egdaniel 529cb6340a62a5d748e4189d50e51fa527c8c80c03egdaniel void onDraw(const GrPipeline& pipeline, 539cb6340a62a5d748e4189d50e51fa527c8c80c03egdaniel const GrPrimitiveProcessor& primProc, 5446983b7dd88603bb2a9a3c3e1ce3e147f5615f2fChris Dalton const GrMesh mesh[], 5546983b7dd88603bb2a9a3c3e1ce3e147f5615f2fChris Dalton const GrPipeline::DynamicState dynamicStates[], 5636a77ee494791989548b717515e3621b9c4ffe4eGreg Daniel int meshCount, 5736a77ee494791989548b717515e3621b9c4ffe4eGreg Daniel const SkRect& bounds) override { 582890fbfe1400b81e4d6af98d14dfe757fec93650Robert Phillips GrGLRenderTarget* target = static_cast<GrGLRenderTarget*>(pipeline.renderTarget()); 59c293a29bc2fced15ac44a66efa813d42cb3f2e0bBrian Salomon if (!fRenderTarget) { 60c293a29bc2fced15ac44a66efa813d42cb3f2e0bBrian Salomon fRenderTarget = target; 61c293a29bc2fced15ac44a66efa813d42cb3f2e0bBrian Salomon } 62c293a29bc2fced15ac44a66efa813d42cb3f2e0bBrian Salomon SkASSERT(target == fRenderTarget); 6346983b7dd88603bb2a9a3c3e1ce3e147f5615f2fChris Dalton fGpu->draw(pipeline, primProc, mesh, dynamicStates, meshCount); 649cb6340a62a5d748e4189d50e51fa527c8c80c03egdaniel } 659cb6340a62a5d748e4189d50e51fa527c8c80c03egdaniel 66c293a29bc2fced15ac44a66efa813d42cb3f2e0bBrian Salomon void onClear(GrRenderTarget* rt, const GrFixedClip& clip, GrColor color) override { 67c293a29bc2fced15ac44a66efa813d42cb3f2e0bBrian Salomon GrGLRenderTarget* target = static_cast<GrGLRenderTarget*>(rt); 68c293a29bc2fced15ac44a66efa813d42cb3f2e0bBrian Salomon if (!fRenderTarget) { 69c293a29bc2fced15ac44a66efa813d42cb3f2e0bBrian Salomon fRenderTarget = target; 70c293a29bc2fced15ac44a66efa813d42cb3f2e0bBrian Salomon } 71c293a29bc2fced15ac44a66efa813d42cb3f2e0bBrian Salomon SkASSERT(target == fRenderTarget); 7265a09274184ffd25d446352a96d3890ea7e625faGreg Daniel fGpu->clear(clip, color, fRenderTarget); 739cb6340a62a5d748e4189d50e51fa527c8c80c03egdaniel } 749cb6340a62a5d748e4189d50e51fa527c8c80c03egdaniel 75c293a29bc2fced15ac44a66efa813d42cb3f2e0bBrian Salomon void onClearStencilClip(GrRenderTarget* rt, const GrFixedClip& clip, 7629df76096fd30941086324902a82656df2d8becdcsmartdalton bool insideStencilMask) override { 77c293a29bc2fced15ac44a66efa813d42cb3f2e0bBrian Salomon GrGLRenderTarget* target = static_cast<GrGLRenderTarget*>(rt); 78c293a29bc2fced15ac44a66efa813d42cb3f2e0bBrian Salomon if (!fRenderTarget) { 79c293a29bc2fced15ac44a66efa813d42cb3f2e0bBrian Salomon fRenderTarget = target; 80c293a29bc2fced15ac44a66efa813d42cb3f2e0bBrian Salomon } 81c293a29bc2fced15ac44a66efa813d42cb3f2e0bBrian Salomon SkASSERT(target == fRenderTarget); 8265a09274184ffd25d446352a96d3890ea7e625faGreg Daniel fGpu->clearStencilClip(clip, insideStencilMask, fRenderTarget); 839cb6340a62a5d748e4189d50e51fa527c8c80c03egdaniel } 849cb6340a62a5d748e4189d50e51fa527c8c80c03egdaniel 859cb6340a62a5d748e4189d50e51fa527c8c80c03egdaniel GrGLGpu* fGpu; 8665a09274184ffd25d446352a96d3890ea7e625faGreg Daniel GrGLRenderTarget* fRenderTarget; 87066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel 88066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel typedef GrGpuCommandBuffer INHERITED; 89066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel}; 90066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel 91066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel#endif 92066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel 93