blob: 3850af623dc3a7303ca9a628e7efc62e148d7822 [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
11#include "GrGpu.h"
12#include "GrGpuFactory.h"
jvanverth633b3562016-03-23 11:01:22 -070013#include "vk/GrVkBackendContext.h"
Greg Daniel164a9f02016-02-22 09:56:40 -050014#include "GrVkCaps.h"
egdanielbc9b2962016-09-27 08:00:53 -070015#include "GrVkCopyManager.h"
Greg Daniel164a9f02016-02-22 09:56:40 -050016#include "GrVkIndexBuffer.h"
jvanverth6b6ffc42016-06-13 14:28:07 -070017#include "GrVkMemory.h"
Greg Daniel164a9f02016-02-22 09:56:40 -050018#include "GrVkResourceProvider.h"
Greg Daniel6be35232017-03-01 17:01:09 -050019#include "GrVkSemaphore.h"
Greg Daniel164a9f02016-02-22 09:56:40 -050020#include "GrVkVertexBuffer.h"
21#include "GrVkUtil.h"
jvanverthe50f3e72016-03-28 07:03:06 -070022#include "vk/GrVkDefines.h"
Greg Daniel164a9f02016-02-22 09:56:40 -050023
24class GrPipeline;
Greg Daniel164a9f02016-02-22 09:56:40 -050025
26class GrVkBufferImpl;
Greg Daniel164a9f02016-02-22 09:56:40 -050027class GrVkPipeline;
egdaniel22281c12016-03-23 13:49:40 -070028class GrVkPipelineState;
egdaniel066df7c2016-06-08 14:02:27 -070029class GrVkPrimaryCommandBuffer;
Greg Daniel164a9f02016-02-22 09:56:40 -050030class GrVkRenderPass;
egdaniel066df7c2016-06-08 14:02:27 -070031class GrVkSecondaryCommandBuffer;
Greg Daniel164a9f02016-02-22 09:56:40 -050032class GrVkTexture;
33struct GrVkInterface;
34
Ethan Nicholas941e7e22016-12-12 15:33:30 -050035namespace SkSL {
36 class Compiler;
37}
38
Greg Daniel164a9f02016-02-22 09:56:40 -050039class GrVkGpu : public GrGpu {
40public:
jvanverth633b3562016-03-23 11:01:22 -070041 static GrGpu* Create(GrBackendContext backendContext, const GrContextOptions& options,
42 GrContext* context);
Greg Daniel02611d92017-07-25 10:05:01 -040043 static GrGpu* Create(const GrVkBackendContext*, const GrContextOptions& options,
44 GrContext* context);
jvanverth633b3562016-03-23 11:01:22 -070045
Greg Daniel164a9f02016-02-22 09:56:40 -050046 ~GrVkGpu() override;
47
Greg Daniel8606cf82017-05-08 16:17:53 -040048 void disconnect(DisconnectType) override;
49
bungeman6bd52842016-10-27 09:30:08 -070050 const GrVkInterface* vkInterface() const { return fBackendContext->fInterface.get(); }
Greg Daniel164a9f02016-02-22 09:56:40 -050051 const GrVkCaps& vkCaps() const { return *fVkCaps; }
52
53 VkDevice device() const { return fDevice; }
54 VkQueue queue() const { return fQueue; }
55 VkCommandPool cmdPool() const { return fCmdPool; }
56 VkPhysicalDeviceMemoryProperties physicalDeviceMemoryProperties() const {
57 return fPhysDevMemProps;
58 }
59
egdanielbc9b2962016-09-27 08:00:53 -070060 GrVkResourceProvider& resourceProvider() { return fResourceProvider; }
61
62 GrVkPrimaryCommandBuffer* currentCommandBuffer() { return fCurrentCmdBuffer; }
Greg Daniel164a9f02016-02-22 09:56:40 -050063
64 enum SyncQueue {
65 kForce_SyncQueue,
66 kSkip_SyncQueue
67 };
68
Robert Phillipsb0e93a22017-08-29 08:26:54 -040069 bool onGetReadPixelsInfo(GrSurface* srcSurface, GrSurfaceOrigin srcOrigin,
70 int readWidth, int readHeight, size_t rowBytes,
Greg Daniel164a9f02016-02-22 09:56:40 -050071 GrPixelConfig readConfig, DrawPreference*,
72 ReadPixelTempDrawInfo*) override;
73
Robert Phillipsb0e93a22017-08-29 08:26:54 -040074 bool onGetWritePixelsInfo(GrSurface* dstSurface, GrSurfaceOrigin dstOrigin,
75 int width, int height,
Greg Daniel164a9f02016-02-22 09:56:40 -050076 GrPixelConfig srcConfig, DrawPreference*,
77 WritePixelTempDrawInfo*) override;
78
Robert Phillipsb0e93a22017-08-29 08:26:54 -040079 bool onCopySurface(GrSurface* dst, GrSurfaceOrigin dstOrigin,
80 GrSurface* src, GrSurfaceOrigin srcOrigin,
81 const SkIRect& srcRect, const SkIPoint& dstPoint) override;
Greg Daniel164a9f02016-02-22 09:56:40 -050082
Robert Phillipsb0e93a22017-08-29 08:26:54 -040083 void onQueryMultisampleSpecs(GrRenderTarget*, GrSurfaceOrigin, const GrStencilSettings&,
csmartdaltonc25c5d72016-11-01 07:03:59 -070084 int* effectiveSampleCnt, SamplePattern*) override;
cdalton28f45b92016-03-07 13:58:26 -080085
Greg Daniel164a9f02016-02-22 09:56:40 -050086 void xferBarrier(GrRenderTarget*, GrXferBarrierType) override {}
87
88 GrBackendObject createTestingOnlyBackendTexture(void* pixels, int w, int h,
egdaniel0a3a7f72016-06-24 09:22:31 -070089 GrPixelConfig config,
90 bool isRenderTarget) override;
Greg Daniel164a9f02016-02-22 09:56:40 -050091 bool isTestingOnlyBackendTexture(GrBackendObject id) const override;
92 void deleteTestingOnlyBackendTexture(GrBackendObject id, bool abandonTexture) override;
93
94 GrStencilAttachment* createStencilAttachmentForRenderTarget(const GrRenderTarget*,
95 int width,
96 int height) override;
97
Robert Phillips95214472017-08-08 18:00:03 -040098 void clearStencil(GrRenderTarget* target, int clearValue) override;
Greg Daniel164a9f02016-02-22 09:56:40 -050099
Greg Daniel500d58b2017-08-24 15:59:33 -0400100 GrGpuRTCommandBuffer* createCommandBuffer(
Robert Phillips95214472017-08-08 18:00:03 -0400101 GrRenderTarget*, GrSurfaceOrigin,
Greg Daniel500d58b2017-08-24 15:59:33 -0400102 const GrGpuRTCommandBuffer::LoadAndStoreInfo&,
103 const GrGpuRTCommandBuffer::StencilLoadAndStoreInfo&) override;
104
105 GrGpuTextureCommandBuffer* createCommandBuffer(GrTexture*, GrSurfaceOrigin) override;
egdaniel066df7c2016-06-08 14:02:27 -0700106
Greg Daniel164a9f02016-02-22 09:56:40 -0500107 void addMemoryBarrier(VkPipelineStageFlags srcStageMask,
108 VkPipelineStageFlags dstStageMask,
109 bool byRegion,
110 VkMemoryBarrier* barrier) const;
111 void addBufferMemoryBarrier(VkPipelineStageFlags srcStageMask,
112 VkPipelineStageFlags dstStageMask,
113 bool byRegion,
114 VkBufferMemoryBarrier* barrier) const;
115 void addImageMemoryBarrier(VkPipelineStageFlags srcStageMask,
116 VkPipelineStageFlags dstStageMask,
117 bool byRegion,
118 VkImageMemoryBarrier* barrier) const;
halcanary9d524f22016-03-29 09:03:52 -0700119
ethannicholasb3058bd2016-07-01 08:22:01 -0700120 SkSL::Compiler* shaderCompiler() const {
121 return fCompiler;
122 }
Greg Daniel164a9f02016-02-22 09:56:40 -0500123
Robert Phillipsb0e93a22017-08-29 08:26:54 -0400124 void onResolveRenderTarget(GrRenderTarget* target, GrSurfaceOrigin origin) override {
125 this->internalResolveRenderTarget(target, origin, true);
Greg Daniel69d49922017-02-23 09:44:02 -0500126 }
egdaniel66933552016-08-24 07:22:19 -0700127
Greg Daniel22bc8652017-03-22 15:45:43 -0400128 void submitSecondaryCommandBuffer(const SkTArray<GrVkSecondaryCommandBuffer*>&,
egdaniel9cb63402016-06-23 08:37:05 -0700129 const GrVkRenderPass*,
Robert Phillips8c326e92017-08-10 13:50:17 -0400130 const VkClearValue* colorClear,
Robert Phillipsb0e93a22017-08-29 08:26:54 -0400131 GrVkRenderTarget*, GrSurfaceOrigin,
egdaniel9cb63402016-06-23 08:37:05 -0700132 const SkIRect& bounds);
egdaniel066df7c2016-06-08 14:02:27 -0700133
Greg Daniel6be35232017-03-01 17:01:09 -0500134 GrFence SK_WARN_UNUSED_RESULT insertFence() override;
135 bool waitFence(GrFence, uint64_t timeout) override;
jvanverth84741b32016-09-30 08:39:02 -0700136 void deleteFence(GrFence) const override;
137
Greg Daniela5cb7812017-06-16 09:45:32 -0400138 sk_sp<GrSemaphore> SK_WARN_UNUSED_RESULT makeSemaphore(bool isOwned) override;
139 sk_sp<GrSemaphore> wrapBackendSemaphore(const GrBackendSemaphore& semaphore,
140 GrWrapOwnership ownership) override;
Brian Osmandc87c952017-04-28 13:57:38 -0400141 void insertSemaphore(sk_sp<GrSemaphore> semaphore, bool flush) override;
Greg Daniel6be35232017-03-01 17:01:09 -0500142 void waitSemaphore(sk_sp<GrSemaphore> semaphore) override;
143
Brian Osman13dddce2017-05-09 13:19:50 -0400144 sk_sp<GrSemaphore> prepareTextureForCrossContextUsage(GrTexture*) override;
145
Robert Phillipsb0e93a22017-08-29 08:26:54 -0400146 void generateMipmap(GrVkTexture* tex, GrSurfaceOrigin texOrigin);
jvanverth62340062016-04-26 08:01:44 -0700147
Greg Daniel6888c0d2017-08-25 11:55:50 -0400148 void copyBuffer(GrVkBuffer* srcBuffer, GrVkBuffer* dstBuffer, VkDeviceSize srcOffset,
149 VkDeviceSize dstOffset, VkDeviceSize size);
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,
Greg Danielc2dd5ed2017-05-05 13:49:11 -0400164 kTexelBuffer_Heap,
jvanverth6b6ffc42016-06-13 14:28:07 -0700165 kCopyReadBuffer_Heap,
166 kCopyWriteBuffer_Heap,
167
168 kLastHeap = kCopyWriteBuffer_Heap
169 };
170 static const int kHeapCount = kLastHeap + 1;
171
Ben Wagner145dbcd2016-11-03 14:40:50 -0400172 GrVkHeap* getHeap(Heap heap) const { return fHeaps[heap].get(); }
jvanverth6b6ffc42016-06-13 14:28:07 -0700173
Greg Daniel164a9f02016-02-22 09:56:40 -0500174private:
jvanverth633b3562016-03-23 11:01:22 -0700175 GrVkGpu(GrContext* context, const GrContextOptions& options,
176 const GrVkBackendContext* backendContext);
177
egdanielcfcd1812016-03-22 07:16:10 -0700178 void onResetContext(uint32_t resetBits) override {}
Greg Daniel164a9f02016-02-22 09:56:40 -0500179
Greg Daniel8606cf82017-05-08 16:17:53 -0400180 void destroyResources();
181
Robert Phillips67d52cf2017-06-05 13:38:13 -0400182 sk_sp<GrTexture> onCreateTexture(const GrSurfaceDesc& desc, SkBudgeted budgeted,
Robert Phillips590533f2017-07-11 14:22:35 -0400183 const GrMipLevel texels[], int mipLevelCount) override;
Greg Daniel164a9f02016-02-22 09:56:40 -0500184
Robert Phillipsb0e93a22017-08-29 08:26:54 -0400185 sk_sp<GrTexture> onWrapBackendTexture(const GrBackendTexture&, GrWrapOwnership) override;
Brian Salomond17f6582017-07-19 18:28:58 -0400186 sk_sp<GrTexture> onWrapRenderableBackendTexture(const GrBackendTexture&,
Brian Salomond17f6582017-07-19 18:28:58 -0400187 int sampleCnt,
188 GrWrapOwnership) override;
Robert Phillipsb0e93a22017-08-29 08:26:54 -0400189 sk_sp<GrRenderTarget> onWrapBackendRenderTarget(const GrBackendRenderTarget&) override;
Greg Daniel7ef28f32017-04-20 16:41:55 +0000190
191 sk_sp<GrRenderTarget> onWrapBackendTextureAsRenderTarget(const GrBackendTexture&,
Greg Daniel7ef28f32017-04-20 16:41:55 +0000192 int sampleCnt) override;
Greg Daniel164a9f02016-02-22 09:56:40 -0500193
cdalton1bf3e712016-04-19 10:00:02 -0700194 GrBuffer* onCreateBuffer(size_t size, GrBufferType type, GrAccessPattern,
195 const void* data) override;
Greg Daniel164a9f02016-02-22 09:56:40 -0500196
csmartdaltone0d36292016-07-29 08:14:20 -0700197 gr_instanced::InstancedRendering* onCreateInstancedRendering() override { return nullptr; }
198
Robert Phillipsb0e93a22017-08-29 08:26:54 -0400199 bool onReadPixels(GrSurface* surface, GrSurfaceOrigin,
Greg Daniel164a9f02016-02-22 09:56:40 -0500200 int left, int top, int width, int height,
201 GrPixelConfig,
202 void* buffer,
203 size_t rowBytes) override;
204
Robert Phillipsb0e93a22017-08-29 08:26:54 -0400205 bool onWritePixels(GrSurface* surface, GrSurfaceOrigin,
Greg Daniel164a9f02016-02-22 09:56:40 -0500206 int left, int top, int width, int height,
Robert Phillips590533f2017-07-11 14:22:35 -0400207 GrPixelConfig config, const GrMipLevel texels[], int mipLevelCount) override;
Greg Daniel164a9f02016-02-22 09:56:40 -0500208
Jim Van Verth2e5eaf02017-06-21 15:55:46 -0400209 bool onTransferPixels(GrTexture*,
Greg Daniel164a9f02016-02-22 09:56:40 -0500210 int left, int top, int width, int height,
cdalton397536c2016-03-25 12:15:03 -0700211 GrPixelConfig config, GrBuffer* transferBuffer,
Jim Van Verth2e5eaf02017-06-21 15:55:46 -0400212 size_t offset, size_t rowBytes) override;
Greg Daniel164a9f02016-02-22 09:56:40 -0500213
Greg Daniel51316782017-08-02 15:10:09 +0000214 void onFinishFlush(bool insertedSemaphores) override;
215
Greg Daniel164a9f02016-02-22 09:56:40 -0500216 // Ends and submits the current command buffer to the queue and then creates a new command
halcanary9d524f22016-03-29 09:03:52 -0700217 // buffer and begins it. If sync is set to kForce_SyncQueue, the function will wait for all
Greg Daniela5cb7812017-06-16 09:45:32 -0400218 // work in the queue to finish before returning. If this GrVkGpu object has any semaphores in
219 // fSemaphoreToSignal, we will add those signal semaphores to the submission of this command
220 // buffer. If this GrVkGpu object has any semaphores in fSemaphoresToWaitOn, we will add those
221 // wait semaphores to the submission of this command buffer.
222 void submitCommandBuffer(SyncQueue sync);
Greg Daniel164a9f02016-02-22 09:56:40 -0500223
Robert Phillipsb0e93a22017-08-29 08:26:54 -0400224 void internalResolveRenderTarget(GrRenderTarget*, GrSurfaceOrigin origin, bool requiresSubmit);
Greg Daniel69d49922017-02-23 09:44:02 -0500225
Robert Phillipsb0e93a22017-08-29 08:26:54 -0400226 void copySurfaceAsCopyImage(GrSurface* dst, GrSurfaceOrigin dstOrigin,
227 GrSurface* src, GrSurfaceOrigin srcOrigin,
228 GrVkImage* dstImage, GrVkImage* srcImage,
Greg Daniel164a9f02016-02-22 09:56:40 -0500229 const SkIRect& srcRect,
230 const SkIPoint& dstPoint);
231
Robert Phillipsb0e93a22017-08-29 08:26:54 -0400232 void copySurfaceAsBlit(GrSurface* dst, GrSurfaceOrigin dstOrigin,
233 GrSurface* src, GrSurfaceOrigin srcOrigin,
234 GrVkImage* dstImage, GrVkImage* srcImage,
egdaniel17b89252016-04-05 07:23:38 -0700235 const SkIRect& srcRect,
236 const SkIPoint& dstPoint);
237
Robert Phillipsb0e93a22017-08-29 08:26:54 -0400238 void copySurfaceAsResolve(GrSurface* dst, GrSurfaceOrigin dstOrigin,
239 GrSurface* src, GrSurfaceOrigin srcOrigin,
egdaniel4bcd62e2016-08-31 07:37:31 -0700240 const SkIRect& srcRect,
241 const SkIPoint& dstPoint);
242
jvanverth900bd4a2016-04-29 13:53:12 -0700243 // helpers for onCreateTexture and writeTexturePixels
Robert Phillipsb0e93a22017-08-29 08:26:54 -0400244 bool uploadTexDataLinear(GrVkTexture* tex, GrSurfaceOrigin texOrigin,
jvanverth900bd4a2016-04-29 13:53:12 -0700245 int left, int top, int width, int height,
246 GrPixelConfig dataConfig,
247 const void* data,
248 size_t rowBytes);
Robert Phillipsb0e93a22017-08-29 08:26:54 -0400249 bool uploadTexDataOptimal(GrVkTexture* tex, GrSurfaceOrigin texOrigin,
jvanverth900bd4a2016-04-29 13:53:12 -0700250 int left, int top, int width, int height,
251 GrPixelConfig dataConfig,
Robert Phillips590533f2017-07-11 14:22:35 -0400252 const GrMipLevel texels[], int mipLevelCount);
Greg Daniel164a9f02016-02-22 09:56:40 -0500253
Robert Phillipsb0e93a22017-08-29 08:26:54 -0400254 void resolveImage(GrSurface* dst, GrSurfaceOrigin dstOrigin,
255 GrVkRenderTarget* src, GrSurfaceOrigin srcOrigin,
256 const SkIRect& srcRect, const SkIPoint& dstPoint);
egdaniel4bcd62e2016-08-31 07:37:31 -0700257
Hal Canary144caf52016-11-07 17:57:18 -0500258 sk_sp<const GrVkBackendContext> fBackendContext;
259 sk_sp<GrVkCaps> fVkCaps;
jvanverth633b3562016-03-23 11:01:22 -0700260
261 // These Vulkan objects are provided by the client, and also stored in fBackendContext.
262 // They're copied here for convenient access.
Greg Daniel6be35232017-03-01 17:01:09 -0500263 VkDevice fDevice;
264 VkQueue fQueue; // Must be Graphics queue
jvanverth633b3562016-03-23 11:01:22 -0700265
266 // Created by GrVkGpu
Greg Daniel6be35232017-03-01 17:01:09 -0500267 GrVkResourceProvider fResourceProvider;
268 VkCommandPool fCmdPool;
Greg Daniel164a9f02016-02-22 09:56:40 -0500269
Greg Daniel6be35232017-03-01 17:01:09 -0500270 GrVkPrimaryCommandBuffer* fCurrentCmdBuffer;
jvanverth6b6ffc42016-06-13 14:28:07 -0700271
Greg Daniel6be35232017-03-01 17:01:09 -0500272 SkSTArray<1, const GrVkSemaphore::Resource*> fSemaphoresToWaitOn;
Greg Daniela5cb7812017-06-16 09:45:32 -0400273 SkSTArray<1, const GrVkSemaphore::Resource*> fSemaphoresToSignal;
Greg Daniel6be35232017-03-01 17:01:09 -0500274
275 VkPhysicalDeviceMemoryProperties fPhysDevMemProps;
276
277 std::unique_ptr<GrVkHeap> fHeaps[kHeapCount];
278
279 GrVkCopyManager fCopyManager;
egdanielbc9b2962016-09-27 08:00:53 -0700280
egdaniel735109c2016-07-27 08:03:57 -0700281#ifdef SK_ENABLE_VK_LAYERS
jvanverthd2497f32016-03-18 12:39:05 -0700282 // For reporting validation layer errors
jvanverth633b3562016-03-23 11:01:22 -0700283 VkDebugReportCallbackEXT fCallback;
jvanverthd2497f32016-03-18 12:39:05 -0700284#endif
285
Ethan Nicholas941e7e22016-12-12 15:33:30 -0500286 // compiler used for compiling sksl into spirv. We only want to create the compiler once since
287 // there is significant overhead to the first compile of any compiler.
ethannicholasb3058bd2016-07-01 08:22:01 -0700288 SkSL::Compiler* fCompiler;
Greg Daniel164a9f02016-02-22 09:56:40 -0500289
Greg Daniel8606cf82017-05-08 16:17:53 -0400290 // We need a bool to track whether or not we've already disconnected all the gpu resources from
291 // vulkan context.
292 bool fDisconnected;
293
Greg Daniel164a9f02016-02-22 09:56:40 -0500294 typedef GrGpu INHERITED;
295};
296
297#endif