1
0
mirror of https://github.com/Yours3lf/rpi-vk-driver.git synced 2024-12-01 13:24:20 +01:00
rpi-vk-driver/driver/vkExt.h
2019-10-01 19:23:52 +01:00

117 lines
3.2 KiB
C

#pragma once
#define VK_NO_PROTOTYPES
#include <vulkan/vulkan.h>
#ifdef __cplusplus
extern "C" {
#endif
typedef VkResult (*PFN_vkCreateRpiSurfaceEXT)(
VkPhysicalDevice physicalDevice);
typedef VkResult (*PFN_vkCreateShaderModuleFromRpiAssemblyEXT)(
VkPhysicalDevice physicalDevice);
// Sooo we're not really getting the REAL VkPhysicalDevice from the Loader
// But rather a Trampoline object that points to a Terminator that finally points to
// The real object
// Therefore if we would like to pass on information in our VkPhysicalDevice object
// We need to walk this chain...
typedef struct VkRpiPhysicalDevice
{
uintptr_t loaderData;
uintptr_t customData;
} VkRpiPhysicalDevice;
typedef struct LoaderTerminator
{
uintptr_t a;
uintptr_t b;
uint8_t c;
VkRpiPhysicalDevice* physicalDevice;
} LoaderTerminator;
typedef struct LoaderTrampoline
{
uintptr_t a;
uintptr_t b;
LoaderTerminator* loaderTerminator;
} LoaderTrampoline;
/*
* assembly to vulkan resource mapping
*
* map vulkan resources such as
* -push constants
* -descriptor set entries
* -images
* -buffers
*
* to assembly uniform reads
*
* push constants should be one read
*
* buffers and images are handled through the TMU pipeline
* and therefore carry implicit uniform reads
* buffers should be one uniform (general memory read)
* number of uniforms for images are dependent on type (and TMU writes)
*
* therefore what we need is a mapping for each assembly uniform read
* to some vulkan resource
* and the driver should be able to figure out what to put in the uniform queue
* based on the mapping
*
* vertex and coordinate shader mappings are shared
*
*/
typedef enum VkRpiSurfaceCreateFlagsEXT {
//reserved
VK_RPI_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF
} VkRpiSurfaceCreateFlagsEXT;
typedef enum VkRpiAssemblyMappingTypeEXT {
VK_RPI_ASSEMBLY_MAPPING_TYPE_DESCRIPTOR = 0,
VK_RPI_ASSEMBLY_MAPPING_TYPE_PUSH_CONSTANT = 1,
VK_RPI_ASSEMBLY_MAPPING_TYPE_MAX
} VkRpiAssemblyMappingTypeEXT;
//defines mapping for a single uniform FIFO read to a Vulkan resource
typedef struct VkRpiAssemblyMappingEXT {
VkRpiAssemblyMappingTypeEXT mappingType;
VkDescriptorType descriptorType;
uint32_t descriptorSet;
uint32_t descriptorBinding;
uint32_t descriptorArrayElement;
uint32_t resourceOffset; //in bytes
VkShaderStageFlagBits shaderStage;
} VkRpiAssemblyMappingEXT;
//we need something like the other platforms to create surfaces on the RPI
//so I created this little "extension"
//full spec in this file ;)
typedef struct VkRpiSurfaceCreateInfoEXT {
VkStructureType sType;
const void* pNext;
VkRpiSurfaceCreateFlagsEXT flags; //reserved
const VkAllocationCallbacks* pAllocator;
VkSurfaceKHR* pSurface;
} VkRpiSurfaceCreateInfoEXT;
typedef struct VkRpiShaderModuleAssemblyCreateInfoEXT {
VkStructureType sType;
const void* pNext;
char** asmStrings;
VkRpiAssemblyMappingEXT* mappings;
uint32_t numMappings;
const VkAllocationCallbacks* pAllocator;
VkShaderModule* pShaderModule;
} VkRpiShaderModuleAssemblyCreateInfoEXT;
#ifdef __cplusplus
}
#endif