Add testing only helper to flush and sync gpu.
The use case for this is mostly for Vulkan where we need to make sure the gpu is done with resources before we delete or use them in some way. Previously we used readPixels to do this which was just an ugly hack. Bug: skia: Change-Id: I7949ebc695032533675133aabca0e32840b417ba Reviewed-on: https://skia-review.googlesource.com/113122 Reviewed-by: Brian Salomon <bsalomon@google.com> Commit-Queue: Greg Daniel <egdaniel@google.com>
This commit is contained in:
parent
f777897934
commit
26b50a4cda
@ -468,6 +468,12 @@ public:
|
||||
*/
|
||||
virtual void deleteTestingOnlyBackendTexture(GrBackendTexture*) = 0;
|
||||
|
||||
/**
|
||||
* Flushes all work to the gpu and forces the GPU to wait until all the gpu work has completed.
|
||||
* This is for testing purposes only.
|
||||
*/
|
||||
virtual void testingOnly_flushGpuAndSync() = 0;
|
||||
|
||||
// width and height may be larger than rt (if underlying API allows it).
|
||||
// Returns nullptr if compatible sb could not be created, otherwise the caller owns the ref on
|
||||
// the GrStencilAttachment.
|
||||
|
@ -4438,6 +4438,10 @@ void GrGLGpu::resetShaderCacheForTesting() const {
|
||||
fProgramCache->abandon();
|
||||
}
|
||||
|
||||
void GrGLGpu::testingOnly_flushGpuAndSync() {
|
||||
GL_CALL(Finish());
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
GrGLAttribArrayState* GrGLGpu::HWVertexArrayState::bindInternalVertexArray(GrGLGpu* gpu,
|
||||
|
@ -158,6 +158,8 @@ public:
|
||||
|
||||
void resetShaderCacheForTesting() const override;
|
||||
|
||||
void testingOnly_flushGpuAndSync() override;
|
||||
|
||||
GrFence SK_WARN_UNUSED_RESULT insertFence() override;
|
||||
bool waitFence(GrFence, uint64_t timeout) override;
|
||||
void deleteFence(GrFence) const override;
|
||||
|
@ -126,6 +126,8 @@ private:
|
||||
bool isTestingOnlyBackendTexture(const GrBackendTexture&) const override;
|
||||
void deleteTestingOnlyBackendTexture(GrBackendTexture*) override;
|
||||
|
||||
void testingOnly_flushGpuAndSync() override {}
|
||||
|
||||
static int NextInternalTextureID();
|
||||
static int NextExternalTextureID();
|
||||
|
||||
|
@ -145,6 +145,8 @@ private:
|
||||
bool isTestingOnlyBackendTexture(const GrBackendTexture&) const override { return false; }
|
||||
void deleteTestingOnlyBackendTexture(GrBackendTexture*) override {}
|
||||
|
||||
void testingOnly_flushGpuAndSync() override {}
|
||||
|
||||
sk_sp<GrMtlCaps> fMtlCaps;
|
||||
|
||||
id<MTLDevice> fDevice;
|
||||
|
@ -1509,6 +1509,10 @@ void GrVkGpu::deleteTestingOnlyBackendTexture(GrBackendTexture* tex) {
|
||||
}
|
||||
}
|
||||
|
||||
void GrVkGpu::testingOnly_flushGpuAndSync() {
|
||||
this->submitCommandBuffer(kForce_SyncQueue);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
void GrVkGpu::addMemoryBarrier(VkPipelineStageFlags srcStageMask,
|
||||
|
@ -76,6 +76,8 @@ public:
|
||||
bool isTestingOnlyBackendTexture(const GrBackendTexture&) const override;
|
||||
void deleteTestingOnlyBackendTexture(GrBackendTexture*) override;
|
||||
|
||||
void testingOnly_flushGpuAndSync() override;
|
||||
|
||||
GrStencilAttachment* createStencilAttachmentForRenderTarget(const GrRenderTarget*,
|
||||
int width,
|
||||
int height) override;
|
||||
|
@ -203,14 +203,9 @@ DEF_GPUTEST_FOR_RENDERING_CONTEXTS(GrBackendTextureImageMipMappedTest, reporter,
|
||||
}
|
||||
|
||||
// Must make sure the uses of the backend texture have finished (we possibly have a
|
||||
// queued up copy) before we delete the backend texture. Thus we use readPixels here
|
||||
// just to force the synchronization.
|
||||
sk_sp<GrSurfaceContext> surfContext =
|
||||
context->contextPriv().makeWrappedSurfaceContext(genProxy);
|
||||
|
||||
SkBitmap bitmap;
|
||||
bitmap.allocPixels(imageInfo);
|
||||
surfContext->readPixels(imageInfo, bitmap.getPixels(), 0, 0, 0, 0);
|
||||
// queued up copy) before we delete the backend texture.
|
||||
context->flush();
|
||||
gpu->testingOnly_flushGpuAndSync();
|
||||
|
||||
gpu->deleteTestingOnlyBackendTexture(&backendTex);
|
||||
}
|
||||
|
@ -939,13 +939,9 @@ static void test_cross_context_image(skiatest::Reporter* reporter, const GrConte
|
||||
otherTestContext->makeCurrent();
|
||||
canvas->flush();
|
||||
|
||||
// This readPixels call is needed for Vulkan to make sure the ReleaseProc is called.
|
||||
// Even though we flushed above, this does not guarantee the command buffer will finish
|
||||
// which is when we call the ReleaseProc. The readPixels forces a CPU sync so we know
|
||||
// that the command buffer has finished and we've called the ReleaseProc.
|
||||
SkBitmap bitmap;
|
||||
bitmap.allocPixels(info);
|
||||
canvas->readPixels(bitmap, 0, 0);
|
||||
// This is specifically here for vulkan to guarantee the command buffer will finish
|
||||
// which is when we call the ReleaseProc.
|
||||
otherCtx->contextPriv().getGpu()->testingOnly_flushGpuAndSync();
|
||||
}
|
||||
|
||||
// Case #6: Verify that only one context can be using the image at a time
|
||||
|
Loading…
Reference in New Issue
Block a user