aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar Robert Phillips <robertphillips@google.com>2017-08-09 09:30:51 -0400
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-08-09 14:30:54 +0000
commit19e51dcd1eb0bcdc70f29620ce4ca30ddbfc2042 (patch)
tree19639614fa3494f150b97c4dd9bf9b07b69474fa /src
parent69fd008199989c5a5a96f992dcaa4089b63f490f (diff)
Store GrRenderTarget in GrGpuCommandBuffer
Change-Id: I545d53ffb5f9d450b87a360516b03bdd47232a70 Reviewed-on: https://skia-review.googlesource.com/32460 Reviewed-by: Brian Salomon <bsalomon@google.com> Commit-Queue: Robert Phillips <robertphillips@google.com>
Diffstat (limited to 'src')
-rw-r--r--src/gpu/GrGpuCommandBuffer.cpp11
-rw-r--r--src/gpu/GrGpuCommandBuffer.h38
-rw-r--r--src/gpu/GrOpFlushState.h1
-rw-r--r--src/gpu/GrPipeline.h1
-rw-r--r--src/gpu/gl/GrGLGpu.cpp13
-rw-r--r--src/gpu/gl/GrGLGpu.h5
-rw-r--r--src/gpu/gl/GrGLGpuCommandBuffer.h52
-rw-r--r--src/gpu/mock/GrMockGpu.cpp4
-rw-r--r--src/gpu/mock/GrMockGpuCommandBuffer.h18
-rw-r--r--src/gpu/ops/GrClearOp.cpp4
-rw-r--r--src/gpu/ops/GrClearStencilClipOp.h5
-rw-r--r--src/gpu/ops/GrDebugMarkerOp.h4
-rw-r--r--src/gpu/ops/GrDiscardOp.h4
-rw-r--r--src/gpu/ops/GrMeshDrawOp.cpp3
-rw-r--r--src/gpu/ops/GrStencilPathOp.cpp2
-rw-r--r--src/gpu/vk/GrVkGpuCommandBuffer.cpp100
-rw-r--r--src/gpu/vk/GrVkGpuCommandBuffer.h18
17 files changed, 106 insertions, 177 deletions
diff --git a/src/gpu/GrGpuCommandBuffer.cpp b/src/gpu/GrGpuCommandBuffer.cpp
index 56376e2287..ad370f077e 100644
--- a/src/gpu/GrGpuCommandBuffer.cpp
+++ b/src/gpu/GrGpuCommandBuffer.cpp
@@ -21,20 +21,19 @@ void GrGpuCommandBuffer::submit() {
this->onSubmit();
}
-void GrGpuCommandBuffer::clear(GrRenderTargetProxy* proxy, const GrFixedClip& clip, GrColor color) {
+void GrGpuCommandBuffer::clear(const GrFixedClip& clip, GrColor color) {
#ifdef SK_DEBUG
- GrRenderTarget* rt = proxy->priv().peekRenderTarget();
+ GrRenderTarget* rt = fRenderTarget;
SkASSERT(rt);
SkASSERT(!clip.scissorEnabled() ||
(SkIRect::MakeWH(rt->width(), rt->height()).contains(clip.scissorRect()) &&
SkIRect::MakeWH(rt->width(), rt->height()) != clip.scissorRect()));
#endif
- this->onClear(proxy, clip, color);
+ this->onClear(clip, color);
}
-void GrGpuCommandBuffer::clearStencilClip(GrRenderTargetProxy* proxy, const GrFixedClip& clip,
- bool insideStencilMask) {
- this->onClearStencilClip(proxy, clip, insideStencilMask);
+void GrGpuCommandBuffer::clearStencilClip(const GrFixedClip& clip, bool insideStencilMask) {
+ this->onClearStencilClip(clip, insideStencilMask);
}
bool GrGpuCommandBuffer::draw(const GrPipeline& pipeline,
diff --git a/src/gpu/GrGpuCommandBuffer.h b/src/gpu/GrGpuCommandBuffer.h
index 1be361f81d..31e9a546d5 100644
--- a/src/gpu/GrGpuCommandBuffer.h
+++ b/src/gpu/GrGpuCommandBuffer.h
@@ -27,12 +27,6 @@ struct SkRect;
* the same render target. It is possible that these commands execute immediately (GL), or get
* buffered up for later execution (Vulkan). GrOps will execute their draw commands into a
* GrGpuCommandBuffer.
- *
- * Ideally we'd know the GrRenderTarget, or at least its properties when the GrGpuCommandBuffer, is
- * created. We also then wouldn't include it in the GrPipeline or as a parameter to the clear and
- * discard methods. The logical place for that will be in GrRenderTargetOpList post-MDB. For now
- * the render target is redundantly passed to each operation, though it will always be the same
- * render target for a given command buffer even pre-MDB.
*/
class GrGpuCommandBuffer {
public:
@@ -60,7 +54,10 @@ public:
StoreOp fStoreOp;
};
- GrGpuCommandBuffer() {}
+ GrGpuCommandBuffer(GrRenderTarget* rt, GrSurfaceOrigin origin)
+ : fRenderTarget(rt)
+ , fOrigin(origin) {
+ }
virtual ~GrGpuCommandBuffer() {}
virtual void begin() = 0;
@@ -83,28 +80,29 @@ public:
const SkRect& bounds);
// Performs an upload of vertex data in the middle of a set of a set of draws
- virtual void inlineUpload(GrOpFlushState*, GrDrawOp::DeferredUploadFn&,
- GrRenderTargetProxy*) = 0;
+ virtual void inlineUpload(GrOpFlushState*, GrDrawOp::DeferredUploadFn&) = 0;
/**
- * Clear the passed in render target. Ignores the draw state and clip.
+ * Clear the owned render target. Ignores the draw state and clip.
*/
- void clear(GrRenderTargetProxy*, const GrFixedClip&, GrColor);
+ void clear(const GrFixedClip&, GrColor);
- void clearStencilClip(GrRenderTargetProxy*, const GrFixedClip&, bool insideStencilMask);
+ void clearStencilClip(const GrFixedClip&, bool insideStencilMask);
/**
- * Discards the contents render target. nullptr indicates that the current render target should
- * be discarded.
+ * Discards the contents render target.
*/
// TODO: This should be removed in the future to favor using the load and store ops for discard
- virtual void discard(GrRenderTargetProxy*) = 0;
+ virtual void discard() = 0;
- virtual void insertEventMarker(GrRenderTargetProxy*, const char*) = 0;
+ virtual void insertEventMarker(const char*) = 0;
+
+protected:
+ GrRenderTarget* fRenderTarget;
+ GrSurfaceOrigin fOrigin;
private:
virtual GrGpu* gpu() = 0;
- virtual GrRenderTarget* renderTarget() = 0;
virtual void onSubmit() = 0;
@@ -117,11 +115,9 @@ private:
const SkRect& bounds) = 0;
// overridden by backend-specific derived class to perform the clear.
- virtual void onClear(GrRenderTargetProxy*, const GrFixedClip&, GrColor) = 0;
-
- virtual void onClearStencilClip(GrRenderTargetProxy*, const GrFixedClip&,
- bool insideStencilMask) = 0;
+ virtual void onClear(const GrFixedClip&, GrColor) = 0;
+ virtual void onClearStencilClip(const GrFixedClip&, bool insideStencilMask) = 0;
};
#endif
diff --git a/src/gpu/GrOpFlushState.h b/src/gpu/GrOpFlushState.h
index c73fee0a28..4d1685638f 100644
--- a/src/gpu/GrOpFlushState.h
+++ b/src/gpu/GrOpFlushState.h
@@ -99,6 +99,7 @@ public:
struct DrawOpArgs {
GrRenderTarget* renderTarget() const { return fProxy->priv().peekRenderTarget(); }
+ // TODO: do we still need the dst proxy here?
GrRenderTargetProxy* fProxy;
const GrAppliedClip* fAppliedClip;
GrXferProcessor::DstProxy fDstProxy;
diff --git a/src/gpu/GrPipeline.h b/src/gpu/GrPipeline.h
index aca41c1484..075f09cf63 100644
--- a/src/gpu/GrPipeline.h
+++ b/src/gpu/GrPipeline.h
@@ -237,6 +237,7 @@ private:
DstTextureProxy fDstTextureProxy;
SkIPoint fDstTextureOffset;
+ // MDB TODO: do we still need the destination proxy here?
RenderTargetProxy fProxy;
GrScissorState fScissorState;
GrWindowRectsState fWindowRectsState;
diff --git a/src/gpu/gl/GrGLGpu.cpp b/src/gpu/gl/GrGLGpu.cpp
index 7eb49525e3..c20cdf048f 100644
--- a/src/gpu/gl/GrGLGpu.cpp
+++ b/src/gpu/gl/GrGLGpu.cpp
@@ -1972,7 +1972,8 @@ void GrGLGpu::disableScissor() {
}
}
-void GrGLGpu::clear(const GrFixedClip& clip, GrColor color, GrRenderTarget* target) {
+void GrGLGpu::clear(const GrFixedClip& clip, GrColor color,
+ GrRenderTarget* target, GrSurfaceOrigin origin) {
this->handleDirtyContext();
// parent class should never let us get here with no RT
@@ -1980,7 +1981,7 @@ void GrGLGpu::clear(const GrFixedClip& clip, GrColor color, GrRenderTarget* targ
GrGLRenderTarget* glRT = static_cast<GrGLRenderTarget*>(target);
this->flushRenderTarget(glRT, clip.scissorEnabled() ? &clip.scissorRect() : nullptr);
- this->flushScissor(clip.scissorState(), glRT->getViewport(), glRT->origin());
+ this->flushScissor(clip.scissorState(), glRT->getViewport(), origin);
this->flushWindowRectangles(clip.windowRectsState(), glRT);
GrGLfloat r, g, b, a;
@@ -2022,7 +2023,7 @@ void GrGLGpu::clearStencil(GrRenderTarget* target, int clearValue) {
void GrGLGpu::clearStencilClip(const GrFixedClip& clip,
bool insideStencilMask,
- GrRenderTarget* target) {
+ GrRenderTarget* target, GrSurfaceOrigin origin) {
SkASSERT(target);
this->handleDirtyContext();
@@ -2056,7 +2057,7 @@ void GrGLGpu::clearStencilClip(const GrFixedClip& clip,
GrGLRenderTarget* glRT = static_cast<GrGLRenderTarget*>(target);
this->flushRenderTarget(glRT, &SkIRect::EmptyIRect());
- this->flushScissor(clip.scissorState(), glRT->getViewport(), glRT->origin());
+ this->flushScissor(clip.scissorState(), glRT->getViewport(), origin);
this->flushWindowRectangles(clip.windowRectsState(), glRT);
GL_CALL(StencilMask((uint32_t) clipStencilMask));
@@ -2448,10 +2449,10 @@ bool GrGLGpu::onReadPixels(GrSurface* surface,
}
GrGpuCommandBuffer* GrGLGpu::createCommandBuffer(
- GrRenderTarget* rt, GrSurfaceOrigin,
+ GrRenderTarget* rt, GrSurfaceOrigin origin,
const GrGpuCommandBuffer::LoadAndStoreInfo&,
const GrGpuCommandBuffer::StencilLoadAndStoreInfo& stencilInfo) {
- return new GrGLGpuCommandBuffer(this, rt, stencilInfo);
+ return new GrGLGpuCommandBuffer(this, rt, origin, stencilInfo);
}
void GrGLGpu::flushRenderTarget(GrGLRenderTarget* target, const SkIRect* bounds, bool disableSRGB) {
diff --git a/src/gpu/gl/GrGLGpu.h b/src/gpu/gl/GrGLGpu.h
index 5b6cda76ee..7ff822fdec 100644
--- a/src/gpu/gl/GrGLGpu.h
+++ b/src/gpu/gl/GrGLGpu.h
@@ -131,12 +131,13 @@ public:
// The GrGLGpuCommandBuffer does not buffer up draws before submitting them to the gpu.
// Thus this is the implementation of the clear call for the corresponding passthrough function
// on GrGLGpuCommandBuffer.
- void clear(const GrFixedClip&, GrColor, GrRenderTarget*);
+ void clear(const GrFixedClip&, GrColor, GrRenderTarget*, GrSurfaceOrigin);
// The GrGLGpuCommandBuffer does not buffer up draws before submitting them to the gpu.
// Thus this is the implementation of the clearStencil call for the corresponding passthrough
// function on GrGLGpuCommandBuffer.
- void clearStencilClip(const GrFixedClip&, bool insideStencilMask, GrRenderTarget*);
+ void clearStencilClip(const GrFixedClip&, bool insideStencilMask,
+ GrRenderTarget*, GrSurfaceOrigin);
const GrGLContext* glContextForTesting() const override {
return &this->glContext();
diff --git a/src/gpu/gl/GrGLGpuCommandBuffer.h b/src/gpu/gl/GrGLGpuCommandBuffer.h
index 85dfbe8a30..0d57337ac1 100644
--- a/src/gpu/gl/GrGLGpuCommandBuffer.h
+++ b/src/gpu/gl/GrGLGpuCommandBuffer.h
@@ -24,10 +24,10 @@ class GrGLGpuCommandBuffer : public GrGpuCommandBuffer {
* pass through functions to corresponding calls in the GrGLGpu class.
*/
public:
- GrGLGpuCommandBuffer(GrGLGpu* gpu, GrRenderTarget* rt,
+ GrGLGpuCommandBuffer(GrGLGpu* gpu, GrRenderTarget* rt, GrSurfaceOrigin origin,
const GrGpuCommandBuffer::StencilLoadAndStoreInfo& stencilInfo)
- : fGpu(gpu)
- , fRenderTarget(static_cast<GrGLRenderTarget*>(rt)) {
+ : INHERITED(rt, origin)
+ , fGpu(gpu) {
fClearSB = LoadOp::kClear == stencilInfo.fLoadOp;
}
@@ -40,32 +40,18 @@ public:
}
void end() override {}
- void discard(GrRenderTargetProxy* proxy) override {
- GrGLRenderTarget* target = static_cast<GrGLRenderTarget*>(proxy->priv().peekRenderTarget());
- if (!fRenderTarget) {
- fRenderTarget = target;
- }
- SkASSERT(target == fRenderTarget);
- }
-
- void insertEventMarker(GrRenderTargetProxy* proxy, const char* msg) override {
- GrGLRenderTarget* target = static_cast<GrGLRenderTarget*>(proxy->priv().peekRenderTarget());
- if (!fRenderTarget) {
- fRenderTarget = target;
- }
- SkASSERT(target == fRenderTarget);
+ void discard() override { }
+ void insertEventMarker(const char* msg) override {
fGpu->insertEventMarker(msg);
}
- void inlineUpload(GrOpFlushState* state, GrDrawOp::DeferredUploadFn& upload,
- GrRenderTargetProxy*) override {
+ void inlineUpload(GrOpFlushState* state, GrDrawOp::DeferredUploadFn& upload) override {
state->doUpload(upload);
}
private:
GrGpu* gpu() override { return fGpu; }
- GrRenderTarget* renderTarget() override { return fRenderTarget; }
void onSubmit() override {}
@@ -75,35 +61,19 @@ private:
const GrPipeline::DynamicState dynamicStates[],
int meshCount,
const SkRect& bounds) override {
- GrGLRenderTarget* target = static_cast<GrGLRenderTarget*>(pipeline.renderTarget());
- if (!fRenderTarget) {
- fRenderTarget = target;
- }
- SkASSERT(target == fRenderTarget);
+ SkASSERT(pipeline.renderTarget() == fRenderTarget);
fGpu->draw(pipeline, primProc, mesh, dynamicStates, meshCount);
}
- void onClear(GrRenderTargetProxy* proxy, const GrFixedClip& clip, GrColor color) override {
- GrGLRenderTarget* target = static_cast<GrGLRenderTarget*>(proxy->priv().peekRenderTarget());
- if (!fRenderTarget) {
- fRenderTarget = target;
- }
- SkASSERT(target == fRenderTarget);
- fGpu->clear(clip, color, fRenderTarget);
+ void onClear(const GrFixedClip& clip, GrColor color) override {
+ fGpu->clear(clip, color, fRenderTarget, fOrigin);
}
- void onClearStencilClip(GrRenderTargetProxy* proxy, const GrFixedClip& clip,
- bool insideStencilMask) override {
- GrGLRenderTarget* target = static_cast<GrGLRenderTarget*>(proxy->priv().peekRenderTarget());
- if (!fRenderTarget) {
- fRenderTarget = target;
- }
- SkASSERT(target == fRenderTarget);
- fGpu->clearStencilClip(clip, insideStencilMask, fRenderTarget);
+ void onClearStencilClip(const GrFixedClip& clip, bool insideStencilMask) override {
+ fGpu->clearStencilClip(clip, insideStencilMask, fRenderTarget, fOrigin);
}
GrGLGpu* fGpu;
- GrGLRenderTarget* fRenderTarget;
bool fClearSB;
typedef GrGpuCommandBuffer INHERITED;
diff --git a/src/gpu/mock/GrMockGpu.cpp b/src/gpu/mock/GrMockGpu.cpp
index d97c789158..397e1a1ca9 100644
--- a/src/gpu/mock/GrMockGpu.cpp
+++ b/src/gpu/mock/GrMockGpu.cpp
@@ -40,10 +40,10 @@ GrGpu* GrMockGpu::Create(const GrMockOptions* mockOptions, const GrContextOption
GrGpuCommandBuffer* GrMockGpu::createCommandBuffer(
- GrRenderTarget*, GrSurfaceOrigin,
+ GrRenderTarget* rt, GrSurfaceOrigin origin,
const GrGpuCommandBuffer::LoadAndStoreInfo&,
const GrGpuCommandBuffer::StencilLoadAndStoreInfo&) {
- return new GrMockGpuCommandBuffer(this);
+ return new GrMockGpuCommandBuffer(this, rt, origin);
}
void GrMockGpu::submitCommandBuffer(const GrMockGpuCommandBuffer* cmdBuffer) {
diff --git a/src/gpu/mock/GrMockGpuCommandBuffer.h b/src/gpu/mock/GrMockGpuCommandBuffer.h
index d2f6baf400..6a780972af 100644
--- a/src/gpu/mock/GrMockGpuCommandBuffer.h
+++ b/src/gpu/mock/GrMockGpuCommandBuffer.h
@@ -13,13 +13,15 @@
class GrMockGpuCommandBuffer : public GrGpuCommandBuffer {
public:
- GrMockGpuCommandBuffer(GrMockGpu* gpu) : fGpu(gpu) {}
+ GrMockGpuCommandBuffer(GrMockGpu* gpu, GrRenderTarget* rt, GrSurfaceOrigin origin)
+ : INHERITED(rt, origin)
+ , fGpu(gpu) {
+ }
GrGpu* gpu() override { return fGpu; }
- void inlineUpload(GrOpFlushState*, GrDrawOp::DeferredUploadFn&,
- GrRenderTargetProxy*) override {}
- void discard(GrRenderTargetProxy*) override {}
- void insertEventMarker(GrRenderTargetProxy*, const char*) override {}
+ void inlineUpload(GrOpFlushState*, GrDrawOp::DeferredUploadFn&) override {}
+ void discard() override {}
+ void insertEventMarker(const char*) override {}
void begin() override {}
void end() override {}
@@ -31,10 +33,8 @@ private:
const GrPipeline::DynamicState[], int meshCount, const SkRect& bounds) override {
++fNumDraws;
}
- void onClear(GrRenderTargetProxy*, const GrFixedClip&, GrColor) override {}
- void onClearStencilClip(GrRenderTargetProxy*, const GrFixedClip&,
- bool insideStencilMask) override {}
- GrRenderTarget* renderTarget() override { return nullptr; }
+ void onClear(const GrFixedClip&, GrColor) override {}
+ void onClearStencilClip(const GrFixedClip&, bool insideStencilMask) override {}
GrMockGpu* fGpu;
int fNumDraws = 0;
diff --git a/src/gpu/ops/GrClearOp.cpp b/src/gpu/ops/GrClearOp.cpp
index 4cc2bf2ac3..4b1efd6c47 100644
--- a/src/gpu/ops/GrClearOp.cpp
+++ b/src/gpu/ops/GrClearOp.cpp
@@ -32,7 +32,5 @@ GrClearOp::GrClearOp(const GrFixedClip& clip, GrColor color, GrSurfaceProxy* pro
}
void GrClearOp::onExecute(GrOpFlushState* state) {
- SkASSERT(state->drawOpArgs().renderTarget());
-
- state->commandBuffer()->clear(state->drawOpArgs().fProxy, fClip, fColor);
+ state->commandBuffer()->clear(fClip, fColor);
}
diff --git a/src/gpu/ops/GrClearStencilClipOp.h b/src/gpu/ops/GrClearStencilClipOp.h
index 2b60f02893..1364b2365a 100644
--- a/src/gpu/ops/GrClearStencilClipOp.h
+++ b/src/gpu/ops/GrClearStencilClipOp.h
@@ -55,10 +55,7 @@ private:
void onPrepare(GrOpFlushState*) override {}
void onExecute(GrOpFlushState* state) override {
- SkASSERT(state->drawOpArgs().renderTarget());
-
- GrRenderTargetProxy* proxy = state->drawOpArgs().fProxy;
- state->commandBuffer()->clearStencilClip(proxy, fClip, fInsideStencilMask);
+ state->commandBuffer()->clearStencilClip(fClip, fInsideStencilMask);
}
const GrFixedClip fClip;
diff --git a/src/gpu/ops/GrDebugMarkerOp.h b/src/gpu/ops/GrDebugMarkerOp.h
index 326aa75bdd..1b02c62e1a 100644
--- a/src/gpu/ops/GrDebugMarkerOp.h
+++ b/src/gpu/ops/GrDebugMarkerOp.h
@@ -42,11 +42,9 @@ private:
void onPrepare(GrOpFlushState*) override {}
void onExecute(GrOpFlushState* state) override {
- SkASSERT(state->drawOpArgs().renderTarget());
-
//SkDebugf("%s\n", fStr.c_str());
if (state->caps().gpuTracingSupport()) {
- state->commandBuffer()->insertEventMarker(state->drawOpArgs().fProxy, fStr.c_str());
+ state->commandBuffer()->insertEventMarker(fStr.c_str());
}
}
diff --git a/src/gpu/ops/GrDiscardOp.h b/src/gpu/ops/GrDiscardOp.h
index 4fb481ca74..d30aa5a8c5 100644
--- a/src/gpu/ops/GrDiscardOp.h
+++ b/src/gpu/ops/GrDiscardOp.h
@@ -39,9 +39,7 @@ private:
void onPrepare(GrOpFlushState*) override {}
void onExecute(GrOpFlushState* state) override {
- SkASSERT(state->drawOpArgs().renderTarget());
-
- state->commandBuffer()->discard(state->drawOpArgs().fProxy);
+ state->commandBuffer()->discard();
}
typedef GrOp INHERITED;
diff --git a/src/gpu/ops/GrMeshDrawOp.cpp b/src/gpu/ops/GrMeshDrawOp.cpp
index 04a3096383..10253174b8 100644
--- a/src/gpu/ops/GrMeshDrawOp.cpp
+++ b/src/gpu/ops/GrMeshDrawOp.cpp
@@ -69,8 +69,7 @@ void GrMeshDrawOp::onExecute(GrOpFlushState* state) {
GrDrawOpUploadToken drawToken = state->nextTokenToFlush();
while (currUploadIdx < fInlineUploads.count() &&
fInlineUploads[currUploadIdx].fUploadBeforeToken == drawToken) {
- state->commandBuffer()->inlineUpload(state, fInlineUploads[currUploadIdx++].fUpload,
- state->drawOpArgs().fProxy);
+ state->commandBuffer()->inlineUpload(state, fInlineUploads[currUploadIdx++].fUpload);
}
const QueuedDraw& draw = fQueuedDraws[currDrawIdx];
SkASSERT(draw.fPipeline->proxy() == state->drawOpArgs().fProxy);
diff --git a/src/gpu/ops/GrStencilPathOp.cpp b/src/gpu/ops/GrStencilPathOp.cpp
index 3c17e81f05..53a55cc979 100644
--- a/src/gpu/ops/GrStencilPathOp.cpp
+++ b/src/gpu/ops/GrStencilPathOp.cpp
@@ -11,8 +11,6 @@
#include "GrOpFlushState.h"
void GrStencilPathOp::onExecute(GrOpFlushState* state) {
- SkASSERT(state->drawOpArgs().renderTarget());
-
GrPathRendering::StencilPathArgs args(fUseHWAA, state->drawOpArgs().fProxy,
&fViewMatrix, &fScissor, &fStencil);
state->gpu()->pathRendering()->stencilPath(args, fPath.get());
diff --git a/src/gpu/vk/GrVkGpuCommandBuffer.cpp b/src/gpu/vk/GrVkGpuCommandBuffer.cpp
index 2528fce38f..65445264c5 100644
--- a/src/gpu/vk/GrVkGpuCommandBuffer.cpp
+++ b/src/gpu/vk/GrVkGpuCommandBuffer.cpp
@@ -57,11 +57,10 @@ GrVkGpuCommandBuffer::GrVkGpuCommandBuffer(GrVkGpu* gpu,
GrRenderTarget* rt, GrSurfaceOrigin origin,
const LoadAndStoreInfo& colorInfo,
const StencilLoadAndStoreInfo& stencilInfo)
- : fGpu(gpu)
- , fRenderTarget(nullptr)
- , fOrigin(kTopLeft_GrSurfaceOrigin)
- , fClearColor(GrColor4f::FromGrColor(colorInfo.fClearColor))
- , fLastPipelineState(nullptr) {
+ : INHERITED(rt, origin)
+ , fGpu(gpu)
+ , fClearColor(GrColor4f::FromGrColor(colorInfo.fClearColor))
+ , fLastPipelineState(nullptr) {
get_vk_load_store_ops(colorInfo.fLoadOp, colorInfo.fStoreOp,
&fVkColorLoadOp, &fVkColorStoreOp);
@@ -69,14 +68,10 @@ GrVkGpuCommandBuffer::GrVkGpuCommandBuffer(GrVkGpu* gpu,
&fVkStencilLoadOp, &fVkStencilStoreOp);
fCurrentCmdInfo = -1;
- this->init(static_cast<GrVkRenderTarget*>(rt), origin);
+ this->init();
}
-void GrVkGpuCommandBuffer::init(GrVkRenderTarget* target, GrSurfaceOrigin origin) {
- SkASSERT(!fRenderTarget);
- fRenderTarget = target;
- fOrigin = origin;
-
+void GrVkGpuCommandBuffer::init() {
GrVkRenderPass::LoadStoreOps vkColorOps(fVkColorLoadOp, fVkColorStoreOp);
GrVkRenderPass::LoadStoreOps vkStencilOps(fVkStencilLoadOp, fVkStencilStoreOp);
@@ -84,13 +79,14 @@ void GrVkGpuCommandBuffer::init(GrVkRenderTarget* target, GrSurfaceOrigin origin
SkASSERT(fCommandBufferInfos.count() == 1);
fCurrentCmdInfo = 0;
- const GrVkResourceProvider::CompatibleRPHandle& rpHandle = target->compatibleRenderPassHandle();
+ GrVkRenderTarget* vkRT = static_cast<GrVkRenderTarget*>(fRenderTarget);
+ const GrVkResourceProvider::CompatibleRPHandle& rpHandle = vkRT->compatibleRenderPassHandle();
if (rpHandle.isValid()) {
cbInfo.fRenderPass = fGpu->resourceProvider().findRenderPass(rpHandle,
vkColorOps,
vkStencilOps);
} else {
- cbInfo.fRenderPass = fGpu->resourceProvider().findRenderPass(*target,
+ cbInfo.fRenderPass = fGpu->resourceProvider().findRenderPass(*vkRT,
vkColorOps,
vkStencilOps);
}
@@ -108,7 +104,7 @@ void GrVkGpuCommandBuffer::init(GrVkRenderTarget* target, GrSurfaceOrigin origin
cbInfo.fStartsWithClear = false;
cbInfo.fCommandBuffers.push_back(fGpu->resourceProvider().findOrCreateSecondaryCommandBuffer());
- cbInfo.currentCmdBuf()->begin(fGpu, target->framebuffer(), cbInfo.fRenderPass);
+ cbInfo.currentCmdBuf()->begin(fGpu, vkRT->framebuffer(), cbInfo.fRenderPass);
}
@@ -123,7 +119,6 @@ GrVkGpuCommandBuffer::~GrVkGpuCommandBuffer() {
}
GrGpu* GrVkGpuCommandBuffer::gpu() { return fGpu; }
-GrRenderTarget* GrVkGpuCommandBuffer::renderTarget() { return fRenderTarget; }
void GrVkGpuCommandBuffer::begin() {
// TODO: remove this - see skbug.com/6936
@@ -142,10 +137,12 @@ void GrVkGpuCommandBuffer::onSubmit() {
if (!fRenderTarget) {
return;
}
+
+ GrVkRenderTarget* vkRT = static_cast<GrVkRenderTarget*>(fRenderTarget);
+
// Change layout of our render target so it can be used as the color attachment. Currently
// we don't attach the resolve to the framebuffer so no need to change its layout.
- GrVkImage* targetImage = fRenderTarget->msaaImage() ? fRenderTarget->msaaImage()
- : fRenderTarget;
+ GrVkImage* targetImage = vkRT->msaaImage() ? vkRT->msaaImage() : vkRT;
// Change layout of our render target so it can be used as the color attachment
targetImage->setImageLayout(fGpu,
@@ -194,17 +191,13 @@ void GrVkGpuCommandBuffer::onSubmit() {
fGpu->submitSecondaryCommandBuffer(cbInfo.fCommandBuffers, cbInfo.fRenderPass,
&cbInfo.fColorClearValue,
&cbInfo.fStencilClearValue,
- fRenderTarget, iBounds);
+ vkRT, iBounds);
}
}
}
-void GrVkGpuCommandBuffer::discard(GrRenderTargetProxy* proxy) {
- GrVkRenderTarget* target = static_cast<GrVkRenderTarget*>(proxy->priv().peekRenderTarget());
- if (!fRenderTarget) {
- this->init(target, proxy->origin());
- }
- SkASSERT(target == fRenderTarget);
+void GrVkGpuCommandBuffer::discard() {
+ GrVkRenderTarget* vkRT = static_cast<GrVkRenderTarget*>(fRenderTarget);
CommandBufferInfo& cbInfo = fCommandBufferInfos[fCurrentCmdInfo];
if (cbInfo.fIsEmpty) {
@@ -217,13 +210,13 @@ void GrVkGpuCommandBuffer::discard(GrRenderTargetProxy* proxy) {
const GrVkRenderPass* oldRP = cbInfo.fRenderPass;
const GrVkResourceProvider::CompatibleRPHandle& rpHandle =
- fRenderTarget->compatibleRenderPassHandle();
+ vkRT->compatibleRenderPassHandle();
if (rpHandle.isValid()) {
cbInfo.fRenderPass = fGpu->resourceProvider().findRenderPass(rpHandle,
vkColorOps,
vkStencilOps);
} else {
- cbInfo.fRenderPass = fGpu->resourceProvider().findRenderPass(*fRenderTarget,
+ cbInfo.fRenderPass = fGpu->resourceProvider().findRenderPass(*vkRT,
vkColorOps,
vkStencilOps);
}
@@ -235,20 +228,13 @@ void GrVkGpuCommandBuffer::discard(GrRenderTargetProxy* proxy) {
}
}
-void GrVkGpuCommandBuffer::insertEventMarker(GrRenderTargetProxy* proxy, const char* msg) {
+void GrVkGpuCommandBuffer::insertEventMarker(const char* msg) {
// TODO: does Vulkan have a correlate?
}
-void GrVkGpuCommandBuffer::onClearStencilClip(GrRenderTargetProxy* proxy, const GrFixedClip& clip,
- bool insideStencilMask) {
+void GrVkGpuCommandBuffer::onClearStencilClip(const GrFixedClip& clip, bool insideStencilMask) {
SkASSERT(!clip.hasWindowRectangles());
- GrVkRenderTarget* target = static_cast<GrVkRenderTarget*>(proxy->priv().peekRenderTarget());
- if (!fRenderTarget) {
- this->init(target, proxy->origin());
- }
- SkASSERT(target == fRenderTarget);
-
CommandBufferInfo& cbInfo = fCommandBufferInfos[fCurrentCmdInfo];
GrStencilAttachment* sb = fRenderTarget->renderTargetPriv().getStencilAttachment();
@@ -306,17 +292,12 @@ void GrVkGpuCommandBuffer::onClearStencilClip(GrRenderTargetProxy* proxy, const
}
}
-void GrVkGpuCommandBuffer::onClear(GrRenderTargetProxy* proxy, const GrFixedClip& clip,
- GrColor color) {
+void GrVkGpuCommandBuffer::onClear(const GrFixedClip& clip, GrColor color) {
+ GrVkRenderTarget* vkRT = static_cast<GrVkRenderTarget*>(fRenderTarget);
+
// parent class should never let us get here with no RT
SkASSERT(!clip.hasWindowRectangles());
- GrVkRenderTarget* target = static_cast<GrVkRenderTarget*>(proxy->priv().peekRenderTarget());
- if (!fRenderTarget) {
- this->init(target, proxy->origin());
- }
- SkASSERT(target == fRenderTarget);
-
CommandBufferInfo& cbInfo = fCommandBufferInfos[fCurrentCmdInfo];
VkClearColorValue vkColor;
@@ -332,13 +313,13 @@ void GrVkGpuCommandBuffer::onClear(GrRenderTargetProxy* proxy, const GrFixedClip
const GrVkRenderPass* oldRP = cbInfo.fRenderPass;
const GrVkResourceProvider::CompatibleRPHandle& rpHandle =
- fRenderTarget->compatibleRenderPassHandle();
+ vkRT->compatibleRenderPassHandle();
if (rpHandle.isValid()) {
cbInfo.fRenderPass = fGpu->resourceProvider().findRenderPass(rpHandle,
vkColorOps,
vkStencilOps);
} else {
- cbInfo.fRenderPass = fGpu->resourceProvider().findRenderPass(*fRenderTarget,
+ cbInfo.fRenderPass = fGpu->resourceProvider().findRenderPass(*vkRT,
vkColorOps,
vkStencilOps);
}
@@ -393,13 +374,17 @@ void GrVkGpuCommandBuffer::onClear(GrRenderTargetProxy* proxy, const GrFixedClip
}
void GrVkGpuCommandBuffer::addAdditionalCommandBuffer() {
+ GrVkRenderTarget* vkRT = static_cast<GrVkRenderTarget*>(fRenderTarget);
+
CommandBufferInfo& cbInfo = fCommandBufferInfos[fCurrentCmdInfo];
cbInfo.currentCmdBuf()->end(fGpu);
cbInfo.fCommandBuffers.push_back(fGpu->resourceProvider().findOrCreateSecondaryCommandBuffer());
- cbInfo.currentCmdBuf()->begin(fGpu, fRenderTarget->framebuffer(), cbInfo.fRenderPass);
+ cbInfo.currentCmdBuf()->begin(fGpu, vkRT->framebuffer(), cbInfo.fRenderPass);
}
void GrVkGpuCommandBuffer::addAdditionalRenderPass() {
+ GrVkRenderTarget* vkRT = static_cast<GrVkRenderTarget*>(fRenderTarget);
+
fCommandBufferInfos[fCurrentCmdInfo].currentCmdBuf()->end(fGpu);
CommandBufferInfo& cbInfo = fCommandBufferInfos.push_back();
@@ -411,13 +396,13 @@ void GrVkGpuCommandBuffer::addAdditionalRenderPass() {
VK_ATTACHMENT_STORE_OP_STORE);
const GrVkResourceProvider::CompatibleRPHandle& rpHandle =
- fRenderTarget->compatibleRenderPassHandle();
+ vkRT->compatibleRenderPassHandle();
if (rpHandle.isValid()) {
cbInfo.fRenderPass = fGpu->resourceProvider().findRenderPass(rpHandle,
vkColorOps,
vkStencilOps);
} else {
- cbInfo.fRenderPass = fGpu->resourceProvider().findRenderPass(*fRenderTarget,
+ cbInfo.fRenderPass = fGpu->resourceProvider().findRenderPass(*vkRT,
vkColorOps,
vkStencilOps);
}
@@ -431,15 +416,11 @@ void GrVkGpuCommandBuffer::addAdditionalRenderPass() {
cbInfo.fIsEmpty = true;
cbInfo.fStartsWithClear = false;
- cbInfo.currentCmdBuf()->begin(fGpu, fRenderTarget->framebuffer(), cbInfo.fRenderPass);
+ cbInfo.currentCmdBuf()->begin(fGpu, vkRT->framebuffer(), cbInfo.fRenderPass);
}
-void GrVkGpuCommandBuffer::inlineUpload(GrOpFlushState* state, GrDrawOp::DeferredUploadFn& upload,
- GrRenderTargetProxy* proxy) {
- GrVkRenderTarget* target = static_cast<GrVkRenderTarget*>(proxy->priv().peekRenderTarget());
- if (!fRenderTarget) {
- this->init(target, proxy->origin());
- }
+void GrVkGpuCommandBuffer::inlineUpload(GrOpFlushState* state, GrDrawOp::DeferredUploadFn& upload) {
+
if (!fCommandBufferInfos[fCurrentCmdInfo].fIsEmpty) {
this->addAdditionalRenderPass();
}
@@ -573,11 +554,7 @@ void GrVkGpuCommandBuffer::onDraw(const GrPipeline& pipeline,
const GrPipeline::DynamicState dynamicStates[],
int meshCount,
const SkRect& bounds) {
- GrVkRenderTarget* target = static_cast<GrVkRenderTarget*>(pipeline.renderTarget());
- if (!fRenderTarget) {
- this->init(target, pipeline.proxy()->origin());
- }
- SkASSERT(target == fRenderTarget);
+ SkASSERT(pipeline.renderTarget() == fRenderTarget);
if (!meshCount) {
return;
@@ -623,7 +600,8 @@ void GrVkGpuCommandBuffer::onDraw(const GrPipeline& pipeline,
if (dynamicStates) {
if (pipeline.getScissorState().enabled()) {
GrVkPipeline::SetDynamicScissorRectState(fGpu, cbInfo.currentCmdBuf(),
- target, dynamicStates[i].fScissorRect);
+ fRenderTarget,
+ dynamicStates[i].fScissorRect);
}
}
diff --git a/src/gpu/vk/GrVkGpuCommandBuffer.h b/src/gpu/vk/GrVkGpuCommandBuffer.h
index cafb015148..2a4498c6d4 100644
--- a/src/gpu/vk/GrVkGpuCommandBuffer.h
+++ b/src/gpu/vk/GrVkGpuCommandBuffer.h
@@ -32,18 +32,15 @@ public:
void begin() override;
void end() override;
- void discard(GrRenderTargetProxy*) override;
- void insertEventMarker(GrRenderTargetProxy*, const char*) override;
+ void discard() override;
+ void insertEventMarker(const char*) override;
- void inlineUpload(GrOpFlushState* state, GrDrawOp::DeferredUploadFn& upload,
- GrRenderTargetProxy*) override;
+ void inlineUpload(GrOpFlushState* state, GrDrawOp::DeferredUploadFn& upload) override;
private:
- // Performs lazy initialization on the first operation seen by the command buffer.
- void init(GrVkRenderTarget*, GrSurfaceOrigin);
+ void init();
GrGpu* gpu() override;
- GrRenderTarget* renderTarget() override;
void onSubmit() override;
@@ -92,10 +89,9 @@ private:
const GrBuffer* instanceBuffer, int instanceCount,
int baseInstance) final;
- void onClear(GrRenderTargetProxy*, const GrFixedClip&, GrColor color) override;
+ void onClear(const GrFixedClip&, GrColor color) override;
- void onClearStencilClip(GrRenderTargetProxy*, const GrFixedClip&,
- bool insideStencilMask) override;
+ void onClearStencilClip(const GrFixedClip&, bool insideStencilMask) override;
void addAdditionalCommandBuffer();
void addAdditionalRenderPass();
@@ -127,8 +123,6 @@ private:
int fCurrentCmdInfo;
GrVkGpu* fGpu;
- GrVkRenderTarget* fRenderTarget;
- GrSurfaceOrigin fOrigin;
VkAttachmentLoadOp fVkColorLoadOp;
VkAttachmentStoreOp fVkColorStoreOp;
VkAttachmentLoadOp fVkStencilLoadOp;