blob: 77eb24215c1ebad48400ef8c6644bcd2f46f990c [file] [log] [blame]
Greg Daniel164a9f02016-02-22 09:56:40 -05001/*
2 * Copyright 2015 Google Inc.
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 GrVkGpu_DEFINED
9#define GrVkGpu_DEFINED
10
ethannicholasb3058bd2016-07-01 08:22:01 -070011#define USE_SKSL 1
12
Greg Daniel164a9f02016-02-22 09:56:40 -050013#include "GrGpu.h"
14#include "GrGpuFactory.h"
jvanverth633b3562016-03-23 11:01:22 -070015#include "vk/GrVkBackendContext.h"
Greg Daniel164a9f02016-02-22 09:56:40 -050016#include "GrVkCaps.h"
egdanielbc9b2962016-09-27 08:00:53 -070017#include "GrVkCopyManager.h"
Greg Daniel164a9f02016-02-22 09:56:40 -050018#include "GrVkIndexBuffer.h"
jvanverth6b6ffc42016-06-13 14:28:07 -070019#include "GrVkMemory.h"
Greg Daniel164a9f02016-02-22 09:56:40 -050020#include "GrVkResourceProvider.h"
21#include "GrVkVertexBuffer.h"
22#include "GrVkUtil.h"
23
ethannicholasb3058bd2016-07-01 08:22:01 -070024#if USE_SKSL
25namespace SkSL {
26 class Compiler;
27}
28#else
Greg Daniel164a9f02016-02-22 09:56:40 -050029#include "shaderc/shaderc.h"
ethannicholasb3058bd2016-07-01 08:22:01 -070030#endif
31
jvanverthe50f3e72016-03-28 07:03:06 -070032#include "vk/GrVkDefines.h"
Greg Daniel164a9f02016-02-22 09:56:40 -050033
34class GrPipeline;
egdaniel0e1853c2016-03-17 11:35:45 -070035class GrNonInstancedMesh;
Greg Daniel164a9f02016-02-22 09:56:40 -050036
37class GrVkBufferImpl;
Greg Daniel164a9f02016-02-22 09:56:40 -050038class GrVkPipeline;
egdaniel22281c12016-03-23 13:49:40 -070039class GrVkPipelineState;
egdaniel066df7c2016-06-08 14:02:27 -070040class GrVkPrimaryCommandBuffer;
Greg Daniel164a9f02016-02-22 09:56:40 -050041class GrVkRenderPass;
egdaniel066df7c2016-06-08 14:02:27 -070042class GrVkSecondaryCommandBuffer;
Greg Daniel164a9f02016-02-22 09:56:40 -050043class GrVkTexture;
44struct GrVkInterface;
45
46class GrVkGpu : public GrGpu {
47public:
jvanverth633b3562016-03-23 11:01:22 -070048 static GrGpu* Create(GrBackendContext backendContext, const GrContextOptions& options,
49 GrContext* context);
50
Greg Daniel164a9f02016-02-22 09:56:40 -050051 ~GrVkGpu() override;
52
jvanverth633b3562016-03-23 11:01:22 -070053 const GrVkInterface* vkInterface() const { return fBackendContext->fInterface; }
Greg Daniel164a9f02016-02-22 09:56:40 -050054 const GrVkCaps& vkCaps() const { return *fVkCaps; }
55
56 VkDevice device() const { return fDevice; }
57 VkQueue queue() const { return fQueue; }
58 VkCommandPool cmdPool() const { return fCmdPool; }
59 VkPhysicalDeviceMemoryProperties physicalDeviceMemoryProperties() const {
60 return fPhysDevMemProps;
61 }
62
egdanielbc9b2962016-09-27 08:00:53 -070063 GrVkResourceProvider& resourceProvider() { return fResourceProvider; }
64
65 GrVkPrimaryCommandBuffer* currentCommandBuffer() { return fCurrentCmdBuffer; }
Greg Daniel164a9f02016-02-22 09:56:40 -050066
67 enum SyncQueue {
68 kForce_SyncQueue,
69 kSkip_SyncQueue
70 };
71
72 bool onGetReadPixelsInfo(GrSurface* srcSurface, int readWidth, int readHeight, size_t rowBytes,
73 GrPixelConfig readConfig, DrawPreference*,
74 ReadPixelTempDrawInfo*) override;
75
76 bool onGetWritePixelsInfo(GrSurface* dstSurface, int width, int height,
77 GrPixelConfig srcConfig, DrawPreference*,
78 WritePixelTempDrawInfo*) override;
79
Greg Daniel164a9f02016-02-22 09:56:40 -050080 bool onCopySurface(GrSurface* dst,
81 GrSurface* src,
82 const SkIRect& srcRect,
83 const SkIPoint& dstPoint) override;
84
csmartdalton0d28e572016-07-06 09:59:43 -070085 void onGetMultisampleSpecs(GrRenderTarget* rt, const GrStencilSettings&,
86 int* effectiveSampleCnt, SamplePattern*) override;
cdalton28f45b92016-03-07 13:58:26 -080087
egdaniel4bcd62e2016-08-31 07:37:31 -070088 bool initDescForDstCopy(const GrRenderTarget* src, GrSurfaceDesc* desc) const override;
Greg Daniel164a9f02016-02-22 09:56:40 -050089
90 void xferBarrier(GrRenderTarget*, GrXferBarrierType) override {}
91
92 GrBackendObject createTestingOnlyBackendTexture(void* pixels, int w, int h,
egdaniel0a3a7f72016-06-24 09:22:31 -070093 GrPixelConfig config,
94 bool isRenderTarget) override;
Greg Daniel164a9f02016-02-22 09:56:40 -050095 bool isTestingOnlyBackendTexture(GrBackendObject id) const override;
96 void deleteTestingOnlyBackendTexture(GrBackendObject id, bool abandonTexture) override;
97
98 GrStencilAttachment* createStencilAttachmentForRenderTarget(const GrRenderTarget*,
99 int width,
100 int height) override;
101
egdaniel3d5d9ac2016-03-01 12:56:15 -0800102 void clearStencil(GrRenderTarget* target) override;
Greg Daniel164a9f02016-02-22 09:56:40 -0500103
egdaniel9cb63402016-06-23 08:37:05 -0700104 GrGpuCommandBuffer* createCommandBuffer(
105 GrRenderTarget* target,
106 const GrGpuCommandBuffer::LoadAndStoreInfo& colorInfo,
107 const GrGpuCommandBuffer::LoadAndStoreInfo& stencilInfo) override;
egdaniel066df7c2016-06-08 14:02:27 -0700108
egdaniele2678932016-03-24 09:50:58 -0700109 void drawDebugWireRect(GrRenderTarget*, const SkIRect&, GrColor) override {}
Greg Daniel164a9f02016-02-22 09:56:40 -0500110
111 void addMemoryBarrier(VkPipelineStageFlags srcStageMask,
112 VkPipelineStageFlags dstStageMask,
113 bool byRegion,
114 VkMemoryBarrier* barrier) const;
115 void addBufferMemoryBarrier(VkPipelineStageFlags srcStageMask,
116 VkPipelineStageFlags dstStageMask,
117 bool byRegion,
118 VkBufferMemoryBarrier* barrier) const;
119 void addImageMemoryBarrier(VkPipelineStageFlags srcStageMask,
120 VkPipelineStageFlags dstStageMask,
121 bool byRegion,
122 VkImageMemoryBarrier* barrier) const;
halcanary9d524f22016-03-29 09:03:52 -0700123
ethannicholasb3058bd2016-07-01 08:22:01 -0700124#if USE_SKSL
125 SkSL::Compiler* shaderCompiler() const {
126 return fCompiler;
127 }
128#else
Greg Daniel164a9f02016-02-22 09:56:40 -0500129 shaderc_compiler_t shadercCompiler() const {
130 return fCompiler;
131 }
ethannicholasb3058bd2016-07-01 08:22:01 -0700132#endif
Greg Daniel164a9f02016-02-22 09:56:40 -0500133
egdaniel66933552016-08-24 07:22:19 -0700134 void onResolveRenderTarget(GrRenderTarget* target) override;
135
jvanverth7ec92412016-07-06 09:24:57 -0700136 void submitSecondaryCommandBuffer(GrVkSecondaryCommandBuffer*,
egdaniel9cb63402016-06-23 08:37:05 -0700137 const GrVkRenderPass*,
138 const VkClearValue*,
139 GrVkRenderTarget*,
140 const SkIRect& bounds);
egdaniel066df7c2016-06-08 14:02:27 -0700141
Robert Phillipsf2361d22016-10-25 14:20:06 -0400142 void finishOpList() override;
Greg Daniel164a9f02016-02-22 09:56:40 -0500143
jvanverth84741b32016-09-30 08:39:02 -0700144 GrFence SK_WARN_UNUSED_RESULT insertFence() const override;
145 bool waitFence(GrFence, uint64_t timeout) const override;
146 void deleteFence(GrFence) const override;
147
egdaniel50ead532016-07-13 14:23:26 -0700148 void generateMipmap(GrVkTexture* tex);
jvanverth62340062016-04-26 08:01:44 -0700149
jvanverthdb379092016-07-07 11:18:46 -0700150 bool updateBuffer(GrVkBuffer* buffer, const void* src, VkDeviceSize offset, VkDeviceSize size);
jvanvertha584de92016-06-30 09:10:52 -0700151
jvanverth6b6ffc42016-06-13 14:28:07 -0700152 // Heaps
153 enum Heap {
154 kLinearImage_Heap = 0,
155 // We separate out small (i.e., <= 16K) images to reduce fragmentation
156 // in the main heap.
157 kOptimalImage_Heap,
158 kSmallOptimalImage_Heap,
egdaniel66933552016-08-24 07:22:19 -0700159 // We have separate vertex and image heaps, because it's possible that
jvanverth6b6ffc42016-06-13 14:28:07 -0700160 // a given Vulkan driver may allocate them separately.
161 kVertexBuffer_Heap,
162 kIndexBuffer_Heap,
163 kUniformBuffer_Heap,
164 kCopyReadBuffer_Heap,
165 kCopyWriteBuffer_Heap,
166
167 kLastHeap = kCopyWriteBuffer_Heap
168 };
169 static const int kHeapCount = kLastHeap + 1;
170
171 GrVkHeap* getHeap(Heap heap) const { return fHeaps[heap]; }
172
Greg Daniel164a9f02016-02-22 09:56:40 -0500173private:
jvanverth633b3562016-03-23 11:01:22 -0700174 GrVkGpu(GrContext* context, const GrContextOptions& options,
175 const GrVkBackendContext* backendContext);
176
egdanielcfcd1812016-03-22 07:16:10 -0700177 void onResetContext(uint32_t resetBits) override {}
Greg Daniel164a9f02016-02-22 09:56:40 -0500178
kkinnunen2e6055b2016-04-22 01:48:29 -0700179 GrTexture* onCreateTexture(const GrSurfaceDesc& desc, SkBudgeted budgeted,
bsalomona1e6b3b2016-03-02 10:58:23 -0800180 const SkTArray<GrMipLevel>&) override;
Greg Daniel164a9f02016-02-22 09:56:40 -0500181
kkinnunen2e6055b2016-04-22 01:48:29 -0700182 GrTexture* onCreateCompressedTexture(const GrSurfaceDesc& desc, SkBudgeted,
egdaniele2678932016-03-24 09:50:58 -0700183 const SkTArray<GrMipLevel>&) override { return NULL; }
Greg Daniel164a9f02016-02-22 09:56:40 -0500184
185 GrTexture* onWrapBackendTexture(const GrBackendTextureDesc&, GrWrapOwnership) override;
186
187 GrRenderTarget* onWrapBackendRenderTarget(const GrBackendRenderTargetDesc&,
188 GrWrapOwnership) override;
kkinnunen49c4c222016-04-01 04:50:37 -0700189 GrRenderTarget* onWrapBackendTextureAsRenderTarget(const GrBackendTextureDesc&) override { return NULL; }
Greg Daniel164a9f02016-02-22 09:56:40 -0500190
cdalton1bf3e712016-04-19 10:00:02 -0700191 GrBuffer* onCreateBuffer(size_t size, GrBufferType type, GrAccessPattern,
192 const void* data) override;
Greg Daniel164a9f02016-02-22 09:56:40 -0500193
csmartdaltone0d36292016-07-29 08:14:20 -0700194 gr_instanced::InstancedRendering* onCreateInstancedRendering() override { return nullptr; }
195
Greg Daniel164a9f02016-02-22 09:56:40 -0500196 bool onReadPixels(GrSurface* surface,
197 int left, int top, int width, int height,
198 GrPixelConfig,
199 void* buffer,
200 size_t rowBytes) override;
201
202 bool onWritePixels(GrSurface* surface,
203 int left, int top, int width, int height,
bsalomona1e6b3b2016-03-02 10:58:23 -0800204 GrPixelConfig config, const SkTArray<GrMipLevel>&) override;
Greg Daniel164a9f02016-02-22 09:56:40 -0500205
jvanverthc3d706f2016-04-20 10:33:27 -0700206 bool onTransferPixels(GrSurface*,
Greg Daniel164a9f02016-02-22 09:56:40 -0500207 int left, int top, int width, int height,
cdalton397536c2016-03-25 12:15:03 -0700208 GrPixelConfig config, GrBuffer* transferBuffer,
jvanverthc3d706f2016-04-20 10:33:27 -0700209 size_t offset, size_t rowBytes) override { return false; }
Greg Daniel164a9f02016-02-22 09:56:40 -0500210
Greg Daniel164a9f02016-02-22 09:56:40 -0500211 // Ends and submits the current command buffer to the queue and then creates a new command
halcanary9d524f22016-03-29 09:03:52 -0700212 // buffer and begins it. If sync is set to kForce_SyncQueue, the function will wait for all
Greg Daniel164a9f02016-02-22 09:56:40 -0500213 // work in the queue to finish before returning.
214 void submitCommandBuffer(SyncQueue sync);
215
216 void copySurfaceAsCopyImage(GrSurface* dst,
217 GrSurface* src,
egdaniel17b89252016-04-05 07:23:38 -0700218 GrVkImage* dstImage,
219 GrVkImage* srcImage,
Greg Daniel164a9f02016-02-22 09:56:40 -0500220 const SkIRect& srcRect,
221 const SkIPoint& dstPoint);
222
egdaniel17b89252016-04-05 07:23:38 -0700223 void copySurfaceAsBlit(GrSurface* dst,
224 GrSurface* src,
225 GrVkImage* dstImage,
226 GrVkImage* srcImage,
227 const SkIRect& srcRect,
228 const SkIPoint& dstPoint);
229
egdaniel4bcd62e2016-08-31 07:37:31 -0700230 void copySurfaceAsResolve(GrSurface* dst,
231 GrSurface* src,
232 const SkIRect& srcRect,
233 const SkIPoint& dstPoint);
234
Greg Daniel164a9f02016-02-22 09:56:40 -0500235 void copySurfaceAsDraw(GrSurface* dst,
236 GrSurface* src,
237 const SkIRect& srcRect,
238 const SkIPoint& dstPoint);
239
jvanverth900bd4a2016-04-29 13:53:12 -0700240 // helpers for onCreateTexture and writeTexturePixels
241 bool uploadTexDataLinear(GrVkTexture* tex,
242 int left, int top, int width, int height,
243 GrPixelConfig dataConfig,
244 const void* data,
245 size_t rowBytes);
246 bool uploadTexDataOptimal(GrVkTexture* tex,
247 int left, int top, int width, int height,
248 GrPixelConfig dataConfig,
249 const SkTArray<GrMipLevel>&);
Greg Daniel164a9f02016-02-22 09:56:40 -0500250
egdaniel4bcd62e2016-08-31 07:37:31 -0700251 void resolveImage(GrVkRenderTarget* dst,
252 GrVkRenderTarget* src,
253 const SkIRect& srcRect,
254 const SkIPoint& dstPoint);
255
jvanverth633b3562016-03-23 11:01:22 -0700256 SkAutoTUnref<const GrVkBackendContext> fBackendContext;
257 SkAutoTUnref<GrVkCaps> fVkCaps;
258
259 // These Vulkan objects are provided by the client, and also stored in fBackendContext.
260 // They're copied here for convenient access.
jvanverth633b3562016-03-23 11:01:22 -0700261 VkDevice fDevice;
262 VkQueue fQueue; // Must be Graphics queue
263
264 // Created by GrVkGpu
265 GrVkResourceProvider fResourceProvider;
266 VkCommandPool fCmdPool;
egdaniel9a6cf802016-06-08 08:22:05 -0700267 GrVkPrimaryCommandBuffer* fCurrentCmdBuffer;
jvanverth633b3562016-03-23 11:01:22 -0700268 VkPhysicalDeviceMemoryProperties fPhysDevMemProps;
Greg Daniel164a9f02016-02-22 09:56:40 -0500269
jvanverth6b6ffc42016-06-13 14:28:07 -0700270 SkAutoTDelete<GrVkHeap> fHeaps[kHeapCount];
271
egdanielbc9b2962016-09-27 08:00:53 -0700272 GrVkCopyManager fCopyManager;
273
egdaniel735109c2016-07-27 08:03:57 -0700274#ifdef SK_ENABLE_VK_LAYERS
jvanverthd2497f32016-03-18 12:39:05 -0700275 // For reporting validation layer errors
jvanverth633b3562016-03-23 11:01:22 -0700276 VkDebugReportCallbackEXT fCallback;
jvanverthd2497f32016-03-18 12:39:05 -0700277#endif
278
ethannicholasb3058bd2016-07-01 08:22:01 -0700279#if USE_SKSL
280 SkSL::Compiler* fCompiler;
281#else
Greg Daniel164a9f02016-02-22 09:56:40 -0500282 // Shaderc compiler used for compiling glsl in spirv. We only want to create the compiler once
283 // since there is significant overhead to the first compile of any compiler.
284 shaderc_compiler_t fCompiler;
ethannicholasb3058bd2016-07-01 08:22:01 -0700285#endif
Greg Daniel164a9f02016-02-22 09:56:40 -0500286
287 typedef GrGpu INHERITED;
288};
289
290#endif