Refresh/include/Refresh.h

1430 lines
41 KiB
C
Raw Normal View History

2022-03-02 19:10:28 +00:00
/* Refresh - XNA-inspired 3D Graphics Library with modern capabilities
2020-12-15 23:00:46 +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>
*
*/
2020-12-16 22:59:14 +00:00
#include <stddef.h>
2020-12-15 23:00:46 +00:00
#ifndef REFRESH_H
#define REFRESH_H
#ifdef _WIN32
#define REFRESHAPI __declspec(dllexport)
#define REFRESHCALL __cdecl
#else
#define REFRESHAPI
#define REFRESHCALL
#endif
/* -Wpedantic nameless union/struct silencing */
#ifndef REFRESHNAMELESS
#ifdef __GNUC__
#define REFRESHNAMELESS __extension__
#else
#define REFRESHNAMELESS
#endif /* __GNUC__ */
#endif /* REFRESHNAMELESS */
#include <stdint.h>
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
2022-03-04 01:31:33 +00:00
/* Version API */
#define REFRESH_MAJOR_VERSION 1
2023-09-19 06:12:01 +00:00
#define REFRESH_MINOR_VERSION 15
2024-01-16 06:34:31 +00:00
#define REFRESH_PATCH_VERSION 4
2022-03-04 01:31:33 +00:00
#define REFRESH_COMPILED_VERSION ( \
(REFRESH_MAJOR_VERSION * 100 * 100) + \
(REFRESH_MINOR_VERSION * 100) + \
(REFRESH_PATCH_VERSION) \
)
REFRESHAPI uint32_t Refresh_LinkedVersion(void);
2020-12-15 23:00:46 +00:00
/* Type Declarations */
2021-01-05 23:00:51 +00:00
typedef struct Refresh_Device Refresh_Device;
2024-02-12 08:04:02 +00:00
typedef struct Refresh_GpuBuffer Refresh_GpuBuffer;
2024-02-23 17:42:31 +00:00
typedef struct Refresh_TransferBuffer Refresh_TransferBuffer;
2021-01-05 23:00:51 +00:00
typedef struct Refresh_Texture Refresh_Texture;
typedef struct Refresh_Sampler Refresh_Sampler;
typedef struct Refresh_ShaderModule Refresh_ShaderModule;
typedef struct Refresh_ComputePipeline Refresh_ComputePipeline;
typedef struct Refresh_GraphicsPipeline Refresh_GraphicsPipeline;
typedef struct Refresh_CommandBuffer Refresh_CommandBuffer;
typedef struct Refresh_Fence Refresh_Fence;
2021-01-05 23:00:51 +00:00
typedef enum Refresh_PresentMode
2020-12-17 03:50:31 +00:00
{
REFRESH_PRESENTMODE_IMMEDIATE,
REFRESH_PRESENTMODE_MAILBOX,
REFRESH_PRESENTMODE_FIFO,
REFRESH_PRESENTMODE_FIFO_RELAXED
2021-01-05 23:00:51 +00:00
} Refresh_PresentMode;
2020-12-17 03:50:31 +00:00
2021-01-05 23:00:51 +00:00
typedef enum Refresh_PrimitiveType
2020-12-16 02:29:26 +00:00
{
2022-02-25 21:42:11 +00:00
REFRESH_PRIMITIVETYPE_POINTLIST,
2020-12-16 02:29:26 +00:00
REFRESH_PRIMITIVETYPE_LINELIST,
REFRESH_PRIMITIVETYPE_LINESTRIP,
REFRESH_PRIMITIVETYPE_TRIANGLELIST,
2020-12-17 00:27:14 +00:00
REFRESH_PRIMITIVETYPE_TRIANGLESTRIP
2021-01-05 23:00:51 +00:00
} Refresh_PrimitiveType;
2020-12-16 02:29:26 +00:00
2021-01-05 23:00:51 +00:00
typedef enum Refresh_LoadOp
2020-12-16 02:08:49 +00:00
{
2022-02-25 21:42:11 +00:00
REFRESH_LOADOP_LOAD,
REFRESH_LOADOP_CLEAR,
REFRESH_LOADOP_DONT_CARE
2021-01-05 23:00:51 +00:00
} Refresh_LoadOp;
2020-12-16 02:08:49 +00:00
2021-01-05 23:00:51 +00:00
typedef enum Refresh_StoreOp
2020-12-16 02:08:49 +00:00
{
2022-02-25 21:42:11 +00:00
REFRESH_STOREOP_STORE,
REFRESH_STOREOP_DONT_CARE
2021-01-05 23:00:51 +00:00
} Refresh_StoreOp;
2020-12-15 23:00:46 +00:00
2021-01-05 23:00:51 +00:00
typedef enum Refresh_IndexElementSize
2020-12-15 23:00:46 +00:00
{
2022-02-25 21:42:11 +00:00
REFRESH_INDEXELEMENTSIZE_16BIT,
REFRESH_INDEXELEMENTSIZE_32BIT
2021-01-05 23:00:51 +00:00
} Refresh_IndexElementSize;
2020-12-15 23:00:46 +00:00
typedef enum Refresh_TextureFormat
2021-01-03 22:53:12 +00:00
{
/* Unsigned Normalized Float Color Formats */
2022-02-25 21:42:11 +00:00
REFRESH_TEXTUREFORMAT_R8G8B8A8,
REFRESH_TEXTUREFORMAT_B8G8R8A8,
2022-02-25 21:42:11 +00:00
REFRESH_TEXTUREFORMAT_R5G6B5,
REFRESH_TEXTUREFORMAT_A1R5G5B5,
REFRESH_TEXTUREFORMAT_B4G4R4A4,
REFRESH_TEXTUREFORMAT_A2R10G10B10,
REFRESH_TEXTUREFORMAT_R16G16,
REFRESH_TEXTUREFORMAT_R16G16B16A16,
REFRESH_TEXTUREFORMAT_R8,
/* Compressed Unsigned Normalized Float Color Formats */
2022-02-25 21:42:11 +00:00
REFRESH_TEXTUREFORMAT_BC1,
REFRESH_TEXTUREFORMAT_BC2,
REFRESH_TEXTUREFORMAT_BC3,
2022-05-12 04:16:24 +00:00
REFRESH_TEXTUREFORMAT_BC7,
/* Signed Normalized Float Color Formats */
2022-02-25 21:42:11 +00:00
REFRESH_TEXTUREFORMAT_R8G8_SNORM,
REFRESH_TEXTUREFORMAT_R8G8B8A8_SNORM,
/* Signed Float Color Formats */
2022-02-25 21:42:11 +00:00
REFRESH_TEXTUREFORMAT_R16_SFLOAT,
REFRESH_TEXTUREFORMAT_R16G16_SFLOAT,
REFRESH_TEXTUREFORMAT_R16G16B16A16_SFLOAT,
REFRESH_TEXTUREFORMAT_R32_SFLOAT,
REFRESH_TEXTUREFORMAT_R32G32_SFLOAT,
REFRESH_TEXTUREFORMAT_R32G32B32A32_SFLOAT,
/* Unsigned Integer Color Formats */
REFRESH_TEXTUREFORMAT_R8_UINT,
REFRESH_TEXTUREFORMAT_R8G8_UINT,
REFRESH_TEXTUREFORMAT_R8G8B8A8_UINT,
REFRESH_TEXTUREFORMAT_R16_UINT,
REFRESH_TEXTUREFORMAT_R16G16_UINT,
REFRESH_TEXTUREFORMAT_R16G16B16A16_UINT,
/* Depth Formats */
REFRESH_TEXTUREFORMAT_D16_UNORM,
REFRESH_TEXTUREFORMAT_D32_SFLOAT,
2022-02-25 21:42:11 +00:00
REFRESH_TEXTUREFORMAT_D16_UNORM_S8_UINT,
REFRESH_TEXTUREFORMAT_D32_SFLOAT_S8_UINT
} Refresh_TextureFormat;
2020-12-15 23:00:46 +00:00
2021-01-05 23:00:51 +00:00
typedef enum Refresh_TextureUsageFlagBits
2020-12-28 20:15:17 +00:00
{
REFRESH_TEXTUREUSAGE_SAMPLER_BIT = 0x00000001,
REFRESH_TEXTUREUSAGE_COLOR_TARGET_BIT = 0x00000002,
REFRESH_TEXTUREUSAGE_DEPTH_STENCIL_TARGET_BIT = 0x00000004,
REFRESH_TEXTUREUSAGE_COMPUTE_BIT = 0X00000008
2021-01-05 23:00:51 +00:00
} Refresh_TextureUsageFlagBits;
2021-01-05 23:00:51 +00:00
typedef uint32_t Refresh_TextureUsageFlags;
2020-12-28 20:15:17 +00:00
2021-01-05 23:00:51 +00:00
typedef enum Refresh_SampleCount
2020-12-17 08:19:02 +00:00
{
REFRESH_SAMPLECOUNT_1,
REFRESH_SAMPLECOUNT_2,
REFRESH_SAMPLECOUNT_4,
Miscellaneous API changes + more MSAA fixes (#26) **Breaking API Changes** * Removed `REFRESH_SAMPLECOUNT_16/32/64`, since hardware support for these sample counts is generally poor (and completely non-existent with MoltenVK and certain consoles). * Removed unused `sampleCount` parameter from `Refresh_TextureCreateInfo`. * Removed `sampleCount` parameter from `Refresh_ColorAttachmentDescription`. The existence of this parameter meant you had to sync up three different sample count values (render pass, pipeline, and color attachment description) whenever you wanted to use multisampling. However, Vulkan requires that all color attachments in a given pipeline _must_ match the pipeline's sample count anyway, so we can assume all color attachments will use the pipeline's sample count. * Removed the `renderArea` parameter from `Refresh_BeginRenderPass()` since it didn't serve much practical purpose and slightly complicated things on the MoonWorks managed side. **Behavior Changes** * When creating a render pass or graphics pipeline, the requested multisample count will be converted into a sample count that's actually supported by the GPU. For example, if you request 8x MSAA on a device that only supports up to 4x MSAA, it will silently fall back to 4x MSAA. * All color attachments are now forced to have an internal store op of `STORE`, even if `REFRESH_STORE_OP_DONTCARE` is specified. The one exception is internal multisample textures -- if `DONTCARE` is used, those textures will be discarded to save on bandwidth. (Their resolve textures will still be stored.) * The RenderPass hashing logic was updated so that it would still work correctly with the removal of `Refresh_ColorAttachmentDescription.sampleCount`. **Bug Fixes** * Fixed bugs where multisampling logic wasn't kicking in for certain sample counts due to incorrect enum comparisons. Co-authored-by: Caleb Cornett <caleb.cornett@outlook.com> Reviewed-on: https://gitea.moonside.games/MoonsideGames/Refresh/pulls/26 Co-authored-by: TheSpydog <thespydog@noreply.example.org> Co-committed-by: TheSpydog <thespydog@noreply.example.org>
2022-11-08 19:09:21 +00:00
REFRESH_SAMPLECOUNT_8
2021-01-05 23:00:51 +00:00
} Refresh_SampleCount;
2020-12-17 08:19:02 +00:00
2021-01-05 23:00:51 +00:00
typedef enum Refresh_CubeMapFace
2020-12-15 23:00:46 +00:00
{
2022-02-25 21:42:11 +00:00
REFRESH_CUBEMAPFACE_POSITIVEX,
REFRESH_CUBEMAPFACE_NEGATIVEX,
REFRESH_CUBEMAPFACE_POSITIVEY,
REFRESH_CUBEMAPFACE_NEGATIVEY,
REFRESH_CUBEMAPFACE_POSITIVEZ,
REFRESH_CUBEMAPFACE_NEGATIVEZ
2021-01-05 23:00:51 +00:00
} Refresh_CubeMapFace;
2020-12-15 23:00:46 +00:00
2021-01-05 23:00:51 +00:00
typedef enum Refresh_BufferUsageFlagBits
2020-12-31 04:39:47 +00:00
{
REFRESH_BUFFERUSAGE_VERTEX_BIT = 0x00000001,
REFRESH_BUFFERUSAGE_INDEX_BIT = 0x00000002,
REFRESH_BUFFERUSAGE_COMPUTE_BIT = 0x00000004,
REFRESH_BUFFERUSAGE_INDIRECT_BIT = 0x00000008
2021-01-05 23:00:51 +00:00
} Refresh_BufferUsageFlagBits;
2020-12-31 04:39:47 +00:00
2021-01-05 23:00:51 +00:00
typedef uint32_t Refresh_BufferUsageFlags;
2020-12-31 04:39:47 +00:00
2021-01-05 23:00:51 +00:00
typedef enum Refresh_VertexElementFormat
2020-12-16 20:11:43 +00:00
{
2022-03-17 21:41:16 +00:00
REFRESH_VERTEXELEMENTFORMAT_UINT,
REFRESH_VERTEXELEMENTFORMAT_FLOAT,
2020-12-16 20:11:43 +00:00
REFRESH_VERTEXELEMENTFORMAT_VECTOR2,
REFRESH_VERTEXELEMENTFORMAT_VECTOR3,
REFRESH_VERTEXELEMENTFORMAT_VECTOR4,
REFRESH_VERTEXELEMENTFORMAT_COLOR,
REFRESH_VERTEXELEMENTFORMAT_BYTE4,
REFRESH_VERTEXELEMENTFORMAT_SHORT2,
REFRESH_VERTEXELEMENTFORMAT_SHORT4,
REFRESH_VERTEXELEMENTFORMAT_NORMALIZEDSHORT2,
REFRESH_VERTEXELEMENTFORMAT_NORMALIZEDSHORT4,
REFRESH_VERTEXELEMENTFORMAT_HALFVECTOR2,
REFRESH_VERTEXELEMENTFORMAT_HALFVECTOR4
2021-01-05 23:00:51 +00:00
} Refresh_VertexElementFormat;
2020-12-16 20:11:43 +00:00
2021-01-05 23:00:51 +00:00
typedef enum Refresh_VertexInputRate
2020-12-16 20:11:43 +00:00
{
REFRESH_VERTEXINPUTRATE_VERTEX = 0,
REFRESH_VERTEXINPUTRATE_INSTANCE = 1
2021-01-05 23:00:51 +00:00
} Refresh_VertexInputRate;
2020-12-16 20:11:43 +00:00
2021-01-05 23:00:51 +00:00
typedef enum Refresh_FillMode
2020-12-16 20:11:43 +00:00
{
REFRESH_FILLMODE_FILL,
2022-03-02 19:10:28 +00:00
REFRESH_FILLMODE_LINE
2021-01-05 23:00:51 +00:00
} Refresh_FillMode;
2020-12-16 20:11:43 +00:00
2021-01-05 23:00:51 +00:00
typedef enum Refresh_CullMode
2020-12-16 20:11:43 +00:00
{
REFRESH_CULLMODE_NONE,
REFRESH_CULLMODE_FRONT,
2022-03-02 19:10:28 +00:00
REFRESH_CULLMODE_BACK
2021-01-05 23:00:51 +00:00
} Refresh_CullMode;
2020-12-16 20:11:43 +00:00
2021-01-05 23:00:51 +00:00
typedef enum Refresh_FrontFace
2020-12-16 20:11:43 +00:00
{
REFRESH_FRONTFACE_COUNTER_CLOCKWISE,
REFRESH_FRONTFACE_CLOCKWISE
2021-01-05 23:00:51 +00:00
} Refresh_FrontFace;
2020-12-16 20:11:43 +00:00
2021-01-05 23:00:51 +00:00
typedef enum Refresh_CompareOp
2020-12-16 20:11:43 +00:00
{
REFRESH_COMPAREOP_NEVER,
REFRESH_COMPAREOP_LESS,
REFRESH_COMPAREOP_EQUAL,
REFRESH_COMPAREOP_LESS_OR_EQUAL,
REFRESH_COMPAREOP_GREATER,
REFRESH_COMPAREOP_NOT_EQUAL,
REFRESH_COMPAREOP_GREATER_OR_EQUAL,
REFRESH_COMPAREOP_ALWAYS
2021-01-05 23:00:51 +00:00
} Refresh_CompareOp;
2020-12-16 20:11:43 +00:00
2021-01-05 23:00:51 +00:00
typedef enum Refresh_StencilOp
2020-12-16 20:11:43 +00:00
{
REFRESH_STENCILOP_KEEP,
REFRESH_STENCILOP_ZERO,
REFRESH_STENCILOP_REPLACE,
REFRESH_STENCILOP_INCREMENT_AND_CLAMP,
REFRESH_STENCILOP_DECREMENT_AND_CLAMP,
REFRESH_STENCILOP_INVERT,
REFRESH_STENCILOP_INCREMENT_AND_WRAP,
REFRESH_STENCILOP_DECREMENT_AND_WRAP
2021-01-05 23:00:51 +00:00
} Refresh_StencilOp;
2020-12-16 20:11:43 +00:00
2021-01-05 23:00:51 +00:00
typedef enum Refresh_BlendOp
2020-12-16 20:11:43 +00:00
{
2020-12-17 19:40:49 +00:00
REFRESH_BLENDOP_ADD,
REFRESH_BLENDOP_SUBTRACT,
REFRESH_BLENDOP_REVERSE_SUBTRACT,
REFRESH_BLENDOP_MIN,
REFRESH_BLENDOP_MAX
2021-01-05 23:00:51 +00:00
} Refresh_BlendOp;
2020-12-16 20:11:43 +00:00
2021-01-05 23:00:51 +00:00
typedef enum Refresh_BlendFactor
2020-12-16 20:11:43 +00:00
{
2022-03-02 19:10:28 +00:00
REFRESH_BLENDFACTOR_ZERO,
REFRESH_BLENDFACTOR_ONE,
REFRESH_BLENDFACTOR_SRC_COLOR,
REFRESH_BLENDFACTOR_ONE_MINUS_SRC_COLOR,
REFRESH_BLENDFACTOR_DST_COLOR,
REFRESH_BLENDFACTOR_ONE_MINUS_DST_COLOR,
REFRESH_BLENDFACTOR_SRC_ALPHA,
REFRESH_BLENDFACTOR_ONE_MINUS_SRC_ALPHA,
REFRESH_BLENDFACTOR_DST_ALPHA,
REFRESH_BLENDFACTOR_ONE_MINUS_DST_ALPHA,
REFRESH_BLENDFACTOR_CONSTANT_COLOR,
REFRESH_BLENDFACTOR_ONE_MINUS_CONSTANT_COLOR,
REFRESH_BLENDFACTOR_SRC_ALPHA_SATURATE
2021-01-05 23:00:51 +00:00
} Refresh_BlendFactor;
2020-12-16 20:11:43 +00:00
2021-01-05 23:00:51 +00:00
typedef enum Refresh_ColorComponentFlagBits
2020-12-16 20:11:43 +00:00
{
2022-02-25 21:42:11 +00:00
REFRESH_COLORCOMPONENT_R_BIT = 0x00000001,
REFRESH_COLORCOMPONENT_G_BIT = 0x00000002,
REFRESH_COLORCOMPONENT_B_BIT = 0x00000004,
REFRESH_COLORCOMPONENT_A_BIT = 0x00000008
2021-01-05 23:00:51 +00:00
} Refresh_ColorComponentFlagBits;
2020-12-16 20:11:43 +00:00
2021-01-05 23:00:51 +00:00
typedef uint32_t Refresh_ColorComponentFlags;
2020-12-16 20:11:43 +00:00
2021-01-05 23:00:51 +00:00
typedef enum Refresh_Filter
2020-12-16 20:47:54 +00:00
{
2021-01-03 21:01:29 +00:00
REFRESH_FILTER_NEAREST,
2022-03-02 19:10:28 +00:00
REFRESH_FILTER_LINEAR
2021-01-05 23:00:51 +00:00
} Refresh_Filter;
2020-12-16 20:47:54 +00:00
2021-01-05 23:00:51 +00:00
typedef enum Refresh_SamplerMipmapMode
2020-12-16 20:47:54 +00:00
{
REFRESH_SAMPLERMIPMAPMODE_NEAREST,
REFRESH_SAMPLERMIPMAPMODE_LINEAR
2021-01-05 23:00:51 +00:00
} Refresh_SamplerMipmapMode;
2020-12-16 20:47:54 +00:00
2021-01-05 23:00:51 +00:00
typedef enum Refresh_SamplerAddressMode
2020-12-16 20:47:54 +00:00
{
REFRESH_SAMPLERADDRESSMODE_REPEAT,
REFRESH_SAMPLERADDRESSMODE_MIRRORED_REPEAT,
REFRESH_SAMPLERADDRESSMODE_CLAMP_TO_EDGE,
REFRESH_SAMPLERADDRESSMODE_CLAMP_TO_BORDER
2021-01-05 23:00:51 +00:00
} Refresh_SamplerAddressMode;
2020-12-16 20:47:54 +00:00
2021-01-05 23:53:16 +00:00
/* FIXME: we should probably make a library-level decision about color types */
2021-01-05 23:00:51 +00:00
typedef enum Refresh_BorderColor
2020-12-16 20:47:54 +00:00
{
2022-03-02 19:10:28 +00:00
REFRESH_BORDERCOLOR_FLOAT_TRANSPARENT_BLACK,
REFRESH_BORDERCOLOR_INT_TRANSPARENT_BLACK,
REFRESH_BORDERCOLOR_FLOAT_OPAQUE_BLACK,
REFRESH_BORDERCOLOR_INT_OPAQUE_BLACK,
REFRESH_BORDERCOLOR_FLOAT_OPAQUE_WHITE,
REFRESH_BORDERCOLOR_INT_OPAQUE_WHITE
2021-01-05 23:00:51 +00:00
} Refresh_BorderColor;
2020-12-16 20:47:54 +00:00
typedef enum Refresh_TransferOptions
2024-02-18 04:21:52 +00:00
{
REFRESH_TRANSFEROPTIONS_SAFEDISCARD,
REFRESH_TRANSFEROPTIONS_OVERWRITE
} Refresh_TransferOptions;
typedef enum Refresh_WriteOptions
{
REFRESH_WRITEOPTIONS_SAFEDISCARD,
REFRESH_WRITEOPTIONS_SAFEOVERWRITE
} Refresh_WriteOptions;
2024-02-18 04:21:52 +00:00
typedef enum Refresh_Backend
{
REFRESH_BACKEND_DONTCARE,
REFRESH_BACKEND_VULKAN,
REFRESH_BACKEND_PS5,
REFRESH_BACKEND_INVALID
} Refresh_Backend;
2020-12-15 23:27:06 +00:00
/* Structures */
2020-12-15 23:00:46 +00:00
2021-01-05 23:00:51 +00:00
typedef struct Refresh_DepthStencilValue
2020-12-16 21:28:06 +00:00
{
float depth;
uint32_t stencil;
2021-01-05 23:00:51 +00:00
} Refresh_DepthStencilValue;
2020-12-16 21:28:06 +00:00
2021-01-05 23:00:51 +00:00
typedef struct Refresh_Rect
2020-12-16 02:29:26 +00:00
{
int32_t x;
int32_t y;
int32_t w;
int32_t h;
2021-01-05 23:00:51 +00:00
} Refresh_Rect;
2020-12-16 02:29:26 +00:00
2021-01-05 23:00:51 +00:00
typedef struct Refresh_Vec4
2020-12-16 02:29:26 +00:00
{
float x;
float y;
float z;
float w;
2021-01-05 23:00:51 +00:00
} Refresh_Vec4;
2020-12-16 02:29:26 +00:00
2021-01-05 23:00:51 +00:00
typedef struct Refresh_Viewport
2020-12-16 02:29:26 +00:00
{
float x;
float y;
float w;
float h;
2020-12-16 02:29:26 +00:00
float minDepth;
float maxDepth;
2021-01-05 23:00:51 +00:00
} Refresh_Viewport;
2020-12-16 02:29:26 +00:00
2021-01-05 23:00:51 +00:00
typedef struct Refresh_TextureSlice
2020-12-19 00:39:03 +00:00
{
2021-01-05 23:00:51 +00:00
Refresh_Texture *texture;
2024-02-12 08:04:02 +00:00
uint32_t mipLevel;
uint32_t layer;
} Refresh_TextureSlice;
typedef struct Refresh_TextureRegion
{
Refresh_TextureSlice textureSlice;
2024-02-12 08:04:02 +00:00
uint32_t x;
uint32_t y;
uint32_t z;
uint32_t w;
uint32_t h;
uint32_t d;
} Refresh_TextureRegion;
2020-12-19 00:39:03 +00:00
2024-02-12 08:04:02 +00:00
typedef struct Refresh_BufferImageCopy
{
uint32_t bufferOffset;
uint32_t bufferStride;
uint32_t bufferImageHeight;
} Refresh_BufferImageCopy;
typedef struct Refresh_BufferCopy
{
uint32_t srcOffset;
uint32_t dstOffset;
uint32_t size;
} Refresh_BufferCopy;
typedef struct Refresh_IndirectDrawCommand
{
uint32_t vertexCount;
uint32_t instanceCount;
uint32_t firstVertex;
uint32_t firstInstance;
} Refresh_IndirectDrawCommand;
2020-12-16 20:11:43 +00:00
/* State structures */
2021-01-05 23:00:51 +00:00
typedef struct Refresh_SamplerStateCreateInfo
2020-12-16 20:47:54 +00:00
{
2021-01-05 23:00:51 +00:00
Refresh_Filter minFilter;
Refresh_Filter magFilter;
Refresh_SamplerMipmapMode mipmapMode;
Refresh_SamplerAddressMode addressModeU;
Refresh_SamplerAddressMode addressModeV;
Refresh_SamplerAddressMode addressModeW;
2020-12-16 20:47:54 +00:00
float mipLodBias;
uint8_t anisotropyEnable;
float maxAnisotropy;
uint8_t compareEnable;
2021-01-05 23:00:51 +00:00
Refresh_CompareOp compareOp;
2020-12-16 20:47:54 +00:00
float minLod;
float maxLod;
2021-01-05 23:00:51 +00:00
Refresh_BorderColor borderColor;
} Refresh_SamplerStateCreateInfo;
2020-12-16 20:47:54 +00:00
2021-01-05 23:00:51 +00:00
typedef struct Refresh_VertexBinding
2020-12-16 02:29:26 +00:00
{
2020-12-16 20:11:43 +00:00
uint32_t binding;
uint32_t stride;
2021-01-05 23:00:51 +00:00
Refresh_VertexInputRate inputRate;
} Refresh_VertexBinding;
2020-12-16 20:11:43 +00:00
2021-01-05 23:00:51 +00:00
typedef struct Refresh_VertexAttribute
2020-12-16 20:11:43 +00:00
{
uint32_t location;
uint32_t binding;
2021-01-05 23:00:51 +00:00
Refresh_VertexElementFormat format;
2020-12-16 20:11:43 +00:00
uint32_t offset;
2021-01-05 23:00:51 +00:00
} Refresh_VertexAttribute;
2020-12-16 20:11:43 +00:00
2021-01-05 23:00:51 +00:00
typedef struct Refresh_VertexInputState
2020-12-16 20:11:43 +00:00
{
2021-01-05 23:00:51 +00:00
const Refresh_VertexBinding *vertexBindings;
2020-12-16 20:11:43 +00:00
uint32_t vertexBindingCount;
2021-01-05 23:00:51 +00:00
const Refresh_VertexAttribute *vertexAttributes;
2020-12-16 20:11:43 +00:00
uint32_t vertexAttributeCount;
2021-01-05 23:00:51 +00:00
} Refresh_VertexInputState;
2020-12-16 02:29:26 +00:00
2021-01-05 23:00:51 +00:00
typedef struct Refresh_StencilOpState
2020-12-15 23:00:46 +00:00
{
2021-01-05 23:00:51 +00:00
Refresh_StencilOp failOp;
Refresh_StencilOp passOp;
Refresh_StencilOp depthFailOp;
Refresh_CompareOp compareOp;
} Refresh_StencilOpState;
2020-12-16 20:11:43 +00:00
typedef struct Refresh_ColorAttachmentBlendState
2020-12-16 20:11:43 +00:00
{
uint8_t blendEnable;
2021-01-05 23:00:51 +00:00
Refresh_BlendFactor srcColorBlendFactor;
Refresh_BlendFactor dstColorBlendFactor;
Refresh_BlendOp colorBlendOp;
Refresh_BlendFactor srcAlphaBlendFactor;
Refresh_BlendFactor dstAlphaBlendFactor;
Refresh_BlendOp alphaBlendOp;
Refresh_ColorComponentFlags colorWriteMask;
} Refresh_ColorAttachmentBlendState;
2021-01-05 23:00:51 +00:00
typedef struct Refresh_ShaderModuleCreateInfo
2020-12-16 22:59:14 +00:00
{
size_t codeSize;
const uint32_t *byteCode;
2021-01-05 23:00:51 +00:00
} Refresh_ShaderModuleCreateInfo;
2020-12-16 22:59:14 +00:00
typedef struct Refresh_TextureCreateInfo
{
uint32_t width;
uint32_t height;
uint32_t depth;
2021-01-14 10:05:21 +00:00
uint8_t isCube;
uint32_t layerCount;
uint32_t levelCount;
Refresh_SampleCount sampleCount;
Refresh_TextureFormat format;
Refresh_TextureUsageFlags usageFlags;
} Refresh_TextureCreateInfo;
2020-12-16 20:11:43 +00:00
/* Pipeline state structures */
2022-03-02 19:22:52 +00:00
typedef struct Refresh_GraphicsShaderInfo
2020-12-16 22:53:34 +00:00
{
2021-01-05 23:00:51 +00:00
Refresh_ShaderModule *shaderModule;
2020-12-16 22:53:34 +00:00
const char* entryPointName;
2024-02-12 19:00:06 +00:00
uint32_t uniformBufferSize;
2022-03-02 19:10:28 +00:00
uint32_t samplerBindingCount;
2022-03-02 19:22:52 +00:00
} Refresh_GraphicsShaderInfo;
typedef struct Refresh_ComputeShaderInfo
{
Refresh_ShaderModule* shaderModule;
const char* entryPointName;
2024-02-12 19:00:06 +00:00
uint32_t uniformBufferSize;
2022-03-02 19:22:52 +00:00
uint32_t bufferBindingCount;
uint32_t imageBindingCount;
} Refresh_ComputeShaderInfo;
2020-12-16 22:53:34 +00:00
2021-01-05 23:00:51 +00:00
typedef struct Refresh_RasterizerState
2020-12-16 20:11:43 +00:00
{
2021-01-05 23:00:51 +00:00
Refresh_FillMode fillMode;
Refresh_CullMode cullMode;
Refresh_FrontFace frontFace;
2020-12-16 20:11:43 +00:00
uint8_t depthBiasEnable;
float depthBiasConstantFactor;
float depthBiasClamp;
float depthBiasSlopeFactor;
2021-01-05 23:00:51 +00:00
} Refresh_RasterizerState;
2020-12-16 20:11:43 +00:00
2021-01-05 23:00:51 +00:00
typedef struct Refresh_MultisampleState
2020-12-16 20:11:43 +00:00
{
2021-01-05 23:00:51 +00:00
Refresh_SampleCount multisampleCount;
2021-01-06 02:05:01 +00:00
uint32_t sampleMask;
2021-01-05 23:00:51 +00:00
} Refresh_MultisampleState;
2020-12-16 20:11:43 +00:00
2021-01-05 23:00:51 +00:00
typedef struct Refresh_DepthStencilState
2020-12-16 20:11:43 +00:00
{
uint8_t depthTestEnable;
uint8_t depthWriteEnable;
2021-01-05 23:00:51 +00:00
Refresh_CompareOp compareOp;
2020-12-16 20:11:43 +00:00
uint8_t depthBoundsTestEnable;
uint8_t stencilTestEnable;
2024-03-03 07:00:44 +00:00
Refresh_StencilOpState backStencilState;
Refresh_StencilOpState frontStencilState;
uint32_t compareMask;
uint32_t writeMask;
uint32_t reference;
2020-12-16 20:11:43 +00:00
float minDepthBounds;
float maxDepthBounds;
2021-01-05 23:00:51 +00:00
} Refresh_DepthStencilState;
2020-12-16 20:11:43 +00:00
typedef struct Refresh_ColorAttachmentDescription
{
Refresh_TextureFormat format;
Refresh_ColorAttachmentBlendState blendState;
} Refresh_ColorAttachmentDescription;
typedef struct Refresh_GraphicsPipelineAttachmentInfo
{
Refresh_ColorAttachmentDescription *colorAttachmentDescriptions;
uint32_t colorAttachmentCount;
uint8_t hasDepthStencilAttachment;
Refresh_TextureFormat depthStencilFormat;
} Refresh_GraphicsPipelineAttachmentInfo;
2021-01-05 23:00:51 +00:00
typedef struct Refresh_GraphicsPipelineCreateInfo
2020-12-16 22:53:34 +00:00
{
2022-03-02 19:22:52 +00:00
Refresh_GraphicsShaderInfo vertexShaderInfo;
Refresh_GraphicsShaderInfo fragmentShaderInfo;
2021-01-05 23:00:51 +00:00
Refresh_VertexInputState vertexInputState;
Refresh_PrimitiveType primitiveType;
2021-01-05 23:00:51 +00:00
Refresh_RasterizerState rasterizerState;
Refresh_MultisampleState multisampleState;
Refresh_DepthStencilState depthStencilState;
Refresh_GraphicsPipelineAttachmentInfo attachmentInfo;
2022-03-02 19:10:28 +00:00
float blendConstants[4];
2021-01-05 23:00:51 +00:00
} Refresh_GraphicsPipelineCreateInfo;
/* Render pass structures */
/* These structures define how textures will be read/written in a render pass.
*
* loadOp: Determines what is done with the texture slice at the beginning of the render pass.
*
* LOAD:
* Loads the data currently in the texture slice.
*
* CLEAR:
* Clears the texture slice to a single color.
*
* DONT_CARE:
* The driver will do whatever it wants with the texture slice memory.
* This is a good option if you know that every single pixel will be touched in the render pass.
*
* storeOp: Determines what is done with the texture slice at the end of the render pass.
*
* STORE:
* Stores the results of the render pass in the texture slice.
*
* DONT_CARE:
* The driver will do whatever it wants with the texture slice memory.
* This is often a good option for depth/stencil textures.
*
*
* writeOption is ignored if loadOp is LOAD and is implicitly assumed to be SAFEOVERWRITE.
* Interleaving LOAD and SAFEDISCARD successively on the same texture (not slice!) is undefined behavior.
*
* writeOption:
* SAFEDISCARD:
* If this texture slice has been used in commands that have not completed,
* this option will prevent a data dependency at the cost of increased memory usage.
* You may NOT assume that any of the previous texture data is retained.
* If the texture slice was not in use, this option is equivalent to SAFEOVERWRITE.
* This is a good option to prevent stalls when frequently reusing a texture slice in rendering.
*
* SAFEOVERWRITE:
* Overwrites the data safely using a GPU memory barrier.
*/
typedef struct Refresh_ColorAttachmentInfo
{
Refresh_TextureSlice textureSlice;
Refresh_Vec4 clearColor; /* Can be ignored by RenderPass if CLEAR is not used */
Refresh_LoadOp loadOp;
Refresh_StoreOp storeOp;
Refresh_WriteOptions writeOption;
} Refresh_ColorAttachmentInfo;
typedef struct Refresh_DepthStencilAttachmentInfo
2020-12-16 21:28:06 +00:00
{
Refresh_TextureSlice textureSlice;
Refresh_DepthStencilValue depthStencilClearValue; /* Can be ignored by RenderPass if CLEAR is not used */
Refresh_LoadOp loadOp;
Refresh_StoreOp storeOp;
Refresh_LoadOp stencilLoadOp;
Refresh_StoreOp stencilStoreOp;
Refresh_WriteOptions writeOption;
} Refresh_DepthStencilAttachmentInfo;
2020-12-16 21:28:06 +00:00
/* Binding structs */
typedef struct Refresh_BufferBinding
{
Refresh_GpuBuffer *gpuBuffer;
uint32_t offset;
} Refresh_BufferBinding;
typedef struct Refresh_TextureSamplerBinding
{
Refresh_Texture *texture;
Refresh_Sampler *sampler;
} Refresh_TextureSamplerBinding;
typedef struct Refresh_ComputeBufferBinding
{
Refresh_GpuBuffer *gpuBuffer;
Refresh_WriteOptions writeOption;
} Refresh_ComputeBufferBinding;
typedef struct Refresh_ComputeTextureBinding
{
Refresh_TextureSlice textureSlice;
Refresh_WriteOptions writeOption;
} Refresh_ComputeTextureBinding;
2020-12-15 23:00:46 +00:00
/* Functions */
2020-12-17 02:38:22 +00:00
/* Logging */
2021-01-05 23:00:51 +00:00
typedef void (REFRESHCALL * Refresh_LogFunc)(const char *msg);
2020-12-17 02:38:22 +00:00
2021-01-06 00:07:42 +00:00
/* Reroutes Refresh's logging to custom logging functions.
*
* info: Basic logs that might be useful to have stored for support.
* warn: Something went wrong, but it's really just annoying, not fatal.
* error: You better have this stored somewhere because it's crashing now!
*/
REFRESHAPI void Refresh_HookLogFunctions(
Refresh_LogFunc info,
Refresh_LogFunc warn,
Refresh_LogFunc error
);
/* Backend selection */
/* Select the graphics API backend that Refresh should use.
*
* Note that Refresh is not required to select your preferred backend
* if it detects an incompatibility.
*
* Returns the backend that will actually be used, and fills in a window flag bitmask.
* This bitmask should be used to create all windows that the device claims.
*
* preferredBackend: The preferred backend that Refresh should select.
* flags: A pointer to a bitflag value that will be filled in with required SDL_WindowFlags masks.
*/
REFRESHAPI Refresh_Backend Refresh_SelectBackend(Refresh_Backend preferredBackend, uint32_t *flags);
2020-12-16 23:33:09 +00:00
/* Device */
/* Create a rendering context for use on the calling thread.
2024-02-13 20:25:53 +00:00
* You MUST have called Refresh_SelectBackend prior to calling this function.
2020-12-16 23:33:09 +00:00
*
2020-12-17 03:28:02 +00:00
* debugMode: Enable debug mode properties.
2020-12-16 23:33:09 +00:00
*/
2021-01-05 23:00:51 +00:00
REFRESHAPI Refresh_Device* Refresh_CreateDevice(
2020-12-17 03:28:02 +00:00
uint8_t debugMode
2020-12-16 23:33:09 +00:00
);
2021-01-05 23:00:51 +00:00
/* Destroys a rendering context previously returned by Refresh_CreateDevice. */
REFRESHAPI void Refresh_DestroyDevice(Refresh_Device *device);
2020-12-16 23:33:09 +00:00
2020-12-16 20:47:54 +00:00
/* State Creation */
2020-12-16 20:11:43 +00:00
2020-12-29 22:52:24 +00:00
/* Returns an allocated ComputePipeline* object. */
2021-01-05 23:00:51 +00:00
REFRESHAPI Refresh_ComputePipeline* Refresh_CreateComputePipeline(
Refresh_Device *device,
2022-03-02 19:22:52 +00:00
Refresh_ComputeShaderInfo *computeShaderInfo
2020-12-29 22:52:24 +00:00
);
/* Returns an allocated GraphicsPipeline* object. */
2021-01-05 23:00:51 +00:00
REFRESHAPI Refresh_GraphicsPipeline* Refresh_CreateGraphicsPipeline(
Refresh_Device *device,
Refresh_GraphicsPipelineCreateInfo *pipelineCreateInfo
2020-12-16 20:11:43 +00:00
);
2020-12-16 21:49:10 +00:00
/* Returns an allocated Sampler* object. */
2021-01-05 23:00:51 +00:00
REFRESHAPI Refresh_Sampler* Refresh_CreateSampler(
Refresh_Device *device,
Refresh_SamplerStateCreateInfo *samplerStateCreateInfo
2020-12-16 20:47:54 +00:00
);
2020-12-16 22:59:14 +00:00
/* Returns an allocated ShaderModule* object. */
2021-01-05 23:00:51 +00:00
REFRESHAPI Refresh_ShaderModule* Refresh_CreateShaderModule(
Refresh_Device *device,
Refresh_ShaderModuleCreateInfo *shaderModuleCreateInfo
2020-12-16 22:59:14 +00:00
);
/* Returns an allocated Refresh_Texture* object. Note that the contents of
2020-12-16 21:49:10 +00:00
* the texture are undefined until SetData is called.
*/
REFRESHAPI Refresh_Texture* Refresh_CreateTexture(
2021-01-05 23:00:51 +00:00
Refresh_Device *device,
Refresh_TextureCreateInfo *textureCreateInfo
2020-12-18 22:35:33 +00:00
);
2024-02-12 08:04:02 +00:00
/* Creates a GpuBuffer.
2020-12-16 22:02:03 +00:00
*
2020-12-31 04:39:47 +00:00
* usageFlags: Specifies how the buffer will be used.
* sizeInBytes: The length of the buffer.
2020-12-16 22:02:03 +00:00
*/
2024-02-12 08:04:02 +00:00
REFRESHAPI Refresh_GpuBuffer* Refresh_CreateGpuBuffer(
2021-01-05 23:00:51 +00:00
Refresh_Device *device,
Refresh_BufferUsageFlags usageFlags,
2020-12-16 22:53:34 +00:00
uint32_t sizeInBytes
2020-12-16 22:02:03 +00:00
);
2024-02-23 17:42:31 +00:00
/* Creates a TransferBuffer.
2020-12-16 22:53:34 +00:00
*
2024-02-12 08:04:02 +00:00
* sizeInBytes: The length of the buffer.
2020-12-16 22:53:34 +00:00
*/
2024-02-23 17:42:31 +00:00
REFRESHAPI Refresh_TransferBuffer* Refresh_CreateTransferBuffer(
2021-01-05 23:00:51 +00:00
Refresh_Device *device,
2024-02-18 04:21:52 +00:00
uint32_t sizeInBytes
2021-01-03 01:00:52 +00:00
);
2020-12-16 22:53:34 +00:00
/* Disposal */
/* Sends a texture to be destroyed by the renderer. Note that we call it
2021-01-06 01:02:36 +00:00
* "QueueDestroy" because it may not be immediately destroyed by the renderer if
2020-12-16 22:53:34 +00:00
* this is not called from the main thread (for example, if a garbage collector
* deletes the resource instead of the programmer).
*
2021-01-05 23:00:51 +00:00
* texture: The Refresh_Texture to be destroyed.
2020-12-16 22:53:34 +00:00
*/
2021-01-06 01:02:36 +00:00
REFRESHAPI void Refresh_QueueDestroyTexture(
2021-01-05 23:00:51 +00:00
Refresh_Device *device,
Refresh_Texture *texture
2020-12-16 22:53:34 +00:00
);
2020-12-16 23:15:42 +00:00
/* Sends a sampler to be destroyed by the renderer. Note that we call it
2021-01-06 01:02:36 +00:00
* "QueueDestroy" because it may not be immediately destroyed by the renderer if
2020-12-16 23:15:42 +00:00
* this is not called from the main thread (for example, if a garbage collector
* deletes the resource instead of the programmer).
*
2021-01-05 23:00:51 +00:00
* texture: The Refresh_Sampler to be destroyed.
2020-12-16 23:15:42 +00:00
*/
2021-01-06 01:02:36 +00:00
REFRESHAPI void Refresh_QueueDestroySampler(
2021-01-05 23:00:51 +00:00
Refresh_Device *device,
Refresh_Sampler *sampler
2020-12-16 23:15:42 +00:00
);
/* Sends a buffer to be destroyed by the renderer. Note that we call it
2024-02-12 08:04:02 +00:00
* "QueueDestroy" because it may not be immediately destroyed by the renderer.
*
* buffer: The Refresh_GpuBuffer to be destroyed.
*/
REFRESHAPI void Refresh_QueueDestroyGpuBuffer(
Refresh_Device *device,
2024-02-23 17:50:48 +00:00
Refresh_GpuBuffer *gpuBuffer
2024-02-12 08:04:02 +00:00
);
/* Sends a buffer to be destroyed by the renderer. Note that we call it
* "QueueDestroy" because it may not be immediately destroyed by the renderer.
2020-12-16 23:15:42 +00:00
*
2024-02-23 17:42:31 +00:00
* buffer: The Refresh_TransferBuffer to be destroyed.
2020-12-16 23:15:42 +00:00
*/
2024-02-23 17:42:31 +00:00
REFRESHAPI void Refresh_QueueDestroyTransferBuffer(
2021-01-05 23:00:51 +00:00
Refresh_Device *device,
2024-02-23 17:50:48 +00:00
Refresh_TransferBuffer *transferBuffer
2020-12-16 23:15:42 +00:00
);
/* Sends a shader module to be destroyed by the renderer. Note that we call it
2024-02-12 08:04:02 +00:00
* "QueueDestroy" because it may not be immediately destroyed by the renderer.
2020-12-16 22:53:34 +00:00
*
2021-01-05 23:00:51 +00:00
* shaderModule: The Refresh_ShaderModule to be destroyed.
2020-12-16 22:53:34 +00:00
*/
2021-01-06 01:02:36 +00:00
REFRESHAPI void Refresh_QueueDestroyShaderModule(
2021-01-05 23:00:51 +00:00
Refresh_Device *device,
Refresh_ShaderModule *shaderModule
2020-12-16 22:53:34 +00:00
);
2020-12-29 22:52:24 +00:00
/* Sends a compute pipeline to be destroyed by the renderer. Note that we call it
2024-02-12 08:04:02 +00:00
* "QueueDestroy" because it may not be immediately destroyed by the renderer.
2020-12-29 22:52:24 +00:00
*
2021-01-05 23:00:51 +00:00
* computePipeline: The Refresh_ComputePipeline to be destroyed.
2020-12-29 22:52:24 +00:00
*/
2021-01-06 01:02:36 +00:00
REFRESHAPI void Refresh_QueueDestroyComputePipeline(
2021-01-05 23:00:51 +00:00
Refresh_Device *device,
Refresh_ComputePipeline *computePipeline
2020-12-29 22:52:24 +00:00
);
2020-12-16 23:15:42 +00:00
/* Sends a graphics pipeline to be destroyed by the renderer. Note that we call it
2024-02-12 08:04:02 +00:00
* "QueueDestroy" because it may not be immediately destroyed by the renderer.
2020-12-16 23:15:42 +00:00
*
2021-01-05 23:00:51 +00:00
* graphicsPipeline: The Refresh_GraphicsPipeline to be destroyed.
2020-12-16 23:15:42 +00:00
*/
2021-01-06 01:02:36 +00:00
REFRESHAPI void Refresh_QueueDestroyGraphicsPipeline(
2021-01-05 23:00:51 +00:00
Refresh_Device *device,
Refresh_GraphicsPipeline *graphicsPipeline
2020-12-16 22:59:14 +00:00
);
2020-12-16 22:53:34 +00:00
/* Graphics State */
2020-12-16 20:47:54 +00:00
2020-12-16 21:28:06 +00:00
/* Begins a render pass.
2022-03-04 20:30:33 +00:00
* This will also set a default viewport and scissor state.
2020-12-16 21:28:06 +00:00
*
* colorAttachmentInfos:
* A pointer to an array of Refresh_ColorAttachmentInfo structures
* that contains render targets and clear values. May be NULL.
* colorAttachmentCount: The amount of structs in the above array.
* depthStencilAttachmentInfo: The depth/stencil render target and clear value. May be NULL.
2020-12-16 21:28:06 +00:00
*/
2021-01-05 23:00:51 +00:00
REFRESHAPI void Refresh_BeginRenderPass(
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer,
Refresh_ColorAttachmentInfo *colorAttachmentInfos,
uint32_t colorAttachmentCount,
Refresh_DepthStencilAttachmentInfo *depthStencilAttachmentInfo
2020-12-16 21:28:06 +00:00
);
2020-12-16 20:47:54 +00:00
2020-12-30 01:31:39 +00:00
/* Binds a graphics pipeline to the graphics bind point. */
2021-01-05 23:00:51 +00:00
REFRESHAPI void Refresh_BindGraphicsPipeline(
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer,
Refresh_GraphicsPipeline *graphicsPipeline
2020-12-16 22:53:34 +00:00
);
2022-03-04 20:30:33 +00:00
/* Sets the current viewport state. */
REFRESHAPI void Refresh_SetViewport(
2022-03-04 20:30:33 +00:00
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer,
Refresh_Viewport *viewport
);
/* Sets the current scissor state. */
REFRESHAPI void Refresh_SetScissor(
2022-03-04 20:30:33 +00:00
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer,
Refresh_Rect *scissor
);
/* Binds vertex buffers for use with subsequent draw calls.
* Note that this may only be called after binding a graphics pipeline.
*/
2021-01-05 23:00:51 +00:00
REFRESHAPI void Refresh_BindVertexBuffers(
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer,
2020-12-20 07:31:55 +00:00
uint32_t firstBinding,
uint32_t bindingCount,
Refresh_BufferBinding *pBindings
2020-12-20 07:31:55 +00:00
);
2020-12-21 23:44:43 +00:00
/* Binds an index buffer for use with subsequent draw calls. */
2021-01-05 23:00:51 +00:00
REFRESHAPI void Refresh_BindIndexBuffer(
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer,
Refresh_BufferBinding *pBinding,
2021-01-05 23:00:51 +00:00
Refresh_IndexElementSize indexElementSize
2020-12-20 07:31:55 +00:00
);
2021-01-06 01:00:06 +00:00
/* Sets textures/samplers for use with the currently bound vertex shader.
*
* NOTE:
* The length of the bindings array must be equal to the number
2021-01-06 01:00:06 +00:00
* of sampler bindings specified by the pipeline.
*
* pBindings: A pointer to an array of TextureSamplerBindings.
2021-01-06 01:00:06 +00:00
*/
REFRESHAPI void Refresh_BindVertexSamplers(
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer,
Refresh_TextureSamplerBinding *pBindings
2021-01-06 01:00:06 +00:00
);
/* Sets textures/samplers for use with the currently bound fragment shader.
*
* NOTE:
* The length of the bindings array must be equal to the number
2021-01-06 01:00:06 +00:00
* of sampler bindings specified by the pipeline.
*
* pBindings: A pointer to an array of TextureSamplerBindings.
2021-01-06 01:00:06 +00:00
*/
REFRESHAPI void Refresh_BindFragmentSamplers(
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer,
Refresh_TextureSamplerBinding *pBindings
2021-01-06 01:00:06 +00:00
);
2024-02-17 01:51:18 +00:00
/* Pushes vertex shader uniforms to the device.
* This uniform data will be used with subsequent draw calls.
2024-02-12 08:04:02 +00:00
*
* NOTE:
2024-02-17 01:51:18 +00:00
* A graphics pipeline must be bound.
2024-02-12 08:04:02 +00:00
* Will use the block size of the currently bound vertex shader.
*
* data: The client data to write into the buffer.
* dataLengthInBytes: The length of the data to write.
*/
2024-02-17 01:51:18 +00:00
REFRESHAPI void Refresh_PushVertexShaderUniforms(
2024-02-12 08:04:02 +00:00
Refresh_Device *device,
Refresh_CommandBuffer * commandBuffer,
void *data,
uint32_t dataLengthInBytes
);
/* Pushes fragment shader params to the device.
2024-02-17 01:51:18 +00:00
* This uniform data will be used with subsequent draw calls.
2024-02-12 08:04:02 +00:00
*
* NOTE:
* A graphics pipeline must be bound.
* Will use the block size of the currently bound fragment shader.
*
* data: The client data to write into the buffer.
* dataLengthInBytes: The length of the data to write.
*/
2024-02-17 01:51:18 +00:00
REFRESHAPI void Refresh_PushFragmentShaderUniforms(
2024-02-12 08:04:02 +00:00
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer,
void *data,
uint32_t dataLengthInBytes
);
/* Drawing */
/* Draws data from vertex/index buffers with instancing enabled.
*
* baseVertex: The starting offset to read from the vertex buffer.
* startIndex: The starting offset to read from the index buffer.
* primitiveCount: The number of primitives to draw.
* instanceCount: The number of instances that will be drawn.
*/
REFRESHAPI void Refresh_DrawInstancedPrimitives(
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer,
uint32_t baseVertex,
uint32_t startIndex,
uint32_t primitiveCount,
2024-02-17 01:51:18 +00:00
uint32_t instanceCount
2024-02-12 08:04:02 +00:00
);
/* Draws data from vertex/index buffers.
*
* baseVertex: The starting offset to read from the vertex buffer.
* startIndex: The starting offset to read from the index buffer.
* primitiveCount: The number of primitives to draw.
*/
REFRESHAPI void Refresh_DrawIndexedPrimitives(
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer,
uint32_t baseVertex,
uint32_t startIndex,
2024-02-17 01:51:18 +00:00
uint32_t primitiveCount
2024-02-12 08:04:02 +00:00
);
/* Draws data from vertex buffers.
*
* vertexStart: The starting offset to read from the vertex buffer.
* primitiveCount: The number of primitives to draw.
*/
REFRESHAPI void Refresh_DrawPrimitives(
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer,
uint32_t vertexStart,
2024-02-17 01:51:18 +00:00
uint32_t primitiveCount
2024-02-12 08:04:02 +00:00
);
/* Similar to Refresh_DrawPrimitives, but draw parameters are set from a buffer.
* The buffer layout should match the layout of Refresh_IndirectDrawCommand.
*
* buffer: A buffer containing draw parameters.
* offsetInBytes: The offset to start reading from the draw buffer.
* drawCount: The number of draw parameter sets that should be read from the draw buffer.
* stride: The byte stride between sets of draw parameters.
*/
REFRESHAPI void Refresh_DrawPrimitivesIndirect(
Refresh_Device *device,
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:51:18 +00:00
uint32_t stride
2024-02-12 08:04:02 +00:00
);
/* Ends the current render pass. */
REFRESHAPI void Refresh_EndRenderPass(
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer
);
2024-02-13 20:25:53 +00:00
/* Compute Pass */
2024-02-12 08:04:02 +00:00
/* Begins a compute pass. */
2024-02-16 00:48:26 +00:00
REFRESHAPI void Refresh_BeginComputePass(
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer
);
2024-02-12 08:04:02 +00:00
2020-12-30 01:31:39 +00:00
/* Binds a compute pipeline to the compute bind point. */
2021-01-05 23:00:51 +00:00
REFRESHAPI void Refresh_BindComputePipeline(
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer,
Refresh_ComputePipeline *computePipeline
2020-12-30 01:31:39 +00:00
);
/* Binds buffers for use with the currently bound compute pipeline.
*
* pBindings:
* An array of ComputeBufferBinding structs.
* Length must be equal to the number of buffers
* specified by the compute pipeline.
2020-12-30 01:31:39 +00:00
*/
2021-01-05 23:00:51 +00:00
REFRESHAPI void Refresh_BindComputeBuffers(
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer,
Refresh_ComputeBufferBinding *pBindings
2020-12-30 01:31:39 +00:00
);
/* Binds textures for use with the currently bound compute pipeline.
*
* pBindings:
* An array of ComputeTextureBinding structs.
* Length must be equal to the number of textures
2024-02-12 08:04:02 +00:00
* specified by the compute pipeline.
2020-12-30 01:31:39 +00:00
*/
2021-01-05 23:00:51 +00:00
REFRESHAPI void Refresh_BindComputeTextures(
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer,
Refresh_ComputeTextureBinding *pBindings
2024-02-12 08:04:02 +00:00
);
/* Pushes compute shader params to the device.
2024-02-17 01:51:18 +00:00
* This uniform data will be used with subsequent dispatch calls.
2024-02-12 08:04:02 +00:00
*
* NOTE:
* A compute pipeline must be bound.
* Will use the block size of the currently bound compute shader.
*
* data: The client data to write into the buffer.
* dataLengthInBytes: The length of the data to write.
*/
2024-02-17 01:51:18 +00:00
REFRESHAPI void Refresh_PushComputeShaderUniforms(
2024-02-12 08:04:02 +00:00
Refresh_Device *device,
Refresh_CommandBuffer * commandBuffer,
void *data,
uint32_t dataLengthInBytes
);
/* Dispatches work compute items.
*
* groupCountX: Number of local workgroups to dispatch in the X dimension.
* groupCountY: Number of local workgroups to dispatch in the Y dimension.
* groupCountZ: Number of local workgroups to dispatch in the Z dimension.
*/
REFRESHAPI void Refresh_DispatchCompute(
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer,
uint32_t groupCountX,
uint32_t groupCountY,
2024-02-17 01:51:18 +00:00
uint32_t groupCountZ
2024-02-12 08:04:02 +00:00
);
/* Ends the current compute pass. */
2024-02-16 00:48:26 +00:00
REFRESHAPI void Refresh_EndComputePass(
Refresh_Device *device,
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
2024-02-23 17:42:31 +00:00
/* Immediately copies data from a pointer into a TransferBuffer.
2024-02-18 04:21:52 +00:00
*
* transferOption:
2024-02-22 18:32:24 +00:00
* SAFEDISCARD:
* If this TransferBuffer has been used in commands that have not completed,
* the issued commands will still be valid at the cost of increased memory usage.
* You may NOT assume that any of the previous data is retained.
* If the TransferBuffer was not in use, this option is equivalent to OVERWRITE.
* This is a good option to prevent stalls when frequently updating data.
2024-02-23 17:42:31 +00:00
* It is not recommended to use this option with large TransferBuffers.
2024-02-18 04:21:52 +00:00
*
2024-02-18 04:23:09 +00:00
* OVERWRITE:
* Overwrites the data regardless of whether a command has been issued.
2024-02-18 04:21:52 +00:00
* Use this option with great care, as it can cause data races to occur!
*/
REFRESHAPI void Refresh_SetTransferData(
2024-02-18 04:21:52 +00:00
Refresh_Device *device,
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
);
2024-02-23 17:42:31 +00:00
/* Immediately copies data from a TransferBuffer into a pointer. */
REFRESHAPI void Refresh_GetTransferData(
2024-02-18 04:21:52 +00:00
Refresh_Device *device,
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 */
/* Begins a copy pass. */
2024-02-16 00:48:26 +00:00
REFRESHAPI void Refresh_BeginCopyPass(
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer
);
2024-02-12 08:04:02 +00:00
/* CPU-to-GPU copies occur on the GPU timeline.
*
* You MAY assume that the copy has finished for subsequent commands.
*/
/*
* writeOption:
* SAFEDISCARD:
* If the destination resource has been used in commands that have not completed,
* this option will prevent a data dependency at the cost of increased memory usage.
* You may NOT assume that any of the previous data is retained.
* If the destination resource was not in use, this option is equivalent to SAFEOVERWRITE.
* This is a good option to prevent stalls on resources with frequent updates.
* It is not recommended to use this option with large resources.
*
* SAFEOVERWRITE:
* Overwrites the data safely using a GPU memory barrier.
*/
2024-02-23 17:42:31 +00:00
/* Uploads data from a TransferBuffer to a texture. */
2024-02-12 08:04:02 +00:00
REFRESHAPI void Refresh_UploadToTexture(
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer,
2024-02-23 17:42:31 +00:00
Refresh_TransferBuffer *transferBuffer,
Refresh_TextureRegion *textureRegion,
Refresh_BufferImageCopy *copyParams,
Refresh_WriteOptions writeOption
2024-02-12 08:04:02 +00:00
);
2024-02-23 17:42:31 +00:00
/* Uploads data from a TransferBuffer to a GpuBuffer. */
2024-02-12 08:04:02 +00:00
REFRESHAPI void Refresh_UploadToBuffer(
Refresh_Device *device,
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
2024-02-12 08:04:02 +00:00
);
/* GPU-to-CPU copies occur on the GPU timeline.
*
2024-02-23 17:42:31 +00:00
* You may NOT assume that the data in the TransferBuffer is fully copied
2024-02-12 08:04:02 +00:00
* until the command buffer has finished execution.
*/
/*
* transferOption:
* SAFEDISCARD:
* If this TransferBuffer has been used in commands that have not completed,
* the issued commands will still be valid at the cost of increased memory usage.
* You may NOT assume that any of the previous data is retained.
* If the TransferBuffer was not in use, this option is equivalent to OVERWRITE.
* It is not recommended to use this option with large TransferBuffers.
*
* OVERWRITE:
* Overwrites the data regardless of whether a command has been issued.
* Use this option with great care, as it can cause data races to occur!
*/
2024-02-23 17:42:31 +00:00
/* Downloads data from a texture to a TransferBuffer. */
2024-02-12 08:04:02 +00:00
REFRESHAPI void Refresh_DownloadFromTexture(
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer,
Refresh_TextureRegion *textureRegion,
2024-02-23 17:42:31 +00:00
Refresh_TransferBuffer *transferBuffer,
Refresh_BufferImageCopy *copyParams,
Refresh_TransferOptions transferOption
2024-02-12 08:04:02 +00:00
);
/* Downloads data from a GpuBuffer object. */
REFRESHAPI void Refresh_DownloadFromBuffer(
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer,
Refresh_GpuBuffer *gpuBuffer,
2024-02-23 17:42:31 +00:00
Refresh_TransferBuffer *transferBuffer,
Refresh_BufferCopy *copyParams,
Refresh_TransferOptions transferOption
2024-02-12 08:04:02 +00:00
);
/* GPU-to-GPU copies occur on the GPU timeline,
* and you may assume the copy has finished in subsequent commands.
*/
/*
* writeOption:
* SAFEDISCARD:
* If the destination resource has been used in commands that have not completed,
* this option will prevent a data dependency at the cost of increased memory usage.
* You may NOT assume that any of the previous data is retained.
* If the destination resource was not in use, this option is equivalent to SAFEOVERWRITE.
* This is a good option to prevent stalls on resources with frequent updates.
* It is not recommended to use this option with large resources.
*
* SAFEOVERWRITE:
* Overwrites the data safely using a GPU memory barrier.
*/
2024-02-12 08:04:02 +00:00
/* Performs a texture-to-texture copy. */
REFRESHAPI void Refresh_CopyTextureToTexture(
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer,
Refresh_TextureRegion *source,
Refresh_TextureRegion *destination,
Refresh_WriteOptions writeOption
2024-02-12 08:04:02 +00:00
);
/* Copies image data from a texture slice into a buffer. */
REFRESHAPI void Refresh_CopyTextureToBuffer(
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer,
Refresh_TextureRegion *textureRegion,
2024-02-23 17:50:48 +00:00
Refresh_GpuBuffer *gpuBuffer,
Refresh_BufferImageCopy *copyParams,
Refresh_WriteOptions writeOption
2020-12-30 01:31:39 +00:00
);
2024-02-12 08:04:02 +00:00
/* Copies data from a buffer to a texture slice. */
REFRESHAPI void Refresh_CopyBufferToTexture(
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer,
2024-02-23 17:50:48 +00:00
Refresh_GpuBuffer *gpuBuffer,
Refresh_TextureRegion *textureRegion,
Refresh_BufferImageCopy *copyParams,
Refresh_WriteOptions writeOption
2024-02-12 08:04:02 +00:00
);
/* Copies data from a buffer to a buffer. */
REFRESHAPI void Refresh_CopyBufferToBuffer(
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer,
Refresh_GpuBuffer *source,
Refresh_GpuBuffer *destination,
Refresh_BufferCopy *copyParams,
Refresh_WriteOptions writeOption
2024-02-12 08:04:02 +00:00
);
/* Generate mipmaps for the given texture. */
REFRESHAPI void Refresh_GenerateMipmaps(
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer,
Refresh_Texture *texture
);
2024-02-16 00:48:26 +00:00
REFRESHAPI void Refresh_EndCopyPass(
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer
);
2024-02-12 08:04:02 +00:00
/* Ends a copy pass. */
2020-12-21 23:44:43 +00:00
/* Submission/Presentation */
2020-12-17 04:19:11 +00:00
/* Claims a window, creating a swapchain structure for it.
* This function MUST be called before any swapchain functions
* are called using the window.
*
* Returns 0 on swapchain creation failure.
*/
REFRESHAPI uint8_t Refresh_ClaimWindow(
Refresh_Device *device,
void *windowHandle,
Refresh_PresentMode presentMode
);
/* Unclaims a window, destroying the swapchain structure for it.
* It is good practice to call this when a window is closed to
* prevent memory bloat, but windows are automatically unclaimed
* by DestroyDevice.
*/
REFRESHAPI void Refresh_UnclaimWindow(
Refresh_Device *device,
void *windowHandle
);
/* Changes the present mode of the swapchain for the given window. */
REFRESHAPI void Refresh_SetSwapchainPresentMode(
Refresh_Device *device,
void *windowHandle,
Refresh_PresentMode presentMode
);
/* Returns the format of the swapchain for the given window. */
REFRESHAPI Refresh_TextureFormat Refresh_GetSwapchainFormat(
Refresh_Device *device,
void *windowHandle
);
2021-01-05 23:00:51 +00:00
/* Returns an allocated Refresh_CommandBuffer* object.
2021-01-03 03:03:25 +00:00
* This command buffer is managed by the implementation and
* should NOT be freed by the user.
2021-01-02 06:07:15 +00:00
*
* NOTE:
* A command buffer may only be used on the thread that
* it was acquired on. Using it on any other thread is an error.
*
*/
2021-01-05 23:00:51 +00:00
REFRESHAPI Refresh_CommandBuffer* Refresh_AcquireCommandBuffer(
Refresh_Device *device
2021-01-02 06:07:15 +00:00
);
/* Acquires a texture to use for presentation.
* May return NULL under certain conditions.
* If NULL, the user must ensure to not use the texture.
* Once a swapchain texture is acquired,
* it will automatically be presented on command buffer submission.
2020-12-21 23:44:43 +00:00
*
* NOTE:
* It is not recommended to hold a reference to this texture long term.
*
* pWidth: A pointer to a uint32 that will be filled with the texture width.
* pHeight: A pointer to a uint32 that will be filled with the texture height.
2020-12-21 23:44:43 +00:00
*/
REFRESHAPI Refresh_Texture* Refresh_AcquireSwapchainTexture(
2021-01-05 23:00:51 +00:00
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer,
void *windowHandle,
uint32_t *pWidth,
uint32_t *pHeight
);
2020-12-21 23:44:43 +00:00
/* Submits all of the enqueued commands. */
2021-01-05 23:00:51 +00:00
REFRESHAPI void Refresh_Submit(
Refresh_Device* device,
Refresh_CommandBuffer *commandBuffer
2020-12-21 23:44:43 +00:00
);
/* Submits a command buffer and acquires a fence.
* You can use the fence to check if or wait until the command buffer has finished processing.
* You are responsible for releasing this fence when you are done using it.
*/
REFRESHAPI Refresh_Fence* Refresh_SubmitAndAcquireFence(
Refresh_Device* device,
Refresh_CommandBuffer *commandBuffer
);
/* Waits for the device to become idle. */
2021-01-05 23:00:51 +00:00
REFRESHAPI void Refresh_Wait(
Refresh_Device *device
2021-01-03 05:07:51 +00:00
);
/* Waits for given fences to be signaled.
*
* waitAll: If 0, waits for any fence to be signaled. If 1, waits for all fences to be signaled.
* fenceCount: The number of fences being submitted.
* pFences: An array of fences to be waited on.
*/
REFRESHAPI void Refresh_WaitForFences(
Refresh_Device *device,
uint8_t waitAll,
uint32_t fenceCount,
Refresh_Fence **pFences
);
/* Check the status of a fence. 1 means the fence is signaled. */
REFRESHAPI int Refresh_QueryFence(
Refresh_Device *device,
Refresh_Fence *fence
);
/* Allows the fence to be reused by future command buffer submissions.
* If you do not release fences after acquiring them, you will cause unbounded resource growth.
*/
REFRESHAPI void Refresh_ReleaseFence(
Refresh_Device *device,
Refresh_Fence *fence
);
2020-12-15 23:00:46 +00:00
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* REFRESH_H */
/* vim: set noexpandtab shiftwidth=8 tabstop=8: */