blob: 474204f008226219afebfcbd82a8048ca7304247 [file] [log] [blame]
/*
* Copyright 2016 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef GrGLOpsRenderPass_DEFINED
#define GrGLOpsRenderPass_DEFINED
#include "src/gpu/ganesh/GrOpsRenderPass.h"
#include "src/gpu/ganesh/GrOpFlushState.h"
#include "src/gpu/ganesh/gl/GrGLGpu.h"
#include "src/gpu/ganesh/gl/GrGLRenderTarget.h"
class GrGLGpu;
class GrGLRenderTarget;
class GrGLOpsRenderPass : public GrOpsRenderPass {
/**
* We do not actually buffer up draws or do any work in the this class for GL. Instead commands
* are immediately sent to the gpu to execute. Thus all the commands in this class are simply
* pass through functions to corresponding calls in the GrGLGpu class.
*/
public:
GrGLOpsRenderPass(GrGLGpu* gpu) : fGpu(gpu) {}
void inlineUpload(GrOpFlushState* state, GrDeferredTextureUploadFn& upload) override {
state->doUpload(upload);
}
void set(GrRenderTarget*, bool useMSAASurface, const SkIRect& contentBounds, GrSurfaceOrigin,
const LoadAndStoreInfo&, const StencilLoadAndStoreInfo&);
void reset() {
fRenderTarget = nullptr;
}
private:
GrGpu* gpu() override { return fGpu; }
void bindInstanceBuffer(const GrBuffer*, int baseInstance);
void bindVertexBuffer(const GrBuffer*, int baseVertex);
const void* offsetForBaseIndex(int baseIndex) const {
if (!fIndexPointer) {
// nullptr != 0. Adding an offset to a nullptr is undefined.
return (void*)(baseIndex * sizeof(uint16_t));
}
return fIndexPointer + baseIndex;
}
// Ideally we load and store DMSAA only within the content bounds of our render pass, but if
// the caps don't allow for partial framebuffer blits, we resolve the full target.
// We resolve the same bounds during load and store both because if we have to do a full size
// resolve at the end, the full DMSAA attachment needs to have valid content.
GrNativeRect dmsaaLoadStoreBounds() const;
void onBegin() override;
void onEnd() override;
bool onBindPipeline(const GrProgramInfo& programInfo, const SkRect& drawBounds) override;
void onSetScissorRect(const SkIRect& scissor) override;
bool onBindTextures(const GrGeometryProcessor&,
const GrSurfaceProxy* const geomProcTextures[],
const GrPipeline&) override;
void onBindBuffers(sk_sp<const GrBuffer> indexBuffer, sk_sp<const GrBuffer> instanceBuffer,
sk_sp<const GrBuffer> vertexBuffer, GrPrimitiveRestart) override;
void onDraw(int vertexCount, int baseVertex) override;
void onDrawIndexed(int indexCount, int baseIndex, uint16_t minIndexValue,
uint16_t maxIndexValue, int baseVertex) override;
void onDrawInstanced(int instanceCount, int baseInstance, int vertexCount,
int baseVertex) override;
void onDrawIndexedInstanced(int indexCount, int baseIndex, int instanceCount, int baseInstance,
int baseVertex) override;
void onDrawIndirect(const GrBuffer* drawIndirectBuffer, size_t offset, int drawCount) override;
void multiDrawArraysANGLEOrWebGL(const GrBuffer* drawIndirectBuffer, size_t offset,
int drawCount);
void onDrawIndexedIndirect(const GrBuffer* drawIndirectBuffer, size_t offset,
int drawCount) override;
void multiDrawElementsANGLEOrWebGL(const GrBuffer* drawIndirectBuffer, size_t offset,
int drawCount);
void onClear(const GrScissorState& scissor, std::array<float, 4> color) override;
void onClearStencilClip(const GrScissorState& scissor, bool insideStencilMask) override;
GrGLGpu* const fGpu;
bool fUseMultisampleFBO;
SkIRect fContentBounds;
LoadAndStoreInfo fColorLoadAndStoreInfo;
StencilLoadAndStoreInfo fStencilLoadAndStoreInfo;
// Per-pipeline state.
GrPrimitiveType fPrimitiveType;
GrGLAttribArrayState* fAttribArrayState = nullptr;
// If using an index buffer, this gets set during onBindBuffers. It is either the CPU address of
// the indices, or nullptr if they reside physically in GPU memory.
const uint16_t* fIndexPointer;
// This tracks whether or not we bound the respective buffers during the bindBuffers call.
SkDEBUGCODE(bool fDidBindVertexBuffer = false;)
SkDEBUGCODE(bool fDidBindInstanceBuffer = false;)
using INHERITED = GrOpsRenderPass;
};
#endif