Refresh/src/Refresh_Driver.h

704 lines
18 KiB
C
Raw Normal View History

2022-03-02 19:22:52 +00:00
/* Refresh - XNA-inspired 3D Graphics Library with modern capabilities
2020-12-17 00:27:14 +00:00
*
* Copyright (c) 2020 Evan Hemsley
*
* This software is provided 'as-is', without any express or implied warranty.
* In no event will the authors be held liable for any damages arising from
* the use of this software.
*
* Permission is granted to anyone to use this software for any purpose,
* including commercial applications, and to alter it and redistribute it
* freely, subject to the following restrictions:
*
* 1. The origin of this software must not be misrepresented; you must not
* claim that you wrote the original software. If you use this software in a
* product, an acknowledgment in the product documentation would be
* appreciated but is not required.
*
* 2. Altered source versions must be plainly marked as such, and must not be
* misrepresented as being the original software.
*
* 3. This notice may not be removed or altered from any source distribution.
*
* Evan "cosmonaut" Hemsley <evan@moonside.games>
*
*/
#ifndef REFRESH_DRIVER_H
#define REFRESH_DRIVER_H
#include "Refresh.h"
/* Windows/Visual Studio cruft */
#ifdef _WIN32
#define inline __inline
#endif
2020-12-17 02:38:22 +00:00
/* Logging */
#ifdef __cplusplus
extern "C" {
#endif
void Refresh_LogInfo(const char *fmt, ...);
void Refresh_LogWarn(const char *fmt, ...);
void Refresh_LogError(const char *fmt, ...);
#ifdef __cplusplus
}
#endif
2020-12-17 02:38:22 +00:00
2020-12-17 00:27:14 +00:00
/* Internal Helper Utilities */
static inline int32_t Texture_GetBlockSize(
Refresh_TextureFormat format
) {
switch (format)
{
case REFRESH_TEXTUREFORMAT_BC1:
case REFRESH_TEXTUREFORMAT_BC2:
case REFRESH_TEXTUREFORMAT_BC3:
case REFRESH_TEXTUREFORMAT_BC7:
return 4;
case REFRESH_TEXTUREFORMAT_R8:
case REFRESH_TEXTUREFORMAT_R8_UINT:
case REFRESH_TEXTUREFORMAT_R5G6B5:
case REFRESH_TEXTUREFORMAT_B4G4R4A4:
case REFRESH_TEXTUREFORMAT_A1R5G5B5:
case REFRESH_TEXTUREFORMAT_R16_SFLOAT:
case REFRESH_TEXTUREFORMAT_R8G8_SNORM:
case REFRESH_TEXTUREFORMAT_R8G8_UINT:
case REFRESH_TEXTUREFORMAT_R16_UINT:
case REFRESH_TEXTUREFORMAT_R8G8B8A8:
case REFRESH_TEXTUREFORMAT_R32_SFLOAT:
case REFRESH_TEXTUREFORMAT_R16G16_SFLOAT:
case REFRESH_TEXTUREFORMAT_R8G8B8A8_SNORM:
case REFRESH_TEXTUREFORMAT_A2R10G10B10:
case REFRESH_TEXTUREFORMAT_R8G8B8A8_UINT:
case REFRESH_TEXTUREFORMAT_R16G16_UINT:
case REFRESH_TEXTUREFORMAT_R16G16B16A16_SFLOAT:
case REFRESH_TEXTUREFORMAT_R16G16B16A16:
case REFRESH_TEXTUREFORMAT_R32G32_SFLOAT:
case REFRESH_TEXTUREFORMAT_R16G16B16A16_UINT:
case REFRESH_TEXTUREFORMAT_R32G32B32A32_SFLOAT:
return 1;
default:
Refresh_LogError(
"Unrecognized TextureFormat!"
);
return 0;
}
}
2020-12-17 00:27:14 +00:00
static inline uint32_t Texture_GetFormatSize(
Refresh_TextureFormat format
2020-12-17 00:27:14 +00:00
) {
switch (format)
{
case REFRESH_TEXTUREFORMAT_BC1:
2020-12-17 00:27:14 +00:00
return 8;
case REFRESH_TEXTUREFORMAT_BC2:
case REFRESH_TEXTUREFORMAT_BC3:
2022-05-12 04:16:24 +00:00
case REFRESH_TEXTUREFORMAT_BC7:
2020-12-17 00:27:14 +00:00
return 16;
case REFRESH_TEXTUREFORMAT_R8:
case REFRESH_TEXTUREFORMAT_R8_UINT:
2020-12-17 00:27:14 +00:00
return 1;
case REFRESH_TEXTUREFORMAT_R5G6B5:
case REFRESH_TEXTUREFORMAT_B4G4R4A4:
case REFRESH_TEXTUREFORMAT_A1R5G5B5:
case REFRESH_TEXTUREFORMAT_R16_SFLOAT:
case REFRESH_TEXTUREFORMAT_R8G8_SNORM:
case REFRESH_TEXTUREFORMAT_R8G8_UINT:
case REFRESH_TEXTUREFORMAT_R16_UINT:
2020-12-17 00:27:14 +00:00
return 2;
case REFRESH_TEXTUREFORMAT_R8G8B8A8:
case REFRESH_TEXTUREFORMAT_R32_SFLOAT:
case REFRESH_TEXTUREFORMAT_R16G16_SFLOAT:
case REFRESH_TEXTUREFORMAT_R8G8B8A8_SNORM:
case REFRESH_TEXTUREFORMAT_A2R10G10B10:
case REFRESH_TEXTUREFORMAT_R8G8B8A8_UINT:
case REFRESH_TEXTUREFORMAT_R16G16_UINT:
2020-12-17 00:27:14 +00:00
return 4;
case REFRESH_TEXTUREFORMAT_R16G16B16A16_SFLOAT:
case REFRESH_TEXTUREFORMAT_R16G16B16A16:
case REFRESH_TEXTUREFORMAT_R32G32_SFLOAT:
case REFRESH_TEXTUREFORMAT_R16G16B16A16_UINT:
2020-12-17 00:27:14 +00:00
return 8;
case REFRESH_TEXTUREFORMAT_R32G32B32A32_SFLOAT:
2020-12-17 00:27:14 +00:00
return 16;
default:
2021-01-05 23:00:51 +00:00
Refresh_LogError(
"Unrecognized TextureFormat!"
2020-12-17 00:27:14 +00:00
);
return 0;
}
}
static inline uint32_t PrimitiveVerts(
2021-01-05 23:00:51 +00:00
Refresh_PrimitiveType primitiveType,
2020-12-17 00:27:14 +00:00
uint32_t primitiveCount
) {
switch (primitiveType)
{
case REFRESH_PRIMITIVETYPE_TRIANGLELIST:
return primitiveCount * 3;
case REFRESH_PRIMITIVETYPE_TRIANGLESTRIP:
return primitiveCount + 2;
case REFRESH_PRIMITIVETYPE_LINELIST:
return primitiveCount * 2;
case REFRESH_PRIMITIVETYPE_LINESTRIP:
return primitiveCount + 1;
case REFRESH_PRIMITIVETYPE_POINTLIST:
return primitiveCount;
default:
2021-01-05 23:00:51 +00:00
Refresh_LogError(
2020-12-17 00:27:14 +00:00
"Unrecognized primitive type!"
);
return 0;
}
}
2021-01-05 23:00:51 +00:00
static inline uint32_t IndexSize(Refresh_IndexElementSize size)
2020-12-17 00:27:14 +00:00
{
2020-12-17 02:12:20 +00:00
return (size == REFRESH_INDEXELEMENTSIZE_16BIT) ? 2 : 4;
2020-12-17 00:27:14 +00:00
}
static inline uint32_t BytesPerRow(
int32_t width,
Refresh_TextureFormat format
2020-12-17 00:27:14 +00:00
) {
uint32_t blocksPerRow = width;
if ( format == REFRESH_TEXTUREFORMAT_BC1 ||
format == REFRESH_TEXTUREFORMAT_BC2 ||
2022-05-12 04:16:24 +00:00
format == REFRESH_TEXTUREFORMAT_BC3 ||
format == REFRESH_TEXTUREFORMAT_BC7 )
2020-12-17 00:27:14 +00:00
{
blocksPerRow = (width + 3) / 4;
}
return blocksPerRow * Texture_GetFormatSize(format);
}
static inline int32_t BytesPerImage(
uint32_t width,
uint32_t height,
Refresh_TextureFormat format
2020-12-17 00:27:14 +00:00
) {
uint32_t blocksPerRow = width;
uint32_t blocksPerColumn = height;
if ( format == REFRESH_TEXTUREFORMAT_BC1 ||
format == REFRESH_TEXTUREFORMAT_BC2 ||
2022-05-12 04:16:24 +00:00
format == REFRESH_TEXTUREFORMAT_BC3 ||
format == REFRESH_TEXTUREFORMAT_BC7 )
2020-12-17 00:27:14 +00:00
{
blocksPerRow = (width + 3) / 4;
blocksPerColumn = (height + 3) / 4;
}
return blocksPerRow * blocksPerColumn * Texture_GetFormatSize(format);
}
/* XNA GraphicsDevice Limits */
/* TODO: can these be adjusted for modern low-end? */
#define MAX_TEXTURE_SAMPLERS 16
#define MAX_VERTEXTEXTURE_SAMPLERS 4
#define MAX_TOTAL_SAMPLERS (MAX_TEXTURE_SAMPLERS + MAX_VERTEXTEXTURE_SAMPLERS)
2022-02-25 21:42:11 +00:00
#define MAX_BUFFER_BINDINGS 16
2020-12-17 00:27:14 +00:00
2020-12-23 07:17:09 +00:00
#define MAX_COLOR_TARGET_BINDINGS 4
#define MAX_PRESENT_COUNT 16
2020-12-17 00:27:14 +00:00
/* Internal Shader Module Create Info */
typedef enum Refresh_Driver_ShaderType
{
REFRESH_DRIVER_SHADERTYPE_VERTEX,
REFRESH_DRIVER_SHADERTYPE_FRAGMENT,
REFRESH_DRIVER_SHADERTYPE_COMPUTE
} Refresh_Driver_ShaderType;
typedef struct Refresh_Driver_ShaderModuleCreateInfo
{
size_t codeSize;
const uint32_t* byteCode;
Refresh_Driver_ShaderType type;
} Refresh_Driver_ShaderModuleCreateInfo;
2021-01-05 23:00:51 +00:00
/* Refresh_Device Definition */
2020-12-17 00:27:14 +00:00
2021-01-05 23:00:51 +00:00
typedef struct Refresh_Renderer Refresh_Renderer;
2020-12-17 00:27:14 +00:00
2021-01-05 23:00:51 +00:00
struct Refresh_Device
2020-12-17 00:27:14 +00:00
{
/* Quit */
2021-01-05 23:00:51 +00:00
void (*DestroyDevice)(Refresh_Device *device);
2020-12-17 00:27:14 +00:00
2024-02-12 08:04:02 +00:00
/* State Creation */
2020-12-17 00:27:14 +00:00
2024-02-12 08:04:02 +00:00
Refresh_ComputePipeline* (*CreateComputePipeline)(
2022-02-25 21:42:11 +00:00
Refresh_Renderer *driverData,
2024-02-12 08:04:02 +00:00
Refresh_ComputeShaderInfo *computeShaderInfo
2020-12-17 00:27:14 +00:00
);
2020-12-20 09:29:15 +00:00
2024-02-12 08:04:02 +00:00
Refresh_GraphicsPipeline* (*CreateGraphicsPipeline)(
2022-02-25 21:42:11 +00:00
Refresh_Renderer *driverData,
2024-02-12 08:04:02 +00:00
Refresh_GraphicsPipelineCreateInfo *pipelineCreateInfo
2020-12-17 00:27:14 +00:00
);
2020-12-20 09:29:15 +00:00
2024-02-12 08:04:02 +00:00
Refresh_Sampler* (*CreateSampler)(
2022-02-25 21:42:11 +00:00
Refresh_Renderer *driverData,
2024-02-12 08:04:02 +00:00
Refresh_SamplerStateCreateInfo *samplerStateCreateInfo
2022-02-25 21:42:11 +00:00
);
2020-12-17 00:27:14 +00:00
2024-02-12 08:04:02 +00:00
Refresh_ShaderModule* (*CreateShaderModule)(
Refresh_Renderer *driverData,
Refresh_Driver_ShaderModuleCreateInfo *shaderModuleCreateInfo
);
2024-02-12 08:04:02 +00:00
Refresh_Texture* (*CreateTexture)(
Refresh_Renderer *driverData,
Refresh_TextureCreateInfo *textureCreateInfo
2022-02-25 21:42:11 +00:00
);
2024-02-12 08:04:02 +00:00
Refresh_GpuBuffer* (*CreateGpuBuffer)(
2022-02-25 21:42:11 +00:00
Refresh_Renderer *driverData,
2024-02-12 08:04:02 +00:00
Refresh_BufferUsageFlags usageFlags,
uint32_t sizeInBytes
2022-02-25 21:42:11 +00:00
);
2024-02-23 17:42:31 +00:00
Refresh_TransferBuffer* (*CreateTransferBuffer)(
2022-02-25 21:42:11 +00:00
Refresh_Renderer *driverData,
uint32_t sizeInBytes
2022-02-25 21:42:11 +00:00
);
2024-02-12 08:04:02 +00:00
/* Disposal */
void (*QueueDestroyTexture)(
2022-02-25 21:42:11 +00:00
Refresh_Renderer *driverData,
2024-02-12 08:04:02 +00:00
Refresh_Texture *texture
2022-02-25 21:42:11 +00:00
);
2020-12-17 00:27:14 +00:00
2024-02-12 08:04:02 +00:00
void (*QueueDestroySampler)(
2022-02-25 21:42:11 +00:00
Refresh_Renderer *driverData,
2024-02-12 08:04:02 +00:00
Refresh_Sampler *sampler
2022-02-25 21:42:11 +00:00
);
2024-02-12 08:04:02 +00:00
void (*QueueDestroyGpuBuffer)(
2022-02-25 21:42:11 +00:00
Refresh_Renderer *driverData,
2024-02-23 17:50:48 +00:00
Refresh_GpuBuffer *gpuBuffer
2022-02-25 21:42:11 +00:00
);
2024-02-23 17:42:31 +00:00
void (*QueueDestroyTransferBuffer)(
2022-02-25 21:42:11 +00:00
Refresh_Renderer *driverData,
2024-02-23 17:50:48 +00:00
Refresh_TransferBuffer *transferBuffer
2022-02-25 21:42:11 +00:00
);
2024-02-12 08:04:02 +00:00
void (*QueueDestroyShaderModule)(
Refresh_Renderer *driverData,
Refresh_ShaderModule *shaderModule
);
2022-02-25 21:42:11 +00:00
2024-02-12 08:04:02 +00:00
void (*QueueDestroyComputePipeline)(
2022-02-25 21:42:11 +00:00
Refresh_Renderer *driverData,
2024-02-12 08:04:02 +00:00
Refresh_ComputePipeline *computePipeline
2022-02-25 21:42:11 +00:00
);
2024-02-12 08:04:02 +00:00
void (*QueueDestroyGraphicsPipeline)(
2022-02-25 21:42:11 +00:00
Refresh_Renderer *driverData,
2024-02-12 08:04:02 +00:00
Refresh_GraphicsPipeline *graphicsPipeline
2022-02-25 21:42:11 +00:00
);
2020-12-17 00:27:14 +00:00
2024-02-12 08:04:02 +00:00
/* Render Pass */
void (*BeginRenderPass)(
2022-02-25 21:42:11 +00:00
Refresh_Renderer *driverData,
Refresh_CommandBuffer *commandBuffer,
2024-02-12 08:04:02 +00:00
Refresh_ColorAttachmentInfo *colorAttachmentInfos,
uint32_t colorAttachmentCount,
Refresh_DepthStencilAttachmentInfo *depthStencilAttachmentInfo
2022-02-25 21:42:11 +00:00
);
2024-02-12 08:04:02 +00:00
void (*BindGraphicsPipeline)(
2022-02-25 21:42:11 +00:00
Refresh_Renderer *driverData,
Refresh_CommandBuffer *commandBuffer,
2024-02-12 08:04:02 +00:00
Refresh_GraphicsPipeline *graphicsPipeline
2022-02-25 21:42:11 +00:00
);
2024-02-12 08:04:02 +00:00
void (*SetViewport)(
2022-02-25 21:42:11 +00:00
Refresh_Renderer *driverData,
Refresh_CommandBuffer *commandBuffer,
2024-02-12 08:04:02 +00:00
Refresh_Viewport *viewport
2022-02-25 21:42:11 +00:00
);
2020-12-17 00:27:14 +00:00
2024-02-12 08:04:02 +00:00
void (*SetScissor)(
2022-02-25 21:42:11 +00:00
Refresh_Renderer *driverData,
Refresh_CommandBuffer *commandBuffer,
2024-02-12 08:04:02 +00:00
Refresh_Rect *scissor
2022-02-25 21:42:11 +00:00
);
2020-12-17 00:27:14 +00:00
2024-02-12 08:04:02 +00:00
void (*BindVertexBuffers)(
2022-02-25 21:42:11 +00:00
Refresh_Renderer *driverData,
Refresh_CommandBuffer *commandBuffer,
2024-02-12 08:04:02 +00:00
uint32_t firstBinding,
uint32_t bindingCount,
Refresh_BufferBinding *pBindings
2022-02-25 21:42:11 +00:00
);
2020-12-29 22:52:24 +00:00
2024-02-12 08:04:02 +00:00
void (*BindIndexBuffer)(
2022-02-25 21:42:11 +00:00
Refresh_Renderer *driverData,
Refresh_CommandBuffer *commandBuffer,
Refresh_BufferBinding *pBinding,
2024-02-12 08:04:02 +00:00
Refresh_IndexElementSize indexElementSize
2022-02-25 21:42:11 +00:00
);
2020-12-17 00:27:14 +00:00
void (*BindVertexSamplers)(
2022-02-25 21:42:11 +00:00
Refresh_Renderer *driverData,
Refresh_CommandBuffer *commandBuffer,
Refresh_TextureSamplerBinding *pBindings
2022-02-25 21:42:11 +00:00
);
2020-12-17 00:27:14 +00:00
void (*BindFragmentSamplers)(
2022-02-25 21:42:11 +00:00
Refresh_Renderer *driverData,
Refresh_CommandBuffer *commandBuffer,
Refresh_TextureSamplerBinding *pBindings
2022-02-25 21:42:11 +00:00
);
2024-02-17 01:54:58 +00:00
void (*PushVertexShaderUniforms)(
2024-02-12 08:04:02 +00:00
Refresh_Renderer *driverData,
Refresh_CommandBuffer *commandBuffer,
void *data,
uint32_t dataLengthInBytes
);
2022-02-25 21:42:11 +00:00
2024-02-17 01:54:58 +00:00
void (*PushFragmentShaderUniforms)(
2022-02-25 21:42:11 +00:00
Refresh_Renderer *driverData,
2024-02-12 08:04:02 +00:00
Refresh_CommandBuffer *commandBuffer,
2022-02-25 21:42:11 +00:00
void *data,
uint32_t dataLengthInBytes
);
2024-02-12 08:04:02 +00:00
void (*DrawInstancedPrimitives)(
Refresh_Renderer *driverData,
Refresh_CommandBuffer *commandBuffer,
uint32_t baseVertex,
uint32_t startIndex,
uint32_t primitiveCount,
2024-02-17 01:54:58 +00:00
uint32_t instanceCount
2024-02-12 08:04:02 +00:00
);
2022-02-25 21:42:11 +00:00
2024-02-12 08:04:02 +00:00
void (*DrawIndexedPrimitives)(
2022-02-25 21:42:11 +00:00
Refresh_Renderer *driverData,
2024-02-12 08:04:02 +00:00
Refresh_CommandBuffer *commandBuffer,
uint32_t baseVertex,
uint32_t startIndex,
2024-02-17 01:54:58 +00:00
uint32_t primitiveCount
2022-02-25 21:42:11 +00:00
);
2024-02-12 08:04:02 +00:00
void (*DrawPrimitives)(
2022-02-25 21:42:11 +00:00
Refresh_Renderer *driverData,
2024-02-12 08:04:02 +00:00
Refresh_CommandBuffer *commandBuffer,
uint32_t vertexStart,
2024-02-17 01:54:58 +00:00
uint32_t primitiveCount
2022-02-25 21:42:11 +00:00
);
2024-02-12 08:04:02 +00:00
void (*DrawPrimitivesIndirect)(
2022-02-25 21:42:11 +00:00
Refresh_Renderer *driverData,
2024-02-12 08:04:02 +00:00
Refresh_CommandBuffer *commandBuffer,
2024-02-23 17:50:48 +00:00
Refresh_GpuBuffer *gpuBuffer,
2024-02-12 08:04:02 +00:00
uint32_t offsetInBytes,
uint32_t drawCount,
2024-02-17 01:54:58 +00:00
uint32_t stride
2022-02-25 21:42:11 +00:00
);
2024-02-12 08:04:02 +00:00
void (*EndRenderPass)(
2022-02-25 21:42:11 +00:00
Refresh_Renderer *driverData,
2024-02-12 08:04:02 +00:00
Refresh_CommandBuffer *commandBuffer
2022-02-25 21:42:11 +00:00
);
2024-02-12 08:04:02 +00:00
/* Compute Pass */
void (*BeginComputePass)(
2024-02-16 00:48:26 +00:00
Refresh_Renderer *driverData,
Refresh_CommandBuffer *commandBuffer
2024-02-12 08:04:02 +00:00
);
void (*BindComputePipeline)(
2022-02-25 21:42:11 +00:00
Refresh_Renderer *driverData,
2024-02-12 08:04:02 +00:00
Refresh_CommandBuffer *commandBuffer,
2022-02-25 21:42:11 +00:00
Refresh_ComputePipeline *computePipeline
);
2024-02-12 08:04:02 +00:00
void (*BindComputeBuffers)(
2022-02-25 21:42:11 +00:00
Refresh_Renderer *driverData,
2024-02-12 08:04:02 +00:00
Refresh_CommandBuffer *commandBuffer,
Refresh_ComputeBufferBinding *pBindings
2022-02-25 21:42:11 +00:00
);
2024-02-12 08:04:02 +00:00
void (*BindComputeTextures)(
Refresh_Renderer *driverData,
Refresh_CommandBuffer *commandBuffer,
Refresh_ComputeTextureBinding *pBindings
2024-02-12 08:04:02 +00:00
);
2022-02-25 21:42:11 +00:00
2024-02-17 01:54:58 +00:00
void (*PushComputeShaderUniforms)(
2022-02-25 21:42:11 +00:00
Refresh_Renderer *driverData,
Refresh_CommandBuffer *commandBuffer,
2024-02-12 08:04:02 +00:00
void *data,
uint32_t dataLengthInBytes
2022-02-25 21:42:11 +00:00
);
2024-02-12 08:04:02 +00:00
void (*DispatchCompute)(
Refresh_Renderer *device,
Refresh_CommandBuffer *commandBuffer,
uint32_t groupCountX,
uint32_t groupCountY,
2024-02-17 01:54:58 +00:00
uint32_t groupCountZ
2024-02-12 08:04:02 +00:00
);
void (*EndComputePass)(
2024-02-16 00:48:26 +00:00
Refresh_Renderer *driverData,
Refresh_CommandBuffer *commandBuffer
2024-02-12 08:04:02 +00:00
);
2024-02-23 17:42:31 +00:00
/* TransferBuffer Set/Get */
2024-02-18 04:21:52 +00:00
void (*SetTransferData)(
2024-02-18 04:21:52 +00:00
Refresh_Renderer *driverData,
void* data,
2024-02-23 17:42:31 +00:00
Refresh_TransferBuffer *transferBuffer,
2024-02-18 04:21:52 +00:00
Refresh_BufferCopy *copyParams,
Refresh_TransferOptions transferOption
2024-02-18 04:21:52 +00:00
);
void (*GetTransferData)(
2024-02-18 04:21:52 +00:00
Refresh_Renderer *driverData,
2024-02-23 17:42:31 +00:00
Refresh_TransferBuffer *transferBuffer,
2024-02-18 04:21:52 +00:00
void* data,
Refresh_BufferCopy *copyParams
);
2024-02-12 08:04:02 +00:00
/* Copy Pass */
void (*BeginCopyPass)(
2024-02-16 00:48:26 +00:00
Refresh_Renderer *driverData,
Refresh_CommandBuffer *commandBuffer
2024-02-12 08:04:02 +00:00
);
void (*UploadToTexture)(
2022-03-04 20:30:33 +00:00
Refresh_Renderer *driverData,
Refresh_CommandBuffer *commandBuffer,
2024-02-23 17:42:31 +00:00
Refresh_TransferBuffer *transferBuffer,
Refresh_TextureRegion *textureSlice,
Refresh_BufferImageCopy *copyParams,
Refresh_WriteOptions writeOption
2022-03-04 20:30:33 +00:00
);
2024-02-12 08:04:02 +00:00
void (*UploadToBuffer)(
2022-03-04 20:30:33 +00:00
Refresh_Renderer *driverData,
Refresh_CommandBuffer *commandBuffer,
2024-02-23 17:42:31 +00:00
Refresh_TransferBuffer *transferBuffer,
2024-02-12 08:04:02 +00:00
Refresh_GpuBuffer *gpuBuffer,
Refresh_BufferCopy *copyParams,
Refresh_WriteOptions writeOption
2022-03-04 20:30:33 +00:00
);
2024-02-12 08:04:02 +00:00
void (*CopyTextureToTexture)(
2022-02-25 21:42:11 +00:00
Refresh_Renderer *driverData,
Refresh_CommandBuffer *commandBuffer,
Refresh_TextureRegion *source,
Refresh_TextureRegion *destination,
Refresh_WriteOptions writeOption
2022-02-25 21:42:11 +00:00
);
2024-02-12 08:04:02 +00:00
void (*CopyBufferToBuffer)(
Refresh_Renderer *driverData,
Refresh_CommandBuffer *commandBuffer,
Refresh_GpuBuffer *source,
Refresh_GpuBuffer *destination,
Refresh_BufferCopy *copyParams,
Refresh_WriteOptions writeOption
2024-02-12 08:04:02 +00:00
);
void (*GenerateMipmaps)(
2022-02-25 21:42:11 +00:00
Refresh_Renderer *driverData,
Refresh_CommandBuffer *commandBuffer,
2024-02-12 08:04:02 +00:00
Refresh_Texture *texture
2022-02-25 21:42:11 +00:00
);
2024-02-12 08:04:02 +00:00
void (*EndCopyPass)(
2024-02-16 00:48:26 +00:00
Refresh_Renderer *driverData,
Refresh_CommandBuffer *commandBuffer
2024-02-12 08:04:02 +00:00
);
/* Submission/Presentation */
uint8_t (*ClaimWindow)(
Refresh_Renderer *driverData,
void *windowHandle,
Refresh_PresentMode presentMode
);
void (*UnclaimWindow)(
Refresh_Renderer *driverData,
void *windowHandle
);
2024-02-12 08:04:02 +00:00
void (*SetSwapchainPresentMode)(
2022-02-25 21:42:11 +00:00
Refresh_Renderer *driverData,
void *windowHandle,
2024-02-12 08:04:02 +00:00
Refresh_PresentMode presentMode
);
Refresh_TextureFormat (*GetSwapchainFormat)(
Refresh_Renderer *driverData,
void *windowHandle
2022-02-25 21:42:11 +00:00
);
2020-12-17 04:19:11 +00:00
2024-02-12 08:04:02 +00:00
Refresh_CommandBuffer* (*AcquireCommandBuffer)(
Refresh_Renderer *driverData
);
Refresh_Texture* (*AcquireSwapchainTexture)(
Refresh_Renderer *driverData,
2024-02-12 08:04:02 +00:00
Refresh_CommandBuffer *commandBuffer,
void *windowHandle,
2024-02-12 08:04:02 +00:00
uint32_t *pWidth,
uint32_t *pHeight
);
void (*Submit)(
2022-02-25 21:42:11 +00:00
Refresh_Renderer *driverData,
Refresh_CommandBuffer *commandBuffer
2022-02-25 21:42:11 +00:00
);
2020-12-21 23:44:43 +00:00
Refresh_Fence* (*SubmitAndAcquireFence)(
Refresh_Renderer *driverData,
Refresh_CommandBuffer *commandBuffer
);
void (*Wait)(
2022-02-25 21:42:11 +00:00
Refresh_Renderer *driverData
);
2021-01-03 05:07:51 +00:00
void (*WaitForFences)(
Refresh_Renderer *driverData,
uint8_t waitAll,
uint32_t fenceCount,
Refresh_Fence **pFences
);
int (*QueryFence)(
Refresh_Renderer *driverData,
Refresh_Fence *fence
);
void (*ReleaseFence)(
Refresh_Renderer *driverData,
Refresh_Fence *fence
);
2024-03-06 01:30:20 +00:00
void (*DownloadFromTexture)(
Refresh_Renderer *driverData,
Refresh_TextureRegion *textureSlice,
Refresh_TransferBuffer *transferBuffer,
Refresh_BufferImageCopy *copyParams,
Refresh_TransferOptions transferOption
);
void (*DownloadFromBuffer)(
Refresh_Renderer *driverData,
Refresh_GpuBuffer *gpuBuffer,
Refresh_TransferBuffer *transferBuffer,
Refresh_BufferCopy *copyParams,
Refresh_TransferOptions transferOption
);
2020-12-17 00:27:14 +00:00
/* Opaque pointer for the Driver */
2021-01-05 23:00:51 +00:00
Refresh_Renderer *driverData;
2020-12-17 00:27:14 +00:00
};
#define ASSIGN_DRIVER_FUNC(func, name) \
result->func = name##_##func;
#define ASSIGN_DRIVER(name) \
ASSIGN_DRIVER_FUNC(DestroyDevice, name) \
2022-02-25 21:42:11 +00:00
ASSIGN_DRIVER_FUNC(CreateComputePipeline, name) \
ASSIGN_DRIVER_FUNC(CreateGraphicsPipeline, name) \
ASSIGN_DRIVER_FUNC(CreateSampler, name) \
ASSIGN_DRIVER_FUNC(CreateShaderModule, name) \
ASSIGN_DRIVER_FUNC(CreateTexture, name) \
2024-02-16 00:34:52 +00:00
ASSIGN_DRIVER_FUNC(CreateGpuBuffer, name) \
2024-02-23 17:42:31 +00:00
ASSIGN_DRIVER_FUNC(CreateTransferBuffer, name) \
2022-02-25 21:42:11 +00:00
ASSIGN_DRIVER_FUNC(QueueDestroyTexture, name) \
ASSIGN_DRIVER_FUNC(QueueDestroySampler, name) \
2024-02-16 00:34:52 +00:00
ASSIGN_DRIVER_FUNC(QueueDestroyGpuBuffer, name) \
2024-02-23 17:42:31 +00:00
ASSIGN_DRIVER_FUNC(QueueDestroyTransferBuffer, name) \
2022-02-25 21:42:11 +00:00
ASSIGN_DRIVER_FUNC(QueueDestroyShaderModule, name) \
ASSIGN_DRIVER_FUNC(QueueDestroyComputePipeline, name) \
ASSIGN_DRIVER_FUNC(QueueDestroyGraphicsPipeline, name) \
ASSIGN_DRIVER_FUNC(BeginRenderPass, name) \
2024-02-16 00:34:52 +00:00
ASSIGN_DRIVER_FUNC(BindGraphicsPipeline, name) \
ASSIGN_DRIVER_FUNC(SetViewport, name) \
ASSIGN_DRIVER_FUNC(SetScissor, name) \
2022-02-25 21:42:11 +00:00
ASSIGN_DRIVER_FUNC(BindVertexBuffers, name) \
ASSIGN_DRIVER_FUNC(BindIndexBuffer, name) \
2024-02-16 00:34:52 +00:00
ASSIGN_DRIVER_FUNC(BindVertexSamplers, name) \
ASSIGN_DRIVER_FUNC(BindFragmentSamplers, name) \
ASSIGN_DRIVER_FUNC(PushVertexShaderUniforms, name) \
ASSIGN_DRIVER_FUNC(PushFragmentShaderUniforms, name) \
ASSIGN_DRIVER_FUNC(DrawInstancedPrimitives, name) \
ASSIGN_DRIVER_FUNC(DrawIndexedPrimitives, name) \
ASSIGN_DRIVER_FUNC(DrawPrimitives, name) \
ASSIGN_DRIVER_FUNC(DrawPrimitivesIndirect, name) \
ASSIGN_DRIVER_FUNC(EndRenderPass, name) \
ASSIGN_DRIVER_FUNC(BeginComputePass, name) \
2022-02-25 21:42:11 +00:00
ASSIGN_DRIVER_FUNC(BindComputePipeline, name) \
ASSIGN_DRIVER_FUNC(BindComputeBuffers, name) \
ASSIGN_DRIVER_FUNC(BindComputeTextures, name) \
2024-02-16 00:34:52 +00:00
ASSIGN_DRIVER_FUNC(PushComputeShaderUniforms, name) \
ASSIGN_DRIVER_FUNC(DispatchCompute, name) \
ASSIGN_DRIVER_FUNC(EndComputePass, name) \
ASSIGN_DRIVER_FUNC(SetTransferData, name) \
ASSIGN_DRIVER_FUNC(GetTransferData, name) \
2024-02-16 00:34:52 +00:00
ASSIGN_DRIVER_FUNC(BeginCopyPass, name) \
ASSIGN_DRIVER_FUNC(UploadToTexture, name) \
ASSIGN_DRIVER_FUNC(UploadToBuffer, name) \
ASSIGN_DRIVER_FUNC(DownloadFromTexture, name) \
ASSIGN_DRIVER_FUNC(DownloadFromBuffer, name) \
ASSIGN_DRIVER_FUNC(CopyTextureToTexture, name) \
ASSIGN_DRIVER_FUNC(CopyBufferToBuffer, name) \
ASSIGN_DRIVER_FUNC(GenerateMipmaps, name) \
ASSIGN_DRIVER_FUNC(EndCopyPass, name) \
ASSIGN_DRIVER_FUNC(ClaimWindow, name) \
ASSIGN_DRIVER_FUNC(UnclaimWindow, name) \
2024-02-16 00:34:52 +00:00
ASSIGN_DRIVER_FUNC(SetSwapchainPresentMode, name) \
ASSIGN_DRIVER_FUNC(GetSwapchainFormat, name) \
2022-02-25 21:42:11 +00:00
ASSIGN_DRIVER_FUNC(AcquireCommandBuffer, name) \
ASSIGN_DRIVER_FUNC(AcquireSwapchainTexture, name) \
2022-02-25 21:42:11 +00:00
ASSIGN_DRIVER_FUNC(Submit, name) \
ASSIGN_DRIVER_FUNC(SubmitAndAcquireFence, name) \
ASSIGN_DRIVER_FUNC(Wait, name) \
ASSIGN_DRIVER_FUNC(WaitForFences, name) \
ASSIGN_DRIVER_FUNC(QueryFence, name) \
ASSIGN_DRIVER_FUNC(ReleaseFence, name)
2020-12-17 00:27:14 +00:00
2021-01-05 23:00:51 +00:00
typedef struct Refresh_Driver
2020-12-17 00:27:14 +00:00
{
const char *Name;
uint8_t (*PrepareDriver)(uint32_t *flags);
2021-01-05 23:00:51 +00:00
Refresh_Device* (*CreateDevice)(
2022-02-25 21:42:11 +00:00
uint8_t debugMode
2020-12-17 00:27:14 +00:00
);
2021-01-05 23:00:51 +00:00
} Refresh_Driver;
2020-12-17 00:27:14 +00:00
2021-01-05 23:00:51 +00:00
extern Refresh_Driver VulkanDriver;
extern Refresh_Driver D3D11Driver;
extern Refresh_Driver PS5Driver;
2020-12-17 00:27:14 +00:00
2020-12-17 19:44:34 +00:00
#endif /* REFRESH_DRIVER_H */
2020-12-17 00:27:14 +00:00
/* vim: set noexpandtab shiftwidth=8 tabstop=8: */