├── .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 | 
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 ! G b U D 2 s (
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------