mirror of
https://github.com/encounter/dawn-cmake.git
synced 2025-12-21 02:39:11 +00:00
Refactor subresource related variables to a struct
This patch put subresource related variables like baseMipLevel, levelCount, baseArrayLayer, layerCount into a single struct at front-end. We have a lot more at backend too, a following patch will do that. Bug: dawn:157 Change-Id: Iab5633a4246b6ae89b80c39f5672dbb31d7a3e78 Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/22704 Reviewed-by: Kai Ninomiya <kainino@chromium.org> Commit-Queue: Yunchao He <yunchao.he@intel.com>
This commit is contained in:
committed by
Commit Bot service account
parent
c7778a27cb
commit
5fafb49c7b
@@ -458,8 +458,7 @@ namespace dawn_native { namespace opengl {
|
||||
// cleared in BeginRenderPass by setting the loadop to clear when the
|
||||
// texture subresource has not been initialized before the render pass.
|
||||
if (!(usages.textureUsages[i].usage & wgpu::TextureUsage::OutputAttachment)) {
|
||||
texture->EnsureSubresourceContentInitialized(0, texture->GetNumMipLevels(), 0,
|
||||
texture->GetArrayLayers());
|
||||
texture->EnsureSubresourceContentInitialized(texture->GetAllSubresources());
|
||||
}
|
||||
}
|
||||
};
|
||||
@@ -513,12 +512,15 @@ namespace dawn_native { namespace opengl {
|
||||
Texture* texture = ToBackend(dst.texture.Get());
|
||||
GLenum target = texture->GetGLTarget();
|
||||
const GLFormat& format = texture->GetGLFormat();
|
||||
|
||||
ASSERT(texture->GetDimension() == wgpu::TextureDimension::e2D);
|
||||
ASSERT(copy->copySize.depth == 1);
|
||||
SubresourceRange subresource =
|
||||
SubresourceRange::SingleSubresource(dst.mipLevel, dst.arrayLayer);
|
||||
if (IsCompleteSubresourceCopiedTo(texture, copySize, dst.mipLevel)) {
|
||||
texture->SetIsSubresourceContentInitialized(true, dst.mipLevel, 1,
|
||||
dst.arrayLayer, 1);
|
||||
texture->SetIsSubresourceContentInitialized(true, subresource);
|
||||
} else {
|
||||
texture->EnsureSubresourceContentInitialized(dst.mipLevel, 1,
|
||||
dst.arrayLayer, 1);
|
||||
texture->EnsureSubresourceContentInitialized(subresource);
|
||||
}
|
||||
|
||||
gl.BindBuffer(GL_PIXEL_UNPACK_BUFFER, buffer->GetHandle());
|
||||
@@ -602,8 +604,10 @@ namespace dawn_native { namespace opengl {
|
||||
UNREACHABLE();
|
||||
}
|
||||
|
||||
texture->EnsureSubresourceContentInitialized(src.mipLevel, 1, src.arrayLayer,
|
||||
1);
|
||||
ASSERT(texture->GetDimension() == wgpu::TextureDimension::e2D);
|
||||
ASSERT(copy->copySize.depth == 1);
|
||||
texture->EnsureSubresourceContentInitialized(
|
||||
SubresourceRange::SingleSubresource(src.mipLevel, src.arrayLayer));
|
||||
// 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());
|
||||
@@ -675,14 +679,16 @@ namespace dawn_native { namespace opengl {
|
||||
Extent3D copySize = ComputeTextureCopyExtent(dst, copy->copySize);
|
||||
Texture* srcTexture = ToBackend(src.texture.Get());
|
||||
Texture* dstTexture = ToBackend(dst.texture.Get());
|
||||
srcTexture->EnsureSubresourceContentInitialized(src.mipLevel, 1, src.arrayLayer,
|
||||
1);
|
||||
SubresourceRange srcRange = {src.mipLevel, 1, src.arrayLayer,
|
||||
copy->copySize.depth};
|
||||
SubresourceRange dstRange = {dst.mipLevel, 1, dst.arrayLayer,
|
||||
copy->copySize.depth};
|
||||
|
||||
srcTexture->EnsureSubresourceContentInitialized(srcRange);
|
||||
if (IsCompleteSubresourceCopiedTo(dstTexture, copySize, dst.mipLevel)) {
|
||||
dstTexture->SetIsSubresourceContentInitialized(
|
||||
true, dst.mipLevel, 1, dst.arrayLayer, copy->copySize.depth);
|
||||
dstTexture->SetIsSubresourceContentInitialized(true, dstRange);
|
||||
} else {
|
||||
dstTexture->EnsureSubresourceContentInitialized(
|
||||
dst.mipLevel, 1, dst.arrayLayer, copy->copySize.depth);
|
||||
dstTexture->EnsureSubresourceContentInitialized(dstRange);
|
||||
}
|
||||
gl.CopyImageSubData(srcTexture->GetHandle(), srcTexture->GetGLTarget(),
|
||||
src.mipLevel, src.origin.x, src.origin.y, src.arrayLayer,
|
||||
|
||||
@@ -145,8 +145,8 @@ namespace dawn_native { namespace opengl {
|
||||
gl.TexParameteri(mTarget, GL_TEXTURE_MAX_LEVEL, levels - 1);
|
||||
|
||||
if (GetDevice()->IsToggleEnabled(Toggle::NonzeroClearResourcesOnCreationForTesting)) {
|
||||
GetDevice()->ConsumedError(ClearTexture(0, GetNumMipLevels(), 0, GetArrayLayers(),
|
||||
TextureBase::ClearValue::NonZero));
|
||||
GetDevice()->ConsumedError(
|
||||
ClearTexture(GetAllSubresources(), TextureBase::ClearValue::NonZero));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -181,10 +181,7 @@ namespace dawn_native { namespace opengl {
|
||||
return ToBackend(GetDevice())->GetGLFormat(GetFormat());
|
||||
}
|
||||
|
||||
MaybeError Texture::ClearTexture(GLint baseMipLevel,
|
||||
GLint levelCount,
|
||||
GLint baseArrayLayer,
|
||||
GLint layerCount,
|
||||
MaybeError Texture::ClearTexture(const SubresourceRange& range,
|
||||
TextureBase::ClearValue clearValue) {
|
||||
// TODO(jiawei.shao@intel.com): initialize the textures with compressed formats.
|
||||
if (GetFormat().isCompressed) {
|
||||
@@ -224,31 +221,35 @@ namespace dawn_native { namespace opengl {
|
||||
gl.GenFramebuffers(1, &framebuffer);
|
||||
gl.BindFramebuffer(GL_DRAW_FRAMEBUFFER, framebuffer);
|
||||
|
||||
for (GLint level = baseMipLevel; level < baseMipLevel + levelCount; ++level) {
|
||||
for (uint32_t level = range.baseMipLevel;
|
||||
level < range.baseMipLevel + range.levelCount; ++level) {
|
||||
switch (GetDimension()) {
|
||||
case wgpu::TextureDimension::e2D:
|
||||
if (GetArrayLayers() == 1) {
|
||||
if (clearValue == TextureBase::ClearValue::Zero &&
|
||||
IsSubresourceContentInitialized(level, 1, 0, 1)) {
|
||||
IsSubresourceContentInitialized(
|
||||
SubresourceRange::SingleSubresource(level, 0))) {
|
||||
// Skip lazy clears if already initialized.
|
||||
continue;
|
||||
}
|
||||
gl.FramebufferTexture2D(GL_DRAW_FRAMEBUFFER,
|
||||
GL_DEPTH_STENCIL_ATTACHMENT, GetGLTarget(),
|
||||
GetHandle(), level);
|
||||
GetHandle(), static_cast<GLint>(level));
|
||||
DoClear();
|
||||
} else {
|
||||
for (GLint layer = baseArrayLayer;
|
||||
layer < baseArrayLayer + layerCount; ++layer) {
|
||||
for (uint32_t layer = range.baseArrayLayer;
|
||||
layer < range.baseArrayLayer + range.layerCount; ++layer) {
|
||||
if (clearValue == TextureBase::ClearValue::Zero &&
|
||||
IsSubresourceContentInitialized(level, 1, layer, 1)) {
|
||||
IsSubresourceContentInitialized(
|
||||
SubresourceRange::SingleSubresource(level, layer))) {
|
||||
// Skip lazy clears if already initialized.
|
||||
continue;
|
||||
}
|
||||
|
||||
gl.FramebufferTextureLayer(GL_DRAW_FRAMEBUFFER,
|
||||
GL_DEPTH_STENCIL_ATTACHMENT,
|
||||
GetHandle(), level, layer);
|
||||
gl.FramebufferTextureLayer(
|
||||
GL_DRAW_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT,
|
||||
GetHandle(), static_cast<GLint>(level),
|
||||
static_cast<GLint>(layer));
|
||||
DoClear();
|
||||
}
|
||||
}
|
||||
@@ -268,16 +269,19 @@ namespace dawn_native { namespace opengl {
|
||||
clearColorData.fill(clearColor);
|
||||
|
||||
const GLFormat& glFormat = GetGLFormat();
|
||||
for (GLint level = baseMipLevel; level < baseMipLevel + levelCount; ++level) {
|
||||
for (uint32_t level = range.baseMipLevel;
|
||||
level < range.baseMipLevel + range.levelCount; ++level) {
|
||||
Extent3D mipSize = GetMipLevelPhysicalSize(level);
|
||||
for (GLint layer = baseArrayLayer; layer < baseArrayLayer + layerCount;
|
||||
++layer) {
|
||||
for (uint32_t layer = range.baseArrayLayer;
|
||||
layer < range.baseArrayLayer + range.layerCount; ++layer) {
|
||||
if (clearValue == TextureBase::ClearValue::Zero &&
|
||||
IsSubresourceContentInitialized(level, 1, layer, 1)) {
|
||||
IsSubresourceContentInitialized(
|
||||
SubresourceRange::SingleSubresource(level, layer))) {
|
||||
// Skip lazy clears if already initialized.
|
||||
continue;
|
||||
}
|
||||
gl.ClearTexSubImage(mHandle, level, 0, 0, layer, mipSize.width,
|
||||
gl.ClearTexSubImage(mHandle, static_cast<GLint>(level), 0, 0,
|
||||
static_cast<GLint>(layer), mipSize.width,
|
||||
mipSize.height, 1, glFormat.format, glFormat.type,
|
||||
clearColorData.data());
|
||||
}
|
||||
@@ -319,7 +323,8 @@ namespace dawn_native { namespace opengl {
|
||||
gl.PixelStorei(GL_UNPACK_ROW_LENGTH,
|
||||
(bytesPerRow / GetFormat().blockByteSize) * GetFormat().blockWidth);
|
||||
gl.PixelStorei(GL_UNPACK_IMAGE_HEIGHT, 0);
|
||||
for (GLint level = baseMipLevel; level < baseMipLevel + levelCount; ++level) {
|
||||
for (uint32_t level = range.baseMipLevel; level < range.baseMipLevel + range.levelCount;
|
||||
++level) {
|
||||
gl.BindBuffer(GL_PIXEL_UNPACK_BUFFER, srcBuffer->GetHandle());
|
||||
gl.ActiveTexture(GL_TEXTURE0);
|
||||
gl.BindTexture(GetGLTarget(), GetHandle());
|
||||
@@ -329,23 +334,26 @@ namespace dawn_native { namespace opengl {
|
||||
case wgpu::TextureDimension::e2D:
|
||||
if (GetArrayLayers() == 1) {
|
||||
if (clearValue == TextureBase::ClearValue::Zero &&
|
||||
IsSubresourceContentInitialized(level, 1, 0, 1)) {
|
||||
IsSubresourceContentInitialized(
|
||||
SubresourceRange::SingleSubresource(level, 0))) {
|
||||
// Skip lazy clears if already initialized.
|
||||
continue;
|
||||
}
|
||||
gl.TexSubImage2D(GetGLTarget(), level, 0, 0, size.width, size.height,
|
||||
GetGLFormat().format, GetGLFormat().type, 0);
|
||||
gl.TexSubImage2D(GetGLTarget(), static_cast<GLint>(level), 0, 0,
|
||||
size.width, size.height, GetGLFormat().format,
|
||||
GetGLFormat().type, 0);
|
||||
} else {
|
||||
for (GLint layer = baseArrayLayer; layer < baseArrayLayer + layerCount;
|
||||
++layer) {
|
||||
for (uint32_t layer = range.baseArrayLayer;
|
||||
layer < range.baseArrayLayer + range.layerCount; ++layer) {
|
||||
if (clearValue == TextureBase::ClearValue::Zero &&
|
||||
IsSubresourceContentInitialized(level, 1, layer, 1)) {
|
||||
IsSubresourceContentInitialized(
|
||||
SubresourceRange::SingleSubresource(level, layer))) {
|
||||
// Skip lazy clears if already initialized.
|
||||
continue;
|
||||
}
|
||||
gl.TexSubImage3D(GetGLTarget(), level, 0, 0, layer, size.width,
|
||||
size.height, 1, GetGLFormat().format,
|
||||
GetGLFormat().type, 0);
|
||||
gl.TexSubImage3D(GetGLTarget(), static_cast<GLint>(level), 0, 0,
|
||||
static_cast<GLint>(layer), size.width, size.height,
|
||||
1, GetGLFormat().format, GetGLFormat().type, 0);
|
||||
}
|
||||
}
|
||||
break;
|
||||
@@ -360,24 +368,18 @@ namespace dawn_native { namespace opengl {
|
||||
gl.BindBuffer(GL_PIXEL_UNPACK_BUFFER, 0);
|
||||
}
|
||||
if (clearValue == TextureBase::ClearValue::Zero) {
|
||||
SetIsSubresourceContentInitialized(true, baseMipLevel, levelCount, baseArrayLayer,
|
||||
layerCount);
|
||||
SetIsSubresourceContentInitialized(true, range);
|
||||
device->IncrementLazyClearCountForTesting();
|
||||
}
|
||||
return {};
|
||||
}
|
||||
|
||||
void Texture::EnsureSubresourceContentInitialized(uint32_t baseMipLevel,
|
||||
uint32_t levelCount,
|
||||
uint32_t baseArrayLayer,
|
||||
uint32_t layerCount) {
|
||||
void Texture::EnsureSubresourceContentInitialized(const SubresourceRange& range) {
|
||||
if (!GetDevice()->IsToggleEnabled(Toggle::LazyClearResourceOnFirstUse)) {
|
||||
return;
|
||||
}
|
||||
if (!IsSubresourceContentInitialized(baseMipLevel, levelCount, baseArrayLayer,
|
||||
layerCount)) {
|
||||
GetDevice()->ConsumedError(ClearTexture(baseMipLevel, levelCount, baseArrayLayer,
|
||||
layerCount, TextureBase::ClearValue::Zero));
|
||||
if (!IsSubresourceContentInitialized(range)) {
|
||||
GetDevice()->ConsumedError(ClearTexture(range, TextureBase::ClearValue::Zero));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -36,20 +36,13 @@ namespace dawn_native { namespace opengl {
|
||||
GLenum GetGLTarget() const;
|
||||
const GLFormat& GetGLFormat() const;
|
||||
|
||||
void EnsureSubresourceContentInitialized(uint32_t baseMipLevel,
|
||||
uint32_t levelCount,
|
||||
uint32_t baseArrayLayer,
|
||||
uint32_t layerCount);
|
||||
void EnsureSubresourceContentInitialized(const SubresourceRange& range);
|
||||
|
||||
private:
|
||||
~Texture() override;
|
||||
|
||||
void DestroyImpl() override;
|
||||
MaybeError ClearTexture(GLint baseMipLevel,
|
||||
GLint levelCount,
|
||||
GLint baseArrayLayer,
|
||||
GLint layerCount,
|
||||
TextureBase::ClearValue clearValue);
|
||||
MaybeError ClearTexture(const SubresourceRange& range, TextureBase::ClearValue clearValue);
|
||||
|
||||
GLuint mHandle;
|
||||
GLenum mTarget;
|
||||
|
||||
Reference in New Issue
Block a user