Home | History | Annotate | Download | only in gl
      1 /*
      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 #ifndef GrGLGpuCommandBuffer_DEFINED
      9 #define GrGLGpuCommandBuffer_DEFINED
     10 
     11 #include "GrGpuCommandBuffer.h"
     12 
     13 #include "GrGLGpu.h"
     14 #include "GrGLRenderTarget.h"
     15 #include "GrOpFlushState.h"
     16 
     17 class GrGLGpu;
     18 class GrGLRenderTarget;
     19 
     20 class GrGLGpuTextureCommandBuffer : public GrGpuTextureCommandBuffer {
     21 public:
     22     GrGLGpuTextureCommandBuffer(GrGLGpu* gpu, GrTexture* texture, GrSurfaceOrigin origin)
     23         : INHERITED(texture, origin)
     24         , fGpu(gpu) {
     25     }
     26 
     27     ~GrGLGpuTextureCommandBuffer() override {}
     28 
     29     void submit() override {}
     30 
     31     void copy(GrSurface* src, GrSurfaceOrigin srcOrigin, const SkIRect& srcRect,
     32               const SkIPoint& dstPoint) override {
     33         fGpu->copySurface(fTexture, fOrigin, src, srcOrigin, srcRect, dstPoint);
     34     }
     35 
     36     void insertEventMarker(const char* msg) override {
     37         fGpu->insertEventMarker(msg);
     38     }
     39 
     40 private:
     41     GrGLGpu* fGpu;
     42 
     43     typedef GrGpuTextureCommandBuffer INHERITED;
     44 };
     45 
     46 class GrGLGpuRTCommandBuffer : public GrGpuRTCommandBuffer {
     47 /**
     48  * We do not actually buffer up draws or do any work in the this class for GL. Instead commands
     49  * are immediately sent to the gpu to execute. Thus all the commands in this class are simply
     50  * pass through functions to corresponding calls in the GrGLGpu class.
     51  */
     52 public:
     53     GrGLGpuRTCommandBuffer(GrGLGpu* gpu, GrRenderTarget* rt, GrSurfaceOrigin origin,
     54                            const GrGpuRTCommandBuffer::LoadAndStoreInfo& colorInfo,
     55                            const GrGpuRTCommandBuffer::StencilLoadAndStoreInfo& stencilInfo)
     56             : INHERITED(rt, origin)
     57             , fGpu(gpu)
     58             , fColorLoadAndStoreInfo(colorInfo)
     59             , fStencilLoadAndStoreInfo(stencilInfo) {
     60     }
     61 
     62     ~GrGLGpuRTCommandBuffer() override {}
     63 
     64     void begin() override;
     65     void end() override {}
     66 
     67     void discard() override { }
     68 
     69     void insertEventMarker(const char* msg) override {
     70         fGpu->insertEventMarker(msg);
     71     }
     72 
     73     void inlineUpload(GrOpFlushState* state, GrDeferredTextureUploadFn& upload) override {
     74         state->doUpload(upload);
     75     }
     76 
     77     void copy(GrSurface* src, GrSurfaceOrigin srcOrigin, const SkIRect& srcRect,
     78               const SkIPoint& dstPoint) override {
     79         fGpu->copySurface(fRenderTarget, fOrigin, src, srcOrigin, srcRect, dstPoint);
     80     }
     81 
     82     void submit() override {}
     83 
     84 private:
     85     GrGpu* gpu() override { return fGpu; }
     86 
     87     void onDraw(const GrPipeline& pipeline,
     88                 const GrPrimitiveProcessor& primProc,
     89                 const GrMesh mesh[],
     90                 const GrPipeline::DynamicState dynamicStates[],
     91                 int meshCount,
     92                 const SkRect& bounds) override {
     93         SkASSERT(pipeline.renderTarget() == fRenderTarget);
     94         fGpu->draw(pipeline, primProc, mesh, dynamicStates, meshCount);
     95     }
     96 
     97     void onClear(const GrFixedClip& clip, GrColor color) override {
     98         fGpu->clear(clip, color, fRenderTarget, fOrigin);
     99     }
    100 
    101     void onClearStencilClip(const GrFixedClip& clip, bool insideStencilMask) override {
    102         fGpu->clearStencilClip(clip, insideStencilMask, fRenderTarget, fOrigin);
    103     }
    104 
    105     GrGLGpu*                                      fGpu;
    106     GrGpuRTCommandBuffer::LoadAndStoreInfo        fColorLoadAndStoreInfo;
    107     GrGpuRTCommandBuffer::StencilLoadAndStoreInfo fStencilLoadAndStoreInfo;
    108 
    109     typedef GrGpuRTCommandBuffer INHERITED;
    110 };
    111 
    112 #endif
    113 
    114