blob: bc7e43cc978e928054b0ba329eda2b1cb9fcf942 [file] [log] [blame]
#ifndef _VKWSIUTIL_HPP
#define _VKWSIUTIL_HPP
/*-------------------------------------------------------------------------
* Vulkan CTS Framework
* --------------------
*
* Copyright (c) 2016 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*//*!
* \file
* \brief Windowing System Integration (WSI) Utilities.
*//*--------------------------------------------------------------------*/
#include "vkDefs.hpp"
#include "vkWsiPlatform.hpp"
#include "vkRef.hpp"
#include "vkMemUtil.hpp"
#include "vkPrograms.hpp"
#include <vector>
namespace vk
{
namespace wsi
{
struct PlatformProperties
{
enum FeatureFlags
{
FEATURE_INITIAL_WINDOW_SIZE = (1 << 0), //!< Platform honors initial window size request
FEATURE_RESIZE_WINDOW = (1 << 1), //!< Platform supports resizing window
};
enum SwapchainExtent
{
SWAPCHAIN_EXTENT_MUST_MATCH_WINDOW_SIZE = 0, //!< Swapchain extent must match window size
SWAPCHAIN_EXTENT_SETS_WINDOW_SIZE, //!< Window will be resized to swapchain size when first image is presented
SWAPCHAIN_EXTENT_SCALED_TO_WINDOW_SIZE, //!< Presented image contents will be scaled to window size
SWAPCHAIN_EXTENT_LAST
};
uint32_t features;
SwapchainExtent swapchainExtent;
uint32_t maxDisplays;
uint32_t maxWindowsPerDisplay;
};
const char *getName(Type wsiType);
const char *getExtensionName(Type wsiType);
const PlatformProperties &getPlatformProperties(Type wsiType);
VkResult createSurface(const InstanceInterface &vki, VkInstance instance, Type wsiType, const Display &nativeDisplay,
const Window &nativeWindow, const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface);
Move<VkSurfaceKHR> createSurface(const InstanceInterface &vki, VkInstance instance, Type wsiType,
const Display &nativeDisplay, const Window &nativeWindow,
const VkAllocationCallbacks *pAllocator = DE_NULL);
VkBool32 getPhysicalDeviceSurfaceSupport(const InstanceInterface &vki, VkPhysicalDevice physicalDevice,
uint32_t queueFamilyIndex, VkSurfaceKHR surface);
VkBool32 getPhysicalDevicePresentationSupport(const InstanceInterface &vki, VkPhysicalDevice physicalDevice,
uint32_t queueFamilyIndex, Type wsiType, const Display &nativeDisplay);
VkSurfaceCapabilitiesKHR getPhysicalDeviceSurfaceCapabilities(const InstanceInterface &vki,
VkPhysicalDevice physicalDevice, VkSurfaceKHR surface);
VkSurfaceCapabilities2EXT getPhysicalDeviceSurfaceCapabilities2EXT(const InstanceInterface &vki,
VkPhysicalDevice physicalDevice,
VkSurfaceKHR surface);
bool sameSurfaceCapabilities(const VkSurfaceCapabilitiesKHR &khr, const VkSurfaceCapabilities2EXT &ext);
std::vector<VkSurfaceFormatKHR> getPhysicalDeviceSurfaceFormats(const InstanceInterface &vki,
VkPhysicalDevice physicalDevice, VkSurfaceKHR surface);
std::vector<VkPresentModeKHR> getPhysicalDeviceSurfacePresentModes(const InstanceInterface &vki,
VkPhysicalDevice physicalDevice,
VkSurfaceKHR surface);
std::vector<VkImage> getSwapchainImages(const DeviceInterface &vkd, VkDevice device, VkSwapchainKHR swapchain);
uint32_t chooseQueueFamilyIndex(const InstanceInterface &vki, VkPhysicalDevice physicalDevice,
const std::vector<VkSurfaceKHR> &surfaces);
uint32_t chooseQueueFamilyIndex(const InstanceInterface &vki, VkPhysicalDevice physicalDevice, VkSurfaceKHR surface);
std::vector<uint32_t> getCompatibleQueueFamilyIndices(const InstanceInterface &vki, VkPhysicalDevice physicalDevice,
const std::vector<VkSurfaceKHR> &surface);
tcu::UVec2 getFullScreenSize(const vk::wsi::Type wsiType, const vk::wsi::Display &display,
const tcu::UVec2 &fallbackSize);
class WsiTriangleRenderer
{
public:
WsiTriangleRenderer(const DeviceInterface &vkd, const VkDevice device, Allocator &allocator,
const BinaryCollection &binaryRegistry, bool explicitLayoutTransitions,
const std::vector<VkImage> swapchainImages, const std::vector<VkImage> aliasImages,
const VkFormat framebufferFormat, const tcu::UVec2 &renderSize);
WsiTriangleRenderer(WsiTriangleRenderer &&other);
~WsiTriangleRenderer(void);
void recordFrame(VkCommandBuffer cmdBuffer, uint32_t imageNdx, uint32_t frameNdx) const;
void recordDeviceGroupFrame(VkCommandBuffer cmdBuffer, uint32_t imageNdx, uint32_t firstDeviceID,
uint32_t secondDeviceID, uint32_t devicesCount, uint32_t frameNdx) const;
static void getPrograms(SourceCollections &dst);
private:
static Move<VkRenderPass> createRenderPass(const DeviceInterface &vkd, const VkDevice device,
const VkFormat colorAttachmentFormat,
const bool explicitLayoutTransitions);
static Move<VkPipelineLayout> createPipelineLayout(const DeviceInterface &vkd, VkDevice device);
static Move<VkPipeline> createPipeline(const DeviceInterface &vkd, const VkDevice device,
const VkRenderPass renderPass, const VkPipelineLayout pipelineLayout,
const BinaryCollection &binaryCollection, const tcu::UVec2 &renderSize);
static Move<VkImageView> createAttachmentView(const DeviceInterface &vkd, const VkDevice device,
const VkImage image, const VkFormat format);
static Move<VkFramebuffer> createFramebuffer(const DeviceInterface &vkd, const VkDevice device,
const VkRenderPass renderPass, const VkImageView colorAttachment,
const tcu::UVec2 &renderSize);
static Move<VkBuffer> createBuffer(const DeviceInterface &vkd, VkDevice device, VkDeviceSize size,
VkBufferUsageFlags usage);
const DeviceInterface &m_vkd;
bool m_explicitLayoutTransitions;
std::vector<VkImage> m_swapchainImages;
std::vector<VkImage> m_aliasImages;
tcu::UVec2 m_renderSize;
Move<VkRenderPass> m_renderPass;
Move<VkPipelineLayout> m_pipelineLayout;
Move<VkPipeline> m_pipeline;
Move<VkBuffer> m_vertexBuffer;
de::MovePtr<Allocation> m_vertexBufferMemory;
using ImageViewSp = de::SharedPtr<Unique<VkImageView>>;
using FramebufferSp = de::SharedPtr<Unique<VkFramebuffer>>;
std::vector<ImageViewSp> m_attachmentViews;
mutable std::vector<VkImageLayout> m_attachmentLayouts;
std::vector<FramebufferSp> m_framebuffers;
};
} // namespace wsi
} // namespace vk
#endif // _VKWSIUTIL_HPP