mirror of
https://github.com/encounter/dawn-cmake.git
synced 2025-12-18 17:35:30 +00:00
Bubble up errors from EnsureSubresourceContentInitialized.
Bug: dawn:1336 Change-Id: I1fd189bd6e3689df6f10351e8ba19fee569bda23 Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/122023 Kokoro: Kokoro <noreply+kokoro@google.com> Commit-Queue: Loko Kung <lokokung@google.com> Reviewed-by: Austin Eng <enga@chromium.org>
This commit is contained in:
@@ -451,24 +451,26 @@ CommandBuffer::CommandBuffer(CommandEncoder* encoder, const CommandBufferDescrip
|
||||
MaybeError CommandBuffer::Execute() {
|
||||
const OpenGLFunctions& gl = ToBackend(GetDevice())->GetGL();
|
||||
|
||||
auto LazyClearSyncScope = [](const SyncScopeResourceUsage& scope) {
|
||||
auto LazyClearSyncScope = [](const SyncScopeResourceUsage& scope) -> MaybeError {
|
||||
for (size_t i = 0; i < scope.textures.size(); i++) {
|
||||
Texture* texture = ToBackend(scope.textures[i]);
|
||||
|
||||
// Clear subresources that are not render attachments. Render attachments will be
|
||||
// cleared in RecordBeginRenderPass by setting the loadop to clear when the texture
|
||||
// subresource has not been initialized before the render pass.
|
||||
scope.textureUsages[i].Iterate(
|
||||
[&](const SubresourceRange& range, wgpu::TextureUsage usage) {
|
||||
DAWN_TRY(scope.textureUsages[i].Iterate(
|
||||
[&](const SubresourceRange& range, wgpu::TextureUsage usage) -> MaybeError {
|
||||
if (usage & ~wgpu::TextureUsage::RenderAttachment) {
|
||||
texture->EnsureSubresourceContentInitialized(range);
|
||||
DAWN_TRY(texture->EnsureSubresourceContentInitialized(range));
|
||||
}
|
||||
});
|
||||
return {};
|
||||
}));
|
||||
}
|
||||
|
||||
for (BufferBase* bufferBase : scope.buffers) {
|
||||
ToBackend(bufferBase)->EnsureDataInitialized();
|
||||
}
|
||||
return {};
|
||||
};
|
||||
|
||||
size_t nextComputePassNumber = 0;
|
||||
@@ -481,7 +483,7 @@ MaybeError CommandBuffer::Execute() {
|
||||
mCommands.NextCommand<BeginComputePassCmd>();
|
||||
for (const SyncScopeResourceUsage& scope :
|
||||
GetResourceUsages().computePasses[nextComputePassNumber].dispatchUsages) {
|
||||
LazyClearSyncScope(scope);
|
||||
DAWN_TRY(LazyClearSyncScope(scope));
|
||||
}
|
||||
DAWN_TRY(ExecuteComputePass());
|
||||
|
||||
@@ -491,7 +493,8 @@ MaybeError CommandBuffer::Execute() {
|
||||
|
||||
case Command::BeginRenderPass: {
|
||||
auto* cmd = mCommands.NextCommand<BeginRenderPassCmd>();
|
||||
LazyClearSyncScope(GetResourceUsages().renderPasses[nextRenderPassNumber]);
|
||||
DAWN_TRY(
|
||||
LazyClearSyncScope(GetResourceUsages().renderPasses[nextRenderPassNumber]));
|
||||
LazyClearRenderPassAttachments(cmd);
|
||||
DAWN_TRY(ExecuteRenderPass(cmd));
|
||||
|
||||
@@ -546,7 +549,7 @@ MaybeError CommandBuffer::Execute() {
|
||||
dst.mipLevel)) {
|
||||
dst.texture->SetIsSubresourceContentInitialized(true, range);
|
||||
} else {
|
||||
ToBackend(dst.texture)->EnsureSubresourceContentInitialized(range);
|
||||
DAWN_TRY(ToBackend(dst.texture)->EnsureSubresourceContentInitialized(range));
|
||||
}
|
||||
|
||||
gl.BindBuffer(GL_PIXEL_UNPACK_BUFFER, buffer->GetHandle());
|
||||
@@ -593,7 +596,7 @@ MaybeError CommandBuffer::Execute() {
|
||||
buffer->EnsureDataInitializedAsDestination(copy);
|
||||
|
||||
SubresourceRange subresources = GetSubresourcesAffectedByCopy(src, copy->copySize);
|
||||
texture->EnsureSubresourceContentInitialized(subresources);
|
||||
DAWN_TRY(texture->EnsureSubresourceContentInitialized(subresources));
|
||||
// The only way to move data from a texture to a buffer in GL is via
|
||||
// glReadPixels with a pack buffer. Create a temporary FBO for the copy.
|
||||
gl.BindTexture(target, texture->GetHandle());
|
||||
@@ -694,11 +697,11 @@ MaybeError CommandBuffer::Execute() {
|
||||
SubresourceRange srcRange = GetSubresourcesAffectedByCopy(src, copy->copySize);
|
||||
SubresourceRange dstRange = GetSubresourcesAffectedByCopy(dst, copy->copySize);
|
||||
|
||||
srcTexture->EnsureSubresourceContentInitialized(srcRange);
|
||||
DAWN_TRY(srcTexture->EnsureSubresourceContentInitialized(srcRange));
|
||||
if (IsCompleteSubresourceCopiedTo(dstTexture, copySize, dst.mipLevel)) {
|
||||
dstTexture->SetIsSubresourceContentInitialized(true, dstRange);
|
||||
} else {
|
||||
dstTexture->EnsureSubresourceContentInitialized(dstRange);
|
||||
DAWN_TRY(dstTexture->EnsureSubresourceContentInitialized(dstRange));
|
||||
}
|
||||
CopyImageSubData(gl, src.aspect, srcTexture->GetHandle(), srcTexture->GetGLTarget(),
|
||||
src.mipLevel, src.origin, dstTexture->GetHandle(),
|
||||
|
||||
@@ -250,7 +250,7 @@ ResultOrError<Ref<NewSwapChainBase>> Device::CreateSwapChainImpl(
|
||||
return DAWN_VALIDATION_ERROR("New swapchains not implemented.");
|
||||
}
|
||||
ResultOrError<Ref<TextureBase>> Device::CreateTextureImpl(const TextureDescriptor* descriptor) {
|
||||
return AcquireRef(new Texture(this, descriptor));
|
||||
return Texture::Create(this, descriptor);
|
||||
}
|
||||
ResultOrError<Ref<TextureViewBase>> Device::CreateTextureViewImpl(
|
||||
TextureBase* texture,
|
||||
@@ -319,10 +319,10 @@ TextureBase* Device::CreateTextureWrappingEGLImage(const ExternalImageDescriptor
|
||||
if (textureDescriptor->size.width != static_cast<uint32_t>(width) ||
|
||||
textureDescriptor->size.height != static_cast<uint32_t>(height) ||
|
||||
textureDescriptor->size.depthOrArrayLayers != 1) {
|
||||
ConsumedError(DAWN_VALIDATION_ERROR(
|
||||
gl.DeleteTextures(1, &tex);
|
||||
HandleError(DAWN_VALIDATION_ERROR(
|
||||
"EGLImage size (width: %u, height: %u, depth: 1) doesn't match descriptor size %s.",
|
||||
width, height, &textureDescriptor->size));
|
||||
gl.DeleteTextures(1, &tex);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
|
||||
@@ -69,7 +69,7 @@ MaybeError Queue::WriteTextureImpl(const ImageCopyTexture& destination,
|
||||
if (IsCompleteSubresourceCopiedTo(destination.texture, writeSizePixel, destination.mipLevel)) {
|
||||
destination.texture->SetIsSubresourceContentInitialized(true, range);
|
||||
} else {
|
||||
ToBackend(destination.texture)->EnsureSubresourceContentInitialized(range);
|
||||
DAWN_TRY(ToBackend(destination.texture)->EnsureSubresourceContentInitialized(range));
|
||||
}
|
||||
DoTexSubImage(ToBackend(GetDevice())->GetGL(), textureCopy, data, dataLayout, writeSizePixel);
|
||||
ToBackend(destination.texture)->Touch();
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
#include "dawn/native/opengl/TextureGL.h"
|
||||
|
||||
#include <limits>
|
||||
#include <utility>
|
||||
|
||||
#include "dawn/common/Assert.h"
|
||||
#include "dawn/common/Constants.h"
|
||||
@@ -170,6 +171,16 @@ void AllocateTexture(const OpenGLFunctions& gl,
|
||||
|
||||
// Texture
|
||||
|
||||
// static
|
||||
ResultOrError<Ref<Texture>> Texture::Create(Device* device, const TextureDescriptor* descriptor) {
|
||||
Ref<Texture> texture = AcquireRef(new Texture(device, descriptor));
|
||||
if (device->IsToggleEnabled(Toggle::NonzeroClearResourcesOnCreationForTesting)) {
|
||||
DAWN_TRY(
|
||||
texture->ClearTexture(texture->GetAllSubresources(), TextureBase::ClearValue::NonZero));
|
||||
}
|
||||
return std::move(texture);
|
||||
}
|
||||
|
||||
Texture::Texture(Device* device, const TextureDescriptor* descriptor)
|
||||
: Texture(device, descriptor, 0, TextureState::OwnedInternal) {
|
||||
const OpenGLFunctions& gl = device->GetGL();
|
||||
@@ -186,11 +197,6 @@ Texture::Texture(Device* device, const TextureDescriptor* descriptor)
|
||||
// The texture is not complete if it uses mipmapping and not all levels up to
|
||||
// MAX_LEVEL have been defined.
|
||||
gl.TexParameteri(mTarget, GL_TEXTURE_MAX_LEVEL, levels - 1);
|
||||
|
||||
if (GetDevice()->IsToggleEnabled(Toggle::NonzeroClearResourcesOnCreationForTesting)) {
|
||||
GetDevice()->ConsumedError(
|
||||
ClearTexture(GetAllSubresources(), TextureBase::ClearValue::NonZero));
|
||||
}
|
||||
}
|
||||
|
||||
void Texture::Touch() {
|
||||
@@ -539,13 +545,14 @@ MaybeError Texture::ClearTexture(const SubresourceRange& range,
|
||||
return {};
|
||||
}
|
||||
|
||||
void Texture::EnsureSubresourceContentInitialized(const SubresourceRange& range) {
|
||||
MaybeError Texture::EnsureSubresourceContentInitialized(const SubresourceRange& range) {
|
||||
if (!GetDevice()->IsToggleEnabled(Toggle::LazyClearResourceOnFirstUse)) {
|
||||
return;
|
||||
return {};
|
||||
}
|
||||
if (!IsSubresourceContentInitialized(range)) {
|
||||
GetDevice()->ConsumedError(ClearTexture(range, TextureBase::ClearValue::Zero));
|
||||
DAWN_TRY(ClearTexture(range, TextureBase::ClearValue::Zero));
|
||||
}
|
||||
return {};
|
||||
}
|
||||
|
||||
// TextureView
|
||||
|
||||
@@ -26,7 +26,7 @@ struct GLFormat;
|
||||
|
||||
class Texture final : public TextureBase {
|
||||
public:
|
||||
Texture(Device* device, const TextureDescriptor* descriptor);
|
||||
static ResultOrError<Ref<Texture>> Create(Device* device, const TextureDescriptor* descriptor);
|
||||
Texture(Device* device, const TextureDescriptor* descriptor, GLuint handle, TextureState state);
|
||||
|
||||
GLuint GetHandle() const;
|
||||
@@ -35,9 +35,10 @@ class Texture final : public TextureBase {
|
||||
uint32_t GetGenID() const;
|
||||
void Touch();
|
||||
|
||||
void EnsureSubresourceContentInitialized(const SubresourceRange& range);
|
||||
MaybeError EnsureSubresourceContentInitialized(const SubresourceRange& range);
|
||||
|
||||
private:
|
||||
Texture(Device* device, const TextureDescriptor* descriptor);
|
||||
~Texture() override;
|
||||
|
||||
void DestroyImpl() override;
|
||||
|
||||
Reference in New Issue
Block a user