mirror of
https://github.com/encounter/dawn-cmake.git
synced 2025-08-12 23:19:06 +00:00
Works around issues on Metal Intel where CopyB2T and WriteTexture with depth/stencil textures do not work correctly. Fixes test failures with depth16unorm in the CTS. Deletes UseTempTextureInStencilTextureToBufferCopy in favor of the stencil blit. The former supposedly fixes a problem where the stencil data is not flushed into the real stencil texture by performing another T2T copy. This only works because the Metal Intel backend also happens to allocate s8 as d32s8. Copying the depth aspect as well seems to make the driver remember to flush the data. The stencil blit is a better fix for the problem since entirely avoids getting the driver into a bad state where the stencil data is not in sync. Fixed: dawn:1389 Change-Id: If34b1d58996157036c164a5bc329e38b5e53f67a Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/117910 Reviewed-by: Loko Kung <lokokung@google.com> Kokoro: Kokoro <noreply+kokoro@google.com> Commit-Queue: Austin Eng <enga@chromium.org>
77 lines
3.2 KiB
C++
77 lines
3.2 KiB
C++
// Copyright 2023 The Dawn Authors
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
#ifndef SRC_DAWN_NATIVE_BLITBUFFERTODEPTHSTENCIL_H_
|
|
#define SRC_DAWN_NATIVE_BLITBUFFERTODEPTHSTENCIL_H_
|
|
|
|
#include "dawn/native/Error.h"
|
|
|
|
namespace dawn::native {
|
|
|
|
struct TextureCopy;
|
|
|
|
// BlitBufferToDepth works around issues where copying from a buffer
|
|
// to depth does not work on some drivers.
|
|
// Currently, only depth16unorm textures can be CopyDst, so only depth16unorm
|
|
// is supported.
|
|
// It does the following:
|
|
// - Copies buffer data to an rg8uint texture.
|
|
// - Sets the viewport to the copy rect.
|
|
// - Uploads the copy origin to a uniform buffer.
|
|
// - For each destination layer:
|
|
// - Performs a draw to sample the rg8uint data, computes the
|
|
// floating point depth value, and writes the frag depth.
|
|
|
|
MaybeError BlitStagingBufferToDepth(DeviceBase* device,
|
|
BufferBase* buffer,
|
|
const TextureDataLayout& src,
|
|
const TextureCopy& dst,
|
|
const Extent3D& copyExtent);
|
|
|
|
MaybeError BlitBufferToDepth(DeviceBase* device,
|
|
CommandEncoder* commandEncoder,
|
|
BufferBase* buffer,
|
|
const TextureDataLayout& src,
|
|
const TextureCopy& dst,
|
|
const Extent3D& copyExtent);
|
|
|
|
// BlitBufferToStencil works around issues where copying from a buffer
|
|
// to stencil does not work on some drivers.
|
|
// It does the following:
|
|
// - Copies buffer data to an r8uint texture.
|
|
// - Sets the viewport to the copy rect.
|
|
// - Uploads the copy origin to a uniform buffer.
|
|
// - For each destination layer:
|
|
// - Performs a draw to clear stencil to 0.
|
|
// - Performs 8 draws for each bit of stencil to set the respective
|
|
// stencil bit to 1, if the source r8 texture also has that bit set.
|
|
// If the source r8 texture does not, the fragment is discarded.
|
|
|
|
MaybeError BlitStagingBufferToStencil(DeviceBase* device,
|
|
BufferBase* buffer,
|
|
const TextureDataLayout& src,
|
|
const TextureCopy& dst,
|
|
const Extent3D& copyExtent);
|
|
|
|
MaybeError BlitBufferToStencil(DeviceBase* device,
|
|
CommandEncoder* commandEncoder,
|
|
BufferBase* buffer,
|
|
const TextureDataLayout& src,
|
|
const TextureCopy& dst,
|
|
const Extent3D& copyExtent);
|
|
|
|
} // namespace dawn::native
|
|
|
|
#endif // SRC_DAWN_NATIVE_BLITBUFFERTODEPTHSTENCIL_H_
|