Compare commits

...

131 Commits

Author SHA1 Message Date
cosmonaut b78d01592b memory system tweaks
continuous-integration/drone/push Build is passing Details
2024-02-11 15:56:53 -08:00
cosmonaut c99b4cdfa1 fix incorrect flag bit
continuous-integration/drone/push Build is passing Details
2024-01-31 14:47:01 -08:00
cosmonaut 2803e6d94e force ignore device-local property if allocation failed
continuous-integration/drone/push Build is passing Details
2024-01-31 14:36:02 -08:00
cosmonaut 30b5f1dd21 user-requested buffers are no longer host-visible
continuous-integration/drone/push Build is passing Details
2024-01-31 14:26:40 -08:00
cosmonaut 4ce2d80f80 Intel doesn't like 1 byte buffers
continuous-integration/drone/push Build is passing Details
2024-01-19 10:19:23 -08:00
cosmonaut 27e9c741f8 1.15.4
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2024-01-15 22:34:31 -08:00
cosmonaut c10ca98ccd Remove some unused variables
continuous-integration/drone/push Build is passing Details
2024-01-15 22:25:27 -08:00
cosmonaut d441424b7c Fix ANY_SHADER_READ_SAMPLED_IMAGE sync hazard
continuous-integration/drone/push Build is passing Details
2024-01-15 21:41:36 -08:00
cosmonaut 55c77def69 Revert "Fix potential sync hazards (#49)"
This reverts commit 20636ec951.
2024-01-15 21:38:37 -08:00
cosmonaut 2634359b48 Texture size calculation fixes
continuous-integration/drone/push Build is passing Details
2024-01-15 16:36:56 -08:00
cosmonaut 56e3eb2af5 1.15.3
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2024-01-15 12:47:49 -08:00
cosmonaut 859fc3b9fa fix UBO buffer size
continuous-integration/drone/push Build is passing Details
2024-01-13 23:45:07 -08:00
cosmonaut 05350a9332 UBO offsets should respect alignment
continuous-integration/drone/push Build is passing Details
2024-01-13 23:39:58 -08:00
cosmonaut 760c29699f 1.15.2
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2024-01-12 18:10:11 -08:00
cosmonaut 20636ec951 Fix potential sync hazards (#49)
We now do certain image layout transitions in the render pass instead of a barrier in EndRenderPass.

There is also an additional barrier on buffer uploads to prevent write-after-write hazard. It's a kludge on the fact that we're only tracking the most recent resource access.

Reviewed-on: MoonsideGames/Refresh#49
2024-01-12 18:10:11 -08:00
cosmonaut 7297eba889 Uniform buffers are now slices of dedicated allocs (#48)
continuous-integration/drone/push Build is passing Details
This should fix an issue where draw calls could flicker if a defrag was in progress and a uniform buffer was being used.

Uniform buffer "pools" are now just a single dedicated VulkanBuffer, and the uniform buffer objects are offsets into that buffer.

Reviewed-on: MoonsideGames/Refresh#48
2024-01-13 01:41:12 +00:00
cosmonaut b72b0b5fde fix path quotes in shadercompiler
continuous-integration/drone/push Build is passing Details
2024-01-11 16:26:08 -08:00
cosmonaut fa92e9e08a change dummy uniform buffer size to 1
continuous-integration/drone/push Build is passing Details
2023-12-08 12:49:46 -08:00
cosmonaut 483c07f3a8 Vulkan: fix dummy UBOs becoming invalid after defrag
continuous-integration/drone/push Build is passing Details
2023-12-05 12:22:40 -08:00
cosmonaut f01d5d817a Vulkan: fix some missed cleanup in DestroyDevice
continuous-integration/drone/push Build is passing Details
2023-12-04 17:28:25 -08:00
cosmonaut 17aae46eae revert OSX deployment target to 10.9
continuous-integration/drone/push Build is passing Details
2023-12-04 16:37:22 -08:00
cosmonaut 1b3e954da8 change render pass barriers to read-write
continuous-integration/drone/push Build is passing Details
2023-11-09 11:00:19 -08:00
Evan Hemsley 0989e45f88 MoltenVK support
continuous-integration/drone/push Build is passing Details
2023-10-14 22:14:00 -07:00
Evan Hemsley 6e6fec5224 bump OSX version to 10.15
continuous-integration/drone/push Build is passing Details
2023-10-14 20:46:22 -07:00
cosmonaut 34b2e437de 1.15.1
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2023-10-12 11:18:37 -07:00
cosmonaut d69bbbe818 fix Vulkan SDK include on Windows
continuous-integration/drone/push Build is passing Details
2023-10-12 11:11:44 -07:00
cosmonaut 54a8ff122c Fix uniform buffers not tracking correctly 2023-10-12 11:11:27 -07:00
TheSpydog a15e26b124 Update Driver Template + Window Crash Fix (#46)
continuous-integration/drone/push Build is passing Details
Some minor stuff that's cropped up from the D3D11 work so far. This PR updates the Driver_Template with the latest API, and also fixes a crash in the Vulkan driver -- if you acquired a swapchain texture from a window that had been destroyed, there was no null check before de-referencing the WindowData.

Co-authored-by: Caleb Cornett <caleb.cornett@outlook.com>
Reviewed-on: MoonsideGames/Refresh#46
Co-authored-by: TheSpydog <thespydog@noreply.example.org>
Co-committed-by: TheSpydog <thespydog@noreply.example.org>
2023-09-30 17:50:48 +00:00
cosmonaut 172fa83417 1.15.0
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2023-09-18 23:12:01 -07:00
cosmonaut a3949528eb Fence API (#45)
continuous-integration/drone/push Build is passing Details
Reviewed-on: MoonsideGames/Refresh#45
2023-09-19 06:11:20 +00:00
cosmonaut f55968814f 1.14.1
continuous-integration/drone/tag Build is passing Details
continuous-integration/drone/push Build is passing Details
2023-07-31 16:14:53 -07:00
cosmonaut c978df6275 remove unused variables
continuous-integration/drone/push Build is passing Details
2023-07-31 16:12:20 -07:00
cosmonaut de42163673 rework Vulkan device selection and initialization
continuous-integration/drone/push Build is passing Details
2023-07-31 16:06:47 -07:00
cosmonaut 4f412b5c15 fix refreshc breaking on file paths with spaces
continuous-integration/drone/push Build is passing Details
2023-07-03 15:35:11 -07:00
cosmonaut c3a5d9f417 enable independentBlend feature
continuous-integration/drone/push Build is passing Details
2023-06-16 15:00:47 -07:00
cosmonaut 9631dc9f83 1.14.0
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2023-06-07 14:13:21 -07:00
cosmonaut 5a2b07097a SetTextureDataYUV rework (#44)
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
Reviewed-on: MoonsideGames/Refresh#44
2023-06-07 20:59:55 +00:00
cosmonaut 1f9f7e0939 Memory Management Rewrite (#41)
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
continuous-integration/drone Build is passing Details
Various changes to reduce and optimize memory usage.

- Defragmenter
- Allocate 4 16MB transfer buffers for pool
- If transfer is larger than 16MB, create temporary transfer buffer
- Fixed some issues with CopyTextureToTexture

Reviewed-on: MoonsideGames/Refresh#41
2023-05-18 23:43:11 +00:00
cosmonaut 4df0459b04 1.13.0
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2023-04-18 23:43:59 -07:00
cosmonaut 0f29bf03e9 Remove qoi.h
continuous-integration/drone/push Build is passing Details
2023-04-18 23:43:23 -07:00
cosmonaut 74909b49c3 Redesign image API to be format agnostic (#40)
continuous-integration/drone/push Build is passing Details
2023-04-19 06:42:44 +00:00
cosmonaut 3f5fe1ff67 1.12.0
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2023-04-03 17:15:14 -07:00
cosmonaut 3fc743ce28 Add support for QOI format and reading images from memory (#39)
continuous-integration/drone/push Build is passing Details
Reviewed-on: MoonsideGames/Refresh#39
2023-04-04 00:14:20 +00:00
cosmonaut 153c3c3c60 add missing texture formats to size function
continuous-integration/drone/push Build is passing Details
2023-02-27 09:54:26 -08:00
cosmonaut decddae384 Fix MultipleThreads error on command buffer reset
continuous-integration/drone/push Build is passing Details
2023-02-14 12:26:39 -08:00
cosmonaut 2d66ec775b 1.11.0
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2023-02-07 12:26:46 -08:00
cosmonaut 8be8ce1062 shader output name includes shader type
continuous-integration/drone/push Build is passing Details
2023-02-03 15:06:14 -08:00
cosmonaut 8eebd9c744 refreshc publish AOT 2023-02-03 15:05:53 -08:00
TheSpydog 1f2aaeed9f add msaa support for depth textures (#38)
continuous-integration/drone/push Build is passing Details
Depth textures handle MSAA differently than color textures do, because there's no need for a resolve texture. This means the root VulkanTexture can have the sample count instead of needing an additional `msaaTex`.

This changeset also fixes a bug where the depth buffer wasn't getting cleared if there were MSAA color attachments.

Co-authored-by: Caleb Cornett <caleb.cornett@outlook.com>
Reviewed-on: MoonsideGames/Refresh#38
Co-authored-by: TheSpydog <thespydog@noreply.example.org>
Co-committed-by: TheSpydog <thespydog@noreply.example.org>
2023-01-31 20:30:05 +00:00
TheSpydog 6439516835 ABI break: Textures now have a sample count, not render passes (#37)
continuous-integration/drone/push Build is passing Details
This change makes Refresh behave more like FNA and other rendering APIs, where user-side textures have a sample count instead of generating MSAA RTs on the fly.

This should theoretically reduce memory consumption since subresource views no longer generate their own MSAA textures. Instead, each texture with a sample count > 1 now has a reference to an MSAA texture baked into the root texture itself, so views can just reference that.

This also simplifies VulkanRenderTarget significantly, to the point where it's just a wrapper around VkImageView. We could probably remove the abstraction entirely at this point.

Since VkRenderPass objects still require knowing the sample count, we can use the first bound texture's sample count. This means users only have to specify sample count in two places -- the graphics pipeline, and the texture. Easy enough.

I also noticed and fixed a bug with clear values with MSAA levels > 1.

Co-authored-by: Caleb Cornett <caleb.cornett@outlook.com>
Reviewed-on: MoonsideGames/Refresh#37
Co-authored-by: TheSpydog <thespydog@noreply.example.org>
Co-committed-by: TheSpydog <thespydog@noreply.example.org>
2023-01-30 18:22:16 +00:00
TheSpydog 89ba9c52ff vulkan: Fix framebuffer creation with mip levels (#36)
continuous-integration/drone/push Build is passing Details
Before this change, framebuffers were created based on the attachments' full dimensions, instead of the dimensions of the requested mip level. This fixes validation errors in the RenderTextureMipmaps test program.

Co-authored-by: Caleb Cornett <caleb.cornett@outlook.com>
Reviewed-on: MoonsideGames/Refresh#36
Co-authored-by: TheSpydog <thespydog@noreply.example.org>
Co-committed-by: TheSpydog <thespydog@noreply.example.org>
2023-01-24 00:15:02 +00:00
TheSpydog e3ab5fadf8 vulkan: Fix 3D texture creation (#35)
continuous-integration/drone/push Build is passing Details
The image type getting passed to imageCreateInfo was always VK_IMAGE_TYPE_2D, even for 3D textures. This fixes that bug, allowing Vulkan to successfully create 3D textures.

Co-authored-by: Caleb Cornett <caleb.cornett@outlook.com>
Reviewed-on: MoonsideGames/Refresh#35
Co-authored-by: TheSpydog <thespydog@noreply.example.org>
Co-committed-by: TheSpydog <thespydog@noreply.example.org>
2023-01-24 00:13:23 +00:00
TheSpydog 05900bee14 Shader cross-compiler (#34)
continuous-integration/drone/push Build is passing Details
This PR adds a shader cross-compiler program (written in C#) that uses glslc and spirv-cross to compile GLSL source files to a custom, Refresh-specific shader blob format that contains shader code for various backends.

The goal is that whenever you want to compile your shaders, you just run this program (either via `refreshc` or `dotnet run`), passing in the path to the GLSL source file. You can specify which backends you want to support via flags (`--vulkan`, for instance), and it will generate a .refresh blob file for Refresh to consume.

This can also be extended via C# defines and the `partial class` system. An example is the PS5 shader implementation, whose logic is squirreled away in the NDA'd repository but can be called in sequence with the rest of the shader cross-compile logic. This way, we don't have to run two separate programs to compile our shaders to all supported platforms.

Refresh handles all the parsing of the file format in Refresh_CreateShaderModule, so individual backends do not need to concern themselves with the particulars.

Co-authored-by: Caleb Cornett <caleb.cornett@outlook.com>
Reviewed-on: MoonsideGames/Refresh#34
Co-authored-by: TheSpydog <thespydog@noreply.example.org>
Co-committed-by: TheSpydog <thespydog@noreply.example.org>
2023-01-20 23:19:12 +00:00
TheSpydog f7250ab12a Remove fixed command buffers + minor cleanup (#33)
continuous-integration/drone/push Build is passing Details
Removes the `fixed` parameter from AcquireCommandBuffer, and removes a couple other unused bools from the VulkanCommandBuffer struct.

Co-authored-by: Caleb Cornett <caleb.cornett@outlook.com>
Reviewed-on: MoonsideGames/Refresh#33
Co-authored-by: TheSpydog <thespydog@noreply.example.org>
Co-committed-by: TheSpydog <thespydog@noreply.example.org>
2023-01-14 18:03:58 +00:00
cosmonaut 903192cb4c Descriptor validation fix (#32)
continuous-integration/drone/push Build is passing Details
The validator layer was complaining about us updating bound descriptor sets, this is technically a bug in the validator layer but resetting the command buffer in Cleanup makes more sense anyway. Also changed the wait for timeout call to a fence status query to make it easier to understand.

Reviewed-on: MoonsideGames/Refresh#32
2023-01-11 02:41:30 +00:00
cosmonaut 4cdd6a497a Fix transfer buffer alignment (#31)
continuous-integration/drone/push Build is passing Details
Reviewed-on: MoonsideGames/Refresh#31
2023-01-07 05:24:58 +00:00
cosmonaut 28b4253fdf 1.10.0
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2023-01-04 11:18:37 -08:00
TheSpydog e4215efe5e Enable multiDrawIndirect feature, add indirect command struct (#30)
continuous-integration/drone/push Build is passing Details
Fixes a validation error when attempting to draw multiple primitives via an indirect draw call. Adds some documentation for how indirect draw buffers should be set up.

Co-authored-by: Caleb Cornett <caleb.cornett@outlook.com>
Reviewed-on: MoonsideGames/Refresh#30
Co-authored-by: TheSpydog <thespydog@noreply.example.org>
Co-committed-by: TheSpydog <thespydog@noreply.example.org>
2023-01-04 18:44:02 +00:00
Caleb Cornett 329ffab6b8 Remove SRC1 blend factors and depthClampEnable flag
continuous-integration/drone/push Build is passing Details
2022-12-28 19:10:59 -08:00
Caleb Cornett 15b35fccfe update documentation + remove validation + misc cleanup
continuous-integration/drone/push Build is passing Details
2022-12-28 19:08:08 -08:00
TheSpydog ade74d73fe Perform pending destroys before unlocking the submit mutex (#28)
continuous-integration/drone/push Build is passing Details
This makes the order of VULKAN_Submit consistent with VULKAN_Wait.

Co-authored-by: Caleb Cornett <caleb.cornett@outlook.com>
Reviewed-on: MoonsideGames/Refresh#28
Co-authored-by: TheSpydog <thespydog@noreply.example.org>
Co-committed-by: TheSpydog <thespydog@noreply.example.org>
2022-12-29 03:03:35 +00:00
cosmonaut 124f202d2c Same-access-type barrier should not be a no-op
continuous-integration/drone/push Build is passing Details
2022-12-27 20:51:09 -08:00
cosmonaut 528abfad76 fix render target destroy segfault
continuous-integration/drone/push Build is passing Details
2022-12-22 17:23:11 -08:00
cosmonaut 59f9eeed36 1.9.0
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2022-11-09 12:04:01 -08:00
TheSpydog 297f234957 Miscellaneous API changes + more MSAA fixes (#26)
continuous-integration/drone/push Build is passing Details
**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: MoonsideGames/Refresh#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
TheSpydog 5f05ef02a0 MSAA fixes (#25)
continuous-integration/drone/push Build is passing Details
- Fixed bug where multisample enum values were not being translated into their equivalent Vulkan enums
- Fixed bug where MSAA attachments in transient render pass creation were using a sample count of 1
- Fixed bug where the clearValues array in BeginRenderPass was not being populated with clear values for multisample attachments. (Modeled the fix after https://github.com/FNA-XNA/FNA3D/blob/master/src/FNA3D_Driver_Vulkan.c#L8723)
- Fixed bug where the multisample texture was not being transitioned when beginning a render pass

Reviewed-on: MoonsideGames/Refresh#25
Co-authored-by: TheSpydog <thespydog@noreply.example.org>
Co-committed-by: TheSpydog <thespydog@noreply.example.org>
2022-11-03 19:50:07 +00:00
TheSpydog c4b9798fc1 enable samplerAnisotropy device feature (#24)
continuous-integration/drone/push Build is passing Details
Co-authored-by: TheSpydog <thespydog@noreply.example.org>
Co-committed-by: TheSpydog <thespydog@noreply.example.org>
2022-11-02 21:23:48 +00:00
cosmonaut 5166ae87b2 1.8.2
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2022-11-01 16:26:27 -07:00
cosmonaut 3c7755d8bf rework window claim and swapchain acquisition
continuous-integration/drone/push Build is passing Details
2022-11-01 11:54:19 -07:00
cosmonaut 9073f68e0a Fix swapchain extent check when size is zero
continuous-integration/drone/push Build is passing Details
2022-10-31 14:16:32 -07:00
cosmonaut 403dcc6084 1.8.1
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2022-10-04 10:15:26 -07:00
cosmonaut fabd31448b fix backend iteration when backend is not compiled 2022-10-04 10:15:16 -07:00
cosmonaut 9aaead40a3 1.8.0
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2022-09-29 14:13:08 -07:00
cosmonaut 1a0beea402 Backend selection + swapchain API revision (#23)
continuous-integration/drone/push Build is passing Details
- The application must now call `Refresh_SetBackend` before creating the device
- `Refresh_SetBackend` can set a preferred backend, but will fall back if it is not available
- Device creation no longer takes presentation parameters
- Windows must now be explicitly claimed by the device
- Windows can be unclaimed by the device
- Windows can have their swapchain present mode changed after creation

Reviewed-on: MoonsideGames/Refresh#23
2022-09-29 21:11:25 +00:00
cosmonaut 5176f790d8 1.7.1
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2022-09-22 14:01:48 -07:00
cosmonaut f8bdf6fe1a fix texture copy memory barrier + optimize RT memory barrier
continuous-integration/drone/push Build is passing Details
2022-09-22 12:44:28 -07:00
cosmonaut 8f0ba8ffb2 1.7.0
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2022-09-13 13:55:25 -07:00
cosmonaut 5568ce4949 Fix heap iteration (#22)
continuous-integration/drone/push Build is passing Details
Fixes an issue where certain memory heaps could potentially be overlooked.

Reviewed-on: MoonsideGames/Refresh#22
2022-09-13 20:54:24 +00:00
cosmonaut f49c0ab190 Texture format rework (#21)
continuous-integration/drone/push Build is passing Details
- Adds number format information to the texture format names
- Adds several unsigned integer texture formats

Reviewed-on: MoonsideGames/Refresh#21
2022-09-13 20:51:41 +00:00
cosmonaut 764de140cc 1.6.1
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2022-08-25 16:21:45 -07:00
cosmonaut 06ad0e1901 fix barrier issue when sampling depth texture
continuous-integration/drone/push Build is passing Details
2022-08-25 16:20:35 -07:00
cosmonaut 83a59d7685 1.6.0
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2022-08-25 13:51:54 -07:00
cosmonaut 5b27f600de add DrawPrimitivesIndirect + fix sync issues
continuous-integration/drone/push Build is passing Details
2022-08-25 12:21:49 -07:00
TheSpydog d4693a9093 Prep for PS5Driver (#19)
continuous-integration/drone/push Build is passing Details
This PR contains the general changes needed for the PS5 driver (being developed separately, outside this repository).

Co-authored-by: Caleb Cornett <caleb.cornett@outlook.com>
Reviewed-on: MoonsideGames/Refresh#19
Co-authored-by: TheSpydog <thespydog@noreply.example.org>
Co-committed-by: TheSpydog <thespydog@noreply.example.org>
2022-08-14 20:45:24 +00:00
cosmonaut 2fb9a6931b fix SetTextureDataYUV image transitions
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2022-07-29 18:15:02 -07:00
Hazel Stagner c01ff21359 Fix blit destination layer and level
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2022-07-22 20:59:01 -07:00
cosmonaut e5da75d33a fix exponential growth when submitting multiple command buffers
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2022-06-27 10:21:40 -07:00
cosmonaut 99e9dc5b8c fix framebuffer size miscalculation with depth attachment
continuous-integration/drone/push Build is passing Details
2022-06-17 14:47:12 -07:00
cosmonaut 0e7720ccf6 D16 fallback when unsupported
continuous-integration/drone/push Build is passing Details
2022-06-17 00:41:27 -07:00
cosmonaut 488cb8c535 add format to render pass hash
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2022-06-06 11:46:08 -07:00
cosmonaut 3007b4c989 1.5.0
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2022-05-11 21:18:54 -07:00
cosmonaut 163adfb5cd add BC7 support
continuous-integration/drone/push Build is passing Details
2022-05-11 21:16:24 -07:00
cosmonaut f0b970496e vertex format changes
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2022-03-17 14:41:16 -07:00
cosmonaut 38d14fd99d 1.4.0
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2022-03-14 10:54:32 -07:00
cosmonaut 4bba0f99f9 remove lineWidth from RasterizerState
continuous-integration/drone/push Build is passing Details
2022-03-14 10:43:01 -07:00
cosmonaut acefc530fd 1.3.0
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2022-03-10 10:28:00 -08:00
cosmonaut 3820d458fe remove Clear and add pWidth and pHeight to AcquireSwapchainTexture
continuous-integration/drone/push Build is passing Details
2022-03-10 10:21:49 -08:00
cosmonaut 7a0b0f5709 suboptimal on recreate is still technically fine
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2022-03-08 11:21:36 -08:00
cosmonaut ce34f4a435 fix deadlock on multi window swapchain resize
continuous-integration/drone/push Build is passing Details
2022-03-08 10:47:07 -08:00
TheSpydog eb5617f40e Update template for latest ABI breaks (#16)
continuous-integration/drone/push Build is passing Details
Co-authored-by: Caleb Cornett <caleb.cornett@outlook.com>
Co-authored-by: cosmonaut <evan@moonside.games>
Reviewed-on: MoonsideGames/Refresh#16
Co-authored-by: TheSpydog <thespydog@noreply.example.org>
Co-committed-by: TheSpydog <thespydog@noreply.example.org>
2022-03-07 08:05:58 +00:00
cosmonaut 0380a96817 Swapchain resize fixes (#18)
continuous-integration/drone/push Build is passing Details
Fixes various errors related to the swapchain being recreated.

Additionally, `BeginRenderPass` now allows a NULL `renderArea` parameter. If NULL, Refresh will select a sensible default render area.
Co-authored-by: cosmonaut <evan@moonside.games>
Co-committed-by: cosmonaut <evan@moonside.games>
2022-03-07 06:31:39 +00:00
cosmonaut 22236607f7 1.2.1
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2022-03-04 13:39:31 -08:00
cosmonaut 715ca591f6 fix compute pipeline create bug
continuous-integration/drone/push Build is passing Details
2022-03-04 13:37:45 -08:00
cosmonaut 7b91c5a140 1.2.0
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2022-03-04 13:18:58 -08:00
cosmonaut 2731d47419 rename viewport and scissor set functions
continuous-integration/drone/push Build is passing Details
2022-03-04 12:47:36 -08:00
cosmonaut 0fbf1b2546 fix erroneous stack free
continuous-integration/drone/push Build is passing Details
2022-03-04 12:36:02 -08:00
cosmonaut f6b96fe34b viewport and scissor ABI break
continuous-integration/drone/push Build is failing Details
2022-03-04 12:30:33 -08:00
cosmonaut 9422d4975f 1.1.0
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2022-03-03 17:32:21 -08:00
cosmonaut 435f56f6b7 move API defines to the top
continuous-integration/drone/push Build is passing Details
2022-03-03 17:31:33 -08:00
cosmonaut 6302603b08 add some missing frees
continuous-integration/drone/push Build is passing Details
2022-03-03 17:30:26 -08:00
cosmonaut 5fe4c8dbf3 remove command buffer from QueueDestroy calls
continuous-integration/drone/push Build is passing Details
2022-03-03 17:07:07 -08:00
cosmonaut 67e3a8799c 1.0.0
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2022-03-02 15:55:56 -08:00
cosmonaut ee50c04428 remove interop structs
continuous-integration/drone/push Build is passing Details
2022-03-02 15:49:40 -08:00
cosmonaut 9eae69f96b remove unused enum
continuous-integration/drone/push Build is passing Details
2022-03-02 11:46:41 -08:00
cosmonaut 057a48e96f separate shader types
continuous-integration/drone/push Build is passing Details
2022-03-02 11:22:52 -08:00
cosmonaut 61e83cfba8 D3D compatibility ABI break
continuous-integration/drone/push Build is passing Details
2022-03-02 11:10:28 -08:00
cosmonaut e4ea104a88 remove swapchain log spam
continuous-integration/drone/push Build is passing Details
2022-03-02 10:27:03 -08:00
cosmonaut 83c2372499 only mark swapchain as needing recreate if it exists
continuous-integration/drone/push Build is passing Details
2022-03-02 10:02:07 -08:00
cosmonaut cb99489b3c Rework Presentation Flow (#15)
continuous-integration/drone/push Build is passing Details
Removes `Refresh_RenderTarget`, `Refresh_CreateRenderTarget` and `Refresh_QueueDestroyRenderTarget`. Render targets are now managed by the implementation.

Adds `REFRESH_TEXTUREFORMAT_B8G8R8A8`.

Adds `Refresh_AcquireSwapchainTexture`. Returns a swapchain texture for the requested window.

Removes `Refresh_QueuePresent`. It is now assumed that the texture returned by `Refresh_AcquireSwapchainTexture` will be presented. This texture can be manipulated like any other texture.

Adds `Refresh_GetSwapchainFormat`. Returns the swapchain format for the requested window.

Reviewed-on: MoonsideGames/Refresh#15
Co-authored-by: cosmonaut <evan@moonside.games>
Co-committed-by: cosmonaut <evan@moonside.games>
2022-03-02 06:33:57 +00:00
cosmonaut d22bed8b76 transition entire images + rework swapchain image management
continuous-integration/drone/push Build is passing Details
2022-02-28 12:02:39 -08:00
cosmonaut 436b990d45 Fix intro message formatting
continuous-integration/drone/push Build is passing Details
2022-02-25 23:13:17 -08:00
cosmonaut a26d3e3689 move color blend state to AttachmentInfo
continuous-integration/drone/push Build is passing Details
2022-02-25 17:37:42 -08:00
cosmonaut a38a9d461d fix right alignment spacing
continuous-integration/drone/push Build is passing Details
2022-02-25 13:51:29 -08:00
cosmonaut 517399f5d9 convert all spaces to tabs
continuous-integration/drone/push Build is passing Details
2022-02-25 13:42:11 -08:00
cosmonaut 5187093ddc reset command buffers on the thread they were spawned
continuous-integration/drone/push Build is passing Details
2022-02-24 22:06:00 -08:00
cosmonaut 336468cc31 fix some invalid accesses
continuous-integration/drone/push Build is passing Details
2022-02-24 21:29:52 -08:00
cosmonaut 26a5ea91ba change colorAttachmentDescriptions to a const pointer
continuous-integration/drone/push Build is passing Details
2022-02-24 21:20:55 -08:00
cosmonaut a531fb8593 Render Pass API Streamlining (#14)
continuous-integration/drone/push Build is passing Details
Removes `Refresh_RenderPass` and `Refresh_Framebuffer` objects.

`Refresh_BeginRenderPass` now takes a set of `Refresh_ColorAttachmentInfo` structs and an optional `Refresh_DepthStencilAttachmentInfo` struct that describe the render pass. The render pass and framebuffer objects are now managed by the implementation instead of the application.

Accordingly, `Refresh_GraphicsPipelineCreateInfo` now takes a `Refresh_GraphicsPipelineAttachmentInfo` struct that describes render passes that may be used with the pipeline. It is an error to bind a pipeline during an incompatible render pass.

Reviewed-on: MoonsideGames/Refresh#14
Co-authored-by: cosmonaut <evan@moonside.games>
Co-committed-by: cosmonaut <evan@moonside.games>
2022-02-24 22:01:37 +00:00
cosmonaut a3aea0f796 Reset fence as late as possible
continuous-integration/drone/push Build is passing Details
2022-02-22 21:54:32 -08:00
cosmonaut 0319c26f6a Submission rewrite (#13)
continuous-integration/drone/push Build is passing Details
Rework submission flow to reduce waiting and improve the resource cleanup process.

This patch also gets rid of descriptor set caching.
Co-authored-by: cosmonaut <evan@moonside.games>
Co-committed-by: cosmonaut <evan@moonside.games>
2022-02-23 00:49:45 +00:00
TheSpydog 1d72fdb995 Added a Refresh driver template file (#12)
continuous-integration/drone/push Build is passing Details
This allows us to avoid monotonous boilerplate when bringing up new backends.
Co-authored-by: TheSpydog <thespydog@noreply.example.org>
Co-committed-by: TheSpydog <thespydog@noreply.example.org>
2022-02-22 03:28:31 +00:00
13 changed files with 8882 additions and 5305 deletions

13
.editorconfig Normal file
View File

@ -0,0 +1,13 @@
# EditorConfig is awesome: https://EditorConfig.org
# top-most EditorConfig file
root = true
[*]
indent_style = tab
insert_final_newline = true
trim_trailing_whitespace = true
[*.{c,h}]
charset = utf-8-bom
max_line_length = 100

View File

@ -7,9 +7,9 @@ project(Refresh C)
option(BUILD_SHARED_LIBS "Build shared library" ON) option(BUILD_SHARED_LIBS "Build shared library" ON)
# Version # Version
SET(LIB_MAJOR_VERSION "0") SET(LIB_MAJOR_VERSION "1")
SET(LIB_MINOR_VERSION "1") SET(LIB_MINOR_VERSION "15")
SET(LIB_REVISION "0") SET(LIB_REVISION "4")
SET(LIB_VERSION "${LIB_MAJOR_VERSION}.${LIB_MINOR_VERSION}.${LIB_REVISION}") SET(LIB_VERSION "${LIB_MAJOR_VERSION}.${LIB_MINOR_VERSION}.${LIB_REVISION}")
# Build Type # Build Type
@ -60,6 +60,11 @@ if(NOT MSVC)
set_property(TARGET Refresh PROPERTY COMPILE_FLAGS "-std=gnu99 -Wall -Wno-strict-aliasing -pedantic") set_property(TARGET Refresh PROPERTY COMPILE_FLAGS "-std=gnu99 -Wall -Wno-strict-aliasing -pedantic")
endif() endif()
# Windows is silly and we need to manually include the Vulkan SDK
if(MSVC)
target_include_directories(Refresh PUBLIC $ENV{VULKAN_SDK}/include)
endif()
# Refresh folders as includes, for other targets to consume # Refresh folders as includes, for other targets to consume
target_include_directories(Refresh PUBLIC target_include_directories(Refresh PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src> $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src>

View File

@ -1,4 +1,4 @@
/* Refresh - XNA-inspired 3D Graphics Library with modern capabilities /* Refresh - XNA-inspired 3D Graphics Library with modern capabilities
* *
* Copyright (c) 2020 Evan Hemsley * Copyright (c) 2020 Evan Hemsley
* *
@ -52,19 +52,31 @@
extern "C" { extern "C" {
#endif /* __cplusplus */ #endif /* __cplusplus */
/* Version API */
#define REFRESH_MAJOR_VERSION 1
#define REFRESH_MINOR_VERSION 15
#define REFRESH_PATCH_VERSION 4
#define REFRESH_COMPILED_VERSION ( \
(REFRESH_MAJOR_VERSION * 100 * 100) + \
(REFRESH_MINOR_VERSION * 100) + \
(REFRESH_PATCH_VERSION) \
)
REFRESHAPI uint32_t Refresh_LinkedVersion(void);
/* Type Declarations */ /* Type Declarations */
typedef struct Refresh_Device Refresh_Device; typedef struct Refresh_Device Refresh_Device;
typedef struct Refresh_Buffer Refresh_Buffer; typedef struct Refresh_Buffer Refresh_Buffer;
typedef struct Refresh_Texture Refresh_Texture; typedef struct Refresh_Texture Refresh_Texture;
typedef struct Refresh_Sampler Refresh_Sampler; typedef struct Refresh_Sampler Refresh_Sampler;
typedef struct Refresh_RenderTarget Refresh_RenderTarget;
typedef struct Refresh_Framebuffer Refresh_Framebuffer;
typedef struct Refresh_ShaderModule Refresh_ShaderModule; typedef struct Refresh_ShaderModule Refresh_ShaderModule;
typedef struct Refresh_RenderPass Refresh_RenderPass;
typedef struct Refresh_ComputePipeline Refresh_ComputePipeline; typedef struct Refresh_ComputePipeline Refresh_ComputePipeline;
typedef struct Refresh_GraphicsPipeline Refresh_GraphicsPipeline; typedef struct Refresh_GraphicsPipeline Refresh_GraphicsPipeline;
typedef struct Refresh_CommandBuffer Refresh_CommandBuffer; typedef struct Refresh_CommandBuffer Refresh_CommandBuffer;
typedef struct Refresh_Fence Refresh_Fence;
typedef enum Refresh_PresentMode typedef enum Refresh_PresentMode
{ {
@ -96,15 +108,6 @@ typedef enum Refresh_StoreOp
REFRESH_STOREOP_DONT_CARE REFRESH_STOREOP_DONT_CARE
} Refresh_StoreOp; } Refresh_StoreOp;
typedef enum Refresh_ClearOptionsBits
{
REFRESH_CLEAROPTIONS_COLOR = 0x00000001,
REFRESH_CLEAROPTIONS_DEPTH = 0x00000002,
REFRESH_CLEAROPTIONS_STENCIL = 0x00000004,
} Refresh_ClearOptionsBits;
typedef uint32_t Refresh_ClearOptions;
typedef enum Refresh_IndexElementSize typedef enum Refresh_IndexElementSize
{ {
REFRESH_INDEXELEMENTSIZE_16BIT, REFRESH_INDEXELEMENTSIZE_16BIT,
@ -113,26 +116,38 @@ typedef enum Refresh_IndexElementSize
typedef enum Refresh_TextureFormat typedef enum Refresh_TextureFormat
{ {
/* Color Formats */ /* Unsigned Normalized Float Color Formats */
REFRESH_TEXTUREFORMAT_R8G8B8A8, REFRESH_TEXTUREFORMAT_R8G8B8A8,
REFRESH_TEXTUREFORMAT_B8G8R8A8,
REFRESH_TEXTUREFORMAT_R5G6B5, REFRESH_TEXTUREFORMAT_R5G6B5,
REFRESH_TEXTUREFORMAT_A1R5G5B5, REFRESH_TEXTUREFORMAT_A1R5G5B5,
REFRESH_TEXTUREFORMAT_B4G4R4A4, REFRESH_TEXTUREFORMAT_B4G4R4A4,
REFRESH_TEXTUREFORMAT_BC1,
REFRESH_TEXTUREFORMAT_BC2,
REFRESH_TEXTUREFORMAT_BC3,
REFRESH_TEXTUREFORMAT_R8G8_SNORM,
REFRESH_TEXTUREFORMAT_R8G8B8A8_SNORM,
REFRESH_TEXTUREFORMAT_A2R10G10B10, REFRESH_TEXTUREFORMAT_A2R10G10B10,
REFRESH_TEXTUREFORMAT_R16G16, REFRESH_TEXTUREFORMAT_R16G16,
REFRESH_TEXTUREFORMAT_R16G16B16A16, REFRESH_TEXTUREFORMAT_R16G16B16A16,
REFRESH_TEXTUREFORMAT_R8, REFRESH_TEXTUREFORMAT_R8,
REFRESH_TEXTUREFORMAT_R32_SFLOAT, /* Compressed Unsigned Normalized Float Color Formats */
REFRESH_TEXTUREFORMAT_R32G32_SFLOAT, REFRESH_TEXTUREFORMAT_BC1,
REFRESH_TEXTUREFORMAT_R32G32B32A32_SFLOAT, REFRESH_TEXTUREFORMAT_BC2,
REFRESH_TEXTUREFORMAT_BC3,
REFRESH_TEXTUREFORMAT_BC7,
/* Signed Normalized Float Color Formats */
REFRESH_TEXTUREFORMAT_R8G8_SNORM,
REFRESH_TEXTUREFORMAT_R8G8B8A8_SNORM,
/* Signed Float Color Formats */
REFRESH_TEXTUREFORMAT_R16_SFLOAT, REFRESH_TEXTUREFORMAT_R16_SFLOAT,
REFRESH_TEXTUREFORMAT_R16G16_SFLOAT, REFRESH_TEXTUREFORMAT_R16G16_SFLOAT,
REFRESH_TEXTUREFORMAT_R16G16B16A16_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 */ /* Depth Formats */
REFRESH_TEXTUREFORMAT_D16_UNORM, REFRESH_TEXTUREFORMAT_D16_UNORM,
REFRESH_TEXTUREFORMAT_D32_SFLOAT, REFRESH_TEXTUREFORMAT_D32_SFLOAT,
@ -144,7 +159,8 @@ typedef enum Refresh_TextureUsageFlagBits
{ {
REFRESH_TEXTUREUSAGE_SAMPLER_BIT = 0x00000001, REFRESH_TEXTUREUSAGE_SAMPLER_BIT = 0x00000001,
REFRESH_TEXTUREUSAGE_COLOR_TARGET_BIT = 0x00000002, REFRESH_TEXTUREUSAGE_COLOR_TARGET_BIT = 0x00000002,
REFRESH_TEXTUREUSAGE_DEPTH_STENCIL_TARGET_BIT = 0x00000004 REFRESH_TEXTUREUSAGE_DEPTH_STENCIL_TARGET_BIT = 0x00000004,
REFRESH_TEXTUREUSAGE_COMPUTE_BIT = 0X00000008
} Refresh_TextureUsageFlagBits; } Refresh_TextureUsageFlagBits;
typedef uint32_t Refresh_TextureUsageFlags; typedef uint32_t Refresh_TextureUsageFlags;
@ -154,10 +170,7 @@ typedef enum Refresh_SampleCount
REFRESH_SAMPLECOUNT_1, REFRESH_SAMPLECOUNT_1,
REFRESH_SAMPLECOUNT_2, REFRESH_SAMPLECOUNT_2,
REFRESH_SAMPLECOUNT_4, REFRESH_SAMPLECOUNT_4,
REFRESH_SAMPLECOUNT_8, REFRESH_SAMPLECOUNT_8
REFRESH_SAMPLECOUNT_16,
REFRESH_SAMPLECOUNT_32,
REFRESH_SAMPLECOUNT_64
} Refresh_SampleCount; } Refresh_SampleCount;
typedef enum Refresh_CubeMapFace typedef enum Refresh_CubeMapFace
@ -174,14 +187,16 @@ typedef enum Refresh_BufferUsageFlagBits
{ {
REFRESH_BUFFERUSAGE_VERTEX_BIT = 0x00000001, REFRESH_BUFFERUSAGE_VERTEX_BIT = 0x00000001,
REFRESH_BUFFERUSAGE_INDEX_BIT = 0x00000002, REFRESH_BUFFERUSAGE_INDEX_BIT = 0x00000002,
REFRESH_BUFFERUSAGE_COMPUTE_BIT = 0x00000004 REFRESH_BUFFERUSAGE_COMPUTE_BIT = 0x00000004,
REFRESH_BUFFERUSAGE_INDIRECT_BIT = 0x00000008
} Refresh_BufferUsageFlagBits; } Refresh_BufferUsageFlagBits;
typedef uint32_t Refresh_BufferUsageFlags; typedef uint32_t Refresh_BufferUsageFlags;
typedef enum Refresh_VertexElementFormat typedef enum Refresh_VertexElementFormat
{ {
REFRESH_VERTEXELEMENTFORMAT_SINGLE, REFRESH_VERTEXELEMENTFORMAT_UINT,
REFRESH_VERTEXELEMENTFORMAT_FLOAT,
REFRESH_VERTEXELEMENTFORMAT_VECTOR2, REFRESH_VERTEXELEMENTFORMAT_VECTOR2,
REFRESH_VERTEXELEMENTFORMAT_VECTOR3, REFRESH_VERTEXELEMENTFORMAT_VECTOR3,
REFRESH_VERTEXELEMENTFORMAT_VECTOR4, REFRESH_VERTEXELEMENTFORMAT_VECTOR4,
@ -204,16 +219,14 @@ typedef enum Refresh_VertexInputRate
typedef enum Refresh_FillMode typedef enum Refresh_FillMode
{ {
REFRESH_FILLMODE_FILL, REFRESH_FILLMODE_FILL,
REFRESH_FILLMODE_LINE, REFRESH_FILLMODE_LINE
REFRESH_FILLMODE_POINT
} Refresh_FillMode; } Refresh_FillMode;
typedef enum Refresh_CullMode typedef enum Refresh_CullMode
{ {
REFRESH_CULLMODE_NONE, REFRESH_CULLMODE_NONE,
REFRESH_CULLMODE_FRONT, REFRESH_CULLMODE_FRONT,
REFRESH_CULLMODE_BACK, REFRESH_CULLMODE_BACK
REFRESH_CULLMODE_FRONT_AND_BACK
} Refresh_CullMode; } Refresh_CullMode;
typedef enum Refresh_FrontFace typedef enum Refresh_FrontFace
@ -255,47 +268,21 @@ typedef enum Refresh_BlendOp
REFRESH_BLENDOP_MAX REFRESH_BLENDOP_MAX
} Refresh_BlendOp; } Refresh_BlendOp;
typedef enum Refresh_LogicOp
{
REFRESH_LOGICOP_CLEAR = 0,
REFRESH_LOGICOP_AND = 1,
REFRESH_LOGICOP_AND_REVERSE = 2,
REFRESH_LOGICOP_COPY = 3,
REFRESH_LOGICOP_AND_INVERTED = 4,
REFRESH_LOGICOP_NO_OP = 5,
REFRESH_LOGICOP_XOR = 6,
REFRESH_LOGICOP_OR = 7,
REFRESH_LOGICOP_NOR = 8,
REFRESH_LOGICOP_EQUIVALENT = 9,
REFRESH_LOGICOP_INVERT = 10,
REFRESH_LOGICOP_OR_REVERSE = 11,
REFRESH_LOGICOP_COPY_INVERTED = 12,
REFRESH_LOGICOP_OR_INVERTED = 13,
REFRESH_LOGICOP_NAND = 14,
REFRESH_LOGICOP_SET = 15
} Refresh_LogicOp;
typedef enum Refresh_BlendFactor typedef enum Refresh_BlendFactor
{ {
REFRESH_BLENDFACTOR_ZERO = 0, REFRESH_BLENDFACTOR_ZERO,
REFRESH_BLENDFACTOR_ONE = 1, REFRESH_BLENDFACTOR_ONE,
REFRESH_BLENDFACTOR_SRC_COLOR = 2, REFRESH_BLENDFACTOR_SRC_COLOR,
REFRESH_BLENDFACTOR_ONE_MINUS_SRC_COLOR = 3, REFRESH_BLENDFACTOR_ONE_MINUS_SRC_COLOR,
REFRESH_BLENDFACTOR_DST_COLOR = 4, REFRESH_BLENDFACTOR_DST_COLOR,
REFRESH_BLENDFACTOR_ONE_MINUS_DST_COLOR = 5, REFRESH_BLENDFACTOR_ONE_MINUS_DST_COLOR,
REFRESH_BLENDFACTOR_SRC_ALPHA = 6, REFRESH_BLENDFACTOR_SRC_ALPHA,
REFRESH_BLENDFACTOR_ONE_MINUS_SRC_ALPHA = 7, REFRESH_BLENDFACTOR_ONE_MINUS_SRC_ALPHA,
REFRESH_BLENDFACTOR_DST_ALPHA = 8, REFRESH_BLENDFACTOR_DST_ALPHA,
REFRESH_BLENDFACTOR_ONE_MINUS_DST_ALPHA = 9, REFRESH_BLENDFACTOR_ONE_MINUS_DST_ALPHA,
REFRESH_BLENDFACTOR_CONSTANT_COLOR = 10, REFRESH_BLENDFACTOR_CONSTANT_COLOR,
REFRESH_BLENDFACTOR_ONE_MINUS_CONSTANT_COLOR = 11, REFRESH_BLENDFACTOR_ONE_MINUS_CONSTANT_COLOR,
REFRESH_BLENDFACTOR_CONSTANT_ALPHA = 12, REFRESH_BLENDFACTOR_SRC_ALPHA_SATURATE
REFRESH_BLENDFACTOR_ONE_MINUS_CONSTANT_ALPHA = 13,
REFRESH_BLENDFACTOR_SRC_ALPHA_SATURATE = 14,
REFRESH_BLENDFACTOR_SRC1_COLOR = 15,
REFRESH_BLENDFACTOR_ONE_MINUS_SRC1_COLOR = 16,
REFRESH_BLENDFACTOR_SRC1_ALPHA = 17,
REFRESH_BLENDFACTOR_ONE_MINUS_SRC1_ALPHA = 18
} Refresh_BlendFactor; } Refresh_BlendFactor;
typedef enum Refresh_ColorComponentFlagBits typedef enum Refresh_ColorComponentFlagBits
@ -308,17 +295,10 @@ typedef enum Refresh_ColorComponentFlagBits
typedef uint32_t Refresh_ColorComponentFlags; typedef uint32_t Refresh_ColorComponentFlags;
typedef enum Refresh_ShaderStageType
{
REFRESH_SHADERSTAGE_VERTEX,
REFRESH_SHADERSTAGE_FRAGMENT
} Refresh_ShaderStageType;
typedef enum Refresh_Filter typedef enum Refresh_Filter
{ {
REFRESH_FILTER_NEAREST, REFRESH_FILTER_NEAREST,
REFRESH_FILTER_LINEAR, REFRESH_FILTER_LINEAR
REFRESH_FILTER_CUBIC
} Refresh_Filter; } Refresh_Filter;
typedef enum Refresh_SamplerMipmapMode typedef enum Refresh_SamplerMipmapMode
@ -338,14 +318,22 @@ typedef enum Refresh_SamplerAddressMode
/* FIXME: we should probably make a library-level decision about color types */ /* FIXME: we should probably make a library-level decision about color types */
typedef enum Refresh_BorderColor typedef enum Refresh_BorderColor
{ {
REFRESH_BORDERCOLOR_FLOAT_TRANSPARENT_BLACK = 0, REFRESH_BORDERCOLOR_FLOAT_TRANSPARENT_BLACK,
REFRESH_BORDERCOLOR_INT_TRANSPARENT_BLACK = 1, REFRESH_BORDERCOLOR_INT_TRANSPARENT_BLACK,
REFRESH_BORDERCOLOR_FLOAT_OPAQUE_BLACK = 2, REFRESH_BORDERCOLOR_FLOAT_OPAQUE_BLACK,
REFRESH_BORDERCOLOR_INT_OPAQUE_BLACK = 3, REFRESH_BORDERCOLOR_INT_OPAQUE_BLACK,
REFRESH_BORDERCOLOR_FLOAT_OPAQUE_WHITE = 4, REFRESH_BORDERCOLOR_FLOAT_OPAQUE_WHITE,
REFRESH_BORDERCOLOR_INT_OPAQUE_WHITE = 5 REFRESH_BORDERCOLOR_INT_OPAQUE_WHITE
} Refresh_BorderColor; } Refresh_BorderColor;
typedef enum Refresh_Backend
{
REFRESH_BACKEND_DONTCARE,
REFRESH_BACKEND_VULKAN,
REFRESH_BACKEND_PS5,
REFRESH_BACKEND_INVALID
} Refresh_Backend;
/* Structures */ /* Structures */
typedef struct Refresh_DepthStencilValue typedef struct Refresh_DepthStencilValue
@ -389,11 +377,13 @@ typedef struct Refresh_TextureSlice
uint32_t level; uint32_t level;
} Refresh_TextureSlice; } Refresh_TextureSlice;
typedef struct Refresh_PresentationParameters typedef struct Refresh_IndirectDrawCommand
{ {
void* deviceWindowHandle; uint32_t vertexCount;
Refresh_PresentMode presentMode; uint32_t instanceCount;
} Refresh_PresentationParameters; uint32_t firstVertex;
uint32_t firstInstance;
} Refresh_IndirectDrawCommand;
/* State structures */ /* State structures */
@ -449,7 +439,7 @@ typedef struct Refresh_StencilOpState
uint32_t reference; uint32_t reference;
} Refresh_StencilOpState; } Refresh_StencilOpState;
typedef struct Refresh_ColorTargetBlendState typedef struct Refresh_ColorAttachmentBlendState
{ {
uint8_t blendEnable; uint8_t blendEnable;
Refresh_BlendFactor srcColorBlendFactor; Refresh_BlendFactor srcColorBlendFactor;
@ -459,43 +449,7 @@ typedef struct Refresh_ColorTargetBlendState
Refresh_BlendFactor dstAlphaBlendFactor; Refresh_BlendFactor dstAlphaBlendFactor;
Refresh_BlendOp alphaBlendOp; Refresh_BlendOp alphaBlendOp;
Refresh_ColorComponentFlags colorWriteMask; Refresh_ColorComponentFlags colorWriteMask;
} Refresh_ColorTargetBlendState; } Refresh_ColorAttachmentBlendState;
typedef struct Refresh_ComputePipelineLayoutCreateInfo
{
uint32_t bufferBindingCount;
uint32_t imageBindingCount;
} Refresh_ComputePipelineLayoutCreateInfo;
typedef struct Refresh_GraphicsPipelineLayoutCreateInfo
{
uint32_t vertexSamplerBindingCount;
uint32_t fragmentSamplerBindingCount;
} Refresh_GraphicsPipelineLayoutCreateInfo;
typedef struct Refresh_ColorTargetDescription
{
Refresh_TextureFormat format;
Refresh_SampleCount multisampleCount;
Refresh_LoadOp loadOp;
Refresh_StoreOp storeOp;
} Refresh_ColorTargetDescription;
typedef struct Refresh_DepthStencilTargetDescription
{
Refresh_TextureFormat depthStencilFormat;
Refresh_LoadOp loadOp;
Refresh_StoreOp storeOp;
Refresh_LoadOp stencilLoadOp;
Refresh_StoreOp stencilStoreOp;
} Refresh_DepthStencilTargetDescription;
typedef struct Refresh_RenderPassCreateInfo
{
const Refresh_ColorTargetDescription *colorTargetDescriptions;
uint32_t colorTargetCount;
const Refresh_DepthStencilTargetDescription *depthTargetDescription; /* can be NULL */
} Refresh_RenderPassCreateInfo;
typedef struct Refresh_ShaderModuleCreateInfo typedef struct Refresh_ShaderModuleCreateInfo
{ {
@ -509,32 +463,33 @@ typedef struct Refresh_TextureCreateInfo
uint32_t height; uint32_t height;
uint32_t depth; uint32_t depth;
uint8_t isCube; uint8_t isCube;
Refresh_SampleCount sampleCount;
uint32_t levelCount; uint32_t levelCount;
Refresh_SampleCount sampleCount;
Refresh_TextureFormat format; Refresh_TextureFormat format;
Refresh_TextureUsageFlags usageFlags; Refresh_TextureUsageFlags usageFlags;
} Refresh_TextureCreateInfo; } Refresh_TextureCreateInfo;
/* Pipeline state structures */ /* Pipeline state structures */
typedef struct Refresh_ShaderStageState typedef struct Refresh_GraphicsShaderInfo
{ {
Refresh_ShaderModule *shaderModule; Refresh_ShaderModule *shaderModule;
const char* entryPointName; const char* entryPointName;
uint64_t uniformBufferSize; uint64_t uniformBufferSize;
} Refresh_ShaderStageState; uint32_t samplerBindingCount;
} Refresh_GraphicsShaderInfo;
typedef struct Refresh_ViewportState typedef struct Refresh_ComputeShaderInfo
{ {
const Refresh_Viewport *viewports; Refresh_ShaderModule* shaderModule;
uint32_t viewportCount; const char* entryPointName;
const Refresh_Rect *scissors; uint64_t uniformBufferSize;
uint32_t scissorCount; uint32_t bufferBindingCount;
} Refresh_ViewportState; uint32_t imageBindingCount;
} Refresh_ComputeShaderInfo;
typedef struct Refresh_RasterizerState typedef struct Refresh_RasterizerState
{ {
uint8_t depthClampEnable;
Refresh_FillMode fillMode; Refresh_FillMode fillMode;
Refresh_CullMode cullMode; Refresh_CullMode cullMode;
Refresh_FrontFace frontFace; Refresh_FrontFace frontFace;
@ -542,7 +497,6 @@ typedef struct Refresh_RasterizerState
float depthBiasConstantFactor; float depthBiasConstantFactor;
float depthBiasClamp; float depthBiasClamp;
float depthBiasSlopeFactor; float depthBiasSlopeFactor;
float lineWidth;
} Refresh_RasterizerState; } Refresh_RasterizerState;
typedef struct Refresh_MultisampleState typedef struct Refresh_MultisampleState
@ -564,111 +518,58 @@ typedef struct Refresh_DepthStencilState
float maxDepthBounds; float maxDepthBounds;
} Refresh_DepthStencilState; } Refresh_DepthStencilState;
typedef struct Refresh_ColorBlendState typedef struct Refresh_ColorAttachmentDescription
{ {
uint8_t logicOpEnable; Refresh_TextureFormat format;
Refresh_LogicOp logicOp; Refresh_ColorAttachmentBlendState blendState;
const Refresh_ColorTargetBlendState *blendStates; } Refresh_ColorAttachmentDescription;
uint32_t blendStateCount;
float blendConstants[4];
} Refresh_ColorBlendState;
typedef struct Refresh_ComputePipelineCreateInfo typedef struct Refresh_GraphicsPipelineAttachmentInfo
{ {
Refresh_ShaderStageState computeShaderState; Refresh_ColorAttachmentDescription *colorAttachmentDescriptions;
Refresh_ComputePipelineLayoutCreateInfo pipelineLayoutCreateInfo; uint32_t colorAttachmentCount;
} Refresh_ComputePipelineCreateInfo; uint8_t hasDepthStencilAttachment;
Refresh_TextureFormat depthStencilFormat;
} Refresh_GraphicsPipelineAttachmentInfo;
typedef struct Refresh_GraphicsPipelineCreateInfo typedef struct Refresh_GraphicsPipelineCreateInfo
{ {
Refresh_ShaderStageState vertexShaderState; Refresh_GraphicsShaderInfo vertexShaderInfo;
Refresh_ShaderStageState fragmentShaderState; Refresh_GraphicsShaderInfo fragmentShaderInfo;
Refresh_VertexInputState vertexInputState; Refresh_VertexInputState vertexInputState;
Refresh_PrimitiveType primitiveType; Refresh_PrimitiveType primitiveType;
Refresh_ViewportState viewportState;
Refresh_RasterizerState rasterizerState; Refresh_RasterizerState rasterizerState;
Refresh_MultisampleState multisampleState; Refresh_MultisampleState multisampleState;
Refresh_DepthStencilState depthStencilState; Refresh_DepthStencilState depthStencilState;
Refresh_ColorBlendState colorBlendState; Refresh_GraphicsPipelineAttachmentInfo attachmentInfo;
Refresh_GraphicsPipelineLayoutCreateInfo pipelineLayoutCreateInfo; float blendConstants[4];
Refresh_RenderPass *renderPass;
} Refresh_GraphicsPipelineCreateInfo; } Refresh_GraphicsPipelineCreateInfo;
typedef struct Refresh_FramebufferCreateInfo /* Render pass structures */
typedef struct Refresh_ColorAttachmentInfo
{ {
Refresh_RenderPass *renderPass; Refresh_Texture *texture; /* We can't use TextureSlice because render passes take a single rectangle. */
Refresh_RenderTarget **pColorTargets; uint32_t depth;
uint32_t colorTargetCount; uint32_t layer;
Refresh_RenderTarget *pDepthStencilTarget; uint32_t level;
uint32_t width; Refresh_Vec4 clearColor; /* Can be ignored by RenderPass */
uint32_t height; Refresh_LoadOp loadOp;
} Refresh_FramebufferCreateInfo; Refresh_StoreOp storeOp;
} Refresh_ColorAttachmentInfo;
/* Interop Structs */ typedef struct Refresh_DepthStencilAttachmentInfo
typedef enum Refresh_SysRendererType
{ {
REFRESH_RENDERER_TYPE_VULKAN Refresh_Texture *texture; /* We can't use TextureSlice because render passes take a single rectangle. */
} Refresh_SysRendererType; uint32_t depth;
uint32_t layer;
typedef struct Refresh_SysRenderer uint32_t level;
{ Refresh_DepthStencilValue depthStencilClearValue; /* Can be ignored by RenderPass */
Refresh_SysRendererType rendererType; Refresh_LoadOp loadOp;
Refresh_StoreOp storeOp;
union Refresh_LoadOp stencilLoadOp;
{ Refresh_StoreOp stencilStoreOp;
#if REFRESH_DRIVER_VULKAN } Refresh_DepthStencilAttachmentInfo;
struct
{
void* instance;
void* physicalDevice;
void* logicalDevice;
uint32_t queueFamilyIndex;
} vulkan;
#endif /* REFRESH_DRIVER_VULKAN */
uint8_t filler[64];
} renderer;
} Refresh_SysRenderer;
typedef struct Refresh_TextureHandles
{
Refresh_SysRendererType rendererType;
union
{
#if REFRESH_DRIVER_VULKAN
#if defined(__LP64__) || defined(_WIN64) || defined(__x86_64__) || defined(_M_X64) || defined(__ia64) || defined (_M_IA64) || defined(__aarch64__) || defined(__powerpc64__)
#define REFRESH_VULKAN_HANDLE_TYPE void*
#else
#define REFRESH_VULKAN_HANDLE_TYPE uint64_t
#endif
struct
{
REFRESH_VULKAN_HANDLE_TYPE image; /* VkImage */
REFRESH_VULKAN_HANDLE_TYPE view; /* VkImageView */
} vulkan;
#endif /* REFRESH_DRIVER_VULKAN */
uint8_t filler[64];
} texture;
} Refresh_TextureHandles;
/* Version API */
#define REFRESH_ABI_VERSION 0
#define REFRESH_MAJOR_VERSION 0
#define REFRESH_MINOR_VERSION 1
#define REFRESH_PATCH_VERSION 0
#define REFRESH_COMPILED_VERSION ( \
(REFRESH_ABI_VERSION * 100 * 100 * 100) + \
(REFRESH_MAJOR_VERSION * 100 * 100) + \
(REFRESH_MINOR_VERSION * 100) + \
(REFRESH_PATCH_VERSION) \
)
REFRESHAPI uint32_t Refresh_LinkedVersion(void);
/* Functions */ /* Functions */
@ -688,16 +589,29 @@ REFRESHAPI void Refresh_HookLogFunctions(
Refresh_LogFunc error 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);
/* Device */ /* Device */
/* Create a rendering context for use on the calling thread. /* Create a rendering context for use on the calling thread.
* You MUST have called Refresh_SelectDriver prior to calling this function.
* *
* presentationParameters:
* If the windowHandle is NULL, Refresh will run in headless mode.
* debugMode: Enable debug mode properties. * debugMode: Enable debug mode properties.
*/ */
REFRESHAPI Refresh_Device* Refresh_CreateDevice( REFRESHAPI Refresh_Device* Refresh_CreateDevice(
Refresh_PresentationParameters *presentationParameters,
uint8_t debugMode uint8_t debugMode
); );
@ -706,30 +620,6 @@ REFRESHAPI void Refresh_DestroyDevice(Refresh_Device *device);
/* Drawing */ /* Drawing */
/* Clears the targets of the currently bound framebuffer.
* If fewer colors are passed than the number of color targets in the
* framebuffer, this function will clear the first n color targets.
*
* NOTE:
* It is generally recommended to clear in BeginRenderPass
* rather than by calling this function unless necessary.
*
* clearRect: Area to clear.
* options: Bitflags to specify color/depth/stencil buffers for clearing.
* colors: An array of color values for the cleared color buffers.
* colorCount: The number of colors in the above array.
* depthStencil: Depth and stencil values for the cleared depth stencil buffer.
*/
REFRESHAPI void Refresh_Clear(
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer,
Refresh_Rect *clearRect,
Refresh_ClearOptions options,
Refresh_Vec4 *colors,
uint32_t colorCount,
Refresh_DepthStencilValue depthStencil
);
/* Draws data from vertex/index buffers with instancing enabled. /* Draws data from vertex/index buffers with instancing enabled.
* *
* baseVertex: The starting offset to read from the vertex buffer. * baseVertex: The starting offset to read from the vertex buffer.
@ -784,6 +674,27 @@ REFRESHAPI void Refresh_DrawPrimitives(
uint32_t fragmentParamOffset uint32_t fragmentParamOffset
); );
/* 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.
* vertexParamOffset: The offset of the vertex shader param data.
* fragmentParamOffset: The offset of the fragment shader param data.
*/
REFRESHAPI 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
);
/* Dispatches work compute items. /* Dispatches work compute items.
* *
* groupCountX: Number of local workgroups to dispatch in the X dimension. * groupCountX: Number of local workgroups to dispatch in the X dimension.
@ -802,16 +713,10 @@ REFRESHAPI void Refresh_DispatchCompute(
/* State Creation */ /* State Creation */
/* Returns an allocated RenderPass* object. */
REFRESHAPI Refresh_RenderPass* Refresh_CreateRenderPass(
Refresh_Device *device,
Refresh_RenderPassCreateInfo *renderPassCreateInfo
);
/* Returns an allocated ComputePipeline* object. */ /* Returns an allocated ComputePipeline* object. */
REFRESHAPI Refresh_ComputePipeline* Refresh_CreateComputePipeline( REFRESHAPI Refresh_ComputePipeline* Refresh_CreateComputePipeline(
Refresh_Device *device, Refresh_Device *device,
Refresh_ComputePipelineCreateInfo *pipelineCreateInfo Refresh_ComputeShaderInfo *computeShaderInfo
); );
/* Returns an allocated GraphicsPipeline* object. */ /* Returns an allocated GraphicsPipeline* object. */
@ -826,12 +731,6 @@ REFRESHAPI Refresh_Sampler* Refresh_CreateSampler(
Refresh_SamplerStateCreateInfo *samplerStateCreateInfo Refresh_SamplerStateCreateInfo *samplerStateCreateInfo
); );
/* Returns an allocated Framebuffer* object. */
REFRESHAPI Refresh_Framebuffer* Refresh_CreateFramebuffer(
Refresh_Device *device,
Refresh_FramebufferCreateInfo *framebufferCreateInfo
);
/* Returns an allocated ShaderModule* object. */ /* Returns an allocated ShaderModule* object. */
REFRESHAPI Refresh_ShaderModule* Refresh_CreateShaderModule( REFRESHAPI Refresh_ShaderModule* Refresh_CreateShaderModule(
Refresh_Device *device, Refresh_Device *device,
@ -846,17 +745,6 @@ REFRESHAPI Refresh_Texture* Refresh_CreateTexture(
Refresh_TextureCreateInfo *textureCreateInfo Refresh_TextureCreateInfo *textureCreateInfo
); );
/* Creates a color target.
*
* textureSlice: The texture slice that the color target will resolve to.
* multisampleCount: The MSAA value for the color target.
*/
REFRESHAPI Refresh_RenderTarget* Refresh_CreateRenderTarget(
Refresh_Device *device,
Refresh_TextureSlice *textureSlice,
Refresh_SampleCount multisampleCount
);
/* Creates a buffer. /* Creates a buffer.
* *
* usageFlags: Specifies how the buffer will be used. * usageFlags: Specifies how the buffer will be used.
@ -871,6 +759,11 @@ REFRESHAPI Refresh_Buffer* Refresh_CreateBuffer(
/* Setters */ /* Setters */
/* Uploads image data to a texture object. /* 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. * textureSlice: The texture slice to be updated.
* data: A pointer to the image data. * data: A pointer to the image data.
@ -893,8 +786,13 @@ REFRESHAPI void Refresh_SetTextureData(
* yHeight: The height of the Y plane. * yHeight: The height of the Y plane.
* uvWidth: The width of the U/V planes. * uvWidth: The width of the U/V planes.
* uvHeight: The height of the U/V planes. * uvHeight: The height of the U/V planes.
* data: A pointer to the raw YUV image data. * yData: A pointer to the raw Y image data.
* dataLength: The size of the image data in bytes. * 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( REFRESHAPI void Refresh_SetTextureDataYUV(
Refresh_Device *driverData, Refresh_Device *driverData,
@ -906,8 +804,13 @@ REFRESHAPI void Refresh_SetTextureDataYUV(
uint32_t yHeight, uint32_t yHeight,
uint32_t uvWidth, uint32_t uvWidth,
uint32_t uvHeight, uint32_t uvHeight,
void* data, void *yDataPtr,
uint32_t dataLength void *uDataPtr,
void *vDataPtr,
uint32_t yDataLength,
uint32_t uvDataLength,
uint32_t yStride,
uint32_t uvStride
); );
/* Performs an asynchronous texture-to-texture copy. /* Performs an asynchronous texture-to-texture copy.
@ -1065,30 +968,6 @@ REFRESHAPI void Refresh_QueueDestroyBuffer(
Refresh_Buffer *buffer Refresh_Buffer *buffer
); );
/* Sends a color target 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).
*
* renderTarget: The Refresh_ColorTarget to be destroyed.
*/
REFRESHAPI void Refresh_QueueDestroyRenderTarget(
Refresh_Device *device,
Refresh_RenderTarget *renderTarget
);
/* Sends a framebuffer 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).
*
* framebuffer: The Refresh_Framebuffer to be destroyed.
*/
REFRESHAPI void Refresh_QueueDestroyFramebuffer(
Refresh_Device *device,
Refresh_Framebuffer *frameBuffer
);
/* Sends a shader module to be destroyed by the renderer. Note that we call it /* 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 * "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 * this is not called from the main thread (for example, if a garbage collector
@ -1101,18 +980,6 @@ REFRESHAPI void Refresh_QueueDestroyShaderModule(
Refresh_ShaderModule *shaderModule Refresh_ShaderModule *shaderModule
); );
/* Sends a render pass 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).
*
* renderPass: The Refresh_RenderPass to be destroyed.
*/
REFRESHAPI void Refresh_QueueDestroyRenderPass(
Refresh_Device *device,
Refresh_RenderPass *renderPass
);
/* Sends a compute pipeline to be destroyed by the renderer. Note that we call it /* 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 * "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 * this is not called from the main thread (for example, if a garbage collector
@ -1140,29 +1007,20 @@ REFRESHAPI void Refresh_QueueDestroyGraphicsPipeline(
/* Graphics State */ /* Graphics State */
/* Begins a render pass. /* Begins a render pass.
* This will also set a default viewport and scissor state.
* *
* renderPass: The renderpass to begin. * colorAttachmentInfos:
* framebuffer: The framebuffer to bind for the render pass. * A pointer to an array of Refresh_ColorAttachmentInfo structures
* renderArea: * that contains render targets and clear values. May be NULL.
* The area affected by the render pass. * colorAttachmentCount: The amount of structs in the above array.
* All load, store and resolve operations are restricted * depthStencilAttachmentInfo: The depth/stencil render target and clear value. May be NULL.
* to the given rectangle.
* clearValues:
* A pointer to an array of Refresh_Color structures
* that contains clear values for each color target in the
* framebuffer. May be NULL.
* clearCount: The amount of color structs in the above array.
* depthStencilClearValue: The depth/stencil clear value. May be NULL.
*/ */
REFRESHAPI void Refresh_BeginRenderPass( REFRESHAPI void Refresh_BeginRenderPass(
Refresh_Device *device, Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer, Refresh_CommandBuffer *commandBuffer,
Refresh_RenderPass *renderPass, Refresh_ColorAttachmentInfo *colorAttachmentInfos,
Refresh_Framebuffer *framebuffer, uint32_t colorAttachmentCount,
Refresh_Rect *renderArea, Refresh_DepthStencilAttachmentInfo *depthStencilAttachmentInfo
Refresh_Vec4 *pColorClearValues,
uint32_t colorClearCount,
Refresh_DepthStencilValue *depthStencilClearValue
); );
/* Ends the current render pass. */ /* Ends the current render pass. */
@ -1178,7 +1036,23 @@ REFRESHAPI void Refresh_BindGraphicsPipeline(
Refresh_GraphicsPipeline *graphicsPipeline Refresh_GraphicsPipeline *graphicsPipeline
); );
/* Binds vertex buffers for use with subsequent draw calls. */ /* 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( REFRESHAPI void Refresh_BindVertexBuffers(
Refresh_Device *device, Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer, Refresh_CommandBuffer *commandBuffer,
@ -1262,6 +1136,41 @@ REFRESHAPI void Refresh_BindComputeTextures(
/* Submission/Presentation */ /* Submission/Presentation */
/* 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
);
/* Returns an allocated Refresh_CommandBuffer* object. /* Returns an allocated Refresh_CommandBuffer* object.
* This command buffer is managed by the implementation and * This command buffer is managed by the implementation and
* should NOT be freed by the user. * should NOT be freed by the user.
@ -1270,49 +1179,78 @@ REFRESHAPI void Refresh_BindComputeTextures(
* A command buffer may only be used on the thread that * A command buffer may only be used on the thread that
* it was acquired on. Using it on any other thread is an error. * it was acquired on. Using it on any other thread is an error.
* *
* fixed:
* If a command buffer is designated as fixed, it can be
* acquired once, have commands recorded into it, and
* be re-submitted indefinitely.
*
*/ */
REFRESHAPI Refresh_CommandBuffer* Refresh_AcquireCommandBuffer( REFRESHAPI Refresh_CommandBuffer* Refresh_AcquireCommandBuffer(
Refresh_Device *device, Refresh_Device *device
uint8_t fixed
); );
/* Queues an image to be presented to a window. /* Acquires a texture to use for presentation.
* The image will be presented upon the next Refresh_Submit call. * 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.
* *
* NOTE: * NOTE:
* It is an error to call this function in headless mode. * It is not recommended to hold a reference to this texture long term.
* *
* textureSlice: The texture slice to present. * pWidth: A pointer to a uint32 that will be filled with the texture width.
* destinationRectangle: The region of the window to update. Can be NULL. * pHeight: A pointer to a uint32 that will be filled with the texture height.
* filter: The filter to use if scaling is required.
* windowHandle: The window to present to.
*/ */
REFRESHAPI void Refresh_QueuePresent( REFRESHAPI Refresh_Texture* Refresh_AcquireSwapchainTexture(
Refresh_Device *device, Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer, Refresh_CommandBuffer *commandBuffer,
Refresh_TextureSlice *textureSlice, void *windowHandle,
Refresh_Rect *destinationRectangle, uint32_t *pWidth,
Refresh_Filter filter, uint32_t *pHeight
void *windowHandle
); );
/* Submits all of the enqueued commands. */ /* Submits all of the enqueued commands. */
REFRESHAPI void Refresh_Submit( REFRESHAPI void Refresh_Submit(
Refresh_Device* device, Refresh_Device* device,
uint32_t commandBufferCount, Refresh_CommandBuffer *commandBuffer
Refresh_CommandBuffer **pCommandBuffers
); );
/* Waits for the previous submission to complete. */ /* 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. */
REFRESHAPI void Refresh_Wait( REFRESHAPI void Refresh_Wait(
Refresh_Device *device Refresh_Device *device
); );
/* 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
);
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif /* __cplusplus */ #endif /* __cplusplus */

View File

@ -44,42 +44,45 @@
extern "C" { extern "C" {
#endif /* __cplusplus */ #endif /* __cplusplus */
/* Decodes PNG data into raw RGBA8 texture data. /* Image Read API */
/* Decodes image data into raw RGBA8 texture data.
* *
* w: Filled with the width of the image. * w: Filled with the width of the image.
* h: Filled with the height of the image. * h: Filled with the height of the image.
* numChannels: Filled with the number of channels in the image. * len: Filled with the length of pixel data in bytes.
* *
* Returns a block of memory suitable for use with Refresh_SetTextureData2D. * Returns a block of memory suitable for use with Refresh_SetTextureData2D.
* Be sure to free the memory with Refresh_Image_Free after use! * Be sure to free the memory with Refresh_Image_Free after use!
*/ */
REFRESHAPI uint8_t* Refresh_Image_Load( REFRESHAPI uint8_t* Refresh_Image_Load(
char const *filename, uint8_t *bufferPtr,
int32_t bufferLength,
int32_t *w, int32_t *w,
int32_t *h, int32_t *h,
int32_t *numChannels int32_t *len
); );
/* Frees memory returned by Refresh_Image_Load. (Do NOT free the memory yourself!) /* Frees memory returned by Refresh_Image_Load. Do NOT free the memory yourself!
* *
* mem: A pointer previously returned by Refresh_Image_Load. * mem: A pointer previously returned by Refresh_Image_LoadPNG.
*/ */
REFRESHAPI void Refresh_Image_Free(uint8_t *mem); REFRESHAPI void Refresh_Image_Free(uint8_t *mem);
/* Image Write API */ /* Image Write API */
/* Encodes RGBA8 image data into PNG data. /* Returns a buffer of PNG encoded from RGBA8 color data.
* *
* filename: The filename that the image will be written to. * data: The raw color data.
* w: The width of the PNG data. * w: The width of the color data.
* h: The height of the PNG data. * h: The height of the color data.
* data: The raw RGBA8 image data. * len: Filled with the length of PNG data in bytes.
*/ */
REFRESHAPI void Refresh_Image_SavePNG( REFRESHAPI void Refresh_Image_SavePNG(
char const *filename, const char* filename,
uint8_t* data,
int32_t w, int32_t w,
int32_t h, int32_t h
uint8_t *data
); );
#ifdef __cplusplus #ifdef __cplusplus

268
shadercompiler/Program.cs Normal file
View File

@ -0,0 +1,268 @@
using System;
using System.IO;
using System.Diagnostics;
partial class Program
{
struct CompileShaderData
{
public string glslPath;
public string outputDir;
public bool preserveTemp;
public bool vulkan;
public bool d3d11;
public bool ps5;
}
private static void DisplayHelpText()
{
Console.WriteLine("Usage: refreshc <path-to-glsl-source | directory-with-glsl-source-files>");
Console.WriteLine("Options:");
Console.WriteLine(" --vulkan Emit shader compatible with the Refresh Vulkan backend");
Console.WriteLine(" --d3d11 Emit shader compatible with the Refresh D3D11 backend");
Console.WriteLine(" --ps5 Emit shader compatible with the Refresh PS5 backend");
Console.WriteLine(" --out dir Write output file(s) to the directory `dir`");
Console.WriteLine(" --preserve-temp Do not delete the temp directory after compilation. Useful for debugging.");
}
public static int Main(string[] args)
{
if (args.Length == 0)
{
DisplayHelpText();
return 1;
}
CompileShaderData data = new CompileShaderData();
string inputPath = null;
for (int i = 0; i < args.Length; i += 1)
{
switch (args[i])
{
case "--vulkan":
data.vulkan = true;
break;
case "--d3d11":
data.d3d11 = true;
break;
case "--ps5":
data.ps5 = true;
break;
case "--out":
i += 1;
data.outputDir = args[i];
break;
case "--preserve-temp":
data.preserveTemp = true;
break;
default:
if (inputPath == null)
{
inputPath = args[i];
}
else
{
Console.WriteLine($"refreshc: Unknown parameter {args[i]}");
return 1;
}
break;
}
}
if (!data.vulkan && !data.d3d11 && !data.ps5)
{
Console.WriteLine($"refreshc: No Refresh platforms selected!");
return 1;
}
#if !PS5
if (data.ps5)
{
Console.WriteLine($"refreshc: `PS5` must be defined in the to target the PS5 backend!");
return 1;
}
#endif
if (data.outputDir == null)
{
data.outputDir = Directory.GetCurrentDirectory();
}
else if (!Directory.Exists(data.outputDir))
{
Console.WriteLine($"refreshc: Output directory {data.outputDir} does not exist");
return 1;
}
if (Directory.Exists(inputPath))
{
// Loop over and compile each file in the directory
string[] files = Directory.GetFiles(inputPath);
foreach (string file in files)
{
Console.WriteLine($"Compiling {file}");
data.glslPath = file;
int res = CompileShader(ref data);
if (res != 0)
{
return res;
}
}
}
else
{
if (!File.Exists(inputPath))
{
Console.WriteLine($"refreshc: glsl source file or directory ({inputPath}) does not exist");
return 1;
}
data.glslPath = inputPath;
int res = CompileShader(ref data);
if (res != 0)
{
return res;
}
}
return 0;
}
static int CompileShader(ref CompileShaderData data)
{
int res = 0;
string shaderName = Path.GetFileNameWithoutExtension(data.glslPath);
string shaderType = Path.GetExtension(data.glslPath);
if (shaderType != ".vert" && shaderType != ".frag" && shaderType != ".comp")
{
Console.WriteLine("refreshc: Expected glsl source file with extension '.vert', '.frag', or '.comp'");
return 1;
}
// Create the temp directory, if needed
string tempDir = Path.Combine(Directory.GetCurrentDirectory(), "temp");
if (!Directory.Exists(tempDir))
{
Directory.CreateDirectory(tempDir);
}
// Compile to spirv
string spirvPath = Path.Combine(tempDir, $"{shaderName}.spv");
res = CompileGlslToSpirv(data.glslPath, shaderName, spirvPath);
if (res != 0)
{
goto cleanup;
}
if (data.d3d11 || data.ps5)
{
// Transpile to hlsl
string hlslPath = Path.Combine(tempDir, $"{shaderName}.hlsl");
res = TranslateSpirvToHlsl(spirvPath, hlslPath);
if (res != 0)
{
goto cleanup;
}
// FIXME: Is there a cross-platform way to compile HLSL to DXBC?
#if PS5
// Transpile to ps5, if requested
if (data.ps5)
{
res = TranslateHlslToPS5(hlslPath, shaderName, shaderType, tempDir);
if (res != 0)
{
goto cleanup;
}
}
#endif
}
// Create the output blob file
string outputFilepath = Path.Combine(data.outputDir, $"{shaderName}{shaderType}.refresh");
using (FileStream fs = File.Create(outputFilepath))
{
using (BinaryWriter writer = new BinaryWriter(fs))
{
// Magic
writer.Write(new char[] { 'R', 'F', 'S', 'H'});
if (data.vulkan)
{
string inputPath = Path.Combine(tempDir, $"{shaderName}.spv");
WriteShaderBlob(writer, inputPath, 1);
}
#if PS5
if (data.ps5)
{
string ext = GetPS5ShaderFileExtension();
string inputPath = Path.Combine(tempDir, $"{shaderName}{ext}");
WriteShaderBlob(writer, inputPath, 2);
}
#endif
if (data.d3d11)
{
string inputPath = Path.Combine(tempDir, $"{shaderName}.hlsl");
WriteShaderBlob(writer, inputPath, 3);
}
}
}
cleanup:
// Clean up the temp directory
if (!data.preserveTemp)
{
Directory.Delete(tempDir, true);
}
return res;
}
static void WriteShaderBlob(BinaryWriter writer, string inputPath, byte backend)
{
byte[] shaderBlob = File.ReadAllBytes(inputPath);
writer.Write(backend); // Corresponds to Refresh_Backend
writer.Write(shaderBlob.Length);
writer.Write(shaderBlob);
}
static int CompileGlslToSpirv(string glslPath, string shaderName, string outputPath)
{
Process glslc = Process.Start(
"glslc",
$"\"{glslPath}\" -o \"{outputPath}\""
);
glslc.WaitForExit();
if (glslc.ExitCode != 0)
{
Console.WriteLine($"refreshc: Could not compile GLSL code");
return 1;
}
return 0;
}
static int TranslateSpirvToHlsl(string spirvPath, string outputPath)
{
Process spirvcross = Process.Start(
"spirv-cross",
$"\"{spirvPath}\" --hlsl --shader-model 50 --output \"{outputPath}\""
);
spirvcross.WaitForExit();
if (spirvcross.ExitCode != 0)
{
Console.WriteLine($"refreshc: Could not translate SPIR-V to HLSL");
return 1;
}
return 0;
}
}

View File

@ -0,0 +1,10 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net7.0</TargetFramework>
<TargetName>refreshc</TargetName>
<PublishAot>true</PublishAot>
</PropertyGroup>
</Project>

View File

@ -1,4 +1,4 @@
/* Refresh - XNA-inspired 3D Graphics Library with modern capabilities /* Refresh - XNA-inspired 3D Graphics Library with modern capabilities
* *
* Copyright (c) 2020 Evan Hemsley * Copyright (c) 2020 Evan Hemsley
* *
@ -33,9 +33,22 @@
/* Drivers */ /* Drivers */
static const Refresh_Driver *drivers[] = { #ifdef REFRESH_DRIVER_VULKAN
&VulkanDriver, #define VULKAN_DRIVER &VulkanDriver
NULL #else
#define VULKAN_DRIVER NULL
#endif
#ifdef REFRESH_DRIVER_PS5
#define PS5_DRIVER &PS5Driver
#else
#define PS5_DRIVER NULL
#endif
static const Refresh_Driver *backends[] = {
NULL,
VULKAN_DRIVER,
PS5_DRIVER
}; };
/* Logging */ /* Logging */
@ -124,19 +137,55 @@ uint32_t Refresh_LinkedVersion(void)
/* Driver Functions */ /* Driver Functions */
static int32_t selectedDriver = 0; static Refresh_Backend selectedBackend = REFRESH_BACKEND_INVALID;
Refresh_Backend Refresh_SelectBackend(Refresh_Backend preferredBackend, uint32_t *flags)
{
uint32_t i;
if (preferredBackend != REFRESH_BACKEND_DONTCARE)
{
if (backends[preferredBackend] == NULL)
{
Refresh_LogWarn("Preferred backend was not compiled into this binary! Attempting to fall back!");
}
else if (backends[preferredBackend]->PrepareDriver(flags))
{
selectedBackend = preferredBackend;
return selectedBackend;
}
}
/* Iterate until we find an appropriate backend. */
for (i = 1; i < SDL_arraysize(backends); i += 1)
{
if (i != preferredBackend && backends[i] != NULL && backends[i]->PrepareDriver(flags))
{
selectedBackend = i;
return i;
}
}
if (backends[i] == NULL)
{
Refresh_LogError("No supported Refresh backend found!");
}
selectedBackend = REFRESH_BACKEND_INVALID;
return REFRESH_BACKEND_INVALID;
}
Refresh_Device* Refresh_CreateDevice( Refresh_Device* Refresh_CreateDevice(
Refresh_PresentationParameters *presentationParameters,
uint8_t debugMode uint8_t debugMode
) { ) {
if (selectedDriver < 0) if (selectedBackend == REFRESH_BACKEND_INVALID)
{ {
Refresh_LogError("Invalid backend selection. Did you call Refresh_SelectBackend?");
return NULL; return NULL;
} }
return drivers[selectedDriver]->CreateDevice( return backends[selectedBackend]->CreateDevice(
presentationParameters,
debugMode debugMode
); );
} }
@ -147,27 +196,6 @@ void Refresh_DestroyDevice(Refresh_Device *device)
device->DestroyDevice(device); device->DestroyDevice(device);
} }
void Refresh_Clear(
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer,
Refresh_Rect *clearRect,
Refresh_ClearOptions options,
Refresh_Vec4 *colors,
uint32_t colorCount,
Refresh_DepthStencilValue depthStencil
) {
NULL_RETURN(device);
device->Clear(
device->driverData,
commandBuffer,
clearRect,
options,
colors,
colorCount,
depthStencil
);
}
void Refresh_DrawIndexedPrimitives( void Refresh_DrawIndexedPrimitives(
Refresh_Device *device, Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer, Refresh_CommandBuffer *commandBuffer,
@ -231,6 +259,29 @@ void Refresh_DrawPrimitives(
); );
} }
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( void Refresh_DispatchCompute(
Refresh_Device *device, Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer, Refresh_CommandBuffer *commandBuffer,
@ -250,25 +301,14 @@ void Refresh_DispatchCompute(
); );
} }
Refresh_RenderPass* Refresh_CreateRenderPass(
Refresh_Device *device,
Refresh_RenderPassCreateInfo *renderPassCreateInfo
) {
NULL_RETURN_NULL(device);
return device->CreateRenderPass(
device->driverData,
renderPassCreateInfo
);
}
Refresh_ComputePipeline* Refresh_CreateComputePipeline( Refresh_ComputePipeline* Refresh_CreateComputePipeline(
Refresh_Device *device, Refresh_Device *device,
Refresh_ComputePipelineCreateInfo *pipelineCreateInfo Refresh_ComputeShaderInfo *computeShaderInfo
) { ) {
NULL_RETURN_NULL(device); NULL_RETURN_NULL(device);
return device->CreateComputePipeline( return device->CreateComputePipeline(
device->driverData, device->driverData,
pipelineCreateInfo computeShaderInfo
); );
} }
@ -294,25 +334,56 @@ Refresh_Sampler* Refresh_CreateSampler(
); );
} }
Refresh_Framebuffer* Refresh_CreateFramebuffer(
Refresh_Device *device,
Refresh_FramebufferCreateInfo *framebufferCreateInfo
) {
NULL_RETURN_NULL(device);
return device->CreateFramebuffer(
device->driverData,
framebufferCreateInfo
);
}
Refresh_ShaderModule* Refresh_CreateShaderModule( Refresh_ShaderModule* Refresh_CreateShaderModule(
Refresh_Device *device, Refresh_Device *device,
Refresh_ShaderModuleCreateInfo *shaderModuleCreateInfo Refresh_ShaderModuleCreateInfo *shaderModuleCreateInfo
) { ) {
Refresh_ShaderModuleCreateInfo driverSpecificCreateInfo = { 0, NULL };
uint8_t *bytes;
uint32_t i, size;
NULL_RETURN_NULL(device); NULL_RETURN_NULL(device);
/* verify the magic number in the shader blob header */
bytes = (uint8_t*) shaderModuleCreateInfo->byteCode;
if (bytes[0] != 'R' || bytes[1] != 'F' || bytes[2] != 'S' || bytes[3] != 'H')
{
Refresh_LogError("Cannot parse malformed Refresh shader blob!");
return NULL;
}
/* find the code for the selected backend */
i = 4;
while (i < shaderModuleCreateInfo->codeSize)
{
size = *((uint32_t*) &bytes[i + 1]);
if (bytes[i] == (uint8_t) selectedBackend)
{
driverSpecificCreateInfo.codeSize = size;
driverSpecificCreateInfo.byteCode = (uint32_t*) &bytes[i + 1 + sizeof(uint32_t)];
break;
}
else
{
/* skip over the backend byte, the blob size, and the blob */
i += 1 + sizeof(uint32_t) + size;
}
}
/* verify the shader blob supports the selected backend */
if (driverSpecificCreateInfo.byteCode == NULL)
{
Refresh_LogError(
"Cannot create shader module that does not contain shader code for the selected backend! "
"Recompile your shader and enable this backend."
);
return NULL;
}
return device->CreateShaderModule( return device->CreateShaderModule(
device->driverData, device->driverData,
shaderModuleCreateInfo &driverSpecificCreateInfo
); );
} }
@ -327,19 +398,6 @@ Refresh_Texture* Refresh_CreateTexture(
); );
} }
Refresh_RenderTarget* Refresh_CreateRenderTarget(
Refresh_Device *device,
Refresh_TextureSlice *textureSlice,
Refresh_SampleCount multisampleCount
) {
NULL_RETURN_NULL(device);
return device->CreateRenderTarget(
device->driverData,
textureSlice,
multisampleCount
);
}
Refresh_Buffer* Refresh_CreateBuffer( Refresh_Buffer* Refresh_CreateBuffer(
Refresh_Device *device, Refresh_Device *device,
Refresh_BufferUsageFlags usageFlags, Refresh_BufferUsageFlags usageFlags,
@ -380,8 +438,13 @@ void Refresh_SetTextureDataYUV(
uint32_t yHeight, uint32_t yHeight,
uint32_t uvWidth, uint32_t uvWidth,
uint32_t uvHeight, uint32_t uvHeight,
void* data, void *yDataPtr,
uint32_t dataLength void *uDataPtr,
void *vDataPtr,
uint32_t yDataLength,
uint32_t uvDataLength,
uint32_t yStride,
uint32_t uvStride
) { ) {
NULL_RETURN(device); NULL_RETURN(device);
device->SetTextureDataYUV( device->SetTextureDataYUV(
@ -394,8 +457,13 @@ void Refresh_SetTextureDataYUV(
yHeight, yHeight,
uvWidth, uvWidth,
uvHeight, uvHeight,
data, yDataPtr,
dataLength uDataPtr,
vDataPtr,
yDataLength,
uvDataLength,
yStride,
uvStride
); );
} }
@ -573,28 +641,6 @@ void Refresh_QueueDestroyBuffer(
); );
} }
void Refresh_QueueDestroyRenderTarget(
Refresh_Device *device,
Refresh_RenderTarget *renderTarget
) {
NULL_RETURN(device);
device->QueueDestroyRenderTarget(
device->driverData,
renderTarget
);
}
void Refresh_QueueDestroyFramebuffer(
Refresh_Device *device,
Refresh_Framebuffer *frameBuffer
) {
NULL_RETURN(device);
device->QueueDestroyFramebuffer(
device->driverData,
frameBuffer
);
}
void Refresh_QueueDestroyShaderModule( void Refresh_QueueDestroyShaderModule(
Refresh_Device *device, Refresh_Device *device,
Refresh_ShaderModule *shaderModule Refresh_ShaderModule *shaderModule
@ -606,17 +652,6 @@ void Refresh_QueueDestroyShaderModule(
); );
} }
void Refresh_QueueDestroyRenderPass(
Refresh_Device *device,
Refresh_RenderPass *renderPass
) {
NULL_RETURN(device);
device->QueueDestroyRenderPass(
device->driverData,
renderPass
);
}
void Refresh_QueueDestroyComputePipeline( void Refresh_QueueDestroyComputePipeline(
Refresh_Device *device, Refresh_Device *device,
Refresh_ComputePipeline *computePipeline Refresh_ComputePipeline *computePipeline
@ -642,23 +677,17 @@ void Refresh_QueueDestroyGraphicsPipeline(
void Refresh_BeginRenderPass( void Refresh_BeginRenderPass(
Refresh_Device *device, Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer, Refresh_CommandBuffer *commandBuffer,
Refresh_RenderPass *renderPass, Refresh_ColorAttachmentInfo *colorAttachmentInfos,
Refresh_Framebuffer *framebuffer, uint32_t colorAttachmentCount,
Refresh_Rect *renderArea, Refresh_DepthStencilAttachmentInfo *depthStencilAttachmentInfo
Refresh_Vec4 *pColorClearValues,
uint32_t colorClearCount,
Refresh_DepthStencilValue *depthStencilClearValue
) { ) {
NULL_RETURN(device); NULL_RETURN(device);
device->BeginRenderPass( device->BeginRenderPass(
device->driverData, device->driverData,
commandBuffer, commandBuffer,
renderPass, colorAttachmentInfos,
framebuffer, colorAttachmentCount,
renderArea, depthStencilAttachmentInfo
pColorClearValues,
colorClearCount,
depthStencilClearValue
); );
} }
@ -673,6 +702,32 @@ void Refresh_EndRenderPass(
); );
} }
void Refresh_SetViewport(
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer,
Refresh_Viewport *viewport
) {
NULL_RETURN(device)
device->SetViewport(
device->driverData,
commandBuffer,
viewport
);
}
void Refresh_SetScissor(
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer,
Refresh_Rect *scissor
) {
NULL_RETURN(device)
device->SetScissor(
device->driverData,
commandBuffer,
scissor
);
}
void Refresh_BindGraphicsPipeline( void Refresh_BindGraphicsPipeline(
Refresh_Device *device, Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer, Refresh_CommandBuffer *commandBuffer,
@ -761,46 +816,99 @@ void Refresh_BindComputeTextures(
); );
} }
Refresh_CommandBuffer* Refresh_AcquireCommandBuffer( uint8_t Refresh_ClaimWindow(
Refresh_Device *device, Refresh_Device *device,
uint8_t fixed void *windowHandle,
Refresh_PresentMode presentMode
) { ) {
NULL_RETURN_NULL(device); if (device == NULL) { return 0; }
return device->AcquireCommandBuffer( return device->ClaimWindow(
device->driverData, device->driverData,
fixed windowHandle,
presentMode
); );
} }
void Refresh_QueuePresent( void Refresh_UnclaimWindow(
Refresh_Device *device, Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer,
Refresh_TextureSlice* textureSlice,
Refresh_Rect *destinationRectangle,
Refresh_Filter filter,
void *windowHandle void *windowHandle
) { ) {
NULL_RETURN(device); NULL_RETURN(device);
device->QueuePresent( device->UnclaimWindow(
device->driverData,
windowHandle
);
}
Refresh_CommandBuffer* Refresh_AcquireCommandBuffer(
Refresh_Device *device
) {
NULL_RETURN_NULL(device);
return device->AcquireCommandBuffer(
device->driverData
);
}
Refresh_Texture* Refresh_AcquireSwapchainTexture(
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer,
void *windowHandle,
uint32_t *pWidth,
uint32_t *pHeight
) {
NULL_RETURN_NULL(device);
return device->AcquireSwapchainTexture(
device->driverData, device->driverData,
commandBuffer, commandBuffer,
textureSlice, windowHandle,
destinationRectangle, pWidth,
filter, pHeight
);
}
Refresh_TextureFormat Refresh_GetSwapchainFormat(
Refresh_Device *device,
void *windowHandle
) {
if (device == NULL) { return 0; }
return device->GetSwapchainFormat(
device->driverData,
windowHandle windowHandle
); );
} }
void Refresh_SetSwapchainPresentMode(
Refresh_Device *device,
void *windowHandle,
Refresh_PresentMode presentMode
) {
NULL_RETURN(device);
device->SetSwapchainPresentMode(
device->driverData,
windowHandle,
presentMode
);
}
void Refresh_Submit( void Refresh_Submit(
Refresh_Device *device, Refresh_Device *device,
uint32_t commandBufferCount, Refresh_CommandBuffer *commandBuffer
Refresh_CommandBuffer **pCommandBuffers
) { ) {
NULL_RETURN(device); NULL_RETURN(device);
device->Submit( device->Submit(
device->driverData, device->driverData,
commandBufferCount, commandBuffer
pCommandBuffers );
}
Refresh_Fence* Refresh_SubmitAndAcquireFence(
Refresh_Device *device,
Refresh_CommandBuffer *commandBuffer
) {
NULL_RETURN_NULL(device);
return device->SubmitAndAcquireFence(
device->driverData,
commandBuffer
); );
} }
@ -813,4 +921,44 @@ void Refresh_Wait(
); );
} }
void Refresh_WaitForFences(
Refresh_Device *device,
uint8_t waitAll,
uint32_t fenceCount,
Refresh_Fence **pFences
) {
NULL_RETURN(device);
device->WaitForFences(
device->driverData,
waitAll,
fenceCount,
pFences
);
}
int Refresh_QueryFence(
Refresh_Device *device,
Refresh_Fence *fence
) {
if (device == NULL) {
return 0;
}
return device->QueryFence(
device->driverData,
fence
);
}
void Refresh_ReleaseFence(
Refresh_Device *device,
Refresh_Fence *fence
) {
NULL_RETURN(device);
device->ReleaseFence(
device->driverData,
fence
);
}
/* vim: set noexpandtab shiftwidth=8 tabstop=8: */ /* vim: set noexpandtab shiftwidth=8 tabstop=8: */

View File

@ -1,4 +1,4 @@
/* Refresh - XNA-inspired 3D Graphics Library with modern capabilities /* Refresh - XNA-inspired 3D Graphics Library with modern capabilities
* *
* Copyright (c) 2020 Evan Hemsley * Copyright (c) 2020 Evan Hemsley
* *
@ -36,9 +36,15 @@
/* Logging */ /* Logging */
extern void Refresh_LogInfo(const char *fmt, ...); #ifdef __cplusplus
extern void Refresh_LogWarn(const char *fmt, ...); extern "C" {
extern void Refresh_LogError(const char *fmt, ...); #endif
void Refresh_LogInfo(const char *fmt, ...);
void Refresh_LogWarn(const char *fmt, ...);
void Refresh_LogError(const char *fmt, ...);
#ifdef __cplusplus
}
#endif
/* Internal Helper Utilities */ /* Internal Helper Utilities */
@ -51,24 +57,31 @@ static inline uint32_t Texture_GetFormatSize(
return 8; return 8;
case REFRESH_TEXTUREFORMAT_BC2: case REFRESH_TEXTUREFORMAT_BC2:
case REFRESH_TEXTUREFORMAT_BC3: case REFRESH_TEXTUREFORMAT_BC3:
case REFRESH_TEXTUREFORMAT_BC7:
return 16; return 16;
case REFRESH_TEXTUREFORMAT_R8: case REFRESH_TEXTUREFORMAT_R8:
case REFRESH_TEXTUREFORMAT_R8_UINT:
return 1; return 1;
case REFRESH_TEXTUREFORMAT_R5G6B5: case REFRESH_TEXTUREFORMAT_R5G6B5:
case REFRESH_TEXTUREFORMAT_B4G4R4A4: case REFRESH_TEXTUREFORMAT_B4G4R4A4:
case REFRESH_TEXTUREFORMAT_A1R5G5B5: case REFRESH_TEXTUREFORMAT_A1R5G5B5:
case REFRESH_TEXTUREFORMAT_R16_SFLOAT: case REFRESH_TEXTUREFORMAT_R16_SFLOAT:
case REFRESH_TEXTUREFORMAT_R8G8_SNORM: case REFRESH_TEXTUREFORMAT_R8G8_SNORM:
case REFRESH_TEXTUREFORMAT_R8G8_UINT:
case REFRESH_TEXTUREFORMAT_R16_UINT:
return 2; return 2;
case REFRESH_TEXTUREFORMAT_R8G8B8A8: case REFRESH_TEXTUREFORMAT_R8G8B8A8:
case REFRESH_TEXTUREFORMAT_R32_SFLOAT: case REFRESH_TEXTUREFORMAT_R32_SFLOAT:
case REFRESH_TEXTUREFORMAT_R16G16_SFLOAT: case REFRESH_TEXTUREFORMAT_R16G16_SFLOAT:
case REFRESH_TEXTUREFORMAT_R8G8B8A8_SNORM: case REFRESH_TEXTUREFORMAT_R8G8B8A8_SNORM:
case REFRESH_TEXTUREFORMAT_A2R10G10B10: case REFRESH_TEXTUREFORMAT_A2R10G10B10:
case REFRESH_TEXTUREFORMAT_R8G8B8A8_UINT:
case REFRESH_TEXTUREFORMAT_R16G16_UINT:
return 4; return 4;
case REFRESH_TEXTUREFORMAT_R16G16B16A16_SFLOAT: case REFRESH_TEXTUREFORMAT_R16G16B16A16_SFLOAT:
case REFRESH_TEXTUREFORMAT_R16G16B16A16: case REFRESH_TEXTUREFORMAT_R16G16B16A16:
case REFRESH_TEXTUREFORMAT_R32G32_SFLOAT: case REFRESH_TEXTUREFORMAT_R32G32_SFLOAT:
case REFRESH_TEXTUREFORMAT_R16G16B16A16_UINT:
return 8; return 8;
case REFRESH_TEXTUREFORMAT_R32G32B32A32_SFLOAT: case REFRESH_TEXTUREFORMAT_R32G32B32A32_SFLOAT:
return 16; return 16;
@ -117,7 +130,8 @@ static inline uint32_t BytesPerRow(
if ( format == REFRESH_TEXTUREFORMAT_BC1 || if ( format == REFRESH_TEXTUREFORMAT_BC1 ||
format == REFRESH_TEXTUREFORMAT_BC2 || format == REFRESH_TEXTUREFORMAT_BC2 ||
format == REFRESH_TEXTUREFORMAT_BC3 ) format == REFRESH_TEXTUREFORMAT_BC3 ||
format == REFRESH_TEXTUREFORMAT_BC7 )
{ {
blocksPerRow = (width + 3) / 4; blocksPerRow = (width + 3) / 4;
} }
@ -135,7 +149,8 @@ static inline int32_t BytesPerImage(
if ( format == REFRESH_TEXTUREFORMAT_BC1 || if ( format == REFRESH_TEXTUREFORMAT_BC1 ||
format == REFRESH_TEXTUREFORMAT_BC2 || format == REFRESH_TEXTUREFORMAT_BC2 ||
format == REFRESH_TEXTUREFORMAT_BC3 ) format == REFRESH_TEXTUREFORMAT_BC3 ||
format == REFRESH_TEXTUREFORMAT_BC7 )
{ {
blocksPerRow = (width + 3) / 4; blocksPerRow = (width + 3) / 4;
blocksPerColumn = (height + 3) / 4; blocksPerColumn = (height + 3) / 4;
@ -154,6 +169,7 @@ static inline int32_t BytesPerImage(
#define MAX_BUFFER_BINDINGS 16 #define MAX_BUFFER_BINDINGS 16
#define MAX_COLOR_TARGET_BINDINGS 4 #define MAX_COLOR_TARGET_BINDINGS 4
#define MAX_PRESENT_COUNT 16
/* Refresh_Device Definition */ /* Refresh_Device Definition */
@ -167,16 +183,6 @@ struct Refresh_Device
/* Drawing */ /* Drawing */
void (*Clear)(
Refresh_Renderer *driverData,
Refresh_CommandBuffer *commandBuffer,
Refresh_Rect *clearRect,
Refresh_ClearOptions options,
Refresh_Vec4 *colors,
uint32_t colorCount,
Refresh_DepthStencilValue depthStencil
);
void (*DrawInstancedPrimitives)( void (*DrawInstancedPrimitives)(
Refresh_Renderer *driverData, Refresh_Renderer *driverData,
Refresh_CommandBuffer *commandBuffer, Refresh_CommandBuffer *commandBuffer,
@ -207,6 +213,17 @@ struct Refresh_Device
uint32_t fragmentParamOffset uint32_t fragmentParamOffset
); );
void (*DrawPrimitivesIndirect)(
Refresh_Renderer *driverData,
Refresh_CommandBuffer *commandBuffer,
Refresh_Buffer *buffer,
uint32_t offsetInBytes,
uint32_t drawCount,
uint32_t stride,
uint32_t vertexParamOffset,
uint32_t fragmentParamOffset
);
void (*DispatchCompute)( void (*DispatchCompute)(
Refresh_Renderer *device, Refresh_Renderer *device,
Refresh_CommandBuffer *commandBuffer, Refresh_CommandBuffer *commandBuffer,
@ -218,14 +235,9 @@ struct Refresh_Device
/* State Creation */ /* State Creation */
Refresh_RenderPass* (*CreateRenderPass)(
Refresh_Renderer *driverData,
Refresh_RenderPassCreateInfo *renderPassCreateInfo
);
Refresh_ComputePipeline* (*CreateComputePipeline)( Refresh_ComputePipeline* (*CreateComputePipeline)(
Refresh_Renderer *driverData, Refresh_Renderer *driverData,
Refresh_ComputePipelineCreateInfo *pipelineCreateInfo Refresh_ComputeShaderInfo *computeShaderInfo
); );
Refresh_GraphicsPipeline* (*CreateGraphicsPipeline)( Refresh_GraphicsPipeline* (*CreateGraphicsPipeline)(
@ -238,11 +250,6 @@ struct Refresh_Device
Refresh_SamplerStateCreateInfo *samplerStateCreateInfo Refresh_SamplerStateCreateInfo *samplerStateCreateInfo
); );
Refresh_Framebuffer* (*CreateFramebuffer)(
Refresh_Renderer *driverData,
Refresh_FramebufferCreateInfo *framebufferCreateInfo
);
Refresh_ShaderModule* (*CreateShaderModule)( Refresh_ShaderModule* (*CreateShaderModule)(
Refresh_Renderer *driverData, Refresh_Renderer *driverData,
Refresh_ShaderModuleCreateInfo *shaderModuleCreateInfo Refresh_ShaderModuleCreateInfo *shaderModuleCreateInfo
@ -253,12 +260,6 @@ struct Refresh_Device
Refresh_TextureCreateInfo *textureCreateInfo Refresh_TextureCreateInfo *textureCreateInfo
); );
Refresh_RenderTarget* (*CreateRenderTarget)(
Refresh_Renderer *driverData,
Refresh_TextureSlice *textureSlice,
Refresh_SampleCount multisampleCount
);
Refresh_Buffer* (*CreateBuffer)( Refresh_Buffer* (*CreateBuffer)(
Refresh_Renderer *driverData, Refresh_Renderer *driverData,
Refresh_BufferUsageFlags usageFlags, Refresh_BufferUsageFlags usageFlags,
@ -285,8 +286,13 @@ struct Refresh_Device
uint32_t yHeight, uint32_t yHeight,
uint32_t uvWidth, uint32_t uvWidth,
uint32_t uvHeight, uint32_t uvHeight,
void* data, void *yDataPtr,
uint32_t dataLength void *uDataPtr,
void *vDataPtr,
uint32_t yDataLength,
uint32_t uvDataLength,
uint32_t yStride,
uint32_t uvStride
); );
void (*CopyTextureToTexture)( void (*CopyTextureToTexture)(
@ -374,26 +380,11 @@ struct Refresh_Device
Refresh_Buffer *buffer Refresh_Buffer *buffer
); );
void(*QueueDestroyRenderTarget)(
Refresh_Renderer *driverData,
Refresh_RenderTarget *renderTarget
);
void(*QueueDestroyFramebuffer)(
Refresh_Renderer *driverData,
Refresh_Framebuffer *frameBuffer
);
void (*QueueDestroyShaderModule)( void (*QueueDestroyShaderModule)(
Refresh_Renderer *driverData, Refresh_Renderer *driverData,
Refresh_ShaderModule *shaderModule Refresh_ShaderModule *shaderModule
); );
void(*QueueDestroyRenderPass)(
Refresh_Renderer *driverData,
Refresh_RenderPass *renderPass
);
void (*QueueDestroyComputePipeline)( void (*QueueDestroyComputePipeline)(
Refresh_Renderer *driverData, Refresh_Renderer *driverData,
Refresh_ComputePipeline *computePipeline Refresh_ComputePipeline *computePipeline
@ -409,12 +400,9 @@ struct Refresh_Device
void (*BeginRenderPass)( void (*BeginRenderPass)(
Refresh_Renderer *driverData, Refresh_Renderer *driverData,
Refresh_CommandBuffer *commandBuffer, Refresh_CommandBuffer *commandBuffer,
Refresh_RenderPass *renderPass, Refresh_ColorAttachmentInfo *colorAttachmentInfos,
Refresh_Framebuffer *framebuffer, uint32_t colorAttachmentCount,
Refresh_Rect *renderArea, Refresh_DepthStencilAttachmentInfo *depthStencilAttachmentInfo
Refresh_Vec4 *pColorClearValues,
uint32_t colorClearCount,
Refresh_DepthStencilValue *depthStencilClearValue
); );
void (*EndRenderPass)( void (*EndRenderPass)(
@ -422,6 +410,18 @@ struct Refresh_Device
Refresh_CommandBuffer *commandBuffer Refresh_CommandBuffer *commandBuffer
); );
void (*SetViewport)(
Refresh_Renderer *driverData,
Refresh_CommandBuffer *commandBuffer,
Refresh_Viewport *viewport
);
void (*SetScissor)(
Refresh_Renderer *driverData,
Refresh_CommandBuffer *commandBuffer,
Refresh_Rect *scissor
);
void (*BindGraphicsPipeline)( void (*BindGraphicsPipeline)(
Refresh_Renderer *driverData, Refresh_Renderer *driverData,
Refresh_CommandBuffer *commandBuffer, Refresh_CommandBuffer *commandBuffer,
@ -463,30 +463,71 @@ struct Refresh_Device
Refresh_Texture **pTextures Refresh_Texture **pTextures
); );
Refresh_CommandBuffer* (*AcquireCommandBuffer)( uint8_t (*ClaimWindow)(
Refresh_Renderer *driverData, Refresh_Renderer *driverData,
uint8_t fixed void *windowHandle,
Refresh_PresentMode presentMode
); );
void(*QueuePresent)( void (*UnclaimWindow)(
Refresh_Renderer *driverData,
void *windowHandle
);
Refresh_CommandBuffer* (*AcquireCommandBuffer)(
Refresh_Renderer *driverData
);
Refresh_Texture* (*AcquireSwapchainTexture)(
Refresh_Renderer *driverData, Refresh_Renderer *driverData,
Refresh_CommandBuffer *commandBuffer, Refresh_CommandBuffer *commandBuffer,
Refresh_TextureSlice *textureSlice, void *windowHandle,
Refresh_Rect *destinationRectangle, uint32_t *pWidth,
Refresh_Filter filter, uint32_t *pHeight
);
Refresh_TextureFormat (*GetSwapchainFormat)(
Refresh_Renderer *driverData,
void *windowHandle void *windowHandle
); );
void (*SetSwapchainPresentMode)(
Refresh_Renderer *driverData,
void *windowHandle,
Refresh_PresentMode presentMode
);
void (*Submit)( void (*Submit)(
Refresh_Renderer *driverData, Refresh_Renderer *driverData,
uint32_t commandBufferCount, Refresh_CommandBuffer *commandBuffer
Refresh_CommandBuffer **pCommandBuffers );
Refresh_Fence* (*SubmitAndAcquireFence)(
Refresh_Renderer *driverData,
Refresh_CommandBuffer *commandBuffer
); );
void (*Wait)( void (*Wait)(
Refresh_Renderer *driverData Refresh_Renderer *driverData
); );
void (*WaitForFences)(
Refresh_Renderer *driverData,
uint8_t waitAll,
uint32_t fenceCount,
Refresh_Fence **pFences
);
int (*QueryFence)(
Refresh_Renderer *driverData,
Refresh_Fence *fence
);
void (*ReleaseFence)(
Refresh_Renderer *driverData,
Refresh_Fence *fence
);
/* Opaque pointer for the Driver */ /* Opaque pointer for the Driver */
Refresh_Renderer *driverData; Refresh_Renderer *driverData;
}; };
@ -495,19 +536,16 @@ struct Refresh_Device
result->func = name##_##func; result->func = name##_##func;
#define ASSIGN_DRIVER(name) \ #define ASSIGN_DRIVER(name) \
ASSIGN_DRIVER_FUNC(DestroyDevice, name) \ ASSIGN_DRIVER_FUNC(DestroyDevice, name) \
ASSIGN_DRIVER_FUNC(Clear, name) \
ASSIGN_DRIVER_FUNC(DrawIndexedPrimitives, name) \ ASSIGN_DRIVER_FUNC(DrawIndexedPrimitives, name) \
ASSIGN_DRIVER_FUNC(DrawInstancedPrimitives, name) \ ASSIGN_DRIVER_FUNC(DrawInstancedPrimitives, name) \
ASSIGN_DRIVER_FUNC(DrawPrimitives, name) \ ASSIGN_DRIVER_FUNC(DrawPrimitives, name) \
ASSIGN_DRIVER_FUNC(DrawPrimitivesIndirect, name) \
ASSIGN_DRIVER_FUNC(DispatchCompute, name) \ ASSIGN_DRIVER_FUNC(DispatchCompute, name) \
ASSIGN_DRIVER_FUNC(CreateRenderPass, name) \
ASSIGN_DRIVER_FUNC(CreateComputePipeline, name) \ ASSIGN_DRIVER_FUNC(CreateComputePipeline, name) \
ASSIGN_DRIVER_FUNC(CreateGraphicsPipeline, name) \ ASSIGN_DRIVER_FUNC(CreateGraphicsPipeline, name) \
ASSIGN_DRIVER_FUNC(CreateSampler, name) \ ASSIGN_DRIVER_FUNC(CreateSampler, name) \
ASSIGN_DRIVER_FUNC(CreateFramebuffer, name) \
ASSIGN_DRIVER_FUNC(CreateShaderModule, name) \ ASSIGN_DRIVER_FUNC(CreateShaderModule, name) \
ASSIGN_DRIVER_FUNC(CreateTexture, name) \ ASSIGN_DRIVER_FUNC(CreateTexture, name) \
ASSIGN_DRIVER_FUNC(CreateRenderTarget, name) \
ASSIGN_DRIVER_FUNC(CreateBuffer, name) \ ASSIGN_DRIVER_FUNC(CreateBuffer, name) \
ASSIGN_DRIVER_FUNC(SetTextureData, name) \ ASSIGN_DRIVER_FUNC(SetTextureData, name) \
ASSIGN_DRIVER_FUNC(SetTextureDataYUV, name) \ ASSIGN_DRIVER_FUNC(SetTextureDataYUV, name) \
@ -523,35 +561,43 @@ struct Refresh_Device
ASSIGN_DRIVER_FUNC(QueueDestroyTexture, name) \ ASSIGN_DRIVER_FUNC(QueueDestroyTexture, name) \
ASSIGN_DRIVER_FUNC(QueueDestroySampler, name) \ ASSIGN_DRIVER_FUNC(QueueDestroySampler, name) \
ASSIGN_DRIVER_FUNC(QueueDestroyBuffer, name) \ ASSIGN_DRIVER_FUNC(QueueDestroyBuffer, name) \
ASSIGN_DRIVER_FUNC(QueueDestroyRenderTarget, name) \
ASSIGN_DRIVER_FUNC(QueueDestroyFramebuffer, name) \
ASSIGN_DRIVER_FUNC(QueueDestroyShaderModule, name) \ ASSIGN_DRIVER_FUNC(QueueDestroyShaderModule, name) \
ASSIGN_DRIVER_FUNC(QueueDestroyRenderPass, name) \
ASSIGN_DRIVER_FUNC(QueueDestroyComputePipeline, name) \ ASSIGN_DRIVER_FUNC(QueueDestroyComputePipeline, name) \
ASSIGN_DRIVER_FUNC(QueueDestroyGraphicsPipeline, name) \ ASSIGN_DRIVER_FUNC(QueueDestroyGraphicsPipeline, name) \
ASSIGN_DRIVER_FUNC(BeginRenderPass, name) \ ASSIGN_DRIVER_FUNC(BeginRenderPass, name) \
ASSIGN_DRIVER_FUNC(EndRenderPass, name) \ ASSIGN_DRIVER_FUNC(EndRenderPass, name) \
ASSIGN_DRIVER_FUNC(SetViewport, name) \
ASSIGN_DRIVER_FUNC(SetScissor, name) \
ASSIGN_DRIVER_FUNC(BindGraphicsPipeline, name) \ ASSIGN_DRIVER_FUNC(BindGraphicsPipeline, name) \
ASSIGN_DRIVER_FUNC(BindVertexBuffers, name) \ ASSIGN_DRIVER_FUNC(BindVertexBuffers, name) \
ASSIGN_DRIVER_FUNC(BindIndexBuffer, name) \ ASSIGN_DRIVER_FUNC(BindIndexBuffer, name) \
ASSIGN_DRIVER_FUNC(BindComputePipeline, name) \ ASSIGN_DRIVER_FUNC(BindComputePipeline, name) \
ASSIGN_DRIVER_FUNC(BindComputeBuffers, name) \ ASSIGN_DRIVER_FUNC(BindComputeBuffers, name) \
ASSIGN_DRIVER_FUNC(BindComputeTextures, name) \ ASSIGN_DRIVER_FUNC(BindComputeTextures, name) \
ASSIGN_DRIVER_FUNC(ClaimWindow, name) \
ASSIGN_DRIVER_FUNC(UnclaimWindow, name) \
ASSIGN_DRIVER_FUNC(AcquireCommandBuffer, name) \ ASSIGN_DRIVER_FUNC(AcquireCommandBuffer, name) \
ASSIGN_DRIVER_FUNC(QueuePresent, name) \ ASSIGN_DRIVER_FUNC(AcquireSwapchainTexture, name) \
ASSIGN_DRIVER_FUNC(GetSwapchainFormat, name) \
ASSIGN_DRIVER_FUNC(SetSwapchainPresentMode, name) \
ASSIGN_DRIVER_FUNC(Submit, name) \ ASSIGN_DRIVER_FUNC(Submit, name) \
ASSIGN_DRIVER_FUNC(Wait, name) ASSIGN_DRIVER_FUNC(SubmitAndAcquireFence, name) \
ASSIGN_DRIVER_FUNC(Wait, name) \
ASSIGN_DRIVER_FUNC(WaitForFences, name) \
ASSIGN_DRIVER_FUNC(QueryFence, name) \
ASSIGN_DRIVER_FUNC(ReleaseFence, name)
typedef struct Refresh_Driver typedef struct Refresh_Driver
{ {
const char *Name; const char *Name;
uint8_t (*PrepareDriver)(uint32_t *flags);
Refresh_Device* (*CreateDevice)( Refresh_Device* (*CreateDevice)(
Refresh_PresentationParameters *presentationParameters,
uint8_t debugMode uint8_t debugMode
); );
} Refresh_Driver; } Refresh_Driver;
extern Refresh_Driver VulkanDriver; extern Refresh_Driver VulkanDriver;
extern Refresh_Driver PS5Driver;
#endif /* REFRESH_DRIVER_H */ #endif /* REFRESH_DRIVER_H */

View File

@ -0,0 +1,707 @@
/* Refresh - XNA-inspired 3D Graphics Library with modern capabilities
*
* 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>
*
*/
#if REFRESH_DRIVER_TEMPLATE
#include "Refresh_Driver.h"
#include <SDL.h>
#define NOT_IMPLEMENTED SDL_assert(0 && "Not implemented!");
/* Conversions */
static TEMPLATE_SURFACE_FORMAT_TYPE RefreshToTEMPLATE_SurfaceFormat[] =
{
0, /* R8G8B8A8 */
0, /* B8G8R8A8 */
0, /* R5G6B5 */
0, /* A1R5G5B5 */
0, /* B4G4R4A4 */
0, /* BC1 */
0, /* BC3 */
0, /* BC5 */
0, /* R8G8_SNORM */
0, /* R8G8B8A8_SNORM */
0, /* A2R10G10B10 */
0, /* R16G16 */
0, /* R16G16B16A16 */
0, /* R8 */
0, /* R32_SFLOAT */
0, /* R32G32_SFLOAT */
0, /* R32G32B32A32_SFLOAT */
0, /* R16_SFLOAT */
0, /* R16G16_SFLOAT */
0, /* R16G16B16A16_SFLOAT */
0, /* D16 */
0, /* D32 */
0, /* D16S8 */
0 /* D32S8 */
};
static TEMPLATE_VERTEX_FORMAT_TYPE RefreshToTEMPLATE_VertexFormat[] =
{
0, /* SINGLE */
0, /* VECTOR2 */
0, /* VECTOR3 */
0, /* VECTOR4 */
0, /* COLOR */
0, /* BYTE4 */
0, /* SHORT2 */
0, /* SHORT4 */
0, /* NORMALIZEDSHORT2 */
0, /* NORMALIZEDSHORT4 */
0, /* HALFVECTOR2 */
0 /* HALFVECTOR4 */
};
static TEMPLATE_INDEX_TYPE RefreshToTEMPLATE_IndexType[] =
{
0, /* 16BIT */
0 /* 32BIT */
};
static TEMPLATE_PRIMITIVE_TYPE RefreshToTEMPLATE_PrimitiveType[] =
{
0, /* POINTLIST */
0, /* LINELIST */
0, /* LINESTRIP */
0, /* TRIANGLELIST */
0 /* TRIANGLESTRIP */
};
static TEMPLATE_POLYGON_MODE_TYPE RefreshToTEMPLATE_PolygonMode[] =
{
0, /* FILL */
0, /* LINE */
};
static TEMPLATE_CULL_MODE_TYPE RefreshToTEMPLATE_CullMode[] =
{
0, /* NONE */
0, /* FRONT */
0, /* BACK */
};
static TEMPLATE_FRONT_FACE_TYPE RefreshToTEMPLATE_FrontFace[] =
{
0, /* COUNTER_CLOCKWISE */
0 /* CLOCKWISE */
};
static TEMPLATE_BLEND_FACTOR_TYPE RefreshToTEMPLATE_BlendFactor[] =
{
0, /* ZERO */
0, /* ONE */
0, /* SRC_COLOR */
0, /* ONE_MINUS_SRC_COLOR */
0, /* DST_COLOR */
0, /* ONE_MINUS_DST_COLOR */
0, /* SRC_ALPHA */
0, /* ONE_MINUS_SRC_ALPHA */
0, /* DST_ALPHA */
0, /* ONE_MINUS_DST_ALPHA */
0, /* CONSTANT_COLOR */
0, /* ONE_MINUS_CONSTANT_COLOR */
0 /* SRC_ALPHA_SATURATE */
};
static TEMPLATE_BLEND_OP_TYPE RefreshToTEMPLATE_BlendOp[] =
{
0, /* ADD */
0, /* SUBTRACT */
0, /* REVERSE_SUBTRACT */
0, /* MIN */
0 /* MAX */
};
static TEMPLATE_COMPARE_OP_TYPE RefreshToTEMPLATE_CompareOp[] =
{
0, /* NEVER */
0, /* LESS */
0, /* EQUAL */
0, /* LESS_OR_EQUAL */
0, /* GREATER */
0, /* NOT_EQUAL */
0, /* GREATER_OR_EQUAL */
0 /* ALWAYS */
};
static TEMPLATE_STENCIL_OP_TYPE RefreshToTEMPLATE_StencilOp[] =
{
0, /* KEEP */
0, /* ZERO */
0, /* REPLACE */
0, /* INCREMENT_AND_CLAMP */
0, /* DECREMENT_AND_CLAMP */
0, /* INVERT */
0, /* INCREMENT_AND_WRAP */
0 /* DECREMENT_AND_WRAP */
};
static TEMPLATE_ATTACHMENT_LOAD_OP_TYPE RefreshToTEMPLATE_LoadOp[] =
{
0, /* LOAD */
0, /* CLEAR */
0 /* DONT_CARE */
};
static TEMPLATE_ATTACHMENT_STORE_OP_TYPE RefreshToTEMPLATE_StoreOp[] =
{
0, /* STORE */
0 /* DONT_CARE */
};
static TEMPLATE_SAMPLE_COUNT_TYPE RefreshToTEMPLATE_SampleCount[] =
{
0, /* 1 */
0, /* 2 */
0, /* 4 */
0, /* 8 */
0, /* 16 */
0, /* 32 */
0 /* 64 */
};
static TEMPLATE_VERTEX_INPUT_RATE_TYPE RefreshToTEMPLATE_VertexInputRate[] =
{
0, /* VERTEX */
0 /* INSTANCE */
};
static TEMPLATE_FILTER_TYPE RefreshToTEMPLATE_Filter[] =
{
0, /* NEAREST */
0, /* LINEAR */
};
static TEMPLATE_SAMPLER_MIPMAP_MODE_TYPE RefreshToTEMPLATE_SamplerMipmapMode[] =
{
0, /* NEAREST */
0 /* LINEAR */
};
static TEMPLATE_SAMPLER_ADDRESS_MODE_TYPE RefreshToTEMPLATE_SamplerAddressMode[] =
{
0, /* REPEAT */
0, /* MIRRORED_REPEAT */
0, /* CLAMP_TO_EDGE */
0 /* CLAMP_TO_BORDER */
};
static TEMPLATE_BORDER_COLOR_TYPE RefreshToTEMPLATE_BorderColor[] =
{
0, /* FLOAT_TRANSPARENT_BLACK */
0, /* INT_TRANSPARENT_BLACK */
0, /* FLOAT_OPAQUE_BLACK */
0, /* INT_OPAQUE_BLACK */
0, /* FLOAT_OPAQUE_WHITE */
0 /* INT_OPAQUE_WHITE */
};
/* Quit */
static void TEMPLATE_DestroyDevice(
Refresh_Device *device
) {
NOT_IMPLEMENTED
}
/* Drawing */
static void TEMPLATE_DrawInstancedPrimitives(
Refresh_Renderer *driverData,
Refresh_CommandBuffer *commandBuffer,
uint32_t baseVertex,
uint32_t startIndex,
uint32_t primitiveCount,
uint32_t instanceCount,
uint32_t vertexParamOffset,
uint32_t fragmentParamOffset
) {
NOT_IMPLEMENTED
}
static void TEMPLATE_DrawIndexedPrimitives(
Refresh_Renderer *driverData,
Refresh_CommandBuffer *commandBuffer,
uint32_t baseVertex,
uint32_t startIndex,
uint32_t primitiveCount,
uint32_t vertexParamOffset,
uint32_t fragmentParamOffset
) {
NOT_IMPLEMENTED
}
static void TEMPLATE_DrawPrimitives(
Refresh_Renderer *driverData,
Refresh_CommandBuffer *commandBuffer,
uint32_t vertexStart,
uint32_t primitiveCount,
uint32_t vertexParamOffset,
uint32_t fragmentParamOffset
) {
NOT_IMPLEMENTED
}
static void TEMPLATE_DrawPrimitivesIndirect(
Refresh_Renderer *driverData,
Refresh_CommandBuffer *commandBuffer,
Refresh_Buffer *buffer,
uint32_t offsetInBytes,
uint32_t drawCount,
uint32_t stride,
uint32_t vertexParamOffset,
uint32_t fragmentParamOffset
) {
NOT_IMPLEMENTED
}
static void TEMPLATE_DispatchCompute(
Refresh_Renderer *device,
Refresh_CommandBuffer *commandBuffer,
uint32_t groupCountX,
uint32_t groupCountY,
uint32_t groupCountZ,
uint32_t computeParamOffset
) {
NOT_IMPLEMENTED
}
/* State Creation */
static Refresh_ComputePipeline* TEMPLATE_CreateComputePipeline(
Refresh_Renderer *driverData,
Refresh_ComputeShaderInfo *computeShaderInfo
) {
NOT_IMPLEMENTED
}
static Refresh_GraphicsPipeline* TEMPLATE_CreateGraphicsPipeline(
Refresh_Renderer *driverData,
Refresh_GraphicsPipelineCreateInfo *pipelineCreateInfo
) {
NOT_IMPLEMENTED
}
static Refresh_Sampler* TEMPLATE_CreateSampler(
Refresh_Renderer *driverData,
Refresh_SamplerStateCreateInfo *samplerStateCreateInfo
) {
NOT_IMPLEMENTED
}
static Refresh_ShaderModule* TEMPLATE_CreateShaderModule(
Refresh_Renderer *driverData,
Refresh_ShaderModuleCreateInfo *shaderModuleCreateInfo
) {
NOT_IMPLEMENTED
}
static Refresh_Texture* TEMPLATE_CreateTexture(
Refresh_Renderer *driverData,
Refresh_TextureCreateInfo *textureCreateInfo
) {
NOT_IMPLEMENTED
}
static Refresh_Buffer* TEMPLATE_CreateBuffer(
Refresh_Renderer *driverData,
Refresh_BufferUsageFlags usageFlags,
uint32_t sizeInBytes
) {
NOT_IMPLEMENTED
}
/* Setters */
static void TEMPLATE_SetTextureData(
Refresh_Renderer *driverData,
Refresh_CommandBuffer *commandBuffer,
Refresh_TextureSlice *textureSlice,
void *data,
uint32_t dataLengthInBytes
) {
NOT_IMPLEMENTED
}
static void TEMPLATE_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
) {
NOT_IMPLEMENTED
}
static void TEMPLATE_CopyTextureToTexture(
Refresh_Renderer *driverData,
Refresh_CommandBuffer *commandBuffer,
Refresh_TextureSlice *sourceTextureSlice,
Refresh_TextureSlice *destinationTextureSlice,
Refresh_Filter filter
) {
NOT_IMPLEMENTED
}
static void TEMPLATE_CopyTextureToBuffer(
Refresh_Renderer *driverData,
Refresh_CommandBuffer *commandBuffer,
Refresh_TextureSlice *textureSlice,
Refresh_Buffer *buffer
) {
NOT_IMPLEMENTED
}
static void TEMPLATE_SetBufferData(
Refresh_Renderer *driverData,
Refresh_CommandBuffer *commandBuffer,
Refresh_Buffer *buffer,
uint32_t offsetInBytes,
void* data,
uint32_t dataLength
) {
NOT_IMPLEMENTED
}
static uint32_t TEMPLATE_PushVertexShaderUniforms(
Refresh_Renderer *driverData,
Refresh_CommandBuffer *commandBuffer,
void *data,
uint32_t dataLengthInBytes
) {
NOT_IMPLEMENTED
}
static uint32_t TEMPLATE_PushFragmentShaderUniforms(
Refresh_Renderer *driverData,
Refresh_CommandBuffer *commandBuffer,
void *data,
uint32_t dataLengthInBytes
) {
NOT_IMPLEMENTED
}
static uint32_t TEMPLATE_PushComputeShaderUniforms(
Refresh_Renderer *driverData,
Refresh_CommandBuffer *commandBuffer,
void *data,
uint32_t dataLengthInBytes
) {
NOT_IMPLEMENTED
}
static void TEMPLATE_BindVertexSamplers(
Refresh_Renderer *driverData,
Refresh_CommandBuffer *commandBuffer,
Refresh_Texture **pTextures,
Refresh_Sampler **pSamplers
) {
NOT_IMPLEMENTED
}
static void TEMPLATE_BindFragmentSamplers(
Refresh_Renderer *driverData,
Refresh_CommandBuffer *commandBuffer,
Refresh_Texture **pTextures,
Refresh_Sampler **pSamplers
) {
NOT_IMPLEMENTED
}
/* Getters */
static void TEMPLATE_GetBufferData(
Refresh_Renderer *driverData,
Refresh_Buffer *buffer,
void *data,
uint32_t dataLengthInBytes
) {
NOT_IMPLEMENTED
}
/* Disposal */
static void TEMPLATE_QueueDestroyTexture(
Refresh_Renderer *driverData,
Refresh_Texture *texture
) {
NOT_IMPLEMENTED
}
static void TEMPLATE_QueueDestroySampler(
Refresh_Renderer *driverData,
Refresh_Sampler *sampler
) {
NOT_IMPLEMENTED
}
static void TEMPLATE_QueueDestroyBuffer(
Refresh_Renderer *driverData,
Refresh_Buffer *buffer
) {
NOT_IMPLEMENTED
}
static void TEMPLATE_QueueDestroyShaderModule(
Refresh_Renderer *driverData,
Refresh_ShaderModule *shaderModule
) {
NOT_IMPLEMENTED
}
static void TEMPLATE_QueueDestroyComputePipeline(
Refresh_Renderer *driverData,
Refresh_ComputePipeline *computePipeline
) {
NOT_IMPLEMENTED
}
static void TEMPLATE_QueueDestroyGraphicsPipeline(
Refresh_Renderer *driverData,
Refresh_GraphicsPipeline *graphicsPipeline
) {
NOT_IMPLEMENTED
}
/* Graphics State */
static Refresh_CommandBuffer* TEMPLATE_AcquireCommandBuffer(
Refresh_Renderer *driverData
) {
NOT_IMPLEMENTED
}
static void TEMPLATE_BeginRenderPass(
Refresh_Renderer *driverData,
Refresh_CommandBuffer *commandBuffer,
Refresh_ColorAttachmentInfo *colorAttachmentInfos,
uint32_t colorAttachmentCount,
Refresh_DepthStencilAttachmentInfo *depthStencilAttachmentInfo
) {
NOT_IMPLEMENTED
}
static void TEMPLATE_EndRenderPass(
Refresh_Renderer *driverData,
Refresh_CommandBuffer *commandBuffer
) {
NOT_IMPLEMENTED
}
static void TEMPLATE_BindGraphicsPipeline(
Refresh_Renderer *driverData,
Refresh_CommandBuffer *commandBuffer,
Refresh_GraphicsPipeline *graphicsPipeline
) {
NOT_IMPLEMENTED
}
static void TEMPLATE_SetViewport(
Refresh_Renderer *driverData,
Refresh_CommandBuffer *commandBuffer,
Refresh_Viewport *viewport
) {
NOT_IMPLEMENTED
}
static void TEMPLATE_SetScissor(
Refresh_Renderer *driverData,
Refresh_CommandBuffer *commandBuffer,
Refresh_Rect *scissor
) {
NOT_IMPLEMENTED
}
static void TEMPLATE_BindVertexBuffers(
Refresh_Renderer *driverData,
Refresh_CommandBuffer *commandBuffer,
uint32_t firstBinding,
uint32_t bindingCount,
Refresh_Buffer **pBuffers,
uint64_t *pOffsets
) {
NOT_IMPLEMENTED
}
static void TEMPLATE_BindIndexBuffer(
Refresh_Renderer *driverData,
Refresh_CommandBuffer *commandBuffer,
Refresh_Buffer *buffer,
uint64_t offset,
Refresh_IndexElementSize indexElementSize
) {
NOT_IMPLEMENTED
}
/* Compute State */
static void TEMPLATE_BindComputePipeline(
Refresh_Renderer *driverData,
Refresh_CommandBuffer *commandBuffer,
Refresh_ComputePipeline *computePipeline
) {
NOT_IMPLEMENTED
}
static void TEMPLATE_BindComputeBuffers(
Refresh_Renderer *driverData,
Refresh_CommandBuffer *commandBuffer,
Refresh_Buffer **pBuffers
) {
NOT_IMPLEMENTED
}
static void TEMPLATE_BindComputeTextures(
Refresh_Renderer *driverData,
Refresh_CommandBuffer *commandBuffer,
Refresh_Texture **pTextures
) {
NOT_IMPLEMENTED
}
/* Window and Swapchain Management */
static uint8_t TEMPLATE_ClaimWindow(
Refresh_Renderer *driverData,
void *windowHandle,
Refresh_PresentMode presentMode
) {
NOT_IMPLEMENTED
}
static void TEMPLATE_UnclaimWindow(
Refresh_Renderer *driverData,
void *windowHandle
) {
NOT_IMPLEMENTED
}
static Refresh_Texture* TEMPLATE_AcquireSwapchainTexture(
Refresh_Renderer *driverData,
Refresh_CommandBuffer *commandBuffer,
void *windowHandle,
uint32_t *pWidth,
uint32_t *pHeight
) {
NOT_IMPLEMENTED
}
static Refresh_TextureFormat TEMPLATE_GetSwapchainFormat(
Refresh_Renderer *driverData,
void *windowHandle
) {
NOT_IMPLEMENTED
}
static void TEMPLATE_SetSwapchainPresentMode(
Refresh_Renderer *driverData,
void *windowHandle,
Refresh_PresentMode presentMode
) {
NOT_IMPLEMENTED
}
/* Submission and Fences */
static void TEMPLATE_Submit(
Refresh_Renderer *driverData,
Refresh_CommandBuffer *commandBuffer
) {
NOT_IMPLEMENTED
}
static Refresh_Fence* TEMPLATE_SubmitAndAcquireFence(
Refresh_Renderer *driverData,
Refresh_CommandBuffer *commandBuffer
) {
NOT_IMPLEMENTED
}
static void TEMPLATE_Wait(
Refresh_Renderer *driverData
) {
NOT_IMPLEMENTED
}
static void TEMPLATE_WaitForFences(
Refresh_Renderer *driverData,
uint8_t waitAll,
uint32_t fenceCount,
Refresh_Fence **pFences
) {
NOT_IMPLEMENTED
}
static int TEMPLATE_QueryFence(
Refresh_Renderer *driverData,
Refresh_Fence *fence
) {
NOT_IMPLEMENTED
}
static void TEMPLATE_ReleaseFence(
Refresh_Renderer *driverData,
Refresh_Fence *fence
) {
NOT_IMPLEMENTED
}
/* Device Creation */
static uint8_t TEMPLATE_PrepareDriver(
uint32_t *flags
) {
NOT_IMPLEMENTED
}
static Refresh_Device* TEMPLATE_CreateDevice(
uint8_t debugMode
) {
NOT_IMPLEMENTED
}
Refresh_Driver TEMPLATEDriver = {
"TEMPLATE",
TEMPLATE_PrepareDriver,
TEMPLATE_CreateDevice
};
#endif //REFRESH_DRIVER_TEMPLATE

File diff suppressed because it is too large Load Diff

View File

@ -89,9 +89,11 @@ VULKAN_DEVICE_FUNCTION(BaseVK, void, vkCmdClearDepthStencilImage, (VkCommandBuff
VULKAN_DEVICE_FUNCTION(BaseVK, void, vkCmdCopyBuffer, (VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer, uint32_t regionCount, const VkBufferCopy* pRegions)) VULKAN_DEVICE_FUNCTION(BaseVK, void, vkCmdCopyBuffer, (VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer, uint32_t regionCount, const VkBufferCopy* pRegions))
VULKAN_DEVICE_FUNCTION(BaseVK, void, vkCmdCopyBufferToImage, (VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount, const VkBufferImageCopy *pRegions)) VULKAN_DEVICE_FUNCTION(BaseVK, void, vkCmdCopyBufferToImage, (VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount, const VkBufferImageCopy *pRegions))
VULKAN_DEVICE_FUNCTION(BaseVK, void, vkCmdCopyImageToBuffer, (VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkBuffer dstBuffer, uint32_t regionCount, const VkBufferImageCopy *pRegions)) VULKAN_DEVICE_FUNCTION(BaseVK, void, vkCmdCopyImageToBuffer, (VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkBuffer dstBuffer, uint32_t regionCount, const VkBufferImageCopy *pRegions))
VULKAN_DEVICE_FUNCTION(BaseVK, void, vkCmdCopyImage, (VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageCopy* pRegions))
VULKAN_DEVICE_FUNCTION(BaseVK, void, vkCmdDispatch, (VkCommandBuffer commandBuffer, uint32_t groupCountX, uint32_t groupCountY, uint32_t groupCountZ)) VULKAN_DEVICE_FUNCTION(BaseVK, void, vkCmdDispatch, (VkCommandBuffer commandBuffer, uint32_t groupCountX, uint32_t groupCountY, uint32_t groupCountZ))
VULKAN_DEVICE_FUNCTION(BaseVK, void, vkCmdDraw, (VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex, uint32_t firstInstance)) VULKAN_DEVICE_FUNCTION(BaseVK, void, vkCmdDraw, (VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex, uint32_t firstInstance))
VULKAN_DEVICE_FUNCTION(BaseVK, void, vkCmdDrawIndexed, (VkCommandBuffer commandBuffer, uint32_t indexCount, uint32_t instanceCount, uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance)) VULKAN_DEVICE_FUNCTION(BaseVK, void, vkCmdDrawIndexed, (VkCommandBuffer commandBuffer, uint32_t indexCount, uint32_t instanceCount, uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance))
VULKAN_DEVICE_FUNCTION(BaseVK, void, vkCmdDrawIndirect, (VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t drawCount, uint32_t stride))
VULKAN_DEVICE_FUNCTION(BaseVK, void, vkCmdEndRenderPass, (VkCommandBuffer commandBuffer)) VULKAN_DEVICE_FUNCTION(BaseVK, void, vkCmdEndRenderPass, (VkCommandBuffer commandBuffer))
VULKAN_DEVICE_FUNCTION(BaseVK, void, vkCmdPipelineBarrier, (VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags, uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers, uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers, uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers)) VULKAN_DEVICE_FUNCTION(BaseVK, void, vkCmdPipelineBarrier, (VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags, uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers, uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers, uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers))
VULKAN_DEVICE_FUNCTION(BaseVK, void, vkCmdResolveImage, (VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageResolve *pRegions)) VULKAN_DEVICE_FUNCTION(BaseVK, void, vkCmdResolveImage, (VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageResolve *pRegions))

View File

@ -48,7 +48,6 @@
#define floorf SDL_floorf #define floorf SDL_floorf
#define ldexp SDL_scalbn #define ldexp SDL_scalbn
#define pow SDL_pow #define pow SDL_pow
#define strtol SDL_strtol
#ifdef memcmp #ifdef memcmp
#undef memcmp #undef memcmp
@ -74,13 +73,10 @@
#undef strlen #undef strlen
#endif #endif
#define strlen SDL_strlen #define strlen SDL_strlen
#ifdef strncmp
#undef strncmp
#endif
#define strncmp SDL_strncmp
/* These are per the Texture2D.FromStream spec */ /* These are per the Texture2D.FromStream spec */
#define STBI_ONLY_PNG #define STBI_ONLY_PNG
#define STBI_ONLY_QOI
/* These are per the Texture2D.SaveAs* spec */ /* These are per the Texture2D.SaveAs* spec */
#define STBIW_ONLY_PNG #define STBIW_ONLY_PNG
@ -140,6 +136,7 @@ SDL_SIMDRealloc(void *mem, const size_t len)
#endif #endif
#define STB_IMAGE_STATIC #define STB_IMAGE_STATIC
#define STBI_NO_HDR
#define STBI_ASSERT SDL_assert #define STBI_ASSERT SDL_assert
#define STBI_MALLOC SDL_SIMDAlloc #define STBI_MALLOC SDL_SIMDAlloc
#define STBI_REALLOC SDL_SIMDRealloc #define STBI_REALLOC SDL_SIMDRealloc
@ -190,28 +187,72 @@ static unsigned char* dgibson_stbi_zlib_compress(
/* Image Read API */ /* Image Read API */
uint8_t* Refresh_Image_Load( uint8_t* Refresh_Image_Load(
char const *filename, uint8_t *bufferPtr,
int32_t bufferLength,
int32_t *w, int32_t *w,
int32_t *h, int32_t *h,
int32_t *numChannels int32_t *len
) { ) {
return stbi_load(filename, w, h, numChannels, STBI_rgb_alpha); uint8_t* result;
uint8_t* pixels;
int32_t format;
int32_t i;
result = stbi_load_from_memory(
bufferPtr,
bufferLength,
w,
h,
&format,
STBI_rgb_alpha
);
if (result == NULL)
{
SDL_LogWarn(SDL_LOG_CATEGORY_ERROR, "Image loading failed: %s", stbi_failure_reason());
}
/* Ensure that the alpha pixels are... well, actual alpha.
* You think this looks stupid, but be assured: Your paint program is
* almost certainly even stupider.
* -flibit
*/
pixels = result;
*len = (*w) * (*h) *4;
for (i = 0; i < *len; i += 4, pixels += 4)
{
if (pixels[3] == 0)
{
pixels[0] = 0;
pixels[1] = 1;
pixels[2] = 2;
}
}
return result;
} }
void Refresh_Image_Free(uint8_t *mem) void Refresh_Image_Free(uint8_t *mem)
{ {
stbi_image_free(mem); SDL_SIMDFree(mem);
} }
/* Image Write API */ /* Image Write API */
void Refresh_Image_SavePNG( void Refresh_Image_SavePNG(
const char* filename, const char* filename,
uint8_t* data,
int32_t w, int32_t w,
int32_t h, int32_t h
uint8_t *data
) { ) {
stbi_write_png(filename, w, h, 4, data, w * 4); stbi_write_png(
filename,
w,
h,
4,
data,
w * 4
);
} }
/* vim: set noexpandtab shiftwidth=8 tabstop=8: */ /* vim: set noexpandtab shiftwidth=8 tabstop=8: */

File diff suppressed because it is too large Load Diff