blob: 00611728fc6085f0915cbe187862dece16ca0fb6 [file] [log] [blame]
/*
* Copyright 2020 Google LLC
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef GrD3DBuffer_DEFINED
#define GrD3DBuffer_DEFINED
#include "include/gpu/d3d/GrD3DTypes.h"
#include "src/gpu/GrGpuBuffer.h"
#include "src/gpu/GrManagedResource.h"
class GrD3DGpu;
class GrD3DBuffer : public GrGpuBuffer {
private:
class Resource;
public:
static sk_sp<GrD3DBuffer> Make(GrD3DGpu*, size_t size, GrGpuBufferType, GrAccessPattern);
~GrD3DBuffer() override {
// release should have been called by the owner of this object.
SkASSERT(!fResource);
SkASSERT(!fMappedResource);
}
ID3D12Resource* d3dResource() const {
SkASSERT(fResource);
return fResource->fD3DResource.get();
}
sk_sp<Resource> resource() const {
SkASSERT(fResource);
return fResource;
}
void setResourceState(const GrD3DGpu* gpu, D3D12_RESOURCE_STATES newResourceState);
protected:
GrD3DBuffer(GrD3DGpu*, size_t size, GrGpuBufferType, GrAccessPattern, const sk_sp<Resource>&,
D3D12_RESOURCE_STATES);
void onAbandon() override;
void onRelease() override;
D3D12_RESOURCE_STATES fResourceState;
private:
void onMap() override;
void onUnmap() override;
bool onUpdateData(const void* src, size_t srcSizeInBytes) override;
void internalMap(size_t size);
void internalUnmap(size_t size);
void validate() const;
GrD3DGpu* getD3DGpu() const {
SkASSERT(!this->wasDestroyed());
return reinterpret_cast<GrD3DGpu*>(this->getGpu());
}
class Resource : public GrRecycledResource {
public:
explicit Resource()
: fD3DResource(nullptr) {
}
Resource(const gr_cp<ID3D12Resource>& bufferResource)
: fD3DResource(bufferResource) {
SkASSERT(bufferResource.get() &&
bufferResource->GetDesc().Dimension == D3D12_RESOURCE_DIMENSION_BUFFER);
}
static sk_sp<Resource> Make(GrD3DGpu*, size_t size, GrGpuBufferType, GrAccessPattern,
D3D12_RESOURCE_STATES*);
size_t size() {
if (!fD3DResource.get()) {
return 0;
}
return fD3DResource->GetDesc().Width;
}
#ifdef SK_TRACE_MANAGED_RESOURCES
void dumpInfo() const override {
SkDebugf("GrD3DBuffer: %d (%d refs)\n", fD3DResource.get(), this->getRefCnt());
}
#endif
mutable gr_cp<ID3D12Resource> fD3DResource;
private:
void freeGPUData() const override {
fD3DResource.reset();
}
void onRecycle() const override { this->unref(); } // TODO
typedef GrRecycledResource INHERITED;
};
sk_sp<Resource> fResource;
sk_sp<Resource> fMappedResource;
typedef GrGpuBuffer INHERITED;
};
#endif