34 std::string_view label) {
39 wgpu::BufferUsage
usage = wgpu::BufferUsage::None;
43 usage = wgpu::BufferUsage::Vertex | wgpu::BufferUsage::CopyDst;
46 usage = wgpu::BufferUsage::Index | wgpu::BufferUsage::CopyDst;
49 usage = wgpu::BufferUsage::CopySrc | wgpu::BufferUsage::MapWrite;
52 usage = wgpu::BufferUsage::CopyDst | wgpu::BufferUsage::MapRead;
55 usage = wgpu::BufferUsage::Uniform | wgpu::BufferUsage::CopyDst;
58 usage = wgpu::BufferUsage::Storage | wgpu::BufferUsage::CopyDst |
59 wgpu::BufferUsage::CopySrc;
62 usage = wgpu::BufferUsage::Indirect | wgpu::BufferUsage::Storage |
63 wgpu::BufferUsage::CopyDst;
66 usage = wgpu::BufferUsage::Vertex | wgpu::BufferUsage::Storage;
69 usage = wgpu::BufferUsage::Index | wgpu::BufferUsage::Storage;
76 usage |= wgpu::BufferUsage::MapWrite;
79 wgpu::BufferDescriptor desc;
87 desc.mappedAtCreation =
SkToBool(
usage & wgpu::BufferUsage::MapWrite);
94 void* mappedAtCreationPtr =
nullptr;
95 if (desc.mappedAtCreation) {
96 mappedAtCreationPtr =
buffer.GetMappedRange();
112 void* mappedAtCreationPtr,
113 std::string_view label)
123#if defined(__EMSCRIPTEN__)
132 if (!(fBuffer.GetUsage() & wgpu::BufferUsage::MapWrite)) {
138 SkASSERT(!this->debugHasCommandBufferRef());
171 SkASSERT((fBuffer.GetUsage() & wgpu::BufferUsage::MapRead) ||
172 (fBuffer.GetUsage() & wgpu::BufferUsage::MapWrite));
173 SkASSERT(fBuffer.GetMapState() == wgpu::BufferMapState::Unmapped);
174 bool isWrite = fBuffer.GetUsage() & wgpu::BufferUsage::MapWrite;
178 isWrite ? wgpu::MapMode::Write :
wgpu::MapMode::
Read,
181 [](WGPUBufferMapAsyncStatus
s, void* userData) {
191#if defined(__EMSCRIPTEN__)
192 SKGPU_LOG_W(
"Synchronous buffer mapping not supported in Dawn. Failing map request.");
196 SkASSERT((fBuffer.GetUsage() & wgpu::BufferUsage::MapRead) ||
197 (fBuffer.GetUsage() & wgpu::BufferUsage::MapWrite));
198 bool isWrite = fBuffer.GetUsage() & wgpu::BufferUsage::MapWrite;
203 wgpu::BufferMapCallbackInfo callbackInfo{};
204 callbackInfo.mode = wgpu::CallbackMode::WaitAnyOnly;
205 callbackInfo.userdata =
this;
206 callbackInfo.callback = [](WGPUBufferMapAsyncStatus
s,
void* userData) {
211 wgpu::FutureWaitInfo mapWaitInfo{};
213 mapWaitInfo.future = fBuffer.MapAsync(isWrite ? wgpu::MapMode::Write : wgpu::MapMode::Read,
220 [[maybe_unused]]
auto status =
instance.WaitAny(1, &mapWaitInfo, 0);
222 if (status != wgpu::WaitStatus::Success) {
241 1, &mapWaitInfo, std::numeric_limits<uint64_t>::max());
244 SkASSERT(status == wgpu::WaitStatus::Success);
257void DawnBuffer::mapCallback(WGPUBufferMapAsyncStatus status) {
259 if (status == WGPUBufferMapAsyncStatus_Success) {
260 if (this->fBuffer.GetUsage() & wgpu::BufferUsage::MapWrite) {
261 this->
fMapPtr = this->fBuffer.GetMappedRange();
265 this->
fMapPtr =
const_cast<void*
>(this->fBuffer.GetConstMappedRange());
268 const char* statusStr;
271 case WGPUBufferMapAsyncStatus_ValidationError:
272 statusStr =
"ValidationError";
274 case WGPUBufferMapAsyncStatus_Unknown:
275 statusStr =
"Unknown";
277 case WGPUBufferMapAsyncStatus_DeviceLost:
278 statusStr =
"DeviceLost";
280 case WGPUBufferMapAsyncStatus_DestroyedBeforeCallback:
281 statusStr =
"DestroyedBeforeCallback";
284 case WGPUBufferMapAsyncStatus_UnmappedBeforeCallback:
285 statusStr =
"UnmappedBeforeCallback";
288 case WGPUBufferMapAsyncStatus_MappingAlreadyPending:
289 statusStr =
"MappingAlreadyPending";
291 case WGPUBufferMapAsyncStatus_OffsetOutOfRange:
292 statusStr =
"OffsetOutOfRange";
294 case WGPUBufferMapAsyncStatus_SizeOutOfRange:
295 statusStr =
"SizeOutOfRange";
298 statusStr =
"<Other>";
301 SKGPU_LOG(priority,
"Buffer async map failed with status %s.", statusStr);
302 for (
auto& cb : this->fAsyncMapCallbacks) {
303 cb->setFailureResult();
306 this->fAsyncMapCallbacks.clear();
310 return fBuffer.GetMapState() != wgpu::BufferMapState::Unmapped;
318 const char* dumpName)
const {
#define SKGPU_LOG(priority, fmt,...)
#define SKGPU_LOG_W(fmt,...)
sk_sp< T > sk_ref_sp(T *obj)
static constexpr bool SkToBool(const T &x)
virtual void dumpStringValue(const char *, const char *, const char *)
static sk_sp< RefCntedCallback > Make(Callback proc, Context ctx)
virtual void onAsyncMap(GpuFinishedProc, GpuFinishedContext)
void asyncMap(GpuFinishedProc=nullptr, GpuFinishedContext=nullptr)
bool drawBufferCanBeMapped() const
bool isUnmappable() const override
void freeGpuData() override
void onDumpMemoryStatistics(SkTraceMemoryDump *traceMemoryDump, const char *dumpName) const override
static sk_sp< DawnBuffer > Make(const DawnSharedContext *, size_t size, BufferType type, AccessPattern, std::string_view label)
virtual void prepareForReturnToCache(const std::function< void()> &takeRef)
virtual void onDumpMemoryStatistics(SkTraceMemoryDump *traceMemoryDump, const char *dumpName) const
const SharedContext * sharedContext() const
const Caps * caps() const
static const uint8_t buffer[]
SK_API bool Read(SkStreamSeekable *src, SkDocumentPage *dstArray, int dstArrayCount, const SkDeserialProcs *=nullptr)
static const char * kBufferTypeNames[kBufferTypeCount]
void * GpuFinishedContext
void(*)(GpuFinishedContext finishedContext, CallbackResult) GpuFinishedProc
static const int kBufferTypeCount
static void usage(char *argv0)