GrGLGpuCommandBuffer.h revision 952144753dc31d9d935683123cae43fca483bade
1066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel/* 27294b851d277d8e703b23657e1a990f1ae24ead6Robert Phillips* Copyright 2016 Google Inc. 37294b851d277d8e703b23657e1a990f1ae24ead6Robert Phillips* 47294b851d277d8e703b23657e1a990f1ae24ead6Robert Phillips* Use of this source code is governed by a BSD-style license that can be 57294b851d277d8e703b23657e1a990f1ae24ead6Robert Phillips* found in the LICENSE file. 67294b851d277d8e703b23657e1a990f1ae24ead6Robert Phillips*/ 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: 27952144753dc31d9d935683123cae43fca483badeRobert Phillips GrGLGpuCommandBuffer(GrGLGpu* gpu, GrRenderTarget* rt, 28952144753dc31d9d935683123cae43fca483badeRobert Phillips const GrGpuCommandBuffer::StencilLoadAndStoreInfo& stencilInfo) 29952144753dc31d9d935683123cae43fca483badeRobert Phillips : fGpu(gpu) 30952144753dc31d9d935683123cae43fca483badeRobert Phillips , fRenderTarget(static_cast<GrGLRenderTarget*>(rt)) { 31952144753dc31d9d935683123cae43fca483badeRobert Phillips fClearSB = LoadOp::kClear == stencilInfo.fLoadOp; 32952144753dc31d9d935683123cae43fca483badeRobert Phillips } 33066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel 34d3b65972aad96453ff4510caa3e25a2b847c6d1eBrian Salomon ~GrGLGpuCommandBuffer() override {} 35066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel 36952144753dc31d9d935683123cae43fca483badeRobert Phillips void begin() override { 37952144753dc31d9d935683123cae43fca483badeRobert Phillips if (fClearSB) { 38952144753dc31d9d935683123cae43fca483badeRobert Phillips fGpu->clearStencil(fRenderTarget, 0x0); 39952144753dc31d9d935683123cae43fca483badeRobert Phillips } 40952144753dc31d9d935683123cae43fca483badeRobert Phillips } 41066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel void end() override {} 42066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel 434f101a77a742015ed0fb50154909aa73e54d8fdeRobert Phillips void discard(GrRenderTargetProxy* proxy) override { 444f101a77a742015ed0fb50154909aa73e54d8fdeRobert Phillips GrGLRenderTarget* target = static_cast<GrGLRenderTarget*>(proxy->priv().peekRenderTarget()); 45c293a29bc2fced15ac44a66efa813d42cb3f2e0bBrian Salomon if (!fRenderTarget) { 46c293a29bc2fced15ac44a66efa813d42cb3f2e0bBrian Salomon fRenderTarget = target; 47c293a29bc2fced15ac44a66efa813d42cb3f2e0bBrian Salomon } 48c293a29bc2fced15ac44a66efa813d42cb3f2e0bBrian Salomon SkASSERT(target == fRenderTarget); 49c293a29bc2fced15ac44a66efa813d42cb3f2e0bBrian Salomon } 50066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel 5165a88fadab72abd104fdf4cc4a97488b2e901c60Robert Phillips void insertEventMarker(GrRenderTargetProxy* proxy, const char* msg) override { 5265a88fadab72abd104fdf4cc4a97488b2e901c60Robert Phillips GrGLRenderTarget* target = static_cast<GrGLRenderTarget*>(proxy->priv().peekRenderTarget()); 5365a88fadab72abd104fdf4cc4a97488b2e901c60Robert Phillips if (!fRenderTarget) { 5465a88fadab72abd104fdf4cc4a97488b2e901c60Robert Phillips fRenderTarget = target; 5565a88fadab72abd104fdf4cc4a97488b2e901c60Robert Phillips } 5665a88fadab72abd104fdf4cc4a97488b2e901c60Robert Phillips SkASSERT(target == fRenderTarget); 5765a88fadab72abd104fdf4cc4a97488b2e901c60Robert Phillips 5865a88fadab72abd104fdf4cc4a97488b2e901c60Robert Phillips fGpu->insertEventMarker(msg); 5965a88fadab72abd104fdf4cc4a97488b2e901c60Robert Phillips } 6065a88fadab72abd104fdf4cc4a97488b2e901c60Robert Phillips 61dbd11ec106e3726b09bf5d240c9fcbf6a671a570Greg Daniel void inlineUpload(GrOpFlushState* state, GrDrawOp::DeferredUploadFn& upload, 624f101a77a742015ed0fb50154909aa73e54d8fdeRobert Phillips GrRenderTargetProxy*) override { 6377b53f66bacd9a1d1c9df7d879a419b2abe069baGreg Daniel state->doUpload(upload); 6477b53f66bacd9a1d1c9df7d879a419b2abe069baGreg Daniel } 6577b53f66bacd9a1d1c9df7d879a419b2abe069baGreg Daniel 66066df7ca911b65d416783f3bec6f4f1662948ad5egdanielprivate: 679cb6340a62a5d748e4189d50e51fa527c8c80c03egdaniel GrGpu* gpu() override { return fGpu; } 6865a09274184ffd25d446352a96d3890ea7e625faGreg Daniel GrRenderTarget* renderTarget() override { return fRenderTarget; } 699cb6340a62a5d748e4189d50e51fa527c8c80c03egdaniel 7036a77ee494791989548b717515e3621b9c4ffe4eGreg Daniel void onSubmit() override {} 719cb6340a62a5d748e4189d50e51fa527c8c80c03egdaniel 729cb6340a62a5d748e4189d50e51fa527c8c80c03egdaniel void onDraw(const GrPipeline& pipeline, 739cb6340a62a5d748e4189d50e51fa527c8c80c03egdaniel const GrPrimitiveProcessor& primProc, 7446983b7dd88603bb2a9a3c3e1ce3e147f5615f2fChris Dalton const GrMesh mesh[], 7546983b7dd88603bb2a9a3c3e1ce3e147f5615f2fChris Dalton const GrPipeline::DynamicState dynamicStates[], 7636a77ee494791989548b717515e3621b9c4ffe4eGreg Daniel int meshCount, 7736a77ee494791989548b717515e3621b9c4ffe4eGreg Daniel const SkRect& bounds) override { 782890fbfe1400b81e4d6af98d14dfe757fec93650Robert Phillips GrGLRenderTarget* target = static_cast<GrGLRenderTarget*>(pipeline.renderTarget()); 79c293a29bc2fced15ac44a66efa813d42cb3f2e0bBrian Salomon if (!fRenderTarget) { 80c293a29bc2fced15ac44a66efa813d42cb3f2e0bBrian Salomon fRenderTarget = target; 81c293a29bc2fced15ac44a66efa813d42cb3f2e0bBrian Salomon } 82c293a29bc2fced15ac44a66efa813d42cb3f2e0bBrian Salomon SkASSERT(target == fRenderTarget); 8346983b7dd88603bb2a9a3c3e1ce3e147f5615f2fChris Dalton fGpu->draw(pipeline, primProc, mesh, dynamicStates, meshCount); 849cb6340a62a5d748e4189d50e51fa527c8c80c03egdaniel } 859cb6340a62a5d748e4189d50e51fa527c8c80c03egdaniel 864f101a77a742015ed0fb50154909aa73e54d8fdeRobert Phillips void onClear(GrRenderTargetProxy* proxy, const GrFixedClip& clip, GrColor color) override { 874f101a77a742015ed0fb50154909aa73e54d8fdeRobert Phillips GrGLRenderTarget* target = static_cast<GrGLRenderTarget*>(proxy->priv().peekRenderTarget()); 88c293a29bc2fced15ac44a66efa813d42cb3f2e0bBrian Salomon if (!fRenderTarget) { 89c293a29bc2fced15ac44a66efa813d42cb3f2e0bBrian Salomon fRenderTarget = target; 90c293a29bc2fced15ac44a66efa813d42cb3f2e0bBrian Salomon } 91c293a29bc2fced15ac44a66efa813d42cb3f2e0bBrian Salomon SkASSERT(target == fRenderTarget); 927294b851d277d8e703b23657e1a990f1ae24ead6Robert Phillips fGpu->clear(clip, color, fRenderTarget); 939cb6340a62a5d748e4189d50e51fa527c8c80c03egdaniel } 949cb6340a62a5d748e4189d50e51fa527c8c80c03egdaniel 954f101a77a742015ed0fb50154909aa73e54d8fdeRobert Phillips void onClearStencilClip(GrRenderTargetProxy* proxy, const GrFixedClip& clip, 9629df76096fd30941086324902a82656df2d8becdcsmartdalton bool insideStencilMask) override { 974f101a77a742015ed0fb50154909aa73e54d8fdeRobert Phillips GrGLRenderTarget* target = static_cast<GrGLRenderTarget*>(proxy->priv().peekRenderTarget()); 98c293a29bc2fced15ac44a66efa813d42cb3f2e0bBrian Salomon if (!fRenderTarget) { 99c293a29bc2fced15ac44a66efa813d42cb3f2e0bBrian Salomon fRenderTarget = target; 100c293a29bc2fced15ac44a66efa813d42cb3f2e0bBrian Salomon } 101c293a29bc2fced15ac44a66efa813d42cb3f2e0bBrian Salomon SkASSERT(target == fRenderTarget); 1027294b851d277d8e703b23657e1a990f1ae24ead6Robert Phillips fGpu->clearStencilClip(clip, insideStencilMask, fRenderTarget); 1039cb6340a62a5d748e4189d50e51fa527c8c80c03egdaniel } 1049cb6340a62a5d748e4189d50e51fa527c8c80c03egdaniel 1059cb6340a62a5d748e4189d50e51fa527c8c80c03egdaniel GrGLGpu* fGpu; 10665a09274184ffd25d446352a96d3890ea7e625faGreg Daniel GrGLRenderTarget* fRenderTarget; 107952144753dc31d9d935683123cae43fca483badeRobert Phillips bool fClearSB; 108066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel 109066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel typedef GrGpuCommandBuffer INHERITED; 110066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel}; 111066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel 112066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel#endif 113066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel 114