proposed API revision
continuous-integration/drone/push Build is failing Details

abi_break
cosmonaut 2024-02-12 00:04:02 -08:00
parent b78d01592b
commit 6f31f17be1
3 changed files with 1195 additions and 973 deletions

View File

@ -69,7 +69,8 @@ REFRESHAPI uint32_t Refresh_LinkedVersion(void);
/* Type Declarations */
typedef struct Refresh_Device Refresh_Device;
typedef struct Refresh_Buffer Refresh_Buffer;
typedef struct Refresh_GpuBuffer Refresh_GpuBuffer;
typedef struct Refresh_CpuBuffer Refresh_CpuBuffer;
typedef struct Refresh_Texture Refresh_Texture;
typedef struct Refresh_Sampler Refresh_Sampler;
typedef struct Refresh_ShaderModule Refresh_ShaderModule;
@ -371,12 +372,31 @@ typedef struct Refresh_Viewport
typedef struct Refresh_TextureSlice
{
Refresh_Texture *texture;
Refresh_Rect rectangle;
uint32_t depth; /* 0 unless 3D */
uint32_t layer; /* 0 unless cube */
uint32_t level;
uint32_t mipLevel;
uint32_t baseLayer; /* either 0-5 for cubemap or 0-n for 3D texture */
uint32_t layerCount;
uint32_t x;
uint32_t y;
uint32_t z;
uint32_t w;
uint32_t h;
uint32_t d;
} Refresh_TextureSlice;
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;
@ -512,8 +532,7 @@ typedef struct Refresh_DepthStencilState
Refresh_CompareOp compareOp;
uint8_t depthBoundsTestEnable;
uint8_t stencilTestEnable;
Refresh_StencilOpState frontStencilState;
Refresh_StencilOpState backStencilState;
Refresh_StencilOpState stencilState;
float minDepthBounds;
float maxDepthBounds;
} Refresh_DepthStencilState;
@ -618,6 +637,263 @@ REFRESHAPI Refresh_Device* Refresh_CreateDevice(
/* Destroys a rendering context previously returned by Refresh_CreateDevice. */
REFRESHAPI void Refresh_DestroyDevice(Refresh_Device *device);
/* State Creation */
/* Returns an allocated ComputePipeline* object. */
REFRESHAPI Refresh_ComputePipeline* Refresh_CreateComputePipeline(
Refresh_Device *device,
Refresh_ComputeShaderInfo *computeShaderInfo
);
/* Returns an allocated GraphicsPipeline* object. */
REFRESHAPI Refresh_GraphicsPipeline* Refresh_CreateGraphicsPipeline(
Refresh_Device *device,
Refresh_GraphicsPipelineCreateInfo *pipelineCreateInfo
);
/* Returns an allocated Sampler* object. */
REFRESHAPI Refresh_Sampler* Refresh_CreateSampler(
Refresh_Device *device,
Refresh_SamplerStateCreateInfo *samplerStateCreateInfo
);
/* Returns an allocated ShaderModule* object. */
REFRESHAPI Refresh_ShaderModule* Refresh_CreateShaderModule(
Refresh_Device *device,
Refresh_ShaderModuleCreateInfo *shaderModuleCreateInfo
);
/* Returns an allocated Refresh_Texture* object. Note that the contents of
* the texture are undefined until SetData is called.
*/
REFRESHAPI Refresh_Texture* Refresh_CreateTexture(
Refresh_Device *device,
Refresh_TextureCreateInfo *textureCreateInfo
);
/* Creates a GpuBuffer.
*
* usageFlags: Specifies how the buffer will be used.
* sizeInBytes: The length of the buffer.
*/
REFRESHAPI Refresh_GpuBuffer* Refresh_CreateGpuBuffer(
Refresh_Device *device,
Refresh_BufferUsageFlags usageFlags,
uint32_t sizeInBytes
);
/* Creates a CpuBuffer.
*
* sizeInBytes: The length of the buffer.
*/
REFRESHAPI Refresh_CpuBuffer* Refresh_CreateCpuBuffer(
Refresh_Device *device,
uint32_t sizeInBytes
);
/* Disposal */
/* Sends a texture to be destroyed by the renderer. Note that we call it
* "QueueDestroy" because it may not be immediately destroyed by the renderer if
* this is not called from the main thread (for example, if a garbage collector
* deletes the resource instead of the programmer).
*
* texture: The Refresh_Texture to be destroyed.
*/
REFRESHAPI void Refresh_QueueDestroyTexture(
Refresh_Device *device,
Refresh_Texture *texture
);
/* Sends a sampler to be destroyed by the renderer. Note that we call it
* "QueueDestroy" because it may not be immediately destroyed by the renderer if
* this is not called from the main thread (for example, if a garbage collector
* deletes the resource instead of the programmer).
*
* texture: The Refresh_Sampler to be destroyed.
*/
REFRESHAPI void Refresh_QueueDestroySampler(
Refresh_Device *device,
Refresh_Sampler *sampler
);
/* 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.
*
* buffer: The Refresh_GpuBuffer to be destroyed.
*/
REFRESHAPI void Refresh_QueueDestroyGpuBuffer(
Refresh_Device *device,
Refresh_GpuBuffer *buffer
);
/* 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.
*
* buffer: The Refresh_CpuBuffer to be destroyed.
*/
REFRESHAPI void Refresh_QueueDestroyCpuBuffer(
Refresh_Device *device,
Refresh_CpuBuffer *buffer
);
/* Sends a shader module to be destroyed by the renderer. Note that we call it
* "QueueDestroy" because it may not be immediately destroyed by the renderer.
*
* shaderModule: The Refresh_ShaderModule to be destroyed.
*/
REFRESHAPI void Refresh_QueueDestroyShaderModule(
Refresh_Device *device,
Refresh_ShaderModule *shaderModule
);
/* Sends a compute pipeline to be destroyed by the renderer. Note that we call it
* "QueueDestroy" because it may not be immediately destroyed by the renderer.
*
* computePipeline: The Refresh_ComputePipeline to be destroyed.
*/
REFRESHAPI void Refresh_QueueDestroyComputePipeline(
Refresh_Device *device,
Refresh_ComputePipeline *computePipeline
);
/* Sends a graphics pipeline to be destroyed by the renderer. Note that we call it
* "QueueDestroy" because it may not be immediately destroyed by the renderer.
*
* graphicsPipeline: The Refresh_GraphicsPipeline to be destroyed.
*/
REFRESHAPI void Refresh_QueueDestroyGraphicsPipeline(
Refresh_Device *device,
Refresh_GraphicsPipeline *graphicsPipeline
);
/* Graphics State */
/* Begins a render pass.
* This will also set a default viewport and scissor state.
*
* 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.
*/
REFRESHAPI void Refresh_BeginRenderPass(
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer,
Refresh_ColorAttachmentInfo *colorAttachmentInfos,
uint32_t colorAttachmentCount,
Refresh_DepthStencilAttachmentInfo *depthStencilAttachmentInfo
);
/* Binds a graphics pipeline to the graphics bind point. */
REFRESHAPI void Refresh_BindGraphicsPipeline(
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer,
Refresh_GraphicsPipeline *graphicsPipeline
);
/* Sets the current viewport state. */
REFRESHAPI void Refresh_SetViewport(
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer,
Refresh_Viewport *viewport
);
/* Sets the current scissor state. */
REFRESHAPI void Refresh_SetScissor(
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.
*/
REFRESHAPI void Refresh_BindVertexBuffers(
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer,
uint32_t firstBinding,
uint32_t bindingCount,
Refresh_GpuBuffer **pBuffers,
uint64_t *pOffsets
);
/* Binds an index buffer for use with subsequent draw calls. */
REFRESHAPI void Refresh_BindIndexBuffer(
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer,
Refresh_GpuBuffer *buffer,
uint64_t offset,
Refresh_IndexElementSize indexElementSize
);
/* Sets textures/samplers for use with the currently bound vertex shader.
*
* NOTE:
* The length of the passed arrays must be equal to the number
* of sampler bindings specified by the pipeline.
*
* textures: A pointer to an array of textures.
* samplers: A pointer to an array of samplers.
*/
REFRESHAPI void Refresh_BindVertexSamplers(
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer,
Refresh_Texture **pTextures,
Refresh_Sampler **pSamplers
);
/* Sets textures/samplers for use with the currently bound fragment shader.
*
* NOTE:
* The length of the passed arrays must be equal to the number
* of sampler bindings specified by the pipeline.
*
* textures: A pointer to an array of textures.
* samplers: A pointer to an array of samplers.
*/
REFRESHAPI void Refresh_BindFragmentSamplers(
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer,
Refresh_Texture **pTextures,
Refresh_Sampler **pSamplers
);
/* Pushes vertex shader params to the device.
* Returns a starting offset value to be used with draw calls.
*
* NOTE:
* A pipeline must be bound.
* 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.
*/
REFRESHAPI uint32_t Refresh_PushVertexShaderUniforms(
Refresh_Device *device,
Refresh_CommandBuffer * commandBuffer,
void *data,
uint32_t dataLengthInBytes
);
/* Pushes fragment shader params to the device.
* Returns a starting offset value to be used with draw calls.
*
* 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.
*/
REFRESHAPI uint32_t Refresh_PushFragmentShaderUniforms(
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer,
void *data,
uint32_t dataLengthInBytes
);
/* Drawing */
/* Draws data from vertex/index buffers with instancing enabled.
@ -687,7 +963,7 @@ REFRESHAPI void Refresh_DrawPrimitives(
REFRESHAPI void Refresh_DrawPrimitivesIndirect(
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer,
Refresh_Buffer *buffer,
Refresh_GpuBuffer *buffer,
uint32_t offsetInBytes,
uint32_t drawCount,
uint32_t stride,
@ -695,206 +971,51 @@ REFRESHAPI void Refresh_DrawPrimitivesIndirect(
uint32_t fragmentParamOffset
);
/* 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.
* computeParamOffset: The offset of the compute shader param data.
*/
REFRESHAPI void Refresh_DispatchCompute(
/* Ends the current render pass. */
REFRESHAPI void Refresh_EndRenderPass(
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer
);
/* Begins a compute pass. */
REFRESHAPI void Refresh_BeginComputePass(Refresh_Device *device);
/* Binds a compute pipeline to the compute bind point. */
REFRESHAPI void Refresh_BindComputePipeline(
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer,
uint32_t groupCountX,
uint32_t groupCountY,
uint32_t groupCountZ,
uint32_t computeParamOffset
Refresh_ComputePipeline *computePipeline
);
/* State Creation */
/* Returns an allocated ComputePipeline* object. */
REFRESHAPI Refresh_ComputePipeline* Refresh_CreateComputePipeline(
Refresh_Device *device,
Refresh_ComputeShaderInfo *computeShaderInfo
);
/* Returns an allocated GraphicsPipeline* object. */
REFRESHAPI Refresh_GraphicsPipeline* Refresh_CreateGraphicsPipeline(
Refresh_Device *device,
Refresh_GraphicsPipelineCreateInfo *pipelineCreateInfo
);
/* Returns an allocated Sampler* object. */
REFRESHAPI Refresh_Sampler* Refresh_CreateSampler(
Refresh_Device *device,
Refresh_SamplerStateCreateInfo *samplerStateCreateInfo
);
/* Returns an allocated ShaderModule* object. */
REFRESHAPI Refresh_ShaderModule* Refresh_CreateShaderModule(
Refresh_Device *device,
Refresh_ShaderModuleCreateInfo *shaderModuleCreateInfo
);
/* Returns an allocated Refresh_Texture* object. Note that the contents of
* the texture are undefined until SetData is called.
/* Binds buffers for use with the currently bound compute pipeline.
*
* pBuffers: An array of buffers to bind.
* Length must be equal to the number of buffers
* specified by the compute pipeline.
*/
REFRESHAPI Refresh_Texture* Refresh_CreateTexture(
Refresh_Device *device,
Refresh_TextureCreateInfo *textureCreateInfo
);
/* Creates a buffer.
*
* usageFlags: Specifies how the buffer will be used.
* sizeInBytes: The length of the buffer.
*/
REFRESHAPI Refresh_Buffer* Refresh_CreateBuffer(
Refresh_Device *device,
Refresh_BufferUsageFlags usageFlags,
uint32_t sizeInBytes
);
/* Setters */
/* Uploads image data to a texture object.
*
* NOTE:
* DO NOT expect this to execute in sequence relative to other commands!
* Calling SetTextureData in a command buffer that also references the
* texture may result in undefined behavior.
*
* textureSlice: The texture slice to be updated.
* data: A pointer to the image data.
* dataLengthInBytes: The size of the image data.
*/
REFRESHAPI void Refresh_SetTextureData(
Refresh_Device *driverData,
Refresh_CommandBuffer *commandBuffer,
Refresh_TextureSlice *textureSlice,
void *data,
uint32_t dataLengthInBytes
);
/* Uploads YUV image data to three R8 texture objects.
*
* y: The texture storing the Y data.
* u: The texture storing the U (Cb) data.
* v: The texture storing the V (Cr) data.
* yWidth: The width of the Y plane.
* yHeight: The height of the Y plane.
* uvWidth: The width of the U/V planes.
* uvHeight: The height of the U/V planes.
* yData: A pointer to the raw Y image data.
* uData: A pointer to the raw U image data.
* vData: A pointer to the raw V image data.
* yDataLength: The size of the Y image data in bytes.
* uvDataLength: The size of the UV image data in bytes.
* yStride: The length of a Y image data row in bytes.
* uvStride: The length of a UV image data row in bytes.
*/
REFRESHAPI void Refresh_SetTextureDataYUV(
Refresh_Device *driverData,
Refresh_CommandBuffer* commandBuffer,
Refresh_Texture *y,
Refresh_Texture *u,
Refresh_Texture *v,
uint32_t yWidth,
uint32_t yHeight,
uint32_t uvWidth,
uint32_t uvHeight,
void *yDataPtr,
void *uDataPtr,
void *vDataPtr,
uint32_t yDataLength,
uint32_t uvDataLength,
uint32_t yStride,
uint32_t uvStride
);
/* Performs an asynchronous texture-to-texture copy.
*
* sourceTextureSlice: The texture slice from which to copy.
* destinationTextureSlice: The texture slice to copy to.
* filter: The filter that will be used if the copy requires scaling.
*/
REFRESHAPI void Refresh_CopyTextureToTexture(
Refresh_Device *driverData,
Refresh_CommandBuffer *commandBuffer,
Refresh_TextureSlice *sourceTextureSlice,
Refresh_TextureSlice *destinationTextureSlice,
Refresh_Filter filter
);
/* Asynchronously copies image data from a texture slice into a buffer.
*
* NOTE:
* The buffer will not contain correct data until the command buffer
* is submitted and completed.
*
* textureSlice: The texture object being copied.
* buffer: The buffer being filled with the image data.
*/
REFRESHAPI void Refresh_CopyTextureToBuffer(
REFRESHAPI void Refresh_BindComputeBuffers(
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer,
Refresh_TextureSlice *textureSlice,
Refresh_Buffer *buffer
Refresh_GpuBuffer **pBuffers
);
/* Sets a region of the buffer with client data.
/* Binds textures for use with the currently bound compute pipeline.
*
* NOTE:
* Calling this function on a buffer after the buffer
* has been bound without calling Submit first is an error.
* pTextures: An array of textures to bind.
* Length must be equal to the number of buffers
* specified by the compute pipeline.
*
* buffer: The vertex buffer to be updated.
* offsetInBytes: The starting offset of the buffer to write into.
* data: The client data to write into the buffer.
* dataLength: The length of data from the client buffer to write.
* pLevels: An array of levels to bind,
* corresponding to the indices in pTextures.
* Length must be equal to the number of buffers
* specified by the compute pipeline.
*/
REFRESHAPI void Refresh_SetBufferData(
REFRESHAPI void Refresh_BindComputeTextures(
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer,
Refresh_Buffer *buffer,
uint32_t offsetInBytes,
void* data,
uint32_t dataLength
);
/* Pushes vertex shader params to the device.
* Returns a starting offset value to be used with draw calls.
*
* NOTE:
* A pipeline must be bound.
* 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.
*/
REFRESHAPI uint32_t Refresh_PushVertexShaderUniforms(
Refresh_Device *device,
Refresh_CommandBuffer * commandBuffer,
void *data,
uint32_t dataLengthInBytes
);
/* Pushes fragment shader params to the device.
* Returns a starting offset value to be used with draw calls.
*
* 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.
*/
REFRESHAPI uint32_t Refresh_PushFragmentShaderUniforms(
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer,
void *data,
uint32_t dataLengthInBytes
Refresh_Texture **pTextures,
uint32_t **pLevels
);
/* Pushes compute shader params to the device.
@ -914,225 +1035,149 @@ REFRESHAPI uint32_t Refresh_PushComputeShaderUniforms(
uint32_t dataLengthInBytes
);
/* Getters */
/* Synchronously copies data from a buffer to a pointer.
* You probably want to wait for a sync point to call this.
/* Dispatches work compute items.
*
* buffer: The buffer to copy data from.
* data: The pointer to copy data to.
* dataLengthInBytes: The length of data to copy.
* 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.
* computeParamOffset: The offset of the compute shader param data.
*/
REFRESHAPI void Refresh_GetBufferData(
REFRESHAPI void Refresh_DispatchCompute(
Refresh_Device *device,
Refresh_Buffer *buffer,
void *data,
uint32_t dataLengthInBytes
Refresh_CommandBuffer *commandBuffer,
uint32_t groupCountX,
uint32_t groupCountY,
uint32_t groupCountZ,
uint32_t computeParamOffset
);
/* Disposal */
/* Ends the current compute pass. */
REFRESHAPI void Refresh_EndComputePass(Refresh_Device *device);
/* Sends a texture to be destroyed by the renderer. Note that we call it
* "QueueDestroy" because it may not be immediately destroyed by the renderer if
* this is not called from the main thread (for example, if a garbage collector
* deletes the resource instead of the programmer).
/* CpuBuffer Map */
/* Maps a CpuBuffer to host memory. Returns a pointer that can be copied to.
*
* texture: The Refresh_Texture to be destroyed.
* offsetInBytes: The offset of the buffer to map.
* sizeInBytes: The number of bytes of memory to map.
*/
REFRESHAPI void Refresh_QueueDestroyTexture(
REFRESHAPI void* Refresh_MapCpuBuffer(
Refresh_Device *device,
Refresh_CpuBuffer *buffer,
uint32_t offsetInBytes,
uint32_t sizeInBytes
);
/* Unmaps a mapped CpuBuffer. Call this when you are done copying data. */
REFRESHAPI void Refresh_UnmapCpuBuffer(
Refresh_Device *device,
Refresh_CpuBuffer *buffer
);
/* Copy Pass */
/* Begins a copy pass. */
REFRESHAPI void Refresh_BeginCopyPass(Refresh_Device *device);
/* CPU-to-GPU copies occur on the GPU timeline.
*
* You MUST NOT alter the data until the command buffer
* has finished execution.
*
* You MAY assume that the copy has finished for subsequent commands.
*/
/* Uploads data from a CpuBuffer to a texture. */
REFRESHAPI void Refresh_UploadToTexture(
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer,
Refresh_CpuBuffer *cpuBuffer,
Refresh_BufferImageCopy *copyParams,
Refresh_TextureSlice *textureSlice
);
/* Uploads data from a CpuBuffer to a GpuBuffer. */
REFRESHAPI void Refresh_UploadToBuffer(
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer,
Refresh_CpuBuffer *cpuBuffer,
Refresh_GpuBuffer *gpuBuffer,
Refresh_BufferCopy *copyParams
);
/* GPU-to-CPU copies occur on the GPU timeline.
*
* You may NOT assume that the data in the CpuBuffer is valid
* until the command buffer has finished execution.
*/
/* Downloads data from a texture to a CpuBuffer. */
REFRESHAPI void Refresh_DownloadFromTexture(
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer,
Refresh_TextureSlice *textureSlice,
Refresh_CpuBuffer *cpuBuffer,
Refresh_BufferImageCopy *copyParams
);
/* Downloads data from a GpuBuffer object. */
REFRESHAPI void Refresh_DownloadFromBuffer(
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer,
Refresh_GpuBuffer *gpuBuffer,
Refresh_CpuBuffer *cpuBuffer,
Refresh_BufferCopy *copyParams
);
/* GPU-to-GPU copies occur on the GPU timeline,
* and you may assume the copy has finished in subsequent commands.
*/
/* Performs a texture-to-texture copy. */
REFRESHAPI void Refresh_CopyTextureToTexture(
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer,
Refresh_TextureSlice *source,
Refresh_TextureSlice *destination
);
/* Copies image data from a texture slice into a buffer. */
REFRESHAPI void Refresh_CopyTextureToBuffer(
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer,
Refresh_TextureSlice *textureSlice,
Refresh_GpuBuffer *buffer,
Refresh_BufferImageCopy *copyParameters
);
/* Copies data from a buffer to a texture slice. */
REFRESHAPI void Refresh_CopyBufferToTexture(
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer,
Refresh_GpuBuffer *buffer,
Refresh_BufferImageCopy *copyParams,
Refresh_TextureSlice *textureSlice
);
/* 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
);
/* Generate mipmaps for the given texture. */
REFRESHAPI void Refresh_GenerateMipmaps(
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer,
Refresh_Texture *texture
);
/* Sends a sampler to be destroyed by the renderer. Note that we call it
* "QueueDestroy" because it may not be immediately destroyed by the renderer if
* this is not called from the main thread (for example, if a garbage collector
* deletes the resource instead of the programmer).
*
* texture: The Refresh_Sampler to be destroyed.
*/
REFRESHAPI void Refresh_QueueDestroySampler(
Refresh_Device *device,
Refresh_Sampler *sampler
);
REFRESHAPI void Refresh_EndCopyPass(Refresh_Device *device);
/* 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 if
* this is not called from the main thread (for example, if a garbage collector
* deletes the resource instead of the programmer).
*
* buffer: The Refresh_Buffer to be destroyed.
*/
REFRESHAPI void Refresh_QueueDestroyBuffer(
Refresh_Device *device,
Refresh_Buffer *buffer
);
/* Sends a shader module to be destroyed by the renderer. Note that we call it
* "QueueDestroy" because it may not be immediately destroyed by the renderer if
* this is not called from the main thread (for example, if a garbage collector
* deletes the resource instead of the programmer).
*
* shaderModule: The Refresh_ShaderModule to be destroyed.
*/
REFRESHAPI void Refresh_QueueDestroyShaderModule(
Refresh_Device *device,
Refresh_ShaderModule *shaderModule
);
/* Sends a compute pipeline to be destroyed by the renderer. Note that we call it
* "QueueDestroy" because it may not be immediately destroyed by the renderer if
* this is not called from the main thread (for example, if a garbage collector
* deletes the resource instead of the programmer).
*
* computePipeline: The Refresh_ComputePipeline to be destroyed.
*/
REFRESHAPI void Refresh_QueueDestroyComputePipeline(
Refresh_Device *device,
Refresh_ComputePipeline *computePipeline
);
/* Sends a graphics pipeline to be destroyed by the renderer. Note that we call it
* "QueueDestroy" because it may not be immediately destroyed by the renderer if
* this is not called from the main thread (for example, if a garbage collector
* deletes the resource instead of the programmer).
*
* graphicsPipeline: The Refresh_GraphicsPipeline to be destroyed.
*/
REFRESHAPI void Refresh_QueueDestroyGraphicsPipeline(
Refresh_Device *device,
Refresh_GraphicsPipeline *graphicsPipeline
);
/* Graphics State */
/* Begins a render pass.
* This will also set a default viewport and scissor state.
*
* 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.
*/
REFRESHAPI void Refresh_BeginRenderPass(
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer,
Refresh_ColorAttachmentInfo *colorAttachmentInfos,
uint32_t colorAttachmentCount,
Refresh_DepthStencilAttachmentInfo *depthStencilAttachmentInfo
);
/* Ends the current render pass. */
REFRESHAPI void Refresh_EndRenderPass(
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer
);
/* Binds a graphics pipeline to the graphics bind point. */
REFRESHAPI void Refresh_BindGraphicsPipeline(
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer,
Refresh_GraphicsPipeline *graphicsPipeline
);
/* Sets the current viewport state. */
REFRESHAPI void Refresh_SetViewport(
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer,
Refresh_Viewport *viewport
);
/* Sets the current scissor state. */
REFRESHAPI void Refresh_SetScissor(
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.
*/
REFRESHAPI void Refresh_BindVertexBuffers(
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer,
uint32_t firstBinding,
uint32_t bindingCount,
Refresh_Buffer **pBuffers,
uint64_t *pOffsets
);
/* Binds an index buffer for use with subsequent draw calls. */
REFRESHAPI void Refresh_BindIndexBuffer(
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer,
Refresh_Buffer *buffer,
uint64_t offset,
Refresh_IndexElementSize indexElementSize
);
/* Sets textures/samplers for use with the currently bound vertex shader.
*
* NOTE:
* The length of the passed arrays must be equal to the number
* of sampler bindings specified by the pipeline.
*
* textures: A pointer to an array of textures.
* samplers: A pointer to an array of samplers.
*/
REFRESHAPI void Refresh_BindVertexSamplers(
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer,
Refresh_Texture **pTextures,
Refresh_Sampler **pSamplers
);
/* Sets textures/samplers for use with the currently bound fragment shader.
*
* NOTE:
* The length of the passed arrays must be equal to the number
* of sampler bindings specified by the pipeline.
*
* textures: A pointer to an array of textures.
* samplers: A pointer to an array of samplers.
*/
REFRESHAPI void Refresh_BindFragmentSamplers(
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer,
Refresh_Texture **pTextures,
Refresh_Sampler **pSamplers
);
/* Binds a compute pipeline to the compute bind point. */
REFRESHAPI void Refresh_BindComputePipeline(
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer,
Refresh_ComputePipeline *computePipeline
);
/* Binds buffers for use with the currently bound compute pipeline.
*
* pBuffers: An array of buffers to bind.
* Length must be equal to the number of buffers
* specified by the compute pipeline.
*/
REFRESHAPI void Refresh_BindComputeBuffers(
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer,
Refresh_Buffer **pBuffers
);
/* Binds textures for use with the currently bound compute pipeline.
*
* pTextures: An array of textures to bind.
* Length must be equal to the number of buffers
* specified by the compute pipeline.
*/
REFRESHAPI void Refresh_BindComputeTextures(
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer,
Refresh_Texture **pTextures
);
/* Ends a copy pass. */
/* Submission/Presentation */

View File

@ -196,110 +196,7 @@ void Refresh_DestroyDevice(Refresh_Device *device)
device->DestroyDevice(device);
}
void Refresh_DrawIndexedPrimitives(
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer,
uint32_t baseVertex,
uint32_t startIndex,
uint32_t primitiveCount,
uint32_t vertexParamOffset,
uint32_t fragmentParamOffset
) {
NULL_RETURN(device);
device->DrawIndexedPrimitives(
device->driverData,
commandBuffer,
baseVertex,
startIndex,
primitiveCount,
vertexParamOffset,
fragmentParamOffset
);
}
void Refresh_DrawInstancedPrimitives(
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer,
uint32_t baseVertex,
uint32_t startIndex,
uint32_t primitiveCount,
uint32_t instanceCount,
uint32_t vertexParamOffset,
uint32_t fragmentParamOffset
) {
NULL_RETURN(device);
device->DrawInstancedPrimitives(
device->driverData,
commandBuffer,
baseVertex,
startIndex,
primitiveCount,
instanceCount,
vertexParamOffset,
fragmentParamOffset
);
}
void Refresh_DrawPrimitives(
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer,
uint32_t vertexStart,
uint32_t primitiveCount,
uint32_t vertexParamOffset,
uint32_t fragmentParamOffset
) {
NULL_RETURN(device);
device->DrawPrimitives(
device->driverData,
commandBuffer,
vertexStart,
primitiveCount,
vertexParamOffset,
fragmentParamOffset
);
}
void Refresh_DrawPrimitivesIndirect(
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer,
Refresh_Buffer *buffer,
uint32_t offsetInBytes,
uint32_t drawCount,
uint32_t stride,
uint32_t vertexParamOffset,
uint32_t fragmentParamOffset
) {
NULL_RETURN(device);
device->DrawPrimitivesIndirect(
device->driverData,
commandBuffer,
buffer,
offsetInBytes,
drawCount,
stride,
vertexParamOffset,
fragmentParamOffset
);
}
void Refresh_DispatchCompute(
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer,
uint32_t groupCountX,
uint32_t groupCountY,
uint32_t groupCountZ,
uint32_t computeParamOffset
) {
NULL_RETURN(device);
device->DispatchCompute(
device->driverData,
commandBuffer,
groupCountX,
groupCountY,
groupCountZ,
computeParamOffset
);
}
/* State Creation */
Refresh_ComputePipeline* Refresh_CreateComputePipeline(
Refresh_Device *device,
@ -398,215 +295,31 @@ Refresh_Texture* Refresh_CreateTexture(
);
}
Refresh_Buffer* Refresh_CreateBuffer(
Refresh_GpuBuffer* Refresh_CreateGpuBuffer(
Refresh_Device *device,
Refresh_BufferUsageFlags usageFlags,
uint32_t sizeInBytes
) {
NULL_RETURN_NULL(device);
return device->CreateBuffer(
return device->CreateGpuBuffer(
device->driverData,
usageFlags,
sizeInBytes
);
}
void Refresh_SetTextureData(
Refresh_CpuBuffer* Refresh_CreateCpuBuffer(
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer,
Refresh_TextureSlice *textureSlice,
void *data,
uint32_t dataLengthInBytes
uint32_t sizeInBytes
) {
NULL_RETURN(device);
device->SetTextureData(
NULL_RETURN_NULL(device);
return device->CreateCpuBuffer(
device->driverData,
commandBuffer,
textureSlice,
data,
dataLengthInBytes
sizeInBytes
);
}
void Refresh_SetTextureDataYUV(
Refresh_Device *device,
Refresh_CommandBuffer* commandBuffer,
Refresh_Texture *y,
Refresh_Texture *u,
Refresh_Texture *v,
uint32_t yWidth,
uint32_t yHeight,
uint32_t uvWidth,
uint32_t uvHeight,
void *yDataPtr,
void *uDataPtr,
void *vDataPtr,
uint32_t yDataLength,
uint32_t uvDataLength,
uint32_t yStride,
uint32_t uvStride
) {
NULL_RETURN(device);
device->SetTextureDataYUV(
device->driverData,
commandBuffer,
y,
u,
v,
yWidth,
yHeight,
uvWidth,
uvHeight,
yDataPtr,
uDataPtr,
vDataPtr,
yDataLength,
uvDataLength,
yStride,
uvStride
);
}
void Refresh_CopyTextureToTexture(
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer,
Refresh_TextureSlice *sourceTextureSlice,
Refresh_TextureSlice *destinationTextureSlice,
Refresh_Filter filter
) {
NULL_RETURN(device);
device->CopyTextureToTexture(
device->driverData,
commandBuffer,
sourceTextureSlice,
destinationTextureSlice,
filter
);
}
void Refresh_CopyTextureToBuffer(
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer,
Refresh_TextureSlice *textureSlice,
Refresh_Buffer *buffer
) {
NULL_RETURN(device);
device->CopyTextureToBuffer(
device->driverData,
commandBuffer,
textureSlice,
buffer
);
}
void Refresh_SetBufferData(
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer,
Refresh_Buffer *buffer,
uint32_t offsetInBytes,
void* data,
uint32_t dataLength
) {
NULL_RETURN(device);
device->SetBufferData(
device->driverData,
commandBuffer,
buffer,
offsetInBytes,
data,
dataLength
);
}
uint32_t Refresh_PushVertexShaderUniforms(
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer,
void *data,
uint32_t dataLengthInBytes
) {
if (device == NULL) { return 0; }
return device->PushVertexShaderUniforms(
device->driverData,
commandBuffer,
data,
dataLengthInBytes
);
}
uint32_t Refresh_PushFragmentShaderUniforms(
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer,
void *data,
uint32_t dataLengthInBytes
) {
if (device == NULL) { return 0; }
return device->PushFragmentShaderUniforms(
device->driverData,
commandBuffer,
data,
dataLengthInBytes
);
}
uint32_t Refresh_PushComputeShaderUniforms(
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer,
void *data,
uint32_t dataLengthInBytes
) {
if (device == NULL) { return 0; }
return device->PushComputeShaderUniforms(
device->driverData,
commandBuffer,
data,
dataLengthInBytes
);
}
void Refresh_BindVertexSamplers(
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer,
Refresh_Texture **pTextures,
Refresh_Sampler **pSamplers
) {
NULL_RETURN(device);
device->BindVertexSamplers(
device->driverData,
commandBuffer,
pTextures,
pSamplers
);
}
void Refresh_BindFragmentSamplers(
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer,
Refresh_Texture **pTextures,
Refresh_Sampler **pSamplers
) {
NULL_RETURN(device);
device->BindFragmentSamplers(
device->driverData,
commandBuffer,
pTextures,
pSamplers
);
}
void Refresh_GetBufferData(
Refresh_Device *device,
Refresh_Buffer *buffer,
void *data,
uint32_t dataLengthInBytes
) {
NULL_RETURN(device);
device->GetBufferData(
device->driverData,
buffer,
data,
dataLengthInBytes
);
}
/* Disposal */
void Refresh_QueueDestroyTexture(
Refresh_Device *device,
@ -630,12 +343,23 @@ void Refresh_QueueDestroySampler(
);
}
void Refresh_QueueDestroyBuffer(
void Refresh_QueueDestroyGpuBuffer(
Refresh_Device *device,
Refresh_Buffer *buffer
Refresh_GpuBuffer *buffer
) {
NULL_RETURN(device);
device->QueueDestroyBuffer(
device->QueueDestroyGpuBuffer(
device->driverData,
buffer
);
}
void Refresh_QueueDestroyCpuBuffer(
Refresh_Device *device,
Refresh_CpuBuffer *buffer
) {
NULL_RETURN(device);
device->QueueDestroyCpuBuffer(
device->driverData,
buffer
);
@ -674,6 +398,8 @@ void Refresh_QueueDestroyGraphicsPipeline(
);
}
/* Render Pass */
void Refresh_BeginRenderPass(
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer,
@ -691,14 +417,16 @@ void Refresh_BeginRenderPass(
);
}
void Refresh_EndRenderPass(
void Refresh_BindGraphicsPipeline(
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer
Refresh_CommandBuffer *commandBuffer,
Refresh_GraphicsPipeline *graphicsPipeline
) {
NULL_RETURN(device);
device->EndRenderPass(
device->BindGraphicsPipeline(
device->driverData,
commandBuffer
commandBuffer,
graphicsPipeline
);
}
@ -728,25 +456,12 @@ void Refresh_SetScissor(
);
}
void Refresh_BindGraphicsPipeline(
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer,
Refresh_GraphicsPipeline *graphicsPipeline
) {
NULL_RETURN(device);
device->BindGraphicsPipeline(
device->driverData,
commandBuffer,
graphicsPipeline
);
}
void Refresh_BindVertexBuffers(
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer,
uint32_t firstBinding,
uint32_t bindingCount,
Refresh_Buffer **pBuffers,
Refresh_GpuBuffer **pBuffers,
uint64_t *pOffsets
) {
NULL_RETURN(device);
@ -763,7 +478,7 @@ void Refresh_BindVertexBuffers(
void Refresh_BindIndexBuffer(
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer,
Refresh_Buffer *buffer,
Refresh_GpuBuffer *buffer,
uint64_t offset,
Refresh_IndexElementSize indexElementSize
) {
@ -777,6 +492,174 @@ void Refresh_BindIndexBuffer(
);
}
void Refresh_BindVertexSamplers(
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer,
Refresh_Texture **pTextures,
Refresh_Sampler **pSamplers
) {
NULL_RETURN(device);
device->BindVertexSamplers(
device->driverData,
commandBuffer,
pTextures,
pSamplers
);
}
void Refresh_BindFragmentSamplers(
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer,
Refresh_Texture **pTextures,
Refresh_Sampler **pSamplers
) {
NULL_RETURN(device);
device->BindFragmentSamplers(
device->driverData,
commandBuffer,
pTextures,
pSamplers
);
}
uint32_t Refresh_PushVertexShaderUniforms(
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer,
void *data,
uint32_t dataLengthInBytes
) {
if (device == NULL) { return 0; }
return device->PushVertexShaderUniforms(
device->driverData,
commandBuffer,
data,
dataLengthInBytes
);
}
uint32_t Refresh_PushFragmentShaderUniforms(
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer,
void *data,
uint32_t dataLengthInBytes
) {
if (device == NULL) { return 0; }
return device->PushFragmentShaderUniforms(
device->driverData,
commandBuffer,
data,
dataLengthInBytes
);
}
void Refresh_DrawInstancedPrimitives(
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer,
uint32_t baseVertex,
uint32_t startIndex,
uint32_t primitiveCount,
uint32_t instanceCount,
uint32_t vertexParamOffset,
uint32_t fragmentParamOffset
) {
NULL_RETURN(device);
device->DrawInstancedPrimitives(
device->driverData,
commandBuffer,
baseVertex,
startIndex,
primitiveCount,
instanceCount,
vertexParamOffset,
fragmentParamOffset
);
}
void Refresh_DrawIndexedPrimitives(
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer,
uint32_t baseVertex,
uint32_t startIndex,
uint32_t primitiveCount,
uint32_t vertexParamOffset,
uint32_t fragmentParamOffset
) {
NULL_RETURN(device);
device->DrawIndexedPrimitives(
device->driverData,
commandBuffer,
baseVertex,
startIndex,
primitiveCount,
vertexParamOffset,
fragmentParamOffset
);
}
void Refresh_DrawPrimitives(
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer,
uint32_t vertexStart,
uint32_t primitiveCount,
uint32_t vertexParamOffset,
uint32_t fragmentParamOffset
) {
NULL_RETURN(device);
device->DrawPrimitives(
device->driverData,
commandBuffer,
vertexStart,
primitiveCount,
vertexParamOffset,
fragmentParamOffset
);
}
void Refresh_DrawPrimitivesIndirect(
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer,
Refresh_GpuBuffer *buffer,
uint32_t offsetInBytes,
uint32_t drawCount,
uint32_t stride,
uint32_t vertexParamOffset,
uint32_t fragmentParamOffset
) {
NULL_RETURN(device);
device->DrawPrimitivesIndirect(
device->driverData,
commandBuffer,
buffer,
offsetInBytes,
drawCount,
stride,
vertexParamOffset,
fragmentParamOffset
);
}
void Refresh_EndRenderPass(
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer
) {
NULL_RETURN(device);
device->EndRenderPass(
device->driverData,
commandBuffer
);
}
/* Compute Pass */
void Refresh_BeginComputePass(
Refresh_Device *device
) {
NULL_RETURN(device);
device->BeginComputePass(
device->driverData
);
}
void Refresh_BindComputePipeline(
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer,
@ -793,7 +676,7 @@ void Refresh_BindComputePipeline(
void Refresh_BindComputeBuffers(
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer,
Refresh_Buffer **pBuffers
Refresh_GpuBuffer **pBuffers
) {
NULL_RETURN(device);
device->BindComputeBuffers(
@ -806,16 +689,258 @@ void Refresh_BindComputeBuffers(
void Refresh_BindComputeTextures(
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer,
Refresh_Texture **pTextures
Refresh_Texture **pTextures,
uint32_t **pLevels
) {
NULL_RETURN(device);
device->BindComputeTextures(
device->driverData,
commandBuffer,
pTextures
pTextures,
pLevels
);
}
uint32_t Refresh_PushComputeShaderUniforms(
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer,
void *data,
uint32_t dataLengthInBytes
) {
if (device == NULL) { return 0; }
return device->PushComputeShaderUniforms(
device->driverData,
commandBuffer,
data,
dataLengthInBytes
);
}
void Refresh_DispatchCompute(
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer,
uint32_t groupCountX,
uint32_t groupCountY,
uint32_t groupCountZ,
uint32_t computeParamOffset
) {
NULL_RETURN(device);
device->DispatchCompute(
device->driverData,
commandBuffer,
groupCountX,
groupCountY,
groupCountZ,
computeParamOffset
);
}
void Refresh_EndComputePass(
Refresh_Device *device
) {
NULL_RETURN(device);
device->EndComputePass(
device->driverData
);
}
/* CpuBuffer Map */
void* Refresh_MapCpuBuffer(
Refresh_Device *device,
Refresh_CpuBuffer *buffer,
uint32_t offsetInBytes,
uint32_t sizeInBytes
) {
NULL_RETURN_NULL(device);
return device->MapCpuBuffer(
device->driverData,
buffer,
offsetInBytes,
sizeInBytes
);
}
void Refresh_UnmapCpuBuffer(
Refresh_Device *device,
Refresh_CpuBuffer *buffer
) {
NULL_RETURN(device);
device->UnmapCpuBuffer(
device->driverData,
buffer
);
}
/* Copy Pass */
void Refresh_BeginCopyPass(
Refresh_Device *device
) {
NULL_RETURN(device);
device->BeginCopyPass(
device->driverData
);
}
void Refresh_UploadToTexture(
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer,
Refresh_CpuBuffer *cpuBuffer,
Refresh_BufferImageCopy *copyParams,
Refresh_TextureSlice *textureSlice
) {
NULL_RETURN(device);
device->UploadToTexture(
device->driverData,
commandBuffer,
cpuBuffer,
copyParams,
textureSlice
);
}
void Refresh_UploadToBuffer(
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer,
Refresh_CpuBuffer *cpuBuffer,
Refresh_GpuBuffer *gpuBuffer,
Refresh_BufferCopy *copyParams
) {
NULL_RETURN(device);
device->UploadToBuffer(
device->driverData,
commandBuffer,
cpuBuffer,
gpuBuffer,
copyParams
);
}
void Refresh_DownloadFromTexture(
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer,
Refresh_TextureSlice *textureSlice,
Refresh_CpuBuffer *cpuBuffer,
Refresh_BufferImageCopy *copyParams
) {
NULL_RETURN(device);
device->DownloadFromTexture(
device->driverData,
commandBuffer,
textureSlice,
cpuBuffer,
copyParams
);
}
void Refresh_DownloadFromBuffer(
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer,
Refresh_GpuBuffer *gpuBuffer,
Refresh_CpuBuffer *cpuBuffer,
Refresh_BufferCopy *copyParams
) {
NULL_RETURN(device);
device->DownloadFromBuffer(
device->driverData,
commandBuffer,
gpuBuffer,
cpuBuffer,
copyParams
);
}
void Refresh_CopyTextureToTexture(
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer,
Refresh_TextureSlice *sourceTextureSlice,
Refresh_TextureSlice *destinationTextureSlice
) {
NULL_RETURN(device);
device->CopyTextureToTexture(
device->driverData,
commandBuffer,
sourceTextureSlice,
destinationTextureSlice
);
}
void Refresh_CopyTextureToBuffer(
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer,
Refresh_TextureSlice *textureSlice,
Refresh_GpuBuffer *buffer,
Refresh_BufferImageCopy *copyParameters
) {
NULL_RETURN(device);
device->CopyTextureToBuffer(
device->driverData,
commandBuffer,
textureSlice,
buffer,
copyParameters
);
}
void Refresh_CopyBufferToTexture(
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer,
Refresh_GpuBuffer *buffer,
Refresh_BufferImageCopy *copyParams,
Refresh_TextureSlice *textureSlice
) {
NULL_RETURN(device);
device->CopyBufferToTexture(
device->driverData,
commandBuffer,
buffer,
copyParams,
textureSlice
);
}
void Refresh_CopyBufferToBuffer(
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer,
Refresh_GpuBuffer *source,
Refresh_GpuBuffer *destination,
Refresh_BufferCopy *copyParams
) {
NULL_RETURN(device);
device->CopyBufferToBuffer(
device->driverData,
commandBuffer,
source,
destination,
copyParams
);
}
void Refresh_GenerateMipmaps(
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer,
Refresh_Texture *texture
) {
NULL_RETURN(device);
device->GenerateMipmaps(
device->driverData,
commandBuffer,
texture
);
}
void Refresh_EndCopyPass(
Refresh_Device *device
) {
NULL_RETURN(device);
device->EndCopyPass(
device->driverData
);
}
/* Submission/Presentation */
uint8_t Refresh_ClaimWindow(
Refresh_Device *device,
void *windowHandle,
@ -840,6 +965,30 @@ void Refresh_UnclaimWindow(
);
}
void Refresh_SetSwapchainPresentMode(
Refresh_Device *device,
void *windowHandle,
Refresh_PresentMode presentMode
) {
NULL_RETURN(device);
device->SetSwapchainPresentMode(
device->driverData,
windowHandle,
presentMode
);
}
Refresh_TextureFormat Refresh_GetSwapchainFormat(
Refresh_Device *device,
void *windowHandle
) {
if (device == NULL) { return 0; }
return device->GetSwapchainFormat(
device->driverData,
windowHandle
);
}
Refresh_CommandBuffer* Refresh_AcquireCommandBuffer(
Refresh_Device *device
) {
@ -866,30 +1015,6 @@ Refresh_Texture* Refresh_AcquireSwapchainTexture(
);
}
Refresh_TextureFormat Refresh_GetSwapchainFormat(
Refresh_Device *device,
void *windowHandle
) {
if (device == NULL) { return 0; }
return device->GetSwapchainFormat(
device->driverData,
windowHandle
);
}
void Refresh_SetSwapchainPresentMode(
Refresh_Device *device,
void *windowHandle,
Refresh_PresentMode presentMode
) {
NULL_RETURN(device);
device->SetSwapchainPresentMode(
device->driverData,
windowHandle,
presentMode
);
}
void Refresh_Submit(
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer

View File

@ -181,7 +181,153 @@ struct Refresh_Device
void (*DestroyDevice)(Refresh_Device *device);
/* Drawing */
/* State Creation */
Refresh_ComputePipeline* (*CreateComputePipeline)(
Refresh_Renderer *driverData,
Refresh_ComputeShaderInfo *computeShaderInfo
);
Refresh_GraphicsPipeline* (*CreateGraphicsPipeline)(
Refresh_Renderer *driverData,
Refresh_GraphicsPipelineCreateInfo *pipelineCreateInfo
);
Refresh_Sampler* (*CreateSampler)(
Refresh_Renderer *driverData,
Refresh_SamplerStateCreateInfo *samplerStateCreateInfo
);
Refresh_ShaderModule* (*CreateShaderModule)(
Refresh_Renderer *driverData,
Refresh_ShaderModuleCreateInfo *shaderModuleCreateInfo
);
Refresh_Texture* (*CreateTexture)(
Refresh_Renderer *driverData,
Refresh_TextureCreateInfo *textureCreateInfo
);
Refresh_GpuBuffer* (*CreateGpuBuffer)(
Refresh_Renderer *driverData,
Refresh_BufferUsageFlags usageFlags,
uint32_t sizeInBytes
);
Refresh_CpuBuffer* (*CreateCpuBuffer)(
Refresh_Renderer *driverData,
uint32_t sizeInBytes
);
/* Disposal */
void (*QueueDestroyTexture)(
Refresh_Renderer *driverData,
Refresh_Texture *texture
);
void (*QueueDestroySampler)(
Refresh_Renderer *driverData,
Refresh_Sampler *sampler
);
void (*QueueDestroyGpuBuffer)(
Refresh_Renderer *driverData,
Refresh_GpuBuffer *buffer
);
void (*QueueDestroyCpuBuffer)(
Refresh_Renderer *driverData,
Refresh_CpuBuffer *buffer
);
void (*QueueDestroyShaderModule)(
Refresh_Renderer *driverData,
Refresh_ShaderModule *shaderModule
);
void (*QueueDestroyComputePipeline)(
Refresh_Renderer *driverData,
Refresh_ComputePipeline *computePipeline
);
void (*QueueDestroyGraphicsPipeline)(
Refresh_Renderer *driverData,
Refresh_GraphicsPipeline *graphicsPipeline
);
/* Render Pass */
void (*BeginRenderPass)(
Refresh_Renderer *driverData,
Refresh_CommandBuffer *commandBuffer,
Refresh_ColorAttachmentInfo *colorAttachmentInfos,
uint32_t colorAttachmentCount,
Refresh_DepthStencilAttachmentInfo *depthStencilAttachmentInfo
);
void (*BindGraphicsPipeline)(
Refresh_Renderer *driverData,
Refresh_CommandBuffer *commandBuffer,
Refresh_GraphicsPipeline *graphicsPipeline
);
void (*SetViewport)(
Refresh_Renderer *driverData,
Refresh_CommandBuffer *commandBuffer,
Refresh_Viewport *viewport
);
void (*SetScissor)(
Refresh_Renderer *driverData,
Refresh_CommandBuffer *commandBuffer,
Refresh_Rect *scissor
);
void (*BindVertexBuffers)(
Refresh_Renderer *driverData,
Refresh_CommandBuffer *commandBuffer,
uint32_t firstBinding,
uint32_t bindingCount,
Refresh_GpuBuffer **pBuffers,
uint64_t *pOffsets
);
void (*BindIndexBuffer)(
Refresh_Renderer *driverData,
Refresh_CommandBuffer *commandBuffer,
Refresh_GpuBuffer *buffer,
uint64_t offset,
Refresh_IndexElementSize indexElementSize
);
void (*BindVertexSamplers)(
Refresh_Renderer *driverData,
Refresh_CommandBuffer *commandBuffer,
Refresh_Texture **pTextures,
Refresh_Sampler **pSamplers
);
void (*BindFragmentSamplers)(
Refresh_Renderer *driverData,
Refresh_CommandBuffer *commandBuffer,
Refresh_Texture **pTextures,
Refresh_Sampler **pSamplers
);
uint32_t (*PushVertexShaderUniforms)(
Refresh_Renderer *driverData,
Refresh_CommandBuffer *commandBuffer,
void *data,
uint32_t dataLengthInBytes
);
uint32_t (*PushFragmentShaderUniforms)(
Refresh_Renderer *driverData,
Refresh_CommandBuffer *commandBuffer,
void *data,
uint32_t dataLengthInBytes
);
void (*DrawInstancedPrimitives)(
Refresh_Renderer *driverData,
@ -216,7 +362,7 @@ struct Refresh_Device
void (*DrawPrimitivesIndirect)(
Refresh_Renderer *driverData,
Refresh_CommandBuffer *commandBuffer,
Refresh_Buffer *buffer,
Refresh_GpuBuffer *buffer,
uint32_t offsetInBytes,
uint32_t drawCount,
uint32_t stride,
@ -224,225 +370,15 @@ struct Refresh_Device
uint32_t fragmentParamOffset
);
void (*DispatchCompute)(
Refresh_Renderer *device,
Refresh_CommandBuffer *commandBuffer,
uint32_t groupCountX,
uint32_t groupCountY,
uint32_t groupCountZ,
uint32_t computeParamOffset
);
/* State Creation */
Refresh_ComputePipeline* (*CreateComputePipeline)(
Refresh_Renderer *driverData,
Refresh_ComputeShaderInfo *computeShaderInfo
);
Refresh_GraphicsPipeline* (*CreateGraphicsPipeline)(
Refresh_Renderer *driverData,
Refresh_GraphicsPipelineCreateInfo *pipelineCreateInfo
);
Refresh_Sampler* (*CreateSampler)(
Refresh_Renderer *driverData,
Refresh_SamplerStateCreateInfo *samplerStateCreateInfo
);
Refresh_ShaderModule* (*CreateShaderModule)(
Refresh_Renderer *driverData,
Refresh_ShaderModuleCreateInfo *shaderModuleCreateInfo
);
Refresh_Texture* (*CreateTexture)(
Refresh_Renderer *driverData,
Refresh_TextureCreateInfo *textureCreateInfo
);
Refresh_Buffer* (*CreateBuffer)(
Refresh_Renderer *driverData,
Refresh_BufferUsageFlags usageFlags,
uint32_t sizeInBytes
);
/* Setters */
void (*SetTextureData)(
Refresh_Renderer *driverData,
Refresh_CommandBuffer *commandBuffer,
Refresh_TextureSlice *textureSlice,
void *data,
uint32_t dataLengthInBytes
);
void (*SetTextureDataYUV)(
Refresh_Renderer *driverData,
Refresh_CommandBuffer* commandBuffer,
Refresh_Texture *y,
Refresh_Texture *u,
Refresh_Texture *v,
uint32_t yWidth,
uint32_t yHeight,
uint32_t uvWidth,
uint32_t uvHeight,
void *yDataPtr,
void *uDataPtr,
void *vDataPtr,
uint32_t yDataLength,
uint32_t uvDataLength,
uint32_t yStride,
uint32_t uvStride
);
void (*CopyTextureToTexture)(
Refresh_Renderer *driverData,
Refresh_CommandBuffer *commandBuffer,
Refresh_TextureSlice *sourceTextureSlice,
Refresh_TextureSlice *destinationTextureSlice,
Refresh_Filter filter
);
void (*CopyTextureToBuffer)(
Refresh_Renderer *driverData,
Refresh_CommandBuffer *commandBuffer,
Refresh_TextureSlice *textureSlice,
Refresh_Buffer *buffer
);
void (*SetBufferData)(
Refresh_Renderer *driverData,
Refresh_CommandBuffer *commandBuffer,
Refresh_Buffer *buffer,
uint32_t offsetInBytes,
void* data,
uint32_t dataLength
);
uint32_t (*PushVertexShaderUniforms)(
Refresh_Renderer *driverData,
Refresh_CommandBuffer *commandBuffer,
void *data,
uint32_t dataLengthInBytes
);
uint32_t (*PushFragmentShaderUniforms)(
Refresh_Renderer *driverData,
Refresh_CommandBuffer *commandBuffer,
void *data,
uint32_t dataLengthInBytes
);
uint32_t (*PushComputeShaderUniforms)(
Refresh_Renderer *driverData,
Refresh_CommandBuffer *commandBuffer,
void *data,
uint32_t dataLengthInBytes
);
void (*BindVertexSamplers)(
Refresh_Renderer *driverData,
Refresh_CommandBuffer *commandBuffer,
Refresh_Texture **pTextures,
Refresh_Sampler **pSamplers
);
void (*BindFragmentSamplers)(
Refresh_Renderer *driverData,
Refresh_CommandBuffer *commandBuffer,
Refresh_Texture **pTextures,
Refresh_Sampler **pSamplers
);
/* Getters */
void (*GetBufferData)(
Refresh_Renderer *driverData,
Refresh_Buffer *buffer,
void *data,
uint32_t dataLengthInBytes
);
/* Disposal */
void (*QueueDestroyTexture)(
Refresh_Renderer *driverData,
Refresh_Texture *texture
);
void (*QueueDestroySampler)(
Refresh_Renderer *driverData,
Refresh_Sampler *sampler
);
void (*QueueDestroyBuffer)(
Refresh_Renderer *driverData,
Refresh_Buffer *buffer
);
void (*QueueDestroyShaderModule)(
Refresh_Renderer *driverData,
Refresh_ShaderModule *shaderModule
);
void (*QueueDestroyComputePipeline)(
Refresh_Renderer *driverData,
Refresh_ComputePipeline *computePipeline
);
void (*QueueDestroyGraphicsPipeline)(
Refresh_Renderer *driverData,
Refresh_GraphicsPipeline *graphicsPipeline
);
/* Graphics State */
void (*BeginRenderPass)(
Refresh_Renderer *driverData,
Refresh_CommandBuffer *commandBuffer,
Refresh_ColorAttachmentInfo *colorAttachmentInfos,
uint32_t colorAttachmentCount,
Refresh_DepthStencilAttachmentInfo *depthStencilAttachmentInfo
);
void (*EndRenderPass)(
Refresh_Renderer *driverData,
Refresh_CommandBuffer *commandBuffer
);
void (*SetViewport)(
Refresh_Renderer *driverData,
Refresh_CommandBuffer *commandBuffer,
Refresh_Viewport *viewport
);
/* Compute Pass */
void (*SetScissor)(
Refresh_Renderer *driverData,
Refresh_CommandBuffer *commandBuffer,
Refresh_Rect *scissor
);
void (*BindGraphicsPipeline)(
Refresh_Renderer *driverData,
Refresh_CommandBuffer *commandBuffer,
Refresh_GraphicsPipeline *graphicsPipeline
);
void (*BindVertexBuffers)(
Refresh_Renderer *driverData,
Refresh_CommandBuffer *commandBuffer,
uint32_t firstBinding,
uint32_t bindingCount,
Refresh_Buffer **pBuffers,
uint64_t *pOffsets
);
void (*BindIndexBuffer)(
Refresh_Renderer *driverData,
Refresh_CommandBuffer *commandBuffer,
Refresh_Buffer *buffer,
uint64_t offset,
Refresh_IndexElementSize indexElementSize
void (*BeginComputePass)(
Refresh_Renderer *driverData
);
void (*BindComputePipeline)(
@ -454,15 +390,131 @@ struct Refresh_Device
void (*BindComputeBuffers)(
Refresh_Renderer *driverData,
Refresh_CommandBuffer *commandBuffer,
Refresh_Buffer **pBuffers
Refresh_GpuBuffer **pBuffers
);
void (*BindComputeTextures)(
Refresh_Renderer *driverData,
Refresh_CommandBuffer *commandBuffer,
Refresh_Texture **pTextures
Refresh_Texture **pTextures,
uint32_t **pLevels
);
uint32_t (*PushComputeShaderUniforms)(
Refresh_Renderer *driverData,
Refresh_CommandBuffer *commandBuffer,
void *data,
uint32_t dataLengthInBytes
);
void (*DispatchCompute)(
Refresh_Renderer *device,
Refresh_CommandBuffer *commandBuffer,
uint32_t groupCountX,
uint32_t groupCountY,
uint32_t groupCountZ,
uint32_t computeParamOffset
);
void (*EndComputePass)(
Refresh_Renderer *driverData
);
/* CpuBuffer map/unmap */
void* (*MapCpuBuffer)(
Refresh_Renderer *driverData,
Refresh_CpuBuffer *buffer,
uint32_t offsetInBytes,
uint32_t sizeInBytes
);
void (*UnmapCpuBuffer)(
Refresh_Renderer *driverData,
Refresh_CpuBuffer *buffer
);
/* Copy Pass */
void (*BeginCopyPass)(
Refresh_Renderer *driverData
);
void (*UploadToTexture)(
Refresh_Renderer *driverData,
Refresh_CommandBuffer *commandBuffer,
Refresh_CpuBuffer *cpuBuffer,
Refresh_BufferImageCopy *copyParams,
Refresh_TextureSlice *textureSlice
);
void (*UploadToBuffer)(
Refresh_Renderer *driverData,
Refresh_CommandBuffer *commandBuffer,
Refresh_CpuBuffer *cpuBuffer,
Refresh_GpuBuffer *gpuBuffer,
Refresh_BufferCopy *copyParams
);
void (*DownloadFromTexture)(
Refresh_Renderer *driverData,
Refresh_CommandBuffer *commandBuffer,
Refresh_TextureSlice *textureSlice,
Refresh_CpuBuffer *cpuBuffer,
Refresh_BufferImageCopy *copyParams
);
void (*DownloadFromBuffer)(
Refresh_Renderer *driverData,
Refresh_CommandBuffer *commandBuffer,
Refresh_GpuBuffer *gpuBuffer,
Refresh_CpuBuffer *cpuBuffer,
Refresh_BufferCopy *copyParams
);
void (*CopyTextureToTexture)(
Refresh_Renderer *driverData,
Refresh_CommandBuffer *commandBuffer,
Refresh_TextureSlice *source,
Refresh_TextureSlice *destination
);
void (*CopyTextureToBuffer)(
Refresh_Renderer *driverData,
Refresh_CommandBuffer *commandBuffer,
Refresh_TextureSlice *textureSlice,
Refresh_GpuBuffer *buffer,
Refresh_BufferImageCopy *copyParameters
);
void (*CopyBufferToTexture)(
Refresh_Renderer *driverData,
Refresh_CommandBuffer *commandBuffer,
Refresh_GpuBuffer *buffer,
Refresh_BufferImageCopy *copyParams,
Refresh_TextureSlice *textureSlice
);
void (*CopyBufferToBuffer)(
Refresh_Renderer *driverData,
Refresh_CommandBuffer *commandBuffer,
Refresh_GpuBuffer *source,
Refresh_GpuBuffer *destination,
Refresh_BufferCopy *copyParams
);
void (*GenerateMipmaps)(
Refresh_Renderer *driverData,
Refresh_CommandBuffer *commandBuffer,
Refresh_Texture *texture
);
void (*EndCopyPass)(
Refresh_Renderer *driverData
);
/* Submission/Presentation */
uint8_t (*ClaimWindow)(
Refresh_Renderer *driverData,
void *windowHandle,
@ -474,6 +526,17 @@ struct Refresh_Device
void *windowHandle
);
void (*SetSwapchainPresentMode)(
Refresh_Renderer *driverData,
void *windowHandle,
Refresh_PresentMode presentMode
);
Refresh_TextureFormat (*GetSwapchainFormat)(
Refresh_Renderer *driverData,
void *windowHandle
);
Refresh_CommandBuffer* (*AcquireCommandBuffer)(
Refresh_Renderer *driverData
);
@ -486,17 +549,6 @@ struct Refresh_Device
uint32_t *pHeight
);
Refresh_TextureFormat (*GetSwapchainFormat)(
Refresh_Renderer *driverData,
void *windowHandle
);
void (*SetSwapchainPresentMode)(
Refresh_Renderer *driverData,
void *windowHandle,
Refresh_PresentMode presentMode
);
void (*Submit)(
Refresh_Renderer *driverData,
Refresh_CommandBuffer *commandBuffer