blob: 4aa1ab496f718067aac3066667b30a87cdbda364 [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 GrD3DCommandList_DEFINED
#define GrD3DCommandList_DEFINED
#include "include/gpu/GrTypes.h"
#include "src/gpu/GrManagedResource.h"
#include "src/gpu/d3d/GrD3D12.h"
#include <memory>
class GrD3DGpu;
class GrD3DCommandList {
public:
void close();
void submit(ID3D12CommandQueue* queue);
void reset();
// Add ref-counted resource that will be tracked and released when this command buffer finishes
// execution
void addResource(const GrManagedResource* resource) {
SkASSERT(resource);
resource->ref();
resource->notifyQueuedForWorkOnGpu();
fTrackedResources.append(1, &resource);
}
// Add ref-counted resource that will be tracked and released when this command buffer finishes
// execution. When it is released, it will signal that the resource can be recycled for reuse.
void addRecycledResource(const GrRecycledResource* resource) {
resource->ref();
resource->notifyQueuedForWorkOnGpu();
fTrackedRecycledResources.append(1, &resource);
}
void releaseResources();
protected:
GrD3DCommandList(gr_cp<ID3D12CommandAllocator> allocator,
gr_cp<ID3D12GraphicsCommandList> commandList);
gr_cp<ID3D12GraphicsCommandList> fCommandList;
SkTDArray<const GrManagedResource*> fTrackedResources;
SkTDArray<const GrRecycledResource*> fTrackedRecycledResources;
// When we create a command list it starts in an active recording state
SkDEBUGCODE(bool fIsActive = true;)
private:
gr_cp<ID3D12CommandAllocator> fAllocator;
static const int kInitialTrackedResourcesCount = 32;
// When resetting the command buffer, we remove the tracked resources from their arrays, and
// we prefer to not free all the memory every time so usually we just rewind. However, to avoid
// all arrays growing to the max size, after so many resets we'll do a full reset of the tracked
// resource arrays.
static const int kNumRewindResetsBeforeFullReset = 8;
int fNumResets = 0;
};
class GrD3DDirectCommandList : public GrD3DCommandList {
public:
static std::unique_ptr<GrD3DDirectCommandList> Make(ID3D12Device* device);
private:
GrD3DDirectCommandList(gr_cp<ID3D12CommandAllocator> allocator,
gr_cp<ID3D12GraphicsCommandList> commandList);
};
class GrD3DCopyCommandList : public GrD3DCommandList {
public:
static std::unique_ptr<GrD3DCopyCommandList> Make(ID3D12Device* device);
private:
GrD3DCopyCommandList(gr_cp<ID3D12CommandAllocator> allocator,
gr_cp<ID3D12GraphicsCommandList> commandList);
};
#endif