gamescope/src/rendervulkan.hpp
Joshua Ashton f537a40483 Use SOA instead of AOS for layers
Produces better code as the shader compiler can load
multiple layers with a single buffer_load at a time
due to the positioning and alignment.
2021-05-01 16:50:51 -07:00

141 lines
2.8 KiB
C++

// Initialize Vulkan and composite stuff with a compute queue
#pragma once
#include <stdint.h>
typedef uint32_t VulkanTexture_t;
#define k_nMaxLayers 4
// These two structs are horrible
struct VulkanPipeline_t
{
struct LayerBinding_t
{
int surfaceWidth;
int surfaceHeight;
VulkanTexture_t tex;
uint32_t fbid;
int zpos;
// These fields below count for the sampler cache
bool bFilter;
bool bBlackBorder;
} layerBindings[ k_nMaxLayers ];
};
struct vec2_t
{
float x, y;
};
struct Composite_t
{
int nLayerCount;
int nSwapChannels;
struct CompositeData_t
{
vec2_t vScale[k_nMaxLayers];
vec2_t vOffset[k_nMaxLayers];
float flOpacity[k_nMaxLayers];
} data;
};
#include "drm.hpp"
#include <unordered_map>
#include <vector>
extern "C" {
#define static
#include <wlr/types/wlr_linux_dmabuf_v1.h>
#include <wlr/render/dmabuf.h>
#include <wlr/render/gles2.h>
#include <wlr/render/interface.h>
#include <wlr/render/egl.h>
#undef static
}
#include <vulkan/vulkan.h>
#include <drm_fourcc.h>
struct VulkanRenderer_t
{
struct wlr_renderer base;
struct wlr_renderer *parent;
};
class CVulkanTexture
{
public:
struct createFlags {
createFlags( void )
{
bFlippable = false;
bTextureable = false;
bMappable = false;
bTransferSrc = false;
bTransferDst = false;
bLinear = false;
}
bool bFlippable : 1;
bool bTextureable : 1;
bool bMappable : 1;
bool bTransferSrc : 1;
bool bTransferDst : 1;
bool bLinear : 1;
};
bool BInit( uint32_t width, uint32_t height, VkFormat format, createFlags flags, wlr_dmabuf_attributes *pDMA = nullptr );
~CVulkanTexture( void );
bool m_bInitialized = false;
VkImage m_vkImage = VK_NULL_HANDLE;
VkDeviceMemory m_vkImageMemory = VK_NULL_HANDLE;
VkImageView m_vkImageView = VK_NULL_HANDLE;
uint32_t m_unRowPitch = 0;
uint32_t m_FBID = 0;
int m_FD = -1;
int32_t nRefCount = 1;
VulkanTexture_t handle = 0;
void *m_pMappedData = nullptr;
};
extern std::vector< const char * > g_vecSDLInstanceExts;
extern bool g_vulkanSupportsModifiers;
int vulkan_init(void);
VulkanTexture_t vulkan_create_texture_from_dmabuf( struct wlr_dmabuf_attributes *pDMA );
VulkanTexture_t vulkan_create_texture_from_bits( uint32_t width, uint32_t height, VkFormat format, void *bits );
int vulkan_get_texture_fence( VulkanTexture_t vulkanTex );
uint32_t vulkan_texture_get_fbid( VulkanTexture_t vulkanTex );
void vulkan_free_texture( VulkanTexture_t vulkanTex );
bool vulkan_composite( struct Composite_t *pComposite, struct VulkanPipeline_t *pPipeline, bool bScreenshot );
uint32_t vulkan_get_last_composite_fbid( void );
void vulkan_present_to_window( void );
void vulkan_garbage_collect( void );
bool vulkan_remake_swapchain( void );
struct wlr_renderer *vulkan_renderer_create( struct wlr_renderer *parent );