├── .gitignore ├── MantleTest.sln ├── MantleTest.vcxproj ├── MantleTest.vcxproj.filters ├── README.md ├── include └── mantle.h ├── shaders ├── compile.bat ├── output2binary.py ├── ps.bin ├── ps.hlsl ├── vs.bin └── vs.hlsl └── src └── main.cpp /.gitignore: -------------------------------------------------------------------------------- 1 | ## Ignore Visual Studio temporary files, build results, and 2 | ## files generated by popular Visual Studio add-ons. 3 | 4 | # User-specific files 5 | *.suo 6 | *.user 7 | *.userosscache 8 | *.sln.docstates 9 | 10 | # User-specific files (MonoDevelop/Xamarin Studio) 11 | *.userprefs 12 | 13 | # Build results 14 | [Dd]ebug/ 15 | [Dd]ebugPublic/ 16 | [Rr]elease/ 17 | [Rr]eleases/ 18 | x64/ 19 | x86/ 20 | build/ 21 | bld/ 22 | [Bb]in/ 23 | [Oo]bj/ 24 | 25 | # Visual Studo 2015 cache/options directory 26 | .vs/ 27 | 28 | # MSTest test Results 29 | [Tt]est[Rr]esult*/ 30 | [Bb]uild[Ll]og.* 31 | 32 | # NUNIT 33 | *.VisualState.xml 34 | TestResult.xml 35 | 36 | # Build Results of an ATL Project 37 | [Dd]ebugPS/ 38 | [Rr]eleasePS/ 39 | dlldata.c 40 | 41 | *_i.c 42 | *_p.c 43 | *_i.h 44 | *.ilk 45 | *.meta 46 | *.obj 47 | *.pch 48 | *.pdb 49 | *.pgc 50 | *.pgd 51 | *.rsp 52 | *.sbr 53 | *.tlb 54 | *.tli 55 | *.tlh 56 | *.tmp 57 | *.tmp_proj 58 | *.log 59 | *.vspscc 60 | *.vssscc 61 | .builds 62 | *.pidb 63 | *.svclog 64 | *.scc 65 | 66 | # Chutzpah Test files 67 | _Chutzpah* 68 | 69 | # Visual C++ cache files 70 | ipch/ 71 | *.aps 72 | *.ncb 73 | *.opensdf 74 | *.sdf 75 | *.cachefile 76 | 77 | # Visual Studio profiler 78 | *.psess 79 | *.vsp 80 | *.vspx 81 | 82 | # TFS 2012 Local Workspace 83 | $tf/ 84 | 85 | # Guidance Automation Toolkit 86 | *.gpState 87 | 88 | # ReSharper is a .NET coding add-in 89 | _ReSharper*/ 90 | *.[Rr]e[Ss]harper 91 | *.DotSettings.user 92 | 93 | # JustCode is a .NET coding addin-in 94 | .JustCode 95 | 96 | # TeamCity is a build add-in 97 | _TeamCity* 98 | 99 | # DotCover is a Code Coverage Tool 100 | *.dotCover 101 | 102 | # NCrunch 103 | _NCrunch_* 104 | .*crunch*.local.xml 105 | 106 | # MightyMoose 107 | *.mm.* 108 | AutoTest.Net/ 109 | 110 | # Web workbench (sass) 111 | .sass-cache/ 112 | 113 | # Installshield output folder 114 | [Ee]xpress/ 115 | 116 | # DocProject is a documentation generator add-in 117 | DocProject/buildhelp/ 118 | DocProject/Help/*.HxT 119 | DocProject/Help/*.HxC 120 | DocProject/Help/*.hhc 121 | DocProject/Help/*.hhk 122 | DocProject/Help/*.hhp 123 | DocProject/Help/Html2 124 | DocProject/Help/html 125 | 126 | # Click-Once directory 127 | publish/ 128 | 129 | # Publish Web Output 130 | *.[Pp]ublish.xml 131 | *.azurePubxml 132 | # TODO: Comment the next line if you want to checkin your web deploy settings 133 | # but database connection strings (with potential passwords) will be unencrypted 134 | *.pubxml 135 | *.publishproj 136 | 137 | # NuGet Packages 138 | *.nupkg 139 | # The packages folder can be ignored because of Package Restore 140 | **/packages/* 141 | # except build/, which is used as an MSBuild target. 142 | !**/packages/build/ 143 | # Uncomment if necessary however generally it will be regenerated when needed 144 | #!**/packages/repositories.config 145 | 146 | # Windows Azure Build Output 147 | csx/ 148 | *.build.csdef 149 | 150 | # Windows Store app package directory 151 | AppPackages/ 152 | 153 | # Others 154 | *.[Cc]ache 155 | ClientBin/ 156 | [Ss]tyle[Cc]op.* 157 | ~$* 158 | *~ 159 | *.dbmdl 160 | *.dbproj.schemaview 161 | *.pfx 162 | *.publishsettings 163 | node_modules/ 164 | bower_components/ 165 | 166 | # RIA/Silverlight projects 167 | Generated_Code/ 168 | 169 | # Backup & report files from converting an old project file 170 | # to a newer Visual Studio version. Backup files are not needed, 171 | # because we have git ;-) 172 | _UpgradeReport_Files/ 173 | Backup*/ 174 | UpgradeLog*.XML 175 | UpgradeLog*.htm 176 | 177 | # SQL Server files 178 | *.mdf 179 | *.ldf 180 | 181 | # Business Intelligence projects 182 | *.rdl.data 183 | *.bim.layout 184 | *.bim_*.settings 185 | 186 | # Microsoft Fakes 187 | FakesAssemblies/ 188 | 189 | # Node.js Tools for Visual Studio 190 | .ntvs_analysis.dat 191 | 192 | # Visual Studio 6 build log 193 | *.plg 194 | 195 | # Visual Studio 6 workspace options file 196 | *.opt 197 | -------------------------------------------------------------------------------- /MantleTest.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio Express 2013 for Windows Desktop 4 | VisualStudioVersion = 12.0.31101.0 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "MantleTest", "MantleTest.vcxproj", "{BFE5E052-6504-49C1-A7B6-3500EE1DD0F3}" 7 | EndProject 8 | Global 9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 10 | Debug|x64 = Debug|x64 11 | Release|x64 = Release|x64 12 | EndGlobalSection 13 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 14 | {BFE5E052-6504-49C1-A7B6-3500EE1DD0F3}.Debug|x64.ActiveCfg = Debug|x64 15 | {BFE5E052-6504-49C1-A7B6-3500EE1DD0F3}.Debug|x64.Build.0 = Debug|x64 16 | {BFE5E052-6504-49C1-A7B6-3500EE1DD0F3}.Release|x64.ActiveCfg = Release|x64 17 | {BFE5E052-6504-49C1-A7B6-3500EE1DD0F3}.Release|x64.Build.0 = Release|x64 18 | EndGlobalSection 19 | GlobalSection(SolutionProperties) = preSolution 20 | HideSolutionNode = FALSE 21 | EndGlobalSection 22 | EndGlobal 23 | -------------------------------------------------------------------------------- /MantleTest.vcxproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Debug 6 | Win32 7 | 8 | 9 | Debug 10 | x64 11 | 12 | 13 | Release 14 | Win32 15 | 16 | 17 | Release 18 | x64 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | {BFE5E052-6504-49C1-A7B6-3500EE1DD0F3} 29 | Win32Proj 30 | MantleTest 31 | 32 | 33 | 34 | Application 35 | true 36 | v120 37 | Unicode 38 | 39 | 40 | Application 41 | true 42 | v120 43 | Unicode 44 | 45 | 46 | Application 47 | false 48 | v120 49 | true 50 | Unicode 51 | 52 | 53 | Application 54 | false 55 | v120 56 | true 57 | Unicode 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | true 77 | 78 | 79 | true 80 | 81 | 82 | false 83 | 84 | 85 | false 86 | 87 | 88 | 89 | 90 | 91 | Level3 92 | Disabled 93 | WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) 94 | true 95 | 96 | 97 | Console 98 | true 99 | 100 | 101 | 102 | 103 | 104 | 105 | Level3 106 | Disabled 107 | WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) 108 | true 109 | $(SolutionDir)include;$(VisualStudioDir)\Libraries\SDL2-2.0.3\include;%(AdditionalIncludeDirectories) 110 | 111 | 112 | Console 113 | true 114 | $(VisualStudioDir)\Libraries\SDL2-2.0.3\lib\x64;%(AdditionalLibraryDirectories) 115 | SDL2.lib;SDL2main.lib;%(AdditionalDependencies) 116 | 117 | 118 | 119 | 120 | Level3 121 | 122 | 123 | MaxSpeed 124 | true 125 | true 126 | WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) 127 | true 128 | 129 | 130 | Console 131 | true 132 | true 133 | true 134 | 135 | 136 | 137 | 138 | Level3 139 | 140 | 141 | MaxSpeed 142 | true 143 | true 144 | WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) 145 | true 146 | $(SolutionDir)include;$(VisualStudioDir)\Libraries\SDL2-2.0.3\include;%(AdditionalIncludeDirectories) 147 | 148 | 149 | Console 150 | true 151 | true 152 | true 153 | $(VisualStudioDir)\Libraries\SDL2-2.0.3\lib\x64;%(AdditionalLibraryDirectories) 154 | SDL2.lib;SDL2main.lib;%(AdditionalDependencies) 155 | 156 | 157 | 158 | 159 | 160 | -------------------------------------------------------------------------------- /MantleTest.vcxproj.filters: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | {4FC737F1-C7A5-4376-A066-2A32D752A2FF} 6 | cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx 7 | 8 | 9 | {93995380-89BD-4b04-88EB-625FBE52EBFB} 10 | h;hh;hpp;hxx;hm;inl;inc;xsd 11 | 12 | 13 | {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} 14 | rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms 15 | 16 | 17 | 18 | 19 | Header Files 20 | 21 | 22 | 23 | 24 | Source Files 25 | 26 | 27 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Introduction 2 | ------------ 3 | 4 | This is an effort to implement Hello Triangle using the Mantle API by using the 5 | API reference and reverse engineering public Mantle demos. 6 | 7 | See this blog post for more information: 8 | 9 | https://medium.com/@Overv/implementing-hello-triangle-in-mantle-4302450fbcd2 10 | 11 | Approach 12 | -------- 13 | 14 | The [reference](http://www.amd.com/Documents/Mantle-Programming-Guide-and-API-Reference.pdf) 15 | is used as primary resource, because it contains a full API reference and some 16 | sample code. Unfortunately it misses a lot of the constant definitions, like 17 | `GR_API_VERSION`, but these can be determined by creating a proxy mantle64.dll 18 | that logs calls and the contents of structs. This approach is currently used 19 | on the [Star Swarm Stress Test](http://store.steampowered.com/app/267130/) to 20 | figure out what calls and data are needed to render a triangle on the screen. 21 | Other values, like `GR_MAX_HEAPS` can be figured out by querying for the struct 22 | size with functions like `grGetObjectInfo`. 23 | 24 | The intermediate language used for Mantle shaders is a subset of AMD IL, for 25 | which CodeXL contains [a compiler](http://developer.amd.com/community/blog/2014/05/16/codexl-game-developers-analyze-hlsl-gcn/). 26 | The disassembly it outputs is incorrect, but the bytecode itself is valid. 27 | Mantle appears to accept this code without problems. 28 | 29 | Status 30 | ------ 31 | 32 | The code is capable of creating a window using the SDL library, clearing it to 33 | black and rendering a per-vertex colored triangle using Mantle. 34 | 35 | ![Preview of running program](http://i.imgur.com/r5PxoRv.png) 36 | 37 | The vertex shader reads the position (`float4`) and color (`float4`) from a 38 | buffer using the `SV_VertexID` built-in variable. Each buffer is assigned a 39 | memory view into GPU memory filled with the following data: 40 | 41 | float vertices[] = { 42 | // Positions 43 | 0.0, 0.5, 0.0, 1.0, 44 | 0.5, -0.5, 0.0, 1.0, 45 | -0.5, -0.5, 0.0, 1.0, 46 | 47 | // Colors 48 | 1.0, 0.0, 0.0, 1.0, 49 | 0.0, 1.0, 0.0, 1.0, 50 | 0.0, 0.0, 1.0, 1.0 51 | }; 52 | 53 | Shader compilation 54 | ------------------ 55 | 56 | Shaders are written in HLSL and compiled to AMD Intermediate Language using 57 | the `CodeXLAnalyzer.exe` tool included in CodeXL using the `--il` flag. A batch 58 | script for doing this is included in the `shaders` folder. The hex code on the 59 | right side can then be converted to a binary file using the `output2binary.py` 60 | script, which takes the IL output file name as parameter. The binaries can then 61 | be loaded into Mantle using `grCreateShader`, as is demonstrated in the code. 62 | 63 | License 64 | ------- 65 | 66 | Copyright (c) 2015 Alexander Overvoorde 67 | 68 | Permission is hereby granted, free of charge, to any person obtaining a copy 69 | of this software and associated documentation files (the "Software"), to 70 | deal in the Software without restriction, including without limitation the 71 | rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 72 | sell copies of the Software, and to permit persons to whom the Software is 73 | furnished to do so, subject to the following conditions: 74 | 75 | The above copyright notice and this permission notice shall be included in 76 | all copies or substantial portions of the Software. 77 | 78 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 79 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 80 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 81 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 82 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 83 | FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 84 | IN THE SOFTWARE. 85 | -------------------------------------------------------------------------------- /include/mantle.h: -------------------------------------------------------------------------------- 1 | #ifndef MANTLE_H 2 | #define MANTLE_H 3 | 4 | #define WIN32_LEAN_AND_MEAN 5 | 6 | #include 7 | #include 8 | #include 9 | 10 | /* 11 | Types and constants 12 | */ 13 | 14 | typedef char GR_CHAR; 15 | typedef int32_t GR_INT; 16 | typedef uint32_t GR_UINT; 17 | typedef uint8_t GR_UINT8; 18 | typedef uint32_t GR_UINT32; 19 | typedef uint64_t GR_UINT64; 20 | typedef float GR_FLOAT; 21 | typedef int32_t GR_BOOL; 22 | typedef void GR_VOID; 23 | 24 | typedef size_t GR_SIZE; 25 | typedef uint64_t GR_GPU_SIZE; 26 | 27 | typedef uint32_t GR_ENUM; 28 | typedef uint32_t GR_FLAGS; 29 | typedef uint32_t GR_SAMPLE_MASK; 30 | 31 | typedef void* GR_PHYSICAL_GPU; 32 | typedef void* GR_DEVICE; 33 | typedef void* GR_WSI_WIN_DISPLAY; 34 | typedef void* GR_QUEUE; 35 | typedef void* GR_IMAGE; 36 | typedef void* GR_GPU_MEMORY; 37 | typedef void* GR_CMD_BUFFER; 38 | typedef void* GR_FENCE; 39 | typedef void* GR_BASE_OBJECT; 40 | typedef void* GR_VIEWPORT_STATE_OBJECT; 41 | typedef void* GR_COLOR_TARGET_VIEW; 42 | typedef void* GR_DESCRIPTOR_SET; 43 | typedef void* GR_OBJECT; 44 | typedef void* GR_MSAA_STATE_OBJECT; 45 | typedef void* GR_SAMPLER; 46 | typedef void* GR_COLOR_BLEND_STATE_OBJECT; 47 | typedef void* GR_DEPTH_STENCIL_STATE_OBJECT; 48 | typedef void* GR_RASTER_STATE_OBJECT; 49 | typedef void* GR_SHADER; 50 | typedef void* GR_PIPELINE; 51 | typedef void* GR_IMAGE_VIEW; 52 | typedef void* GR_DEPTH_STENCIL_VIEW; 53 | typedef void* GR_STATE_OBJECT; 54 | 55 | #define GR_NULL_HANDLE NULL 56 | 57 | const int GR_MAX_PHYSICAL_GPUS = 16; 58 | const int GR_API_VERSION = 1; 59 | const int GR_MAX_PHYSICAL_GPU_NAME = 256; 60 | const int GR_MAX_VIEWPORTS = 16; 61 | const int GR_MAX_MEMORY_HEAPS = 8; 62 | const int GR_MAX_COLOR_TARGETS = 8; 63 | const int GR_MAX_DESCRIPTOR_SETS = 2; 64 | 65 | const GR_BOOL GR_TRUE = 1; 66 | const GR_BOOL GR_FALSE = 0; 67 | 68 | #define GR_STDCALL __stdcall 69 | 70 | typedef enum _GR_RESULT { 71 | GR_SUCCESS = 0x10000, 72 | GR_UNSUPPORTED, 73 | GR_NOT_READY, 74 | GR_TIMEOUT, 75 | GR_EVENT_SET, 76 | GR_EVENT_RESET, 77 | 78 | GR_ERROR_UNKNOW = 0x11000, 79 | GR_ERROR_UNAVAILABLE, 80 | GR_ERROR_INITIALIZATION_FAILED, 81 | GR_ERROR_OUT_OF_MEMORY, 82 | GR_ERROR_OUT_OF_GPU_MEMORY, 83 | GR_ERROR_DEVICE_ALREADY_CREATED, 84 | GR_ERROR_DEVICE_LOST, 85 | GR_ERROR_INVALID_POINTER, 86 | GR_ERROR_INVALID_VALUE, 87 | GR_ERROR_INVALID_HANDLE, 88 | GR_ERROR_INVALID_ORDINAL, 89 | GR_ERROR_INVALID_MEMORY_SIZE, 90 | GR_ERROR_INVALID_EXTENSION, 91 | GR_ERROR_INVALID_FLAGS, 92 | GR_ERROR_INVALID_ALIGNMENT, 93 | GR_ERROR_INVALID_FORMAT, 94 | GR_ERROR_INVALID_IMAGE, 95 | GR_ERROR_INVALID_DESCRIPTOR_SET_DATA, 96 | GR_ERROR_INVALID_QUEUE_TYPE, 97 | GR_ERROR_INVALID_OBJECT_TYPE, 98 | GR_ERROR_UNSUPPORTED_SHADER_IL_VERSION, 99 | GR_ERROR_BAD_SHADER_CODE, 100 | GR_ERROR_BAD_PIPELINE_DATA, 101 | GR_ERROR_TOO_MANY_MEMORY_REFERENCES, 102 | GR_ERROR_NOT_MAPPABLE, 103 | GR_ERROR_MEMORY_MAP_FAILED, 104 | GR_ERROR_MEMORY_UNMAP_FAILED, 105 | GR_ERROR_INCOMPATIBLE_DEVICE, 106 | GR_ERROR_INCOMPATIBLE_DRIVER, 107 | GR_ERROR_INCOMPLETE_COMMAND_BUFFER, 108 | GR_ERROR_BUILDING_COMMAND_BUFFER, 109 | GR_ERROR_MEMORY_NOT_BOUND, 110 | GR_ERROR_INCOMPATIBLE_QUEUE, 111 | GR_ERROR_NOT_SHAREABLE 112 | } GR_RESULT; 113 | 114 | typedef enum _GR_INFO_TYPE { 115 | GR_INFO_TYPE_PHYSICAL_GPU_PROPERTIES = 0x6100, 116 | GR_INFO_TYPE_PHYSICAL_GPU_PERFORMANCE, 117 | GR_INFO_TYPE_PHYSICAL_GPU_QUEUE_PROPERTIES, 118 | GR_INFO_TYPE_PHYSICAL_GPU_MEMORY_PROPERTIES, 119 | GR_INFO_TYPE_PHYSICAL_GPU_IMAGE_PROPERTIES, 120 | GR_INFO_TYPE_MEMORY_HEAP_PROPERTIES = 0x6200, 121 | GR_INFO_TYPE_FORMAT_PROPERTIES = 0x6300, 122 | GR_INFO_TYPE_SUBRESOURCE_LAYOUT = 0x6400, 123 | GR_INFO_TYPE_MEMORY_REQUIREMENTS = 0x6800, 124 | GR_INFO_TYPE_PARENT_DEVICE, 125 | GR_INFO_TYPE_PARENT_PHYSICAL_GPU, 126 | } GR_INFO_TYPE; 127 | 128 | typedef enum _GR_PHYSICAL_GPU_TYPE { 129 | GR_GPU_TYPE_OTHER = 0x3000, 130 | GR_GPU_TYPE_INTEGRATED, 131 | GR_GPU_TYPE_DISCRETE, 132 | GR_GPU_TYPE_VIRTUAL, 133 | } GR_PHYSICAL_GPU_TYPE; 134 | 135 | typedef enum _GR_QUEUE_TYPE { 136 | GR_QUEUE_UNIVERSAL = 0x1000, 137 | GR_QUEUE_COMPUTE, 138 | GR_EXT_QUEUE_DMA = 0x00300200, 139 | GR_EXT_QUEUE_TIMER 140 | } GR_QUEUE_TYPE; 141 | 142 | typedef enum _GR_VALIDATION_LEVEL { 143 | GR_VALIDATION_LEVEL_0 = 0x8000, 144 | GR_VALIDATION_LEVEL_1, 145 | GR_VALIDATION_LEVEL_2, 146 | GR_VALIDATION_LEVEL_3, 147 | GR_VALIDATION_LEVEL_4, 148 | } GR_VALIDATION_LEVEL; 149 | 150 | typedef enum _GR_DEVICE_CREATE_FLAGS { 151 | GR_DEVICE_CREATE_VALIDATION = 0x00000001, 152 | } GR_DEVICE_CREATE_FLAGS; 153 | 154 | typedef enum _GR_CHANNEL_FORMAT { 155 | GR_CH_FMT_UNDEFINED, 156 | GR_CH_FMT_R4G4, 157 | GR_CH_FMT_R4G4B4A4, 158 | GR_CH_FMT_R5G6B5, 159 | GR_CH_FMT_B5G6R5, 160 | GR_CH_FMT_R5G5B5A1, 161 | GR_CH_FMT_R8, 162 | GR_CH_FMT_R8G8, 163 | GR_CH_FMT_R8G8B8A8, 164 | GR_CH_FMT_B8G8R8A8, 165 | GR_CH_FMT_R10G11B11, 166 | GR_CH_FMT_R11G11B10, 167 | GR_CH_FMT_R10G10B10A2, 168 | GR_CH_FMT_R16, 169 | GR_CH_FMT_R16G16, 170 | GR_CH_FMT_R16G16B16A16, 171 | GR_CH_FMT_R32, 172 | GR_CH_FMT_R32G32, 173 | GR_CH_FMT_R32G32B32, 174 | GR_CH_FMT_R32G32B32A32, 175 | GR_CH_FMT_R16G8, 176 | GR_CH_FMT_R32G8, 177 | GR_CH_FMT_R9G9B9E5, 178 | GR_CH_FMT_BC1, 179 | GR_CH_FMT_BC2, 180 | GR_CH_FMT_BC3, 181 | GR_CH_FMT_BC4, 182 | GR_CH_FMT_BC5, 183 | GR_CH_FMT_BC6U, 184 | GR_CH_FMT_BC6S, 185 | GR_CH_FMT_BC7 186 | } GR_CHANNEL_FORMAT; 187 | 188 | typedef enum _GR_NUM_FORMAT { 189 | GR_NUM_FMT_UNDEFINED, 190 | GR_NUM_FMT_UNORM, 191 | GR_NUM_FMT_SNORM, 192 | GR_NUM_FMT_UINT, 193 | GR_NUM_FMT_SINT, 194 | GR_NUM_FMT_FLOAT, 195 | GR_NUM_FMT_SRGB, 196 | GR_NUM_FMT_DS 197 | } GR_NUM_FORMAT; 198 | 199 | typedef enum _GR_IMAGE_USAGE_FLAGS { 200 | GR_IMAGE_USAGE_SHADER_ACCESS_READ = 0x00000001, 201 | GR_IMAGE_USAGE_SHADER_ACCESS_WRITE = 0x00000002, 202 | GR_IMAGE_USAGE_COLOR_TARGET = 0x00000004, 203 | GR_IMAGE_USAGE_DEPTH_STENCIL = 0x00000008, 204 | } GR_IMAGE_USAGE_FLAGS; 205 | 206 | typedef enum _GR_WSI_WIN_IMAGE_CREATE_FLAGS { 207 | GR_WSI_WIN_IMAGE_CREATE_FULLSCREEN_PRESENT = 0x00000001, 208 | GR_WSI_WIN_IMAGE_CREATE_STEREO = 0x00000002, 209 | } GR_WSI_WIN_IMAGE_CREATE_FLAGS; 210 | 211 | typedef enum _GR_CMD_BUFFER_BUILD_FLAGS { 212 | GR_CMD_BUFFER_OPTIMIZE_GPU_SMALL_BATCH = 0x00000001, 213 | GR_CMD_BUFFER_OPTIMIZE_PIPELINE_SWITCH = 0x00000002, 214 | GR_CMD_BUFFER_OPTIMIZE_ONE_TIME_SUBMIT = 0x00000004, 215 | GR_CMD_BUFFER_OPTIMIZE_DESCRIPTOR_SET_SWITCH = 0x00000008, 216 | } GR_CMD_BUFFER_BUILD_FLAGS; 217 | 218 | typedef enum _GR_IMAGE_STATE { 219 | GR_IMAGE_STATE_DATA_TRANSFER = 0x1300, 220 | GR_IMAGE_STATE_GRAPHICS_SHADER_READ_ONLY = 0x1301, 221 | GR_IMAGE_STATE_GRAPHICS_SHADER_WRITE_ONLY = 0x1302, 222 | GR_IMAGE_STATE_GRAPHICS_SHADER_READ_WRITE = 0x1303, 223 | GR_IMAGE_STATE_COMPUTE_SHADER_READ_ONLY = 0x1304, 224 | GR_IMAGE_STATE_COMPUTE_SHADER_WRITE_ONLY = 0x1305, 225 | GR_IMAGE_STATE_COMPUTE_SHADER_READ_WRITE = 0x1306, 226 | GR_IMAGE_STATE_MULTI_SHADER_READ_ONLY = 0x1307, 227 | GR_IMAGE_STATE_TARGET_AND_SHADER_READ_ONLY = 0x1308, 228 | GR_IMAGE_STATE_UNINITIALIZED = 0x1309, 229 | GR_IMAGE_STATE_TARGET_RENDER_ACCESS_OPTIMAL = 0x130a, 230 | GR_IMAGE_STATE_TARGET_SHADER_ACCESS_OPTIMAL = 0x130b, 231 | GR_IMAGE_STATE_CLEAR = 0x130c, 232 | GR_IMAGE_STATE_RESOLVE_SOURCE = 0x130d, 233 | GR_IMAGE_STATE_RESOLVE_DESTINATION = 0x130e, 234 | GR_IMAGE_STATE_DISCARD = 0x131f, 235 | GR_IMAGE_STATE_DATA_TRANSFER_SOURCE = 0x1310, 236 | GR_IMAGE_STATE_DATA_TRANSFER_DESTINATION = 0x1311, 237 | } GR_IMAGE_STATE; 238 | 239 | typedef enum _GR_WSI_WIN_IMAGE_STATE { 240 | GR_WSI_WIN_IMAGE_STATE_PRESENT_WINDOWED = 0x00200000, 241 | GR_WSI_WIN_IMAGE_STATE_PRESENT_FULLSCREEN = 0x00200001, 242 | } GR_WSI_WIN_IMAGE_STATE; 243 | 244 | typedef enum _GR_IMAGE_ASPECT { 245 | GR_IMAGE_ASPECT_COLOR = 0x1700, 246 | GR_IMAGE_ASPECT_DEPTH = 0x1701, 247 | GR_IMAGE_ASPECT_STENCIL = 0x1702, 248 | } GR_IMAGE_ASPECT; 249 | 250 | typedef enum _GR_WSI_WIN_PRESENT_MODE { 251 | GR_WSI_WIN_PRESENT_MODE_WINDOWED = 0x00200200, 252 | GR_WSI_WIN_PRESENT_MODE_FULLSCREEN = 0x00200201, 253 | } GR_WSI_WIN_PRESENT_MODE; 254 | 255 | typedef enum _GR_WSI_WIN_PRESENT_FLAGS { 256 | GR_WSI_WIN_PRESENT_FULLSCREEN_DONOTWAIT = 0x00000001, 257 | GR_WSI_WIN_PRESENT_FULLSCREEN_STEREO = 0x00000002, 258 | } GR_WSI_WIN_PRESENT_FLAGS; 259 | 260 | typedef enum _GR_MEMORY_PRIORITY { 261 | GR_MEMORY_PRIORITY_NORMAL = 0x1100, 262 | GR_MEMORY_PRIORITY_HIGH = 0x1101, 263 | GR_MEMORY_PRIORITY_LOW = 0x1102, 264 | GR_MEMORY_PRIORITY_UNUSED = 0x1103, 265 | GR_MEMORY_PRIORITY_VERY_HIGH = 0x1104, 266 | GR_MEMORY_PRIORITY_VERY_LOW = 0x1105, 267 | } GR_MEMORY_PRIORITY; 268 | 269 | typedef enum _GR_COMPARE_FUNC { 270 | GR_COMPARE_NEVER = 0x2500, 271 | GR_COMPARE_LESS = 0x2501, 272 | GR_COMPARE_EQUAL = 0x2502, 273 | GR_COMPARE_LESS_EQUAL = 0x2503, 274 | GR_COMPARE_GREATER = 0x2504, 275 | GR_COMPARE_NOT_EQUAL = 0x2505, 276 | GR_COMPARE_GREATER_EQUAL = 0x2506, 277 | GR_COMPARE_ALWAYS = 0x2507, 278 | } GR_COMPARE_FUNC; 279 | 280 | typedef enum _GR_FILL_MODE { 281 | GR_FILL_SOLID = 0x2600, 282 | GR_FILL_WIREFRAME = 0x2601, 283 | } GR_FILL_MODE; 284 | 285 | typedef enum _GR_CULL_MODE { 286 | GR_CULL_NONE = 0x2700, 287 | GR_CULL_FRONT = 0x2701, 288 | GR_CULL_BACK = 0x2702, 289 | } GR_CULL_MODE; 290 | 291 | typedef enum _GR_FACE_ORIENTATION { 292 | GR_FRONT_FACE_CCW = 0x2800, 293 | GR_FRONT_FACE_CW = 0x2801, 294 | } GR_FACE_ORIENTATION; 295 | 296 | typedef enum _GR_DESCRIPTOR_SET_SLOT_TYPE { 297 | GR_SLOT_UNUSED = 0x1900, 298 | GR_SLOT_SHADER_RESOURCE, 299 | GR_SLOT_SHADER_UAV, 300 | GR_SLOT_SHADER_SAMPLER, 301 | GR_SLOT_NEXT_DESCRIPTOR_SET, 302 | } GR_DESCRIPTOR_SET_SLOT_TYPE; 303 | 304 | typedef enum _GR_STATE_BIND_POINT { 305 | GR_STATE_BIND_VIEWPORT = 0x1f00, 306 | GR_STATE_BIND_RASTER = 0x1f01, 307 | GR_STATE_BIND_DEPTH_STENCIL = 0x1f02, 308 | GR_STATE_BIND_COLOR_BLEND = 0x1f03, 309 | GR_STATE_BIND_MSAA = 0x1f04, 310 | } GR_STATE_BIND_POINT; 311 | 312 | typedef enum _GR_BLEND { 313 | GR_BLEND_ZERO = 0x2900, 314 | GR_BLEND_ONE = 0x2901, 315 | GR_BLEND_SRC_COLOR = 0x2902, 316 | GR_BLEND_ONE_MINUS_SRC_COLOR = 0x2903, 317 | GR_BLEND_DEST_COLOR = 0x2904, 318 | GR_BLEND_ONE_MINUS_DEST_COLOR = 0x2905, 319 | GR_BLEND_SRC_ALPHA = 0x2906, 320 | GR_BLEND_ONE_MINUS_SRC_ALPHA = 0x2907, 321 | GR_BLEND_DEST_ALPHA = 0x2908, 322 | GR_BLEND_ONE_MINUS_DEST_ALPHA = 0x2909, 323 | GR_BLEND_CONSTANT_COLOR = 0x290a, 324 | GR_BLEND_ONE_MINUS_CONSTANT_COLOR = 0x290b, 325 | GR_BLEND_CONSTANT_ALPHA = 0x290c, 326 | GR_BLEND_ONE_MINUS_CONSTANT_ALPHA = 0x290d, 327 | GR_BLEND_SRC_ALPHA_SATURATE = 0x290e, 328 | GR_BLEND_SRC1_COLOR = 0x290f, 329 | GR_BLEND_ONE_MINUS_SRC1_COLOR = 0x2910, 330 | GR_BLEND_SRC1_ALPHA = 0x2911, 331 | GR_BLEND_ONE_MINUS_SRC1_ALPHA = 0x2912, 332 | } GR_BLEND; 333 | 334 | typedef enum _GR_BLEND_FUNC { 335 | GR_BLEND_FUNC_ADD = 0x2a00, 336 | GR_BLEND_FUNC_SUBTRACT = 0x2a01, 337 | GR_BLEND_FUNC_REVERSE_SUBTRACT = 0x2a02, 338 | GR_BLEND_FUNC_MIN = 0x2a03, 339 | GR_BLEND_FUNC_MAX = 0x2a04, 340 | } GR_BLEND_FUNC; 341 | 342 | typedef enum _GR_STENCIL_OP { 343 | GR_STENCIL_OP_KEEP = 0x2b00, 344 | GR_STENCIL_OP_ZERO = 0x2b01, 345 | GR_STENCIL_OP_REPLACE = 0x2b02, 346 | GR_STENCIL_OP_INC_CLAMP = 0x2b03, 347 | GR_STENCIL_OP_DEC_CLAMP = 0x2b04, 348 | GR_STENCIL_OP_INVERT = 0x2b05, 349 | GR_STENCIL_OP_INC_WRAP = 0x2b06, 350 | GR_STENCIL_OP_DEC_WRAP = 0x2b07, 351 | } GR_STENCIL_OP; 352 | 353 | typedef enum _GR_INDEX_TYPE { 354 | GR_INDEX_16 = 0x2100, 355 | GR_INDEX_32 = 0x2101, 356 | } GR_INDEX_TYPE; 357 | 358 | typedef enum _GR_PIPELINE_BIND_POINT { 359 | GR_PIPELINE_BIND_POINT_COMPUTE = 0x1e00, 360 | GR_PIPELINE_BIND_POINT_GRAPHICS = 0x1e01, 361 | } GR_PIPELINE_BIND_POINT; 362 | 363 | typedef enum _GR_PRIMITIVE_TOPOLOGY { 364 | GR_TOPOLOGY_POINT_LIST = 0x2000, 365 | GR_TOPOLOGY_LINE_LIST = 0x2001, 366 | GR_TOPOLOGY_LINE_STRIP = 0x2002, 367 | GR_TOPOLOGY_TRIANGLE_LIST = 0x2003, 368 | GR_TOPOLOGY_TRIANGLE_STRIP = 0x2004, 369 | GR_TOPOLOGY_RECT_LIST = 0x2005, 370 | GR_TOPOLOGY_QUAD_LIST = 0x2006, 371 | GR_TOPOLOGY_QUAD_STRIP = 0x2007, 372 | GR_TOPOLOGY_LINE_LIST_ADJ = 0x2008, 373 | GR_TOPOLOGY_LINE_STRIP_ADJ = 0x2009, 374 | GR_TOPOLOGY_TRIANGLE_LIST_ADJ = 0x200a, 375 | GR_TOPOLOGY_TRIANGLE_STRIP_ADJ = 0x200b, 376 | GR_TOPOLOGY_PATCH = 0x200c, 377 | } GR_PRIMITIVE_TOPOLOGY; 378 | 379 | typedef enum _GR_LOGIC_OP { 380 | GR_LOGIC_OP_COPY = 0x2c00, 381 | GR_LOGIC_OP_CLEAR = 0x2c01, 382 | GR_LOGIC_OP_AND = 0x2c02, 383 | GR_LOGIC_OP_AND_REVERSE = 0x2c03, 384 | GR_LOGIC_OP_AND_INVERTED = 0x2c04, 385 | GR_LOGIC_OP_NOOP = 0x2c05, 386 | GR_LOGIC_OP_XOR = 0x2c06, 387 | GR_LOGIC_OP_OR = 0x2c07, 388 | GR_LOGIC_OP_NOR = 0x2c08, 389 | GR_LOGIC_OP_EQUIV = 0x2c09, 390 | GR_LOGIC_OP_INVERT = 0x2c0a, 391 | GR_LOGIC_OP_OR_REVERSE = 0x2c0b, 392 | GR_LOGIC_OP_COPY_INVERTED = 0x2c0c, 393 | GR_LOGIC_OP_OR_INVERTED = 0x2c0d, 394 | GR_LOGIC_OP_NAND = 0x2c0e, 395 | GR_LOGIC_OP_SET = 0x2c0f, 396 | } GR_LOGIC_OP; 397 | 398 | typedef enum _GR_SHADER_CREATE_FLAGS { 399 | GR_SHADER_CREATE_ALLOW_RE_Z = 0x00000001, 400 | } GR_SHADER_CREATE_FLAGS; 401 | 402 | typedef enum _GR_MEMORY_STATE { 403 | GR_MEMORY_STATE_DATA_TRANSFER = 0x1200, 404 | GR_MEMORY_STATE_GRAPHICS_SHADER_READ_ONLY = 0x1201, 405 | GR_MEMORY_STATE_GRAPHICS_SHADER_WRITE_ONLY = 0x1202, 406 | GR_MEMORY_STATE_GRAPHICS_SHADER_READ_WRITE = 0x1203, 407 | GR_MEMORY_STATE_COMPUTE_SHADER_READ_ONLY = 0x1204, 408 | GR_MEMORY_STATE_COMPUTE_SHADER_WRITE_ONLY = 0x1205, 409 | GR_MEMORY_STATE_COMPUTE_SHADER_READ_WRITE = 0x1206, 410 | GR_MEMORY_STATE_MULTI_USE_READ_ONLY = 0x1207, 411 | GR_MEMORY_STATE_INDEX_DATA = 0x1208, 412 | GR_MEMORY_STATE_INDIRECT_ARG = 0x1209, 413 | GR_MEMORY_STATE_WRITE_TIMESTAMP = 0x120a, 414 | GR_MEMORY_STATE_QUEUE_ATOMIC = 0x120b, 415 | GR_MEMORY_STATE_DISCARD = 0x120c, 416 | GR_MEMORY_STATE_DATA_TRANSFER_SOURCE = 0x120d, 417 | GR_MEMORY_STATE_DATA_TRANSFER_DESTINATION = 0x120e, 418 | } GR_MEMORY_STATE; 419 | 420 | typedef enum _GR_MEMORY_HEAP_FLAGS { 421 | GR_MEMORY_HEAP_CPU_VISIBLE = 0x00000001, 422 | GR_MEMORY_HEAP_CPU_GPU_COHERENT = 0x00000002, 423 | GR_MEMORY_HEAP_CPU_UNCACHED = 0x00000004, 424 | GR_MEMORY_HEAP_CPU_WRITE_COMBINED = 0x00000008, 425 | GR_MEMORY_HEAP_HOLDS_PINNED = 0x00000010, 426 | GR_MEMORY_HEAP_SHAREABLE = 0x00000020, 427 | } GR_MEMORY_HEAP_FLAGS; 428 | 429 | /* 430 | Callback functions 431 | */ 432 | 433 | typedef GR_VOID* (GR_STDCALL *GR_ALLOC_FUNCTION)( 434 | GR_SIZE size, 435 | GR_SIZE alignment, 436 | GR_ENUM allocType); 437 | 438 | typedef GR_VOID(GR_STDCALL *GR_FREE_FUNCTION)( 439 | GR_VOID* pMem); 440 | 441 | typedef GR_VOID(GR_STDCALL *GR_DBG_MSG_CALLBACK_FUNCTION)( 442 | GR_ENUM msgType, 443 | GR_ENUM validationLevel, 444 | GR_BASE_OBJECT srcObject, 445 | GR_SIZE location, 446 | GR_ENUM msgCode, 447 | const GR_CHAR* pMsg, 448 | GR_VOID* pUserData); 449 | 450 | /* 451 | Structures 452 | */ 453 | 454 | typedef struct _GR_APPLICATION_INFO { 455 | const GR_CHAR* pAppName; 456 | GR_UINT32 appVersion; 457 | const GR_CHAR* pEngineName; 458 | GR_UINT32 engineVersion; 459 | GR_UINT32 apiVersion; 460 | } GR_APPLICATION_INFO; 461 | 462 | typedef struct _GR_ALLOC_CALLBACKS { 463 | GR_ALLOC_FUNCTION pfnAlloc; 464 | GR_FREE_FUNCTION pfnFree; 465 | } GR_ALLOC_CALLBACKS; 466 | 467 | typedef struct _GR_PHYSICAL_GPU_PROPERTIES { 468 | GR_UINT32 apiVersion; 469 | GR_UINT32 driverVersion; 470 | GR_UINT32 vendorId; 471 | GR_UINT32 deviceId; 472 | GR_ENUM gpuType; 473 | GR_CHAR gpuName[GR_MAX_PHYSICAL_GPU_NAME]; 474 | GR_UINT maxMemRefsPerSubmission; 475 | GR_GPU_SIZE reserved; 476 | GR_GPU_SIZE maxInlineMemoryUpdateSize; 477 | GR_UINT maxBoundDescriptorSets; 478 | GR_UINT maxThreadGroupSize; 479 | GR_UINT64 timestampFrequency; 480 | GR_BOOL multiColorTargetClears; 481 | } GR_PHYSICAL_GPU_PROPERTIES; 482 | 483 | typedef struct _GR_PHYSICAL_GPU_PERFORMANCE { 484 | GR_FLOAT maxGpuClock; 485 | GR_FLOAT aluPerClock; 486 | GR_FLOAT texPerClock; 487 | GR_FLOAT primsPerClock; 488 | GR_FLOAT pixelsPerClock; 489 | } GR_PHYSICAL_GPU_PERFORMANCE; 490 | 491 | typedef struct _GR_PHYSICAL_GPU_QUEUE_PROPERTIES { 492 | GR_ENUM queueType; 493 | GR_UINT queueCount; 494 | GR_UINT maxAtomicCounters; 495 | GR_BOOL supportsTimestamps; 496 | } GR_PHYSICAL_GPU_QUEUE_PROPERTIES; 497 | 498 | typedef struct _GR_DEVICE_QUEUE_CREATE_INFO { 499 | GR_ENUM queueType; 500 | GR_UINT queueCount; 501 | } GR_DEVICE_QUEUE_CREATE_INFO; 502 | 503 | typedef struct _GR_DEVICE_CREATE_INFO { 504 | GR_UINT queueRecordCount; 505 | const GR_DEVICE_QUEUE_CREATE_INFO* pRequestedQueues; 506 | GR_UINT extensionCount; 507 | const GR_CHAR*const* ppEnabledExtensionNames; 508 | GR_ENUM maxValidationLevel; 509 | GR_FLAGS flags; 510 | } GR_DEVICE_CREATE_INFO; 511 | 512 | typedef struct _GR_EXTENT2D { 513 | GR_INT width; 514 | GR_INT height; 515 | } GR_EXTENT2D; 516 | 517 | typedef struct _GR_EXTENT3D { 518 | GR_INT width; 519 | GR_INT height; 520 | GR_INT depth; 521 | } GR_EXTENT3D; 522 | 523 | typedef struct _GR_FORMAT { 524 | GR_UINT32 channelFormat : 16; 525 | GR_UINT32 numericFormat : 16; 526 | } GR_FORMAT; 527 | 528 | typedef struct _GR_WSI_WIN_DISPLAY_MODE { 529 | GR_EXTENT2D extent; 530 | GR_FORMAT format; 531 | GR_UINT refreshRate; 532 | GR_BOOL stereo; 533 | GR_BOOL crossDisplayPresent; 534 | } GR_WSI_WIN_DISPLAY_MODE; 535 | 536 | typedef struct _GR_WSI_WIN_PRESENTABLE_IMAGE_CREATE_INFO { 537 | GR_FORMAT format; 538 | GR_FLAGS usage; 539 | GR_EXTENT2D extent; 540 | GR_WSI_WIN_DISPLAY display; 541 | GR_FLAGS flags; 542 | } GR_WSI_WIN_PRESENTABLE_IMAGE_CREATE_INFO; 543 | 544 | typedef struct _GR_CMD_BUFFER_CREATE_INFO { 545 | GR_ENUM queueType; 546 | GR_FLAGS flags; 547 | } GR_CMD_BUFFER_CREATE_INFO; 548 | 549 | typedef struct _GR_MEMORY_REF { 550 | GR_GPU_MEMORY mem; 551 | GR_FLAGS flags; 552 | } GR_MEMORY_REF; 553 | 554 | typedef struct _GR_IMAGE_SUBRESOURCE_RANGE { 555 | GR_ENUM aspect; 556 | GR_UINT baseMipLevel; 557 | GR_UINT mipLevels; 558 | GR_UINT baseArraySlice; 559 | GR_UINT arraySize; 560 | } GR_IMAGE_SUBRESOURCE_RANGE; 561 | 562 | typedef struct _GR_IMAGE_STATE_TRANSITION { 563 | GR_IMAGE image; 564 | GR_ENUM oldState; 565 | GR_ENUM newState; 566 | GR_IMAGE_SUBRESOURCE_RANGE subresourceRange; 567 | } GR_IMAGE_STATE_TRANSITION; 568 | 569 | typedef struct _GR_WSI_WIN_PRESENT_INFO { 570 | HWND hWndDest; 571 | GR_IMAGE srcImage; 572 | GR_ENUM presentMode; 573 | GR_UINT presentInterval; 574 | GR_FLAGS flags; 575 | } GR_WSI_WIN_PRESENT_INFO; 576 | 577 | typedef struct _GR_VIEWPORT { 578 | GR_FLOAT originX; 579 | GR_FLOAT originY; 580 | GR_FLOAT width; 581 | GR_FLOAT height; 582 | GR_FLOAT minDepth; 583 | GR_FLOAT maxDepth; 584 | } GR_VIEWPORT; 585 | 586 | typedef struct _GR_OFFSET2D { 587 | GR_INT x; 588 | GR_INT y; 589 | } GR_OFFSET2D; 590 | 591 | typedef struct _GR_OFFSET3D { 592 | GR_INT x; 593 | GR_INT y; 594 | GR_INT z; 595 | } GR_OFFSET3D; 596 | 597 | typedef struct _GR_RECT { 598 | GR_OFFSET2D offset; 599 | GR_EXTENT2D extent; 600 | } GR_RECT; 601 | 602 | typedef struct _GR_VIEWPORT_STATE_CREATE_INFO { 603 | GR_UINT viewportCount; 604 | GR_BOOL scissorEnable; 605 | GR_VIEWPORT viewports[GR_MAX_VIEWPORTS]; 606 | GR_RECT scissors[GR_MAX_VIEWPORTS]; 607 | } GR_VIEWPORT_STATE_CREATE_INFO; 608 | 609 | typedef struct _GR_COLOR_TARGET_VIEW_CREATE_INFO { 610 | GR_IMAGE image; 611 | GR_FORMAT format; 612 | GR_UINT mipLevel; 613 | GR_UINT baseArraySlice; 614 | GR_UINT arraySize; 615 | } GR_COLOR_TARGET_VIEW_CREATE_INFO; 616 | 617 | typedef struct _GR_MEMORY_ALLOC_INFO { 618 | GR_GPU_SIZE size; 619 | GR_GPU_SIZE alignment; 620 | GR_FLAGS flags; 621 | GR_UINT heapCount; 622 | GR_UINT heaps[GR_MAX_MEMORY_HEAPS]; 623 | GR_ENUM memPriority; 624 | } GR_MEMORY_ALLOC_INFO; 625 | 626 | typedef struct _GR_DESCRIPTOR_SET_CREATE_INFO { 627 | GR_UINT slots; 628 | } GR_DESCRIPTOR_SET_CREATE_INFO; 629 | 630 | typedef struct _GR_FENCE_CREATE_INFO { 631 | GR_FLAGS flags; 632 | } GR_FENCE_CREATE_INFO; 633 | 634 | typedef struct _GR_MSAA_STATE_CREATE_INFO { 635 | GR_UINT samples; 636 | GR_SAMPLE_MASK sampleMask; 637 | } GR_MSAA_STATE_CREATE_INFO; 638 | 639 | typedef struct _GR_SAMPLER_CREATE_INFO { 640 | GR_ENUM filter; 641 | GR_ENUM addressU; 642 | GR_ENUM addressV; 643 | GR_ENUM addressW; 644 | GR_FLOAT mipLodBias; 645 | GR_UINT maxAnisotropy; 646 | GR_ENUM compareFunc; 647 | GR_FLOAT minLod; 648 | GR_FLOAT maxLod; 649 | GR_ENUM borderColor; 650 | } GR_SAMPLER_CREATE_INFO; 651 | 652 | typedef struct _GR_COLOR_TARGET_BLEND_STATE { 653 | GR_BOOL blendEnable; 654 | GR_ENUM srcBlendColor; 655 | GR_ENUM destBlendColor; 656 | GR_ENUM blendFuncColor; 657 | GR_ENUM srcBlendAlpha; 658 | GR_ENUM destBlendAlpha; 659 | GR_ENUM blendFuncAlpha; 660 | } GR_COLOR_TARGET_BLEND_STATE; 661 | 662 | typedef struct _GR_COLOR_BLEND_STATE_CREATE_INFO { 663 | GR_COLOR_TARGET_BLEND_STATE target[GR_MAX_COLOR_TARGETS]; 664 | GR_FLOAT blendConst[4]; 665 | } GR_COLOR_BLEND_STATE_CREATE_INFO; 666 | 667 | typedef struct _GR_DEPTH_STENCIL_OP { 668 | GR_ENUM stencilFailOp; 669 | GR_ENUM stencilPassOp; 670 | GR_ENUM stencilDepthFailOp; 671 | GR_ENUM stencilFunc; 672 | GR_UINT8 stencilRef; 673 | } GR_DEPTH_STENCIL_OP; 674 | 675 | typedef struct _GR_DEPTH_STENCIL_STATE_CREATE_INFO { 676 | GR_BOOL depthEnable; 677 | GR_BOOL depthWriteEnable; 678 | GR_ENUM depthFunc; 679 | GR_BOOL depthBoundsEnable; 680 | GR_FLOAT minDepth; 681 | GR_FLOAT maxDepth; 682 | GR_BOOL stencilEnable; 683 | GR_UINT8 stencilReadMask; 684 | GR_UINT8 stencilWriteMask; 685 | GR_DEPTH_STENCIL_OP front; 686 | GR_DEPTH_STENCIL_OP back; 687 | } GR_DEPTH_STENCIL_STATE_CREATE_INFO; 688 | 689 | typedef struct _GR_RASTER_STATE_CREATE_INFO { 690 | GR_ENUM fillMode; 691 | GR_ENUM cullMode; 692 | GR_ENUM frontFace; 693 | GR_INT depthBias; 694 | GR_FLOAT depthBiasClamp; 695 | GR_FLOAT slopeScaledDepthBias; 696 | } GR_RASTER_STATE_CREATE_INFO; 697 | 698 | typedef struct _GR_SHADER_CREATE_INFO { 699 | GR_SIZE codeSize; 700 | const GR_VOID* pCode; 701 | GR_FLAGS flags; 702 | } GR_SHADER_CREATE_INFO; 703 | 704 | typedef struct _GR_DESCRIPTOR_SLOT_INFO { 705 | GR_ENUM slotObjectType; 706 | union { 707 | GR_UINT shaderEntityIndex; 708 | const struct _GR_DESCRIPTOR_SET_MAPPING* pNextLevelSet; 709 | }; 710 | } GR_DESCRIPTOR_SLOT_INFO; 711 | 712 | typedef struct _GR_DESCRIPTOR_SET_MAPPING { 713 | GR_UINT descriptorCount; 714 | const GR_DESCRIPTOR_SLOT_INFO* pDescriptorInfo; 715 | } GR_DESCRIPTOR_SET_MAPPING; 716 | 717 | typedef struct _GR_LINK_CONST_BUFFER { 718 | GR_UINT bufferId; 719 | GR_SIZE bufferSize; 720 | const GR_VOID* pBufferData; 721 | } GR_LINK_CONST_BUFFER; 722 | 723 | typedef struct _GR_DYNAMIC_MEMORY_VIEW_SLOT_INFO { 724 | GR_ENUM slotObjectType; 725 | GR_UINT shaderEntityIndex; 726 | } GR_DYNAMIC_MEMORY_VIEW_SLOT_INFO; 727 | 728 | typedef struct _GR_PIPELINE_SHADER { 729 | GR_SHADER shader; 730 | GR_DESCRIPTOR_SET_MAPPING descriptorSetMapping[GR_MAX_DESCRIPTOR_SETS]; 731 | GR_UINT linkConstBufferCount; 732 | const GR_LINK_CONST_BUFFER* pLinkConstBufferInfo; 733 | GR_DYNAMIC_MEMORY_VIEW_SLOT_INFO dynamicMemoryViewMapping; 734 | } GR_PIPELINE_SHADER; 735 | 736 | typedef struct _GR_PIPELINE_IA_STATE { 737 | GR_ENUM topology; 738 | GR_BOOL disableVertexReuse; 739 | } GR_PIPELINE_IA_STATE; 740 | 741 | typedef struct _GR_PIPELINE_TESS_STATE { 742 | GR_UINT patchControlPoints; 743 | GR_FLOAT optimalTessFactor; 744 | } GR_PIPELINE_TESS_STATE; 745 | 746 | typedef struct _GR_PIPELINE_RS_STATE { 747 | GR_BOOL depthClipEnable; 748 | } GR_PIPELINE_RS_STATE; 749 | 750 | typedef struct _GR_PIPELINE_CB_TARGET_STATE { 751 | GR_BOOL blendEnable; 752 | GR_FORMAT format; 753 | GR_UINT8 channelWriteMask; 754 | } GR_PIPELINE_CB_TARGET_STATE; 755 | 756 | typedef struct _GR_PIPELINE_CB_STATE { 757 | GR_BOOL alphaToCoverageEnable; 758 | GR_BOOL dualSourceBlendEnable; 759 | GR_ENUM logicOp; 760 | GR_PIPELINE_CB_TARGET_STATE target[GR_MAX_COLOR_TARGETS]; 761 | } GR_PIPELINE_CB_STATE; 762 | 763 | typedef struct _GR_PIPELINE_DB_STATE { 764 | GR_FORMAT format; 765 | } GR_PIPELINE_DB_STATE; 766 | 767 | typedef struct _GR_GRAPHICS_PIPELINE_CREATE_INFO { 768 | GR_PIPELINE_SHADER vs; 769 | GR_PIPELINE_SHADER hs; 770 | GR_PIPELINE_SHADER ds; 771 | GR_PIPELINE_SHADER gs; 772 | GR_PIPELINE_SHADER ps; 773 | GR_PIPELINE_IA_STATE iaState; 774 | GR_PIPELINE_TESS_STATE tessState; 775 | GR_PIPELINE_RS_STATE rsState; 776 | GR_PIPELINE_CB_STATE cbState; 777 | GR_PIPELINE_DB_STATE dbState; 778 | GR_FLAGS flags; 779 | } GR_GRAPHICS_PIPELINE_CREATE_INFO; 780 | 781 | typedef struct _GR_COMPUTE_PIPELINE_CREATE_INFO { 782 | GR_PIPELINE_SHADER cs; 783 | GR_FLAGS flags; 784 | } GR_COMPUTE_PIPELINE_CREATE_INFO; 785 | 786 | typedef struct _GR_MEMORY_VIEW_ATTACH_INFO { 787 | GR_GPU_MEMORY mem; 788 | GR_GPU_SIZE offset; 789 | GR_GPU_SIZE range; 790 | GR_GPU_SIZE stride; 791 | GR_FORMAT format; 792 | GR_ENUM state; 793 | } GR_MEMORY_VIEW_ATTACH_INFO; 794 | 795 | typedef struct _GR_IMAGE_CREATE_INFO { 796 | GR_ENUM imageType; 797 | GR_FORMAT format; 798 | GR_EXTENT3D extent; 799 | GR_UINT mipLevels; 800 | GR_UINT arraySize; 801 | GR_UINT samples; 802 | GR_ENUM tiling; 803 | GR_FLAGS usage; 804 | GR_FLAGS flags; 805 | } GR_IMAGE_CREATE_INFO; 806 | 807 | typedef struct _GR_CHANNEL_MAPPING { 808 | GR_ENUM r; 809 | GR_ENUM g; 810 | GR_ENUM b; 811 | GR_ENUM a; 812 | } GR_CHANNEL_MAPPING; 813 | 814 | typedef struct _GR_IMAGE_VIEW_CREATE_INFO { 815 | GR_IMAGE image; 816 | GR_ENUM viewType; 817 | GR_FORMAT format; 818 | GR_CHANNEL_MAPPING channels; 819 | GR_IMAGE_SUBRESOURCE_RANGE subresourceRange; 820 | GR_FLOAT minLod; 821 | } GR_IMAGE_VIEW_CREATE_INFO; 822 | 823 | typedef struct _GR_IMAGE_VIEW_ATTACH_INFO { 824 | GR_IMAGE_VIEW view; 825 | GR_ENUM state; 826 | } GR_IMAGE_VIEW_ATTACH_INFO; 827 | 828 | typedef struct _GR_IMAGE_SUBRESOURCE { 829 | GR_ENUM aspect; 830 | GR_UINT mipLevel; 831 | GR_UINT arraySlice; 832 | } GR_IMAGE_SUBRESOURCE; 833 | 834 | typedef struct _GR_MEMORY_STATE_TRANSITION { 835 | GR_GPU_MEMORY mem; 836 | GR_ENUM oldState; 837 | GR_ENUM newState; 838 | GR_GPU_SIZE offset; 839 | GR_GPU_SIZE regionSize; 840 | } GR_MEMORY_STATE_TRANSITION; 841 | 842 | typedef struct _GR_MEMORY_COPY { 843 | GR_GPU_SIZE srcOffset; 844 | GR_GPU_SIZE destOffset; 845 | GR_GPU_SIZE copySize; 846 | } GR_MEMORY_COPY; 847 | 848 | typedef struct _GR_IMAGE_COPY { 849 | GR_IMAGE_SUBRESOURCE srcSubresource; 850 | GR_OFFSET3D srcOffset; 851 | GR_IMAGE_SUBRESOURCE destSubresource; 852 | GR_OFFSET3D destOffset; 853 | GR_EXTENT3D extent; 854 | } GR_IMAGE_COPY; 855 | 856 | typedef struct _GR_COLOR_TARGET_BIND_INFO { 857 | GR_COLOR_TARGET_VIEW view; 858 | GR_ENUM colorTargetState; 859 | } GR_COLOR_TARGET_BIND_INFO; 860 | 861 | typedef struct _GR_DEPTH_STENCIL_BIND_INFO { 862 | GR_DEPTH_STENCIL_VIEW view; 863 | GR_ENUM depthState; 864 | GR_ENUM stencilState; 865 | } GR_DEPTH_STENCIL_BIND_INFO; 866 | 867 | typedef struct _GR_MEMORY_IMAGE_COPY { 868 | GR_GPU_SIZE memOffset; 869 | GR_IMAGE_SUBRESOURCE imageSubresource; 870 | GR_OFFSET3D imageOffset; 871 | GR_EXTENT3D imageExtent; 872 | } GR_MEMORY_IMAGE_COPY; 873 | 874 | typedef struct _GR_DESCRIPTOR_SET_ATTACH_INFO { 875 | GR_DESCRIPTOR_SET descriptorSet; 876 | GR_UINT slotOffset; 877 | } GR_DESCRIPTOR_SET_ATTACH_INFO; 878 | 879 | typedef struct _GR_MEMORY_REQUIREMENTS { 880 | GR_GPU_SIZE size; 881 | GR_GPU_SIZE alignment; 882 | GR_UINT heapCount; 883 | GR_UINT heaps[GR_MAX_MEMORY_HEAPS]; 884 | } GR_MEMORY_REQUIREMENTS; 885 | 886 | typedef struct _GR_MEMORY_HEAP_PROPERTIES { 887 | GR_ENUM heapMemoryType; 888 | GR_GPU_SIZE heapSize; 889 | GR_GPU_SIZE pageSize; 890 | GR_FLAGS flags; 891 | GR_FLOAT gpuReadPerfRating; 892 | GR_FLOAT gpuWritePerfRating; 893 | GR_FLOAT cpuReadPerfRating; 894 | GR_FLOAT cpuWritePerfRating; 895 | } GR_MEMORY_HEAP_PROPERTIES; 896 | 897 | /* 898 | API function pointers 899 | */ 900 | 901 | GR_RESULT(GR_STDCALL *grInitAndEnumerateGpus)( 902 | const GR_APPLICATION_INFO* pAppInfo, 903 | const GR_ALLOC_CALLBACKS* pAllocCb, 904 | GR_UINT* pGpuCount, 905 | GR_PHYSICAL_GPU gpus[GR_MAX_PHYSICAL_GPUS]); 906 | 907 | GR_RESULT(GR_STDCALL *grGetGpuInfo)( 908 | GR_PHYSICAL_GPU gpu, 909 | GR_ENUM infoType, 910 | GR_SIZE* pDataSize, 911 | GR_VOID* pData); 912 | 913 | GR_RESULT(GR_STDCALL *grGetExtensionSupport)( 914 | GR_PHYSICAL_GPU gpu, 915 | const GR_CHAR* pExtName); 916 | 917 | GR_RESULT(GR_STDCALL *grCreateDevice)( 918 | GR_PHYSICAL_GPU gpu, 919 | const GR_DEVICE_CREATE_INFO* pCreateInfo, 920 | GR_DEVICE* pDevice); 921 | 922 | GR_RESULT(GR_STDCALL *grWsiWinGetDisplays)( 923 | GR_DEVICE device, 924 | GR_UINT* pDisplayCount, 925 | GR_WSI_WIN_DISPLAY* pDisplayList); 926 | 927 | GR_RESULT(GR_STDCALL *grWsiWinGetDisplayModeList)( 928 | GR_WSI_WIN_DISPLAY display, 929 | GR_UINT* pDisplayModeCount, 930 | GR_WSI_WIN_DISPLAY_MODE* pDisplayModeList); 931 | 932 | GR_RESULT(GR_STDCALL *grGetDeviceQueue)( 933 | GR_DEVICE device, 934 | GR_ENUM queueType, 935 | GR_UINT queueId, 936 | GR_QUEUE* pQueue); 937 | 938 | GR_RESULT(GR_STDCALL *grWsiWinCreatePresentableImage)( 939 | GR_DEVICE device, 940 | const GR_WSI_WIN_PRESENTABLE_IMAGE_CREATE_INFO* pCreateInfo, 941 | GR_IMAGE* pImage, 942 | GR_GPU_MEMORY* pMem); 943 | 944 | GR_RESULT(GR_STDCALL *grCreateCommandBuffer)( 945 | GR_DEVICE device, 946 | const GR_CMD_BUFFER_CREATE_INFO* pCreateInfo, 947 | GR_CMD_BUFFER* pCmdBuffer); 948 | 949 | GR_RESULT(GR_STDCALL *grBeginCommandBuffer)( 950 | GR_CMD_BUFFER cmdBuffer, 951 | GR_FLAGS flags); 952 | 953 | GR_RESULT(GR_STDCALL *grEndCommandBuffer)( 954 | GR_CMD_BUFFER cmdBuffer); 955 | 956 | GR_RESULT(GR_STDCALL *grQueueSubmit)( 957 | GR_QUEUE queue, 958 | GR_UINT cmdBufferCount, 959 | const GR_CMD_BUFFER* pCmdBuffers, 960 | GR_UINT memRefCount, 961 | const GR_MEMORY_REF* pMemRefs, 962 | GR_FENCE fence); 963 | 964 | GR_VOID(GR_STDCALL *grCmdPrepareImages)( 965 | GR_CMD_BUFFER cmdBuffer, 966 | GR_UINT transitionCount, 967 | const GR_IMAGE_STATE_TRANSITION* pStateTransitions); 968 | 969 | GR_VOID(GR_STDCALL *grCmdClearColorImage)( 970 | GR_CMD_BUFFER cmdBuffer, 971 | GR_IMAGE image, 972 | const GR_FLOAT color[4], 973 | GR_UINT rangeCount, 974 | const GR_IMAGE_SUBRESOURCE_RANGE* pRanges); 975 | 976 | GR_RESULT(GR_STDCALL *grWsiWinQueuePresent)( 977 | GR_QUEUE queue, 978 | const GR_WSI_WIN_PRESENT_INFO* pPresentInfo); 979 | 980 | GR_RESULT(GR_STDCALL *grDbgRegisterMsgCallback)( 981 | GR_DBG_MSG_CALLBACK_FUNCTION pfnMsgCallback, 982 | GR_VOID* pUserData); 983 | 984 | GR_RESULT(GR_STDCALL *grCreateViewportState)( 985 | GR_DEVICE device, 986 | const GR_VIEWPORT_STATE_CREATE_INFO* pCreateInfo, 987 | GR_VIEWPORT_STATE_OBJECT* pState); 988 | 989 | GR_RESULT(GR_STDCALL *grGetMemoryHeapCount)( 990 | GR_DEVICE device, 991 | GR_UINT* pCount); 992 | 993 | GR_RESULT(GR_STDCALL *grCreateColorTargetView)( 994 | GR_DEVICE device, 995 | const GR_COLOR_TARGET_VIEW_CREATE_INFO* pCreateInfo, 996 | GR_COLOR_TARGET_VIEW* pView); 997 | 998 | GR_RESULT(GR_STDCALL *grGetMemoryHeapInfo)( 999 | GR_DEVICE device, 1000 | GR_UINT heapId, 1001 | GR_ENUM infoType, 1002 | GR_SIZE* pDataSize, 1003 | GR_VOID* pData); 1004 | 1005 | GR_RESULT(GR_STDCALL *grAllocMemory)( 1006 | GR_DEVICE device, 1007 | const GR_MEMORY_ALLOC_INFO* pAllocInfo, 1008 | GR_GPU_MEMORY* pMem); 1009 | 1010 | GR_RESULT(GR_STDCALL *grCreateDescriptorSet)( 1011 | GR_DEVICE device, 1012 | const GR_DESCRIPTOR_SET_CREATE_INFO* pCreateInfo, 1013 | GR_DESCRIPTOR_SET* pDescriptorSet); 1014 | 1015 | GR_RESULT(GR_STDCALL *grGetObjectInfo)( 1016 | GR_BASE_OBJECT object, 1017 | GR_ENUM infoType, 1018 | GR_SIZE* pDataSize, 1019 | GR_VOID* pData); 1020 | 1021 | GR_RESULT(GR_STDCALL *grBindObjectMemory)( 1022 | GR_OBJECT object, 1023 | GR_GPU_MEMORY mem, 1024 | GR_GPU_SIZE offset); 1025 | 1026 | GR_RESULT(GR_STDCALL *grCreateFence)( 1027 | GR_DEVICE device, 1028 | const GR_FENCE_CREATE_INFO* pCreateInfo, 1029 | GR_FENCE* pFence); 1030 | 1031 | GR_RESULT(GR_STDCALL *grCreateMsaaState)( 1032 | GR_DEVICE device, 1033 | const GR_MSAA_STATE_CREATE_INFO* pCreateInfo, 1034 | GR_MSAA_STATE_OBJECT* pState); 1035 | 1036 | GR_RESULT(GR_STDCALL *grCreateSampler)( 1037 | GR_DEVICE device, 1038 | const GR_SAMPLER_CREATE_INFO* pCreateInfo, 1039 | GR_SAMPLER* pSampler); 1040 | 1041 | GR_VOID(GR_STDCALL *grBeginDescriptorSetUpdate)( 1042 | GR_DESCRIPTOR_SET descriptorSet); 1043 | 1044 | GR_VOID(GR_STDCALL *grEndDescriptorSetUpdate)( 1045 | GR_DESCRIPTOR_SET descriptorSet); 1046 | 1047 | GR_VOID(GR_STDCALL *grAttachSamplerDescriptors)( 1048 | GR_DESCRIPTOR_SET descriptorSet, 1049 | GR_UINT startSlot, 1050 | GR_UINT slotCount, 1051 | const GR_SAMPLER* pSamplers); 1052 | 1053 | GR_RESULT(GR_STDCALL *grCreateColorBlendState)( 1054 | GR_DEVICE device, 1055 | const GR_COLOR_BLEND_STATE_CREATE_INFO* pCreateInfo, 1056 | GR_COLOR_BLEND_STATE_OBJECT* pState); 1057 | 1058 | GR_RESULT(GR_STDCALL *grCreateDepthStencilState)( 1059 | GR_DEVICE device, 1060 | const GR_DEPTH_STENCIL_STATE_CREATE_INFO* pCreateInfo, 1061 | GR_DEPTH_STENCIL_STATE_OBJECT* pState); 1062 | 1063 | GR_RESULT(GR_STDCALL *grCreateRasterState)( 1064 | GR_DEVICE device, 1065 | const GR_RASTER_STATE_CREATE_INFO* pCreateInfo, 1066 | GR_RASTER_STATE_OBJECT* pState); 1067 | 1068 | GR_RESULT(GR_STDCALL *grMapMemory)( 1069 | GR_GPU_MEMORY mem, 1070 | GR_FLAGS flags, 1071 | GR_VOID** ppData); 1072 | 1073 | GR_RESULT(GR_STDCALL *grUnmapMemory)( 1074 | GR_GPU_MEMORY mem); 1075 | 1076 | GR_RESULT(GR_STDCALL *grCreateShader)( 1077 | GR_DEVICE device, 1078 | const GR_SHADER_CREATE_INFO* pCreateInfo, 1079 | GR_SHADER* pShader); 1080 | 1081 | GR_RESULT(GR_STDCALL *grCreateGraphicsPipeline)( 1082 | GR_DEVICE device, 1083 | const GR_GRAPHICS_PIPELINE_CREATE_INFO* pCreateInfo, 1084 | GR_PIPELINE* pPipeline); 1085 | 1086 | GR_RESULT(GR_STDCALL *grCreateComputePipeline)( 1087 | GR_DEVICE device, 1088 | const GR_COMPUTE_PIPELINE_CREATE_INFO* pCreateInfo, 1089 | GR_PIPELINE* pPipeline); 1090 | 1091 | GR_VOID(GR_STDCALL *grClearDescriptorSetSlots)( 1092 | GR_DESCRIPTOR_SET descriptorSet, 1093 | GR_UINT startSlot, 1094 | GR_UINT slotCount); 1095 | 1096 | GR_VOID(GR_STDCALL *grAttachMemoryViewDescriptors)( 1097 | GR_DESCRIPTOR_SET descriptorSet, 1098 | GR_UINT startSlot, 1099 | GR_UINT slotCount, 1100 | const GR_MEMORY_VIEW_ATTACH_INFO* pMemViews); 1101 | 1102 | GR_RESULT(GR_STDCALL *grWaitForFences)( 1103 | GR_DEVICE device, 1104 | GR_UINT fenceCount, 1105 | const GR_FENCE* pFences, 1106 | GR_BOOL waitAll, 1107 | GR_FLOAT timeout); 1108 | 1109 | GR_RESULT(GR_STDCALL *grCreateImage)( 1110 | GR_DEVICE device, 1111 | const GR_IMAGE_CREATE_INFO* pCreateInfo, 1112 | GR_IMAGE* pImage); 1113 | 1114 | GR_RESULT(GR_STDCALL *grDestroyObject)( 1115 | GR_OBJECT object); 1116 | 1117 | GR_RESULT(GR_STDCALL *grCreateImageView)( 1118 | GR_DEVICE device, 1119 | const GR_IMAGE_VIEW_CREATE_INFO* pCreateInfo, 1120 | GR_IMAGE_VIEW* pView); 1121 | 1122 | GR_VOID(GR_STDCALL *grAttachImageViewDescriptors)( 1123 | GR_DESCRIPTOR_SET descriptorSet, 1124 | GR_UINT startSlot, 1125 | GR_UINT slotCount, 1126 | const GR_IMAGE_VIEW_ATTACH_INFO* pImageViews); 1127 | 1128 | GR_RESULT(GR_STDCALL *grGetImageSubresourceInfo)( 1129 | GR_IMAGE image, 1130 | const GR_IMAGE_SUBRESOURCE* pSubresource, 1131 | GR_ENUM infoType, 1132 | GR_SIZE* pDataSize, 1133 | GR_VOID* pData); 1134 | 1135 | GR_RESULT(GR_STDCALL *grResetCommandBuffer)( 1136 | GR_CMD_BUFFER cmdBuffer); 1137 | 1138 | GR_VOID(GR_STDCALL *grCmdPrepareMemoryRegions)( 1139 | GR_CMD_BUFFER cmdBuffer, 1140 | GR_UINT transitionCount, 1141 | const GR_MEMORY_STATE_TRANSITION* pStateTransitions); 1142 | 1143 | GR_VOID(GR_STDCALL *grCmdCopyMemory)( 1144 | GR_CMD_BUFFER cmdBuffer, 1145 | GR_GPU_MEMORY srcMem, 1146 | GR_GPU_MEMORY destMem, 1147 | GR_UINT regionCount, 1148 | const GR_MEMORY_COPY* pRegions); 1149 | 1150 | GR_VOID(GR_STDCALL *grCmdCopyImage)( 1151 | GR_CMD_BUFFER cmdBuffer, 1152 | GR_IMAGE srcImage, 1153 | GR_IMAGE destImage, 1154 | GR_UINT regionCount, 1155 | const GR_IMAGE_COPY* pRegions); 1156 | 1157 | GR_VOID(GR_STDCALL *grCmdBindTargets)( 1158 | GR_CMD_BUFFER cmdBuffer, 1159 | GR_UINT colorTargetCount, 1160 | const GR_COLOR_TARGET_BIND_INFO* pColorTargets, 1161 | const GR_DEPTH_STENCIL_BIND_INFO* pDepthTarget); 1162 | 1163 | GR_VOID(GR_STDCALL *grCmdBindStateObject)( 1164 | GR_CMD_BUFFER cmdBuffer, 1165 | GR_ENUM stateBindPoint, 1166 | GR_STATE_OBJECT state); 1167 | 1168 | GR_RESULT(GR_STDCALL *grFreeMemory)( 1169 | GR_GPU_MEMORY mem); 1170 | 1171 | GR_VOID(GR_STDCALL *grCmdCopyMemoryToImage)( 1172 | GR_CMD_BUFFER cmdBuffer, 1173 | GR_GPU_MEMORY srcMem, 1174 | GR_IMAGE destImage, 1175 | GR_UINT regionCount, 1176 | const GR_MEMORY_IMAGE_COPY* pRegions); 1177 | 1178 | GR_VOID(GR_STDCALL *grAttachNestedDescriptors)( 1179 | GR_DESCRIPTOR_SET descriptorSet, 1180 | GR_UINT startSlot, 1181 | GR_UINT slotCount, 1182 | const GR_DESCRIPTOR_SET_ATTACH_INFO* pNestedDescriptorSets); 1183 | 1184 | GR_VOID(GR_STDCALL *grCmdBindDescriptorSet)( 1185 | GR_CMD_BUFFER cmdBuffer, 1186 | GR_ENUM pipelineBindPoint, 1187 | GR_UINT index, 1188 | GR_DESCRIPTOR_SET descriptorSet, 1189 | GR_UINT slotOffset); 1190 | 1191 | GR_VOID(GR_STDCALL *grCmdBindIndexData)( 1192 | GR_CMD_BUFFER cmdBuffer, 1193 | GR_GPU_MEMORY mem, 1194 | GR_GPU_SIZE offset, 1195 | GR_ENUM indexType); 1196 | 1197 | GR_VOID(GR_STDCALL *grCmdBindPipeline)( 1198 | GR_CMD_BUFFER cmdBuffer, 1199 | GR_ENUM pipelineBindPoint, 1200 | GR_PIPELINE pipeline); 1201 | 1202 | GR_VOID(GR_STDCALL *grCmdDrawIndexed)( 1203 | GR_CMD_BUFFER cmdBuffer, 1204 | GR_UINT firstIndex, 1205 | GR_UINT indexCount, 1206 | GR_INT vertexOffset, 1207 | GR_UINT firstInstance, 1208 | GR_UINT instanceCount); 1209 | 1210 | GR_VOID(GR_STDCALL *grCmdBindDynamicMemoryView)( 1211 | GR_CMD_BUFFER cmdBuffer, 1212 | GR_ENUM pipelineBindPoint, 1213 | const GR_MEMORY_VIEW_ATTACH_INFO* pMemView); 1214 | 1215 | GR_VOID(GR_STDCALL *grCmdDispatch)( 1216 | GR_CMD_BUFFER cmdBuffer, 1217 | GR_UINT x, 1218 | GR_UINT y, 1219 | GR_UINT z); 1220 | 1221 | GR_VOID(GR_STDCALL *grCmdDraw)( 1222 | GR_CMD_BUFFER cmdBuffer, 1223 | GR_UINT firstVertex, 1224 | GR_UINT vertexCount, 1225 | GR_UINT firstInstance, 1226 | GR_UINT instanceCount); 1227 | 1228 | #define LOAD_PROC(fnCheck, module, var)\ 1229 | {\ 1230 | var = (decltype(var)) GetProcAddress(module, #var);\ 1231 | if (!var) fnCheck = false;\ 1232 | }\ 1233 | 1234 | // Applications should call this at the beginning of the program 1235 | bool mantleLoadFunctions() { 1236 | static bool loaded = false; 1237 | if (loaded) return true; 1238 | loaded = true; 1239 | 1240 | HMODULE mantleDll = LoadLibrary(TEXT("mantle64.dll")); 1241 | if (!mantleDll) return false; 1242 | 1243 | bool fnCheck = true; 1244 | 1245 | LOAD_PROC(fnCheck, mantleDll, grCreateViewportState); 1246 | LOAD_PROC(fnCheck, mantleDll, grDbgRegisterMsgCallback); 1247 | LOAD_PROC(fnCheck, mantleDll, grInitAndEnumerateGpus); 1248 | LOAD_PROC(fnCheck, mantleDll, grGetGpuInfo); 1249 | LOAD_PROC(fnCheck, mantleDll, grGetExtensionSupport); 1250 | LOAD_PROC(fnCheck, mantleDll, grCreateDevice); 1251 | LOAD_PROC(fnCheck, mantleDll, grGetDeviceQueue); 1252 | LOAD_PROC(fnCheck, mantleDll, grCreateCommandBuffer); 1253 | LOAD_PROC(fnCheck, mantleDll, grBeginCommandBuffer); 1254 | LOAD_PROC(fnCheck, mantleDll, grEndCommandBuffer); 1255 | LOAD_PROC(fnCheck, mantleDll, grQueueSubmit); 1256 | LOAD_PROC(fnCheck, mantleDll, grCmdPrepareImages); 1257 | LOAD_PROC(fnCheck, mantleDll, grCmdClearColorImage); 1258 | LOAD_PROC(fnCheck, mantleDll, grGetMemoryHeapCount); 1259 | LOAD_PROC(fnCheck, mantleDll, grCreateColorTargetView); 1260 | LOAD_PROC(fnCheck, mantleDll, grGetMemoryHeapInfo); 1261 | LOAD_PROC(fnCheck, mantleDll, grAllocMemory); 1262 | LOAD_PROC(fnCheck, mantleDll, grCreateDescriptorSet); 1263 | LOAD_PROC(fnCheck, mantleDll, grGetObjectInfo); 1264 | LOAD_PROC(fnCheck, mantleDll, grBindObjectMemory); 1265 | LOAD_PROC(fnCheck, mantleDll, grCreateFence); 1266 | LOAD_PROC(fnCheck, mantleDll, grCreateMsaaState); 1267 | LOAD_PROC(fnCheck, mantleDll, grCreateSampler); 1268 | LOAD_PROC(fnCheck, mantleDll, grBeginDescriptorSetUpdate); 1269 | LOAD_PROC(fnCheck, mantleDll, grEndDescriptorSetUpdate); 1270 | LOAD_PROC(fnCheck, mantleDll, grAttachSamplerDescriptors); 1271 | LOAD_PROC(fnCheck, mantleDll, grCreateColorBlendState); 1272 | LOAD_PROC(fnCheck, mantleDll, grCreateDepthStencilState); 1273 | LOAD_PROC(fnCheck, mantleDll, grCreateRasterState); 1274 | LOAD_PROC(fnCheck, mantleDll, grMapMemory); 1275 | LOAD_PROC(fnCheck, mantleDll, grUnmapMemory); 1276 | LOAD_PROC(fnCheck, mantleDll, grCreateShader); 1277 | LOAD_PROC(fnCheck, mantleDll, grCreateGraphicsPipeline); 1278 | LOAD_PROC(fnCheck, mantleDll, grCreateComputePipeline); 1279 | LOAD_PROC(fnCheck, mantleDll, grClearDescriptorSetSlots); 1280 | LOAD_PROC(fnCheck, mantleDll, grAttachMemoryViewDescriptors); 1281 | LOAD_PROC(fnCheck, mantleDll, grWaitForFences); 1282 | LOAD_PROC(fnCheck, mantleDll, grCreateImage); 1283 | LOAD_PROC(fnCheck, mantleDll, grDestroyObject); 1284 | LOAD_PROC(fnCheck, mantleDll, grCreateImageView); 1285 | LOAD_PROC(fnCheck, mantleDll, grAttachImageViewDescriptors); 1286 | LOAD_PROC(fnCheck, mantleDll, grGetImageSubresourceInfo); 1287 | LOAD_PROC(fnCheck, mantleDll, grResetCommandBuffer); 1288 | LOAD_PROC(fnCheck, mantleDll, grCmdPrepareMemoryRegions); 1289 | LOAD_PROC(fnCheck, mantleDll, grCmdCopyMemory); 1290 | LOAD_PROC(fnCheck, mantleDll, grCmdCopyImage); 1291 | LOAD_PROC(fnCheck, mantleDll, grCmdBindTargets); 1292 | LOAD_PROC(fnCheck, mantleDll, grCmdBindStateObject); 1293 | LOAD_PROC(fnCheck, mantleDll, grFreeMemory); 1294 | LOAD_PROC(fnCheck, mantleDll, grCmdCopyMemoryToImage); 1295 | LOAD_PROC(fnCheck, mantleDll, grAttachNestedDescriptors); 1296 | LOAD_PROC(fnCheck, mantleDll, grCmdBindDescriptorSet); 1297 | LOAD_PROC(fnCheck, mantleDll, grCmdBindIndexData); 1298 | LOAD_PROC(fnCheck, mantleDll, grCmdBindPipeline); 1299 | LOAD_PROC(fnCheck, mantleDll, grCmdDrawIndexed); 1300 | LOAD_PROC(fnCheck, mantleDll, grCmdBindDynamicMemoryView); 1301 | LOAD_PROC(fnCheck, mantleDll, grCmdDispatch); 1302 | LOAD_PROC(fnCheck, mantleDll, grCmdDraw); 1303 | 1304 | LOAD_PROC(fnCheck, mantleDll, grWsiWinGetDisplays); 1305 | LOAD_PROC(fnCheck, mantleDll, grWsiWinGetDisplayModeList); 1306 | LOAD_PROC(fnCheck, mantleDll, grWsiWinCreatePresentableImage); 1307 | LOAD_PROC(fnCheck, mantleDll, grWsiWinQueuePresent); 1308 | 1309 | return fnCheck; 1310 | } 1311 | 1312 | #endif 1313 | -------------------------------------------------------------------------------- /shaders/compile.bat: -------------------------------------------------------------------------------- 1 | "C:\Program Files (x86)\AMD\CodeXL\CodeXLAnalyzer.exe" -c Hawaii -f VShader -s HLSL -p vs_5_0 --il vs_il.txt vs.hlsl 2 | "C:\Program Files (x86)\AMD\CodeXL\CodeXLAnalyzer.exe" -c Hawaii -f PShader -s HLSL -p ps_5_0 --il ps_il.txt ps.hlsl 3 | pause -------------------------------------------------------------------------------- /shaders/output2binary.py: -------------------------------------------------------------------------------- 1 | import re 2 | import sys 3 | 4 | with open(sys.argv[1]) as f: 5 | lines = f.readlines() 6 | 7 | lines = filter(lambda l: '//' in l, lines) 8 | lines = map(lambda l: l.strip().split(': ')[1].split(' '), lines) 9 | lines = map(lambda l: ''.join(reversed(l)), lines) 10 | lines = map(lambda l: re.findall('..', l)[::-1], lines) 11 | lines = map(lambda l: map(lambda b: chr(int(b, 16)), l), lines) 12 | 13 | code = ''.join(reduce(lambda a, b: a + b, lines, [])) 14 | 15 | with open('il.bin', 'w') as f: 16 | f.write(code) 17 | -------------------------------------------------------------------------------- /shaders/ps.bin: -------------------------------------------------------------------------------- 1 | ]~F!}"G!GbUD2s( -------------------------------------------------------------------------------- /shaders/ps.hlsl: -------------------------------------------------------------------------------- 1 | float4 PShader(float4 position : SV_POSITION, float4 color : COLOR) : SV_TARGET { 2 | return color; 3 | } -------------------------------------------------------------------------------- /shaders/vs.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Overv/MantleHelloTriangle/f375f171cb217e71612a6b9142e39b171b098dba/shaders/vs.bin -------------------------------------------------------------------------------- /shaders/vs.hlsl: -------------------------------------------------------------------------------- 1 | struct VOut { 2 | float4 position : SV_POSITION; 3 | float4 color : COLOR; 4 | }; 5 | 6 | Buffer positions : register(t0); 7 | Buffer colors : register(t1); 8 | 9 | VOut VShader(uint id : SV_VertexID) { 10 | VOut output; 11 | 12 | output.position = positions.Load(id); 13 | output.color = colors.Load(id); 14 | 15 | return output; 16 | } -------------------------------------------------------------------------------- /src/main.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | 6 | #include 7 | 8 | #include "mantle.h" 9 | 10 | const int WIDTH = 1280; 11 | const int HEIGHT = 720; 12 | 13 | float vertices[] = { 14 | // Positions 15 | 0.0, 0.5, 0.0, 1.0, 16 | 0.5, -0.5, 0.0, 1.0, 17 | -0.5, -0.5, 0.0, 1.0, 18 | 19 | // Colors 20 | 1.0, 0.0, 0.0, 1.0, 21 | 0.0, 1.0, 0.0, 1.0, 22 | 0.0, 0.0, 1.0, 1.0 23 | }; 24 | 25 | GR_CMD_BUFFER_CREATE_INFO bufferCreateInfo = {GR_QUEUE_UNIVERSAL, 0}; 26 | 27 | GR_MSAA_STATE_OBJECT msaaState; 28 | GR_VIEWPORT_STATE_OBJECT viewportState; 29 | GR_COLOR_BLEND_STATE_OBJECT colorBlendState; 30 | GR_DEPTH_STENCIL_STATE_OBJECT depthStencilState; 31 | GR_RASTER_STATE_OBJECT rasterState; 32 | 33 | GR_VOID GR_STDCALL debugCallback(GR_ENUM type, GR_ENUM level, GR_BASE_OBJECT obj, GR_SIZE location, GR_ENUM msgCode, const GR_CHAR* msg, GR_VOID* userData) { 34 | std::cerr << "DEBUG: " << msg << std::endl; 35 | } 36 | 37 | std::vector loadShader(const std::string& filename) { 38 | std::ifstream file(filename, std::ios::binary | std::ios::ate); 39 | 40 | auto size = file.tellg(); 41 | file.seekg(0, std::ios::beg); 42 | 43 | std::vector data; 44 | data.resize(size); 45 | file.read(&data[0], size); 46 | 47 | file.close(); 48 | 49 | return data; 50 | } 51 | 52 | GR_MEMORY_REF allocateObjectMemory(GR_DEVICE device, GR_OBJECT object) { 53 | GR_MEMORY_REQUIREMENTS memReqs = {}; 54 | GR_SIZE memReqsSize = sizeof(memReqs); 55 | grGetObjectInfo(object, GR_INFO_TYPE_MEMORY_REQUIREMENTS, &memReqsSize, &memReqs); 56 | 57 | GR_MEMORY_HEAP_PROPERTIES heapProps = {}; 58 | GR_SIZE heapPropsSize = sizeof(heapProps); 59 | grGetMemoryHeapInfo(device, memReqs.heaps[0], GR_INFO_TYPE_MEMORY_HEAP_PROPERTIES, &heapPropsSize, &heapProps); 60 | 61 | GR_GPU_MEMORY memory; 62 | GR_MEMORY_ALLOC_INFO allocInfo = {}; 63 | allocInfo.size = (1 + memReqs.size / heapProps.pageSize) * heapProps.pageSize; 64 | allocInfo.alignment = 0; 65 | allocInfo.memPriority = GR_MEMORY_PRIORITY_HIGH; 66 | allocInfo.heapCount = 1; 67 | allocInfo.heaps[0] = memReqs.heaps[0]; 68 | grAllocMemory(device, &allocInfo, &memory); 69 | 70 | grBindObjectMemory(object, memory, 0); 71 | 72 | GR_MEMORY_REF memoryRef = {}; 73 | memoryRef.mem = memory; 74 | 75 | return memoryRef; 76 | } 77 | 78 | GR_GPU_MEMORY allocateMappableBuffer(GR_DEVICE device, GR_GPU_SIZE size) { 79 | // Find CPU visible (mappable) heap 80 | GR_UINT heapCount; 81 | grGetMemoryHeapCount(device, &heapCount); 82 | 83 | GR_MEMORY_HEAP_PROPERTIES heapProps = {}; 84 | GR_SIZE heapPropsSize = sizeof(heapProps); 85 | GR_UINT suitableHeap = -1; 86 | 87 | for (int i = 0; i < heapCount; i++) { 88 | grGetMemoryHeapInfo(device, i, GR_INFO_TYPE_MEMORY_HEAP_PROPERTIES, &heapPropsSize, &heapProps); 89 | 90 | if (heapProps.flags & GR_MEMORY_HEAP_CPU_VISIBLE) { 91 | suitableHeap = i; 92 | break; 93 | } 94 | } 95 | 96 | // Allocate buffer in that heap with multiple of page size >= size 97 | GR_GPU_MEMORY memory; 98 | GR_MEMORY_ALLOC_INFO allocInfo = {}; 99 | allocInfo.size = (1 + size / heapProps.pageSize) * heapProps.pageSize; 100 | allocInfo.alignment = 0; 101 | allocInfo.memPriority = GR_MEMORY_PRIORITY_HIGH; 102 | allocInfo.heapCount = 1; 103 | allocInfo.heaps[0] = suitableHeap; 104 | grAllocMemory(device, &allocInfo, &memory); 105 | 106 | return memory; 107 | } 108 | 109 | void createDeviceAndQueue(GR_DEVICE& device, GR_QUEUE& universalQueue) { 110 | // Find Mantle compatible GPU handles 111 | GR_APPLICATION_INFO appInfo = {}; 112 | appInfo.apiVersion = GR_API_VERSION; 113 | 114 | GR_PHYSICAL_GPU gpus[GR_MAX_PHYSICAL_GPUS] = {}; 115 | GR_UINT gpuCount = 0; 116 | 117 | grInitAndEnumerateGpus(&appInfo, nullptr, &gpuCount, gpus); 118 | 119 | // Create device from first compatible GPU 120 | GR_DEVICE_QUEUE_CREATE_INFO queueInfo = {}; 121 | queueInfo.queueType = GR_QUEUE_UNIVERSAL; 122 | queueInfo.queueCount = 1; 123 | 124 | assert(grGetExtensionSupport(gpus[0], "GR_WSI_WINDOWS") == GR_SUCCESS); 125 | 126 | static const GR_CHAR* const ppExtensions[] = { 127 | "GR_WSI_WINDOWS", 128 | }; 129 | 130 | GR_DEVICE_CREATE_INFO deviceInfo = {}; 131 | deviceInfo.queueRecordCount = 1; 132 | deviceInfo.pRequestedQueues = &queueInfo; 133 | deviceInfo.extensionCount = 1; 134 | deviceInfo.ppEnabledExtensionNames = ppExtensions; 135 | deviceInfo.flags |= GR_DEVICE_CREATE_VALIDATION; 136 | deviceInfo.maxValidationLevel = GR_VALIDATION_LEVEL_4; 137 | 138 | grCreateDevice(gpus[0], &deviceInfo, &device); 139 | 140 | grGetDeviceQueue(device, GR_QUEUE_UNIVERSAL, 0, &universalQueue); 141 | } 142 | 143 | void initPresentableImage(GR_DEVICE device, GR_QUEUE commandQueue, GR_IMAGE& image, GR_MEMORY_REF& imageMemoryRef, GR_IMAGE_SUBRESOURCE_RANGE& imageColorRange) { 144 | // Create image that can be presented 145 | GR_WSI_WIN_PRESENTABLE_IMAGE_CREATE_INFO imageCreateInfo = {}; 146 | imageCreateInfo.format = { 147 | GR_CH_FMT_R8G8B8A8, 148 | GR_NUM_FMT_UNORM 149 | }; 150 | imageCreateInfo.usage = GR_IMAGE_USAGE_COLOR_TARGET; 151 | imageCreateInfo.extent = {WIDTH, HEIGHT}; 152 | 153 | GR_GPU_MEMORY imageMemory; 154 | grWsiWinCreatePresentableImage(device, &imageCreateInfo, &image, &imageMemory); 155 | 156 | imageMemoryRef = {}; 157 | imageMemoryRef.mem = imageMemory; 158 | 159 | imageColorRange = {}; 160 | imageColorRange.aspect = GR_IMAGE_ASPECT_COLOR; 161 | imageColorRange.baseMipLevel = 0; 162 | imageColorRange.mipLevels = 1; 163 | imageColorRange.baseArraySlice = 0; 164 | imageColorRange.arraySize = 1; 165 | 166 | // Create and submit command buffer that transitions the image to being presentable 167 | GR_CMD_BUFFER initCmdBuffer; 168 | grCreateCommandBuffer(device, &bufferCreateInfo, &initCmdBuffer); 169 | 170 | grBeginCommandBuffer(initCmdBuffer, 0); 171 | 172 | GR_IMAGE_STATE_TRANSITION initTransition = {}; 173 | initTransition.image = image; 174 | initTransition.oldState = GR_IMAGE_STATE_UNINITIALIZED; 175 | initTransition.newState = GR_WSI_WIN_IMAGE_STATE_PRESENT_WINDOWED; 176 | initTransition.subresourceRange = imageColorRange; 177 | 178 | grCmdPrepareImages(initCmdBuffer, 1, &initTransition); 179 | 180 | grEndCommandBuffer(initCmdBuffer); 181 | 182 | grQueueSubmit(commandQueue, 1, &initCmdBuffer, 1, &imageMemoryRef, 0); 183 | } 184 | 185 | void createTargetStates(GR_DEVICE device, GR_MSAA_STATE_OBJECT& msaaState, GR_VIEWPORT_STATE_OBJECT& viewportState, 186 | GR_COLOR_BLEND_STATE_OBJECT& colorBlendState, GR_DEPTH_STENCIL_STATE_OBJECT& depthStencilState, GR_RASTER_STATE_OBJECT& rasterState) { 187 | 188 | // Create target states 189 | GR_MSAA_STATE_CREATE_INFO msaaStateCreateInfo = {}; 190 | msaaStateCreateInfo.samples = 1; 191 | msaaStateCreateInfo.sampleMask = 0xF; // RGBA bits 192 | 193 | grCreateMsaaState(device, &msaaStateCreateInfo, &msaaState); 194 | 195 | GR_VIEWPORT_STATE_CREATE_INFO viewportStateCreateInfo = {}; 196 | viewportStateCreateInfo.viewportCount = 1; 197 | viewportStateCreateInfo.scissorEnable = GR_FALSE; 198 | viewportStateCreateInfo.viewports[0].width = WIDTH; 199 | viewportStateCreateInfo.viewports[0].height = HEIGHT; 200 | viewportStateCreateInfo.viewports[0].minDepth = 0; 201 | viewportStateCreateInfo.viewports[0].maxDepth = 1; 202 | 203 | grCreateViewportState(device, &viewportStateCreateInfo, &viewportState); 204 | 205 | GR_COLOR_BLEND_STATE_CREATE_INFO blendStateCreateInfo = {}; 206 | blendStateCreateInfo.target[0].blendEnable = GR_TRUE; 207 | blendStateCreateInfo.target[0].srcBlendColor = GR_BLEND_SRC_ALPHA; 208 | blendStateCreateInfo.target[0].destBlendColor = GR_BLEND_ONE_MINUS_SRC_ALPHA; 209 | blendStateCreateInfo.target[0].blendFuncColor = GR_BLEND_FUNC_ADD; 210 | 211 | blendStateCreateInfo.target[0].srcBlendAlpha = GR_BLEND_ONE; 212 | blendStateCreateInfo.target[0].destBlendAlpha = GR_BLEND_ONE; 213 | blendStateCreateInfo.target[0].blendFuncAlpha = GR_BLEND_FUNC_ADD; 214 | 215 | grCreateColorBlendState(device, &blendStateCreateInfo, &colorBlendState); 216 | 217 | GR_DEPTH_STENCIL_STATE_CREATE_INFO depthStencilStateCreateInfo = {}; 218 | depthStencilStateCreateInfo.depthEnable = GR_FALSE; 219 | depthStencilStateCreateInfo.stencilEnable = GR_FALSE; 220 | depthStencilStateCreateInfo.depthFunc = GR_COMPARE_LESS; 221 | 222 | depthStencilStateCreateInfo.front.stencilDepthFailOp = GR_STENCIL_OP_KEEP; 223 | depthStencilStateCreateInfo.front.stencilFailOp = GR_STENCIL_OP_KEEP; 224 | depthStencilStateCreateInfo.front.stencilPassOp = GR_STENCIL_OP_KEEP; 225 | depthStencilStateCreateInfo.front.stencilFunc = GR_COMPARE_ALWAYS; 226 | depthStencilStateCreateInfo.front.stencilRef = 0; 227 | 228 | depthStencilStateCreateInfo.back.stencilDepthFailOp = GR_STENCIL_OP_KEEP; 229 | depthStencilStateCreateInfo.back.stencilFailOp = GR_STENCIL_OP_KEEP; 230 | depthStencilStateCreateInfo.back.stencilPassOp = GR_STENCIL_OP_KEEP; 231 | depthStencilStateCreateInfo.back.stencilFunc = GR_COMPARE_ALWAYS; 232 | depthStencilStateCreateInfo.back.stencilRef = 0; 233 | 234 | grCreateDepthStencilState(device, &depthStencilStateCreateInfo, &depthStencilState); 235 | 236 | GR_RASTER_STATE_CREATE_INFO rasterStateCreateInfo = {}; 237 | rasterStateCreateInfo.fillMode = GR_FILL_SOLID; 238 | rasterStateCreateInfo.cullMode = GR_CULL_NONE; 239 | rasterStateCreateInfo.frontFace = GR_FRONT_FACE_CCW; 240 | 241 | grCreateRasterState(device, &rasterStateCreateInfo, &rasterState); 242 | } 243 | 244 | GR_SHADER createShader(GR_DEVICE device, const std::string& filename) { 245 | GR_SHADER shader; 246 | GR_SHADER_CREATE_INFO shaderCreateInfo = {}; 247 | 248 | auto vertexShaderCode = loadShader(filename); 249 | 250 | shaderCreateInfo.pCode = vertexShaderCode.data(); 251 | shaderCreateInfo.codeSize = vertexShaderCode.size(); 252 | 253 | grCreateShader(device, &shaderCreateInfo, &shader); 254 | 255 | return shader; 256 | } 257 | 258 | void createGraphicsPipeline(GR_DEVICE device, GR_PIPELINE& pipeline, GR_MEMORY_REF& pipelineMemRef) { 259 | // Load shaders 260 | GR_SHADER vertexShader = createShader(device, "shaders/vs.bin"); 261 | GR_SHADER fragShader = createShader(device, "shaders/ps.bin"); 262 | 263 | // Specify descriptor slots 264 | GR_DESCRIPTOR_SLOT_INFO vsDescriptorSlots[2]; 265 | 266 | vsDescriptorSlots[0].slotObjectType = GR_SLOT_SHADER_RESOURCE; 267 | vsDescriptorSlots[0].shaderEntityIndex = 0; 268 | 269 | vsDescriptorSlots[1].slotObjectType = GR_SLOT_SHADER_RESOURCE; 270 | vsDescriptorSlots[1].shaderEntityIndex = 1; 271 | 272 | GR_DESCRIPTOR_SLOT_INFO psDescriptorSlots[2]; 273 | 274 | psDescriptorSlots[0].slotObjectType = GR_SLOT_UNUSED; 275 | psDescriptorSlots[1].slotObjectType = GR_SLOT_UNUSED; 276 | 277 | // Create graphics pipeline 278 | GR_GRAPHICS_PIPELINE_CREATE_INFO pipelineCreateInfo = {}; 279 | 280 | pipelineCreateInfo.vs.shader = vertexShader; 281 | pipelineCreateInfo.vs.dynamicMemoryViewMapping.slotObjectType = GR_SLOT_UNUSED; 282 | pipelineCreateInfo.vs.descriptorSetMapping[0].descriptorCount = 2; 283 | pipelineCreateInfo.vs.descriptorSetMapping[0].pDescriptorInfo = vsDescriptorSlots; 284 | 285 | pipelineCreateInfo.ps.shader = fragShader; 286 | pipelineCreateInfo.ps.dynamicMemoryViewMapping.slotObjectType = GR_SLOT_UNUSED; 287 | pipelineCreateInfo.ps.descriptorSetMapping[0].descriptorCount = 2; 288 | pipelineCreateInfo.ps.descriptorSetMapping[0].pDescriptorInfo = psDescriptorSlots; 289 | 290 | pipelineCreateInfo.iaState.topology = GR_TOPOLOGY_TRIANGLE_LIST; 291 | pipelineCreateInfo.iaState.disableVertexReuse = GR_FALSE; 292 | 293 | pipelineCreateInfo.rsState.depthClipEnable = GR_FALSE; 294 | 295 | pipelineCreateInfo.cbState.logicOp = GR_LOGIC_OP_COPY; 296 | pipelineCreateInfo.cbState.target[0].blendEnable = GR_TRUE; 297 | pipelineCreateInfo.cbState.target[0].channelWriteMask = 0xF; // RGBA bits 298 | pipelineCreateInfo.cbState.target[0].format.channelFormat = GR_CH_FMT_R8G8B8A8; 299 | pipelineCreateInfo.cbState.target[0].format.numericFormat = GR_NUM_FMT_UNORM; 300 | 301 | pipelineCreateInfo.dbState.format.channelFormat = GR_CH_FMT_UNDEFINED; 302 | pipelineCreateInfo.dbState.format.numericFormat = GR_NUM_FMT_UNDEFINED; 303 | 304 | grCreateGraphicsPipeline(device, &pipelineCreateInfo, &pipeline); 305 | 306 | pipelineMemRef = allocateObjectMemory(device, pipeline); 307 | } 308 | 309 | void initDescriptorSet(GR_DEVICE device, GR_QUEUE commandQueue, GR_DESCRIPTOR_SET& descriptorSet, GR_MEMORY_REF& descriptorMemRef, GR_MEMORY_REF& vertexDataMemRef) { 310 | // Create descriptor set for vertex shader inputs 311 | GR_DESCRIPTOR_SET_CREATE_INFO descriptorCreateInfo = {}; 312 | descriptorCreateInfo.slots = 2; 313 | 314 | grCreateDescriptorSet(device, &descriptorCreateInfo, &descriptorSet); 315 | 316 | descriptorMemRef = allocateObjectMemory(device, descriptorSet); 317 | 318 | // Store vertex data in GPU memory 319 | GR_GPU_MEMORY vertexDataMemory = allocateMappableBuffer(device, sizeof(vertices)); 320 | 321 | void* bufferPointer; 322 | grMapMemory(vertexDataMemory, 0, &bufferPointer); 323 | memcpy(bufferPointer, vertices, sizeof(vertices)); 324 | grUnmapMemory(vertexDataMemory); 325 | 326 | vertexDataMemRef = {}; 327 | vertexDataMemRef.mem = vertexDataMemory; 328 | 329 | // Create and submit command buffer that transitions vertex data memory to being shader accessible 330 | GR_CMD_BUFFER initDataCmdBuffer; 331 | grCreateCommandBuffer(device, &bufferCreateInfo, &initDataCmdBuffer); 332 | 333 | grBeginCommandBuffer(initDataCmdBuffer, 0); 334 | 335 | GR_MEMORY_STATE_TRANSITION dataTransition = {}; 336 | dataTransition.mem = vertexDataMemory; 337 | dataTransition.oldState = GR_MEMORY_STATE_DATA_TRANSFER; 338 | dataTransition.newState = GR_MEMORY_STATE_GRAPHICS_SHADER_READ_ONLY; 339 | dataTransition.offset = 0; 340 | dataTransition.regionSize = sizeof(vertices); 341 | 342 | grCmdPrepareMemoryRegions(initDataCmdBuffer, 1, &dataTransition); 343 | 344 | grEndCommandBuffer(initDataCmdBuffer); 345 | 346 | grQueueSubmit(commandQueue, 1, &initDataCmdBuffer, 1, &vertexDataMemRef, 0); 347 | 348 | // Attach views to the vertex data to the descriptor set 349 | grBeginDescriptorSetUpdate(descriptorSet); 350 | 351 | GR_MEMORY_VIEW_ATTACH_INFO memoryViewAttachInfo = {}; 352 | memoryViewAttachInfo.mem = vertexDataMemory; 353 | memoryViewAttachInfo.offset = 0; 354 | memoryViewAttachInfo.stride = sizeof(float) * 4; 355 | memoryViewAttachInfo.range = sizeof(float) * 12; 356 | memoryViewAttachInfo.format.channelFormat = GR_CH_FMT_R32G32B32A32; 357 | memoryViewAttachInfo.format.numericFormat = GR_NUM_FMT_FLOAT; 358 | memoryViewAttachInfo.state = GR_MEMORY_STATE_GRAPHICS_SHADER_READ_ONLY; 359 | 360 | grAttachMemoryViewDescriptors(descriptorSet, 0, 1, &memoryViewAttachInfo); 361 | 362 | memoryViewAttachInfo.offset = sizeof(float) * 12; 363 | memoryViewAttachInfo.range = sizeof(float) * 12; 364 | 365 | grAttachMemoryViewDescriptors(descriptorSet, 1, 1, &memoryViewAttachInfo); 366 | 367 | grEndDescriptorSetUpdate(descriptorSet); 368 | } 369 | 370 | GR_CMD_BUFFER createPrepareBuffer(GR_DEVICE device, GR_IMAGE presentableImage, GR_IMAGE_SUBRESOURCE_RANGE imageColorRange) { 371 | // Create command buffer that prepares the color target image for rendering 372 | GR_CMD_BUFFER buffer; 373 | grCreateCommandBuffer(device, &bufferCreateInfo, &buffer); 374 | 375 | grBeginCommandBuffer(buffer, 0); 376 | 377 | GR_IMAGE_STATE_TRANSITION transition = {}; 378 | transition.image = presentableImage; 379 | transition.oldState = GR_WSI_WIN_IMAGE_STATE_PRESENT_WINDOWED; 380 | transition.newState = GR_IMAGE_STATE_TARGET_RENDER_ACCESS_OPTIMAL; 381 | transition.subresourceRange = imageColorRange; 382 | 383 | grCmdPrepareImages(buffer, 1, &transition); 384 | 385 | grEndCommandBuffer(buffer); 386 | 387 | return buffer; 388 | } 389 | 390 | GR_CMD_BUFFER createClearBuffer(GR_DEVICE device, GR_IMAGE presentableImage, GR_IMAGE_SUBRESOURCE_RANGE imageColorRange) { 391 | // Create command buffer that clears the color target to black 392 | GR_CMD_BUFFER buffer; 393 | grCreateCommandBuffer(device, &bufferCreateInfo, &buffer); 394 | 395 | grBeginCommandBuffer(buffer, 0); 396 | 397 | GR_IMAGE_STATE_TRANSITION transition = {}; 398 | transition.image = presentableImage; 399 | transition.oldState = GR_IMAGE_STATE_TARGET_RENDER_ACCESS_OPTIMAL; 400 | transition.newState = GR_IMAGE_STATE_CLEAR; 401 | transition.subresourceRange = imageColorRange; 402 | 403 | grCmdPrepareImages(buffer, 1, &transition); 404 | 405 | float clearColor[] = {0.0, 0.0, 0.0, 1.0}; 406 | grCmdClearColorImage(buffer, presentableImage, clearColor, 1, &imageColorRange); 407 | 408 | transition.image = presentableImage; 409 | transition.oldState = GR_IMAGE_STATE_CLEAR; 410 | transition.newState = GR_IMAGE_STATE_TARGET_RENDER_ACCESS_OPTIMAL; 411 | transition.subresourceRange = imageColorRange; 412 | 413 | grCmdPrepareImages(buffer, 1, &transition); 414 | 415 | grEndCommandBuffer(buffer); 416 | 417 | return buffer; 418 | } 419 | 420 | GR_CMD_BUFFER createDrawTriangleBuffer(GR_DEVICE device, GR_COLOR_TARGET_VIEW colorTargetView, GR_DESCRIPTOR_SET descriptorSet, GR_PIPELINE pipeline) { 421 | // Create command buffer that renders the triangle 422 | GR_CMD_BUFFER buffer; 423 | grCreateCommandBuffer(device, &bufferCreateInfo, &buffer); 424 | 425 | grBeginCommandBuffer(buffer, 0); 426 | 427 | // Bind render target 428 | GR_COLOR_TARGET_BIND_INFO colorTargetBindInfo; 429 | colorTargetBindInfo.view = colorTargetView; 430 | colorTargetBindInfo.colorTargetState = GR_IMAGE_STATE_TARGET_RENDER_ACCESS_OPTIMAL; 431 | 432 | grCmdBindTargets(buffer, 1, &colorTargetBindInfo, nullptr); 433 | 434 | // Set up dynamic draw state 435 | grCmdBindStateObject(buffer, GR_STATE_BIND_MSAA, msaaState); 436 | grCmdBindStateObject(buffer, GR_STATE_BIND_VIEWPORT, viewportState); 437 | grCmdBindStateObject(buffer, GR_STATE_BIND_COLOR_BLEND, colorBlendState); 438 | grCmdBindStateObject(buffer, GR_STATE_BIND_DEPTH_STENCIL, depthStencilState); 439 | grCmdBindStateObject(buffer, GR_STATE_BIND_RASTER, rasterState); 440 | 441 | // Bind descriptor set 442 | grCmdBindDescriptorSet(buffer, GR_PIPELINE_BIND_POINT_GRAPHICS, 0, descriptorSet, 0); 443 | 444 | // Set graphics pipeline 445 | grCmdBindPipeline(buffer, GR_PIPELINE_BIND_POINT_GRAPHICS, pipeline); 446 | 447 | // Render triangle 448 | grCmdDraw(buffer, 0, 3, 0, 1); 449 | 450 | grEndCommandBuffer(buffer); 451 | 452 | return buffer; 453 | } 454 | 455 | GR_CMD_BUFFER createFinishBuffer(GR_DEVICE device, GR_IMAGE presentableImage, GR_IMAGE_SUBRESOURCE_RANGE imageColorRange) { 456 | // Create command buffer that transitions color target image back to a presentable state 457 | GR_CMD_BUFFER buffer; 458 | grCreateCommandBuffer(device, &bufferCreateInfo, &buffer); 459 | 460 | grBeginCommandBuffer(buffer, 0); 461 | 462 | GR_IMAGE_STATE_TRANSITION transition = {}; 463 | transition.image = presentableImage; 464 | transition.oldState = GR_IMAGE_STATE_TARGET_RENDER_ACCESS_OPTIMAL; 465 | transition.newState = GR_WSI_WIN_IMAGE_STATE_PRESENT_WINDOWED; 466 | transition.subresourceRange = imageColorRange; 467 | 468 | grCmdPrepareImages(buffer, 1, &transition); 469 | 470 | grEndCommandBuffer(buffer); 471 | 472 | return buffer; 473 | } 474 | 475 | int main(int argc, char *args[]) { 476 | // Initialize function pointers, much like GLEW in OpenGL 477 | mantleLoadFunctions(); 478 | 479 | // Set debug callback 480 | grDbgRegisterMsgCallback(debugCallback, nullptr); 481 | 482 | // Create device and presentable image 483 | GR_DEVICE device; 484 | GR_QUEUE universalQueue; 485 | createDeviceAndQueue(device, universalQueue); 486 | 487 | GR_IMAGE presentableImage; 488 | GR_MEMORY_REF presentableImageMemRef; 489 | GR_IMAGE_SUBRESOURCE_RANGE imageColorRange; 490 | initPresentableImage(device, universalQueue, presentableImage, presentableImageMemRef, imageColorRange); 491 | 492 | // Create window to present to 493 | SDL_Init(SDL_INIT_VIDEO); 494 | 495 | SDL_Window* window = SDL_CreateWindow("Mantle Hello Triangle", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, WIDTH, HEIGHT, 0); 496 | 497 | GR_WSI_WIN_PRESENT_INFO presentInfo = {}; 498 | presentInfo.hWndDest = GetActiveWindow(); 499 | presentInfo.srcImage = presentableImage; 500 | presentInfo.presentMode = GR_WSI_WIN_PRESENT_MODE_WINDOWED; 501 | 502 | // Create color target view 503 | GR_COLOR_TARGET_VIEW colorTargetView; 504 | GR_COLOR_TARGET_VIEW_CREATE_INFO colorTargetViewCreateInfo = {}; 505 | colorTargetViewCreateInfo.image = presentableImage; 506 | colorTargetViewCreateInfo.arraySize = 1; 507 | colorTargetViewCreateInfo.baseArraySlice = 0; 508 | colorTargetViewCreateInfo.mipLevel = 0; 509 | colorTargetViewCreateInfo.format.channelFormat = GR_CH_FMT_R8G8B8A8; 510 | colorTargetViewCreateInfo.format.numericFormat = GR_NUM_FMT_UNORM; 511 | 512 | grCreateColorTargetView(device, &colorTargetViewCreateInfo, &colorTargetView); 513 | 514 | // Create dynamic states (viewport, depth/stencil operations, etc.) 515 | createTargetStates(device, msaaState, viewportState, colorBlendState, depthStencilState, rasterState); 516 | 517 | // Create graphics pipeline with shaders and descriptor bindings 518 | GR_PIPELINE pipeline; 519 | GR_MEMORY_REF pipelineMemRef; 520 | createGraphicsPipeline(device, pipeline, pipelineMemRef); 521 | 522 | // Set up descriptor set with vertex data memory views 523 | GR_DESCRIPTOR_SET descriptorSet; 524 | GR_MEMORY_REF descriptorMemRef, vertexDataMemRef; 525 | initDescriptorSet(device, universalQueue, descriptorSet, descriptorMemRef, vertexDataMemRef); 526 | 527 | // Create command buffers for rendering steps 528 | GR_CMD_BUFFER bufferPrepareRender = createPrepareBuffer(device, presentableImage, imageColorRange); 529 | GR_CMD_BUFFER bufferClear = createClearBuffer(device, presentableImage, imageColorRange); 530 | GR_CMD_BUFFER bufferDrawTriangle = createDrawTriangleBuffer(device, colorTargetView, descriptorSet, pipeline); 531 | GR_CMD_BUFFER bufferFinish = createFinishBuffer(device, presentableImage, imageColorRange); 532 | 533 | // Create fence for CPU synchronization with rendering 534 | GR_FENCE fence; 535 | GR_FENCE_CREATE_INFO fenceCreateInfo = {}; 536 | grCreateFence(device, &fenceCreateInfo, &fence); 537 | 538 | // Main loop 539 | while (true) { 540 | SDL_Event windowEvent; 541 | if (SDL_PollEvent(&windowEvent)) { 542 | if (windowEvent.type == SDL_QUIT) break; 543 | } 544 | 545 | // Wait for previous frame to end 546 | grWaitForFences(device, 1, &fence, true, 1); 547 | 548 | // Submit command buffers along with memory references 549 | GR_MEMORY_REF memoryRefs[] = {presentableImageMemRef, pipelineMemRef, descriptorMemRef, vertexDataMemRef}; 550 | GR_CMD_BUFFER commandBuffers[] = {bufferPrepareRender, bufferClear, bufferDrawTriangle, bufferFinish}; 551 | 552 | grQueueSubmit(universalQueue, 4, commandBuffers, 4, memoryRefs, fence); 553 | 554 | // Present image to the window 555 | grWsiWinQueuePresent(universalQueue, &presentInfo); 556 | } 557 | 558 | return 0; 559 | } 560 | --------------------------------------------------------------------------------