mirror of
https://github.com/encounter/dawn-cmake.git
synced 2025-08-19 02:11:40 +00:00
This patch fixes the issues on the initialization of buffers with MapRead usage and mappedAtCreation == true. 1. The buffers with MapRead usage and mappedAtCreation == true can be read from the CPU side just after the creation of the buffer, however at that time the internal pending command buffers may not be executed, thus causing the buffer is not cleared as is expected. 2. On D3D12 the buffer with MapRead and mappedAtCreation == true is created on the READBACK heap, so all the data written in the CPU side cannot be uploaded to the GPU memory. When the buffer is mapped again all the original data written through the CPU pointer will be overwritten by the data in the GPU memory (which means it is also cleared to 0). This patch fixes this issue by: 1. clearing the buffers with mappedAtCreation == true on the CPU side. 2. on D3D12 making the buffer with MapRead and mappedAtCreation == true use the staging buffer instead of mapping itself. Note that this change is only related to the code path with Toggle "nonzero_clear_resources_on_creation_for_testing" enabled, currently we don't plan to do the similar change when we enable Dawn wire. BUG=dawn:414 TEST=dawn_end2end_tests Change-Id: I2b3d0840333e8d99759800ab9fc141d0a7cf2f8d Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/27220 Reviewed-by: Corentin Wallez <cwallez@chromium.org> Commit-Queue: Jiawei Shao <jiawei.shao@intel.com>
61 lines
2.1 KiB
C++
61 lines
2.1 KiB
C++
// Copyright 2017 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 DAWNNATIVE_OPENGL_BUFFERGL_H_
|
|
#define DAWNNATIVE_OPENGL_BUFFERGL_H_
|
|
|
|
#include "dawn_native/Buffer.h"
|
|
|
|
#include "dawn_native/opengl/opengl_platform.h"
|
|
|
|
namespace dawn_native { namespace opengl {
|
|
|
|
class Device;
|
|
|
|
class Buffer final : public BufferBase {
|
|
public:
|
|
static ResultOrError<Ref<Buffer>> CreateInternalBuffer(Device* device,
|
|
const BufferDescriptor* descriptor,
|
|
bool shouldLazyClear);
|
|
|
|
Buffer(Device* device, const BufferDescriptor* descriptor);
|
|
|
|
GLuint GetHandle() const;
|
|
|
|
void EnsureDataInitialized();
|
|
void EnsureDataInitializedAsDestination(uint64_t offset, uint64_t size);
|
|
void EnsureDataInitializedAsDestination(const CopyTextureToBufferCmd* copy);
|
|
|
|
private:
|
|
Buffer(Device* device, const BufferDescriptor* descriptor, bool shouldLazyClear);
|
|
~Buffer() override;
|
|
MaybeError MapAsyncImpl(wgpu::MapMode mode, size_t offset, size_t size) override;
|
|
void UnmapImpl() override;
|
|
void DestroyImpl() override;
|
|
bool IsCPUWritableAtCreation() const override;
|
|
MaybeError MapAtCreationImpl() override;
|
|
void* GetMappedPointerImpl() override;
|
|
|
|
uint64_t GetAppliedSize() const;
|
|
|
|
void InitializeToZero();
|
|
|
|
GLuint mBuffer = 0;
|
|
void* mMappedData = nullptr;
|
|
};
|
|
|
|
}} // namespace dawn_native::opengl
|
|
|
|
#endif // DAWNNATIVE_OPENGL_BUFFERGL_H_
|