blob: a80de67f8a69f30ced5a4cc64f6912848a135706 [file] [log] [blame]
Hernan Liatisc6eb41b2019-02-22 11:12:59 -08001// Copyright 2018 The SwiftShader Authors. All Rights Reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15#ifndef SWIFTSHADER_VKSURFACEKHR_HPP_
16#define SWIFTSHADER_VKSURFACEKHR_HPP_
17
Nicolas Capensd3545372019-08-09 13:59:18 -040018#include "Vulkan/VkImage.hpp"
Ben Clayton45c697a2019-12-17 20:38:03 +000019#include "Vulkan/VkObject.hpp"
Antonio Maiorano42fd1592020-04-27 11:30:40 -040020#include "Vulkan/VulkanPlatform.hpp"
Nicolas Capensd3545372019-08-09 13:59:18 -040021
Hernan Liatisc6eb41b2019-02-22 11:12:59 -080022#include <vector>
23
Nicolas Capens157ba262019-12-10 17:49:14 -050024namespace vk {
Hernan Liatisc6eb41b2019-02-22 11:12:59 -080025
Hernan Liatisf945a5e2019-03-06 15:31:04 -080026enum PresentImageStatus
27{
Nicolas Capensd3545372019-08-09 13:59:18 -040028 NONEXISTENT, // Image wasn't created
Hernan Liatisf945a5e2019-03-06 15:31:04 -080029 AVAILABLE,
30 DRAWING,
31 PRESENTING,
32};
33
Alexis Hetu63ae9242019-06-06 13:52:15 -040034class DeviceMemory;
35class Image;
36class SwapchainKHR;
37
38class PresentImage
Hernan Liatisf945a5e2019-03-06 15:31:04 -080039{
Alexis Hetu63ae9242019-06-06 13:52:15 -040040public:
Nicolas Capensc3298812021-10-05 14:31:31 -040041 VkResult createImage(VkDevice device, const VkImageCreateInfo &createInfo);
Ben Clayton45c697a2019-12-17 20:38:03 +000042 VkResult allocateAndBindImageMemory(VkDevice device, const VkMemoryAllocateInfo &allocateInfo);
Nicolas Capensc3298812021-10-05 14:31:31 -040043 void release();
Alexis Hetu63ae9242019-06-06 13:52:15 -040044 VkImage asVkImage() const;
45
Ben Clayton45c697a2019-12-17 20:38:03 +000046 const Image *getImage() const { return image; }
47 DeviceMemory *getImageMemory() const { return imageMemory; }
Alexis Hetu63ae9242019-06-06 13:52:15 -040048 bool isAvailable() const { return (imageStatus == AVAILABLE); }
49 bool exists() const { return (imageStatus != NONEXISTENT); }
50 void setStatus(PresentImageStatus status) { imageStatus = status; }
51
52private:
Ben Clayton45c697a2019-12-17 20:38:03 +000053 Image *image = nullptr;
54 DeviceMemory *imageMemory = nullptr;
Alexis Hetu63ae9242019-06-06 13:52:15 -040055 PresentImageStatus imageStatus = NONEXISTENT;
Hernan Liatisf945a5e2019-03-06 15:31:04 -080056};
57
Hernan Liatisc6eb41b2019-02-22 11:12:59 -080058class SurfaceKHR
59{
60public:
Ben Claytoncaf60312019-05-21 15:31:12 +010061 virtual ~SurfaceKHR() = default;
62
Hernan Liatisc6eb41b2019-02-22 11:12:59 -080063 operator VkSurfaceKHR()
64 {
Alexis Hetubd4cf812019-06-14 15:14:07 -040065 return vk::TtoVkT<SurfaceKHR, VkSurfaceKHR>(this);
66 }
67
Ben Clayton45c697a2019-12-17 20:38:03 +000068 static inline SurfaceKHR *Cast(VkSurfaceKHR object)
Alexis Hetubd4cf812019-06-14 15:14:07 -040069 {
70 return vk::VkTtoT<SurfaceKHR, VkSurfaceKHR>(object);
Hernan Liatisc6eb41b2019-02-22 11:12:59 -080071 }
72
Ben Clayton45c697a2019-12-17 20:38:03 +000073 void destroy(const VkAllocationCallbacks *pAllocator)
Hernan Liatisc6eb41b2019-02-22 11:12:59 -080074 {
75 destroySurface(pAllocator);
76 }
77
Ben Clayton45c697a2019-12-17 20:38:03 +000078 virtual void destroySurface(const VkAllocationCallbacks *pAllocator) = 0;
Hernan Liatisc6eb41b2019-02-22 11:12:59 -080079
Shahbaz Youssefiea3fc742022-10-23 22:41:06 -040080 virtual VkResult getSurfaceCapabilities(const void *pSurfaceInfoPNext, VkSurfaceCapabilitiesKHR *pSurfaceCapabilities, void *pSurfaceCapabilitiesPNext) const = 0;
Hernan Liatisc6eb41b2019-02-22 11:12:59 -080081
Shahbaz Youssefiea3fc742022-10-23 22:41:06 -040082 uint32_t getSurfaceFormatsCount(const void *pSurfaceInfoPNext) const;
83 VkResult getSurfaceFormats(const void *pSurfaceInfoPNext, uint32_t *pSurfaceFormatCount, VkSurfaceFormat2KHR *pSurfaceFormats) const;
Hernan Liatisc6eb41b2019-02-22 11:12:59 -080084
85 uint32_t getPresentModeCount() const;
Ben Clayton45c697a2019-12-17 20:38:03 +000086 VkResult getPresentModes(uint32_t *pPresentModeCount, VkPresentModeKHR *pPresentModes) const;
Hernan Liatisc6eb41b2019-02-22 11:12:59 -080087
Chris Forbesb52384b2019-08-28 12:01:29 -070088 VkResult getPresentRectangles(uint32_t *pRectCount, VkRect2D *pRects) const;
89
Peng Huang87c78ac2021-12-23 10:49:44 +000090 virtual void* allocateImageMemory(PresentImage *image, const VkMemoryAllocateInfo &allocateInfo) { return nullptr; }
91 virtual void releaseImageMemory(PresentImage *image) {}
Ben Clayton45c697a2019-12-17 20:38:03 +000092 virtual void attachImage(PresentImage *image) = 0;
93 virtual void detachImage(PresentImage *image) = 0;
94 virtual VkResult present(PresentImage *image) = 0;
Hernan Liatis6b12a502019-03-01 15:06:13 -080095
Ben Clayton45c697a2019-12-17 20:38:03 +000096 void associateSwapchain(SwapchainKHR *swapchain);
Hernan Liatis43be7162019-03-08 17:57:41 -080097 void disassociateSwapchain();
Alexis Hetu63ae9242019-06-06 13:52:15 -040098 bool hasAssociatedSwapchain();
Hernan Liatis43be7162019-03-08 17:57:41 -080099
Antonio Maiorano51286432021-02-19 09:56:47 -0500100protected:
Shahbaz Youssefiea3fc742022-10-23 22:41:06 -0400101 static void setCommonSurfaceCapabilities(const void *pSurfaceInfoPNext, VkSurfaceCapabilitiesKHR *pSurfaceCapabilities, void *pSurfaceCapabilitiesPNext);
Antonio Maiorano51286432021-02-19 09:56:47 -0500102
Hernan Liatisc6eb41b2019-02-22 11:12:59 -0800103private:
Ben Clayton45c697a2019-12-17 20:38:03 +0000104 SwapchainKHR *associatedSwapchain = nullptr;
Hernan Liatisc6eb41b2019-02-22 11:12:59 -0800105};
106
Ben Clayton45c697a2019-12-17 20:38:03 +0000107static inline SurfaceKHR *Cast(VkSurfaceKHR object)
Hernan Liatisc6eb41b2019-02-22 11:12:59 -0800108{
Alexis Hetubd4cf812019-06-14 15:14:07 -0400109 return SurfaceKHR::Cast(object);
Hernan Liatisc6eb41b2019-02-22 11:12:59 -0800110}
111
Nicolas Capens157ba262019-12-10 17:49:14 -0500112} // namespace vk
Hernan Liatisc6eb41b2019-02-22 11:12:59 -0800113
Sean Risser08762e32021-05-05 14:28:24 -0400114#endif // SWIFTSHADER_VKSURFACEKHR_HPP_