Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(50)

Side by Side Diff: tools/viewer/sk_app/VulkanWindowContext.cpp

Issue 1978573003: Add OpenGL context to Viewer. (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Fix Android stuff Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 1
2 /* 2 /*
3 * Copyright 2015 Google Inc. 3 * Copyright 2015 Google Inc.
4 * 4 *
5 * Use of this source code is governed by a BSD-style license that can be 5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file. 6 * found in the LICENSE file.
7 */ 7 */
8 8
9 #include "GrContext.h" 9 #include "GrContext.h"
10 #include "SkSurface.h" 10 #include "SkSurface.h"
11 #include "VulkanWindowContext.h" 11 #include "VulkanWindowContext.h"
12 12
13 #include "vk/GrVkInterface.h" 13 #include "vk/GrVkInterface.h"
14 #include "vk/GrVkUtil.h" 14 #include "vk/GrVkUtil.h"
15 #include "vk/GrVkTypes.h" 15 #include "vk/GrVkTypes.h"
16 16
17 #ifdef VK_USE_PLATFORM_WIN32_KHR 17 #ifdef VK_USE_PLATFORM_WIN32_KHR
18 // windows wants to define this as CreateSemaphoreA or CreateSemaphoreW 18 // windows wants to define this as CreateSemaphoreA or CreateSemaphoreW
19 #undef CreateSemaphore 19 #undef CreateSemaphore
20 #endif 20 #endif
21 21
22 #define GET_PROC(F) f ## F = (PFN_vk ## F) vkGetInstanceProcAddr(instance, "vk" #F) 22 #define GET_PROC(F) f ## F = (PFN_vk ## F) vkGetInstanceProcAddr(instance, "vk" #F)
23 #define GET_DEV_PROC(F) f ## F = (PFN_vk ## F) vkGetDeviceProcAddr(device, "vk" #F) 23 #define GET_DEV_PROC(F) f ## F = (PFN_vk ## F) vkGetDeviceProcAddr(device, "vk" #F)
24 24
25 namespace sk_app { 25 namespace sk_app {
26 26
27 VulkanWindowContext::VulkanWindowContext(void* platformData, const DisplayParams & params) 27 VulkanWindowContext::VulkanWindowContext(void* platformData, const DisplayParams & params)
28 : fSurface(VK_NULL_HANDLE) 28 : WindowContext()
29 , fSurface(VK_NULL_HANDLE)
29 , fSwapchain(VK_NULL_HANDLE) 30 , fSwapchain(VK_NULL_HANDLE)
31 , fImages(nullptr)
32 , fImageLayouts(nullptr)
33 , fSurfaces(nullptr)
30 , fCommandPool(VK_NULL_HANDLE) 34 , fCommandPool(VK_NULL_HANDLE)
31 , fBackbuffers(nullptr) { 35 , fBackbuffers(nullptr) {
32 36
33 // any config code here (particularly for msaa)? 37 // any config code here (particularly for msaa)?
34 38
35 this->initializeContext(platformData, params); 39 this->initializeContext(platformData, params);
36 } 40 }
37 41
38 void VulkanWindowContext::initializeContext(void* platformData, const DisplayPar ams& params) { 42 void VulkanWindowContext::initializeContext(void* platformData, const DisplayPar ams& params) {
39 43
(...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after
262 info.fImageTiling = VK_IMAGE_TILING_OPTIMAL; 266 info.fImageTiling = VK_IMAGE_TILING_OPTIMAL;
263 info.fFormat = format; 267 info.fFormat = format;
264 info.fLevelCount = 1; 268 info.fLevelCount = 1;
265 desc.fWidth = fWidth; 269 desc.fWidth = fWidth;
266 desc.fHeight = fHeight; 270 desc.fHeight = fHeight;
267 desc.fConfig = fPixelConfig; 271 desc.fConfig = fPixelConfig;
268 desc.fOrigin = kTopLeft_GrSurfaceOrigin; 272 desc.fOrigin = kTopLeft_GrSurfaceOrigin;
269 desc.fSampleCnt = 0; 273 desc.fSampleCnt = 0;
270 desc.fStencilBits = 0; 274 desc.fStencilBits = 0;
271 desc.fRenderTargetHandle = (GrBackendObject) &info; 275 desc.fRenderTargetHandle = (GrBackendObject) &info;
276 // TODO: base this on fSurfaceProps
272 SkSurfaceProps props(GrPixelConfigIsSRGB(fPixelConfig) 277 SkSurfaceProps props(GrPixelConfigIsSRGB(fPixelConfig)
273 ? SkSurfaceProps::kGammaCorrect_Flag : 0, 278 ? SkSurfaceProps::kGammaCorrect_Flag : 0,
274 kUnknown_SkPixelGeometry); 279 kUnknown_SkPixelGeometry);
275 fSurfaces[i] = SkSurface::MakeFromBackendRenderTarget(fContext, desc, &p rops); 280 fSurfaces[i] = SkSurface::MakeFromBackendRenderTarget(fContext, desc, &p rops);
276 } 281 }
277 282
278 // create the command pool for the command buffers 283 // create the command pool for the command buffers
279 if (VK_NULL_HANDLE == fCommandPool) { 284 if (VK_NULL_HANDLE == fCommandPool) {
280 VkCommandPoolCreateInfo commandPoolInfo; 285 VkCommandPoolCreateInfo commandPoolInfo;
281 memset(&commandPoolInfo, 0, sizeof(VkCommandPoolCreateInfo)); 286 memset(&commandPoolInfo, 0, sizeof(VkCommandPoolCreateInfo));
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after
391 if (VK_NULL_HANDLE != fSwapchain) { 396 if (VK_NULL_HANDLE != fSwapchain) {
392 fDestroySwapchainKHR(fBackendContext->fDevice, fSwapchain, nullptr); 397 fDestroySwapchainKHR(fBackendContext->fDevice, fSwapchain, nullptr);
393 fSwapchain = VK_NULL_HANDLE; 398 fSwapchain = VK_NULL_HANDLE;
394 } 399 }
395 400
396 if (VK_NULL_HANDLE != fSurface) { 401 if (VK_NULL_HANDLE != fSurface) {
397 fDestroySurfaceKHR(fBackendContext->fInstance, fSurface, nullptr); 402 fDestroySurfaceKHR(fBackendContext->fInstance, fSurface, nullptr);
398 fSurface = VK_NULL_HANDLE; 403 fSurface = VK_NULL_HANDLE;
399 } 404 }
400 405
401 delete fContext; 406 fContext->abandonContext();
407 fContext->unref();
402 408
403 fBackendContext.reset(nullptr); 409 fBackendContext.reset(nullptr);
404 } 410 }
405 411
406 VulkanWindowContext::BackbufferInfo* VulkanWindowContext::getAvailableBackbuffer () { 412 VulkanWindowContext::BackbufferInfo* VulkanWindowContext::getAvailableBackbuffer () {
407 SkASSERT(fBackbuffers); 413 SkASSERT(fBackbuffers);
408 414
409 ++fCurrentBackbufferIndex; 415 ++fCurrentBackbufferIndex;
410 if (fCurrentBackbufferIndex > fImageCount) { 416 if (fCurrentBackbufferIndex > fImageCount) {
411 fCurrentBackbufferIndex = 0; 417 fCurrentBackbufferIndex = 0;
412 } 418 }
413 419
414 BackbufferInfo* backbuffer = fBackbuffers + fCurrentBackbufferIndex; 420 BackbufferInfo* backbuffer = fBackbuffers + fCurrentBackbufferIndex;
415 421
416 GR_VK_CALL_ERRCHECK(fBackendContext->fInterface, 422 GR_VK_CALL_ERRCHECK(fBackendContext->fInterface,
417 WaitForFences(fBackendContext->fDevice, 2, backbuffer->f UsageFences, 423 WaitForFences(fBackendContext->fDevice, 2, backbuffer->f UsageFences,
418 true, UINT64_MAX)); 424 true, UINT64_MAX));
419 return backbuffer; 425 return backbuffer;
420 } 426 }
421 427
422 SkSurface* VulkanWindowContext::getBackbufferSurface() { 428 sk_sp<SkSurface> VulkanWindowContext::getBackbufferSurface() {
423 BackbufferInfo* backbuffer = this->getAvailableBackbuffer(); 429 BackbufferInfo* backbuffer = this->getAvailableBackbuffer();
424 SkASSERT(backbuffer); 430 SkASSERT(backbuffer);
425 431
426 // reset the fence 432 // reset the fence
427 GR_VK_CALL_ERRCHECK(fBackendContext->fInterface, 433 GR_VK_CALL_ERRCHECK(fBackendContext->fInterface,
428 ResetFences(fBackendContext->fDevice, 2, backbuffer->fUs ageFences)); 434 ResetFences(fBackendContext->fDevice, 2, backbuffer->fUs ageFences));
429 // semaphores should be in unsignaled state 435 // semaphores should be in unsignaled state
430 436
431 // acquire the image 437 // acquire the image
432 VkResult res = fAcquireNextImageKHR(fBackendContext->fDevice, fSwapchain, UI NT64_MAX, 438 VkResult res = fAcquireNextImageKHR(fBackendContext->fDevice, fSwapchain, UI NT64_MAX,
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
503 submitInfo.pWaitSemaphores = &backbuffer->fAcquireSemaphore; 509 submitInfo.pWaitSemaphores = &backbuffer->fAcquireSemaphore;
504 submitInfo.pWaitDstStageMask = &waitDstStageFlags; 510 submitInfo.pWaitDstStageMask = &waitDstStageFlags;
505 submitInfo.commandBufferCount = 1; 511 submitInfo.commandBufferCount = 1;
506 submitInfo.pCommandBuffers = &backbuffer->fTransitionCmdBuffers[0]; 512 submitInfo.pCommandBuffers = &backbuffer->fTransitionCmdBuffers[0];
507 submitInfo.signalSemaphoreCount = 0; 513 submitInfo.signalSemaphoreCount = 0;
508 514
509 GR_VK_CALL_ERRCHECK(fBackendContext->fInterface, 515 GR_VK_CALL_ERRCHECK(fBackendContext->fInterface,
510 QueueSubmit(fBackendContext->fQueue, 1, &submitInfo, 516 QueueSubmit(fBackendContext->fQueue, 1, &submitInfo,
511 backbuffer->fUsageFences[0])); 517 backbuffer->fUsageFences[0]));
512 518
513 return fSurfaces[backbuffer->fImageIndex].get(); 519 return sk_ref_sp(fSurfaces[backbuffer->fImageIndex].get());
514 } 520 }
515 521
516
517 void VulkanWindowContext::swapBuffers() { 522 void VulkanWindowContext::swapBuffers() {
518 523
519 BackbufferInfo* backbuffer = fBackbuffers + fCurrentBackbufferIndex; 524 BackbufferInfo* backbuffer = fBackbuffers + fCurrentBackbufferIndex;
520 525
521 VkImageLayout layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; 526 VkImageLayout layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
522 VkPipelineStageFlags srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPU T_BIT; 527 VkPipelineStageFlags srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPU T_BIT;
523 VkPipelineStageFlags dstStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT; 528 VkPipelineStageFlags dstStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT;
524 VkAccessFlags srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; 529 VkAccessFlags srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
525 VkAccessFlags dstAccessMask = VK_ACCESS_MEMORY_READ_BIT; 530 VkAccessFlags dstAccessMask = VK_ACCESS_MEMORY_READ_BIT;
526 531
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
581 &fSwapchain, // pSwapchains 586 &fSwapchain, // pSwapchains
582 &backbuffer->fImageIndex, // pImageIndices 587 &backbuffer->fImageIndex, // pImageIndices
583 NULL // pResults 588 NULL // pResults
584 }; 589 };
585 590
586 fQueuePresentKHR(fPresentQueue, &presentInfo); 591 fQueuePresentKHR(fPresentQueue, &presentInfo);
587 592
588 } 593 }
589 594
590 } //namespace sk_app 595 } //namespace sk_app
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698