| /* | |
| * Copyright 2021 Google LLC | |
| * | |
| * Use of this source code is governed by a BSD-style license that can be | |
| * found in the LICENSE file. | |
| */ | |
| #include "src/gpu/graphite/CopyTask.h" | |
| #include "src/gpu/graphite/Buffer.h" | |
| #include "src/gpu/graphite/CommandBuffer.h" | |
| #include "src/gpu/graphite/Log.h" | |
| #include "src/gpu/graphite/Texture.h" | |
| #include "src/gpu/graphite/TextureProxy.h" | |
| namespace skgpu::graphite { | |
| sk_sp<CopyBufferToBufferTask> CopyBufferToBufferTask::Make(sk_sp<Buffer> srcBuffer, | |
| sk_sp<Buffer> dstBuffer) { | |
| SkASSERT(srcBuffer); | |
| const size_t size = srcBuffer->size(); // Get size before we move it into Make() | |
| return Make(std::move(srcBuffer), 0, std::move(dstBuffer), 0, size); | |
| } | |
| sk_sp<CopyBufferToBufferTask> CopyBufferToBufferTask::Make(sk_sp<Buffer> srcBuffer, | |
| size_t srcOffset, | |
| sk_sp<Buffer> dstBuffer, | |
| size_t dstOffset, | |
| size_t size) { | |
| SkASSERT(srcBuffer); | |
| SkASSERT(size <= srcBuffer->size() - srcOffset); | |
| SkASSERT(dstBuffer); | |
| SkASSERT(size <= dstBuffer->size() - dstOffset); | |
| return sk_sp<CopyBufferToBufferTask>(new CopyBufferToBufferTask(std::move(srcBuffer), srcOffset, | |
| std::move(dstBuffer), dstOffset, | |
| size)); | |
| } | |
| CopyBufferToBufferTask::CopyBufferToBufferTask(sk_sp<Buffer> srcBuffer, size_t srcOffset, | |
| sk_sp<Buffer> dstBuffer, size_t dstOffset, | |
| size_t size) | |
| : fSrcBuffer(std::move(srcBuffer)) | |
| , fSrcOffset(srcOffset) | |
| , fDstBuffer(std::move(dstBuffer)) | |
| , fDstOffset(dstOffset) | |
| , fSize(size) {} | |
| CopyBufferToBufferTask::~CopyBufferToBufferTask() = default; | |
| bool CopyBufferToBufferTask::prepareResources(ResourceProvider*, const RuntimeEffectDictionary*) { | |
| return true; | |
| } | |
| bool CopyBufferToBufferTask::addCommands(Context*, CommandBuffer* commandBuffer, ReplayTargetData) { | |
| return commandBuffer->copyBufferToBuffer(fSrcBuffer, fSrcOffset, fDstBuffer, fDstOffset, fSize); | |
| } | |
| sk_sp<CopyTextureToBufferTask> CopyTextureToBufferTask::Make(sk_sp<TextureProxy> textureProxy, | |
| SkIRect srcRect, | |
| sk_sp<Buffer> buffer, | |
| size_t bufferOffset, | |
| size_t bufferRowBytes) { | |
| return sk_sp<CopyTextureToBufferTask>(new CopyTextureToBufferTask(std::move(textureProxy), | |
| srcRect, | |
| std::move(buffer), | |
| bufferOffset, | |
| bufferRowBytes)); | |
| } | |
| CopyTextureToBufferTask::CopyTextureToBufferTask(sk_sp<TextureProxy> textureProxy, | |
| SkIRect srcRect, | |
| sk_sp<Buffer> buffer, | |
| size_t bufferOffset, | |
| size_t bufferRowBytes) | |
| : fTextureProxy(std::move(textureProxy)) | |
| , fSrcRect(srcRect) | |
| , fBuffer(std::move(buffer)) | |
| , fBufferOffset(bufferOffset) | |
| , fBufferRowBytes(bufferRowBytes) { | |
| } | |
| CopyTextureToBufferTask::~CopyTextureToBufferTask() {} | |
| bool CopyTextureToBufferTask::prepareResources(ResourceProvider* resourceProvider, | |
| const RuntimeEffectDictionary*) { | |
| if (!fTextureProxy) { | |
| SKGPU_LOG_E("No texture proxy specified for CopyTextureToBufferTask"); | |
| return false; | |
| } | |
| if (!TextureProxy::InstantiateIfNotLazy(resourceProvider, fTextureProxy.get())) { | |
| SKGPU_LOG_E("Could not instantiate texture proxy for CopyTextureToBufferTask!"); | |
| return false; | |
| } | |
| return true; | |
| } | |
| bool CopyTextureToBufferTask::addCommands(Context*, | |
| CommandBuffer* commandBuffer, | |
| ReplayTargetData) { | |
| return commandBuffer->copyTextureToBuffer(fTextureProxy->refTexture(), | |
| fSrcRect, | |
| std::move(fBuffer), | |
| fBufferOffset, | |
| fBufferRowBytes); | |
| } | |
| //-------------------------------------------------------------------------------------------------- | |
| sk_sp<CopyTextureToTextureTask> CopyTextureToTextureTask::Make(sk_sp<TextureProxy> srcProxy, | |
| SkIRect srcRect, | |
| sk_sp<TextureProxy> dstProxy, | |
| SkIPoint dstPoint) { | |
| return sk_sp<CopyTextureToTextureTask>(new CopyTextureToTextureTask(std::move(srcProxy), | |
| srcRect, | |
| std::move(dstProxy), | |
| dstPoint)); | |
| } | |
| CopyTextureToTextureTask::CopyTextureToTextureTask(sk_sp<TextureProxy> srcProxy, | |
| SkIRect srcRect, | |
| sk_sp<TextureProxy> dstProxy, | |
| SkIPoint dstPoint) | |
| : fSrcProxy(std::move(srcProxy)) | |
| , fSrcRect(srcRect) | |
| , fDstProxy(std::move(dstProxy)) | |
| , fDstPoint(dstPoint) { | |
| } | |
| CopyTextureToTextureTask::~CopyTextureToTextureTask() {} | |
| bool CopyTextureToTextureTask::prepareResources(ResourceProvider* resourceProvider, | |
| const RuntimeEffectDictionary*) { | |
| if (!fSrcProxy) { | |
| SKGPU_LOG_E("No src texture proxy specified for CopyTextureToTextureTask"); | |
| return false; | |
| } | |
| if (!TextureProxy::InstantiateIfNotLazy(resourceProvider, fSrcProxy.get())) { | |
| SKGPU_LOG_E("Could not instantiate src texture proxy for CopyTextureToTextureTask!"); | |
| return false; | |
| } | |
| if (!fDstProxy) { | |
| SKGPU_LOG_E("No dst texture proxy specified for CopyTextureToTextureTask"); | |
| return false; | |
| } | |
| if (!TextureProxy::InstantiateIfNotLazy(resourceProvider, fDstProxy.get())) { | |
| SKGPU_LOG_E("Could not instantiate dst texture proxy for CopyTextureToTextureTask!"); | |
| return false; | |
| } | |
| return true; | |
| } | |
| bool CopyTextureToTextureTask::addCommands(Context*, | |
| CommandBuffer* commandBuffer, | |
| ReplayTargetData) { | |
| return commandBuffer->copyTextureToTexture(fSrcProxy->refTexture(), | |
| fSrcRect, | |
| fDstProxy->refTexture(), | |
| fDstPoint); | |
| } | |
| } // namespace skgpu::graphite |