blob: 5e7db628ce54a533836f02e778232b8f230dd378 [file] [log] [blame]
Greg Daniel02c45902020-03-09 10:58:09 -04001/*
2 * Copyright 2020 Google LLC
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#ifndef GrD3DResourceProvider_DEFINED
9#define GrD3DResourceProvider_DEFINED
10
Jim Van Verth9aa9a682020-04-01 10:13:48 -040011#include "include/gpu/d3d/GrD3DTypes.h"
Greg Daniel7a5f1fa2020-03-24 14:50:19 -040012#include "include/private/SkTArray.h"
Greg Danielb698ad32020-05-04 10:17:22 -040013#include "src/core/SkLRUCache.h"
14#include "src/gpu/GrProgramDesc.h"
Jim Van Verthafd41132020-05-28 06:44:55 -040015#include "src/gpu/d3d/GrD3DCpuDescriptorManager.h"
Greg Danielc31edc02020-04-23 11:03:02 -040016#include "src/gpu/d3d/GrD3DRootSignature.h"
Greg Daniel02c45902020-03-09 10:58:09 -040017
Greg Daniele52c9782020-03-23 14:18:37 -040018#include <memory>
19
20class GrD3DDirectCommandList;
Greg Daniel02c45902020-03-09 10:58:09 -040021class GrD3DGpu;
Greg Danielb698ad32020-05-04 10:17:22 -040022class GrD3DPipelineState;
Greg Daniel02c45902020-03-09 10:58:09 -040023
24class GrD3DResourceProvider {
25public:
26 GrD3DResourceProvider(GrD3DGpu*);
27
Greg Daniele52c9782020-03-23 14:18:37 -040028 std::unique_ptr<GrD3DDirectCommandList> findOrCreateDirectCommandList();
Greg Daniel85da3362020-03-09 15:18:35 -040029
Greg Daniel7a5f1fa2020-03-24 14:50:19 -040030 void recycleDirectCommandList(std::unique_ptr<GrD3DDirectCommandList>);
31
Greg Danielc31edc02020-04-23 11:03:02 -040032 sk_sp<GrD3DRootSignature> findOrCreateRootSignature(int numTextureSamplers);
33
Jim Van Verth5ce94402020-05-01 14:19:13 -040034 D3D12_CPU_DESCRIPTOR_HANDLE createRenderTargetView(ID3D12Resource* textureResource);
35 void recycleRenderTargetView(D3D12_CPU_DESCRIPTOR_HANDLE*);
36
Jim Van Verth73591652020-05-08 12:50:38 -040037 D3D12_CPU_DESCRIPTOR_HANDLE createDepthStencilView(ID3D12Resource* textureResource);
38 void recycleDepthStencilView(D3D12_CPU_DESCRIPTOR_HANDLE*);
39
Jim Van Verthafd41132020-05-28 06:44:55 -040040 D3D12_CPU_DESCRIPTOR_HANDLE createConstantBufferView(ID3D12Resource* bufferResource,
41 size_t offset,
42 size_t size);
43 D3D12_CPU_DESCRIPTOR_HANDLE createShaderResourceView(ID3D12Resource* resource);
44 void recycleConstantOrShaderView(D3D12_CPU_DESCRIPTOR_HANDLE*);
45
46 D3D12_CPU_DESCRIPTOR_HANDLE createSampler(D3D12_FILTER filter,
47 D3D12_TEXTURE_ADDRESS_MODE addressModeU,
48 D3D12_TEXTURE_ADDRESS_MODE addressModeV);
49 void recycleSampler(D3D12_CPU_DESCRIPTOR_HANDLE*);
50
Greg Danielb698ad32020-05-04 10:17:22 -040051 sk_sp<GrD3DPipelineState> findOrCreateCompatiblePipelineState(GrRenderTarget*,
52 const GrProgramInfo&);
53
Greg Daniel02c45902020-03-09 10:58:09 -040054private:
Greg Danielb698ad32020-05-04 10:17:22 -040055#ifdef SK_DEBUG
56#define GR_PIPELINE_STATE_CACHE_STATS
57#endif
58
59 class PipelineStateCache : public ::SkNoncopyable {
60 public:
61 PipelineStateCache(GrD3DGpu* gpu);
62 ~PipelineStateCache();
63
64 sk_sp<GrD3DPipelineState> refPipelineState(GrRenderTarget*, const GrProgramInfo&);
65
66 private:
67 struct Entry;
68
69 struct DescHash {
70 uint32_t operator()(const GrProgramDesc& desc) const {
71 return SkOpts::hash_fn(desc.asKey(), desc.keyLength(), 0);
72 }
73 };
74
75 SkLRUCache<const GrProgramDesc, std::unique_ptr<Entry>, DescHash> fMap;
76
77 GrD3DGpu* fGpu;
78
79#ifdef GR_PIPELINE_STATE_CACHE_STATS
80 int fTotalRequests;
81 int fCacheMisses;
82#endif
83 };
84
Greg Daniel85da3362020-03-09 15:18:35 -040085 GrD3DGpu* fGpu;
Greg Daniel7a5f1fa2020-03-24 14:50:19 -040086
87 SkSTArray<4, std::unique_ptr<GrD3DDirectCommandList>> fAvailableDirectCommandLists;
Greg Danielc31edc02020-04-23 11:03:02 -040088 SkSTArray<4, sk_sp<GrD3DRootSignature>> fRootSignatures;
Jim Van Verth5ce94402020-05-01 14:19:13 -040089
Jim Van Verthafd41132020-05-28 06:44:55 -040090 GrD3DCpuDescriptorManager fCpuDescriptorManager;
Greg Danielb698ad32020-05-04 10:17:22 -040091
92 std::unique_ptr<PipelineStateCache> fPipelineStateCache;
Greg Daniel02c45902020-03-09 10:58:09 -040093};
94
95#endif