ReShade
A generic post-processing injector for games and video software.
reshade_api_resource.hpp
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2021 Patrick Mours
3  * SPDX-License-Identifier: BSD-3-Clause OR MIT
4  */
5 
6 #pragma once
7 
8 #define RESHADE_DEFINE_HANDLE(name) \
9  typedef struct { uint64_t handle; } name; \
10  constexpr bool operator< (name lhs, name rhs) { return lhs.handle < rhs.handle; } \
11  constexpr bool operator!=(name lhs, name rhs) { return lhs.handle != rhs.handle; } \
12  constexpr bool operator!=(name lhs, uint64_t rhs) { return lhs.handle != rhs; } \
13  constexpr bool operator==(name lhs, name rhs) { return lhs.handle == rhs.handle; } \
14  constexpr bool operator==(name lhs, uint64_t rhs) { return lhs.handle == rhs; }
15 
16 #define RESHADE_DEFINE_ENUM_FLAG_OPERATORS(type) \
17  constexpr type operator~(type a) { return static_cast<type>(~static_cast<uint32_t>(a)); } \
18  inline type &operator&=(type &a, type b) { return reinterpret_cast<type &>(reinterpret_cast<uint32_t &>(a) &= static_cast<uint32_t>(b)); } \
19  constexpr type operator&(type a, type b) { return static_cast<type>(static_cast<uint32_t>(a) & static_cast<uint32_t>(b)); } \
20  inline type &operator|=(type &a, type b) { return reinterpret_cast<type &>(reinterpret_cast<uint32_t &>(a) |= static_cast<uint32_t>(b)); } \
21  constexpr type operator|(type a, type b) { return static_cast<type>(static_cast<uint32_t>(a) | static_cast<uint32_t>(b)); } \
22  inline type &operator^=(type &a, type b) { return reinterpret_cast<type &>(reinterpret_cast<uint32_t &>(a) ^= static_cast<uint32_t>(b)); } \
23  constexpr type operator^(type a, type b) { return static_cast<type>(static_cast<uint32_t>(a) ^ static_cast<uint32_t>(b)); } \
24  constexpr bool operator==(type lhs, uint32_t rhs) { return static_cast<uint32_t>(lhs) == rhs; } \
25  constexpr bool operator!=(type lhs, uint32_t rhs) { return static_cast<uint32_t>(lhs) != rhs; }
26 
27 #include "reshade_api_format.hpp"
28 
29 namespace reshade { namespace api
30 {
34  enum class compare_op : uint32_t
35  {
36  never = 0,
37  less = 1,
38  equal = 2,
39  less_equal = 3,
40  greater = 4,
41  not_equal = 5,
42  greater_equal = 6,
43  always = 7
44  };
45 
49  enum class filter_mode : uint32_t
50  {
58  min_mag_mip_linear = 0x15,
60  anisotropic = 0x55,
70  compare_anisotropic = 0xd5
71  };
72 
76  enum class texture_address_mode : uint32_t
77  {
78  wrap = 1,
79  mirror = 2,
80  clamp = 3,
81  border = 4,
82  mirror_once = 5
83  };
84 
88  struct sampler_desc
89  {
109  float mip_lod_bias = 0.0f;
113  float max_anisotropy = 1.0f;
121  float border_color[4] = { 1.0f, 1.0f, 1.0f, 1.0f };
125  float min_lod = -FLT_MAX;
129  float max_lod = +FLT_MAX;
130  };
131 
147 
151  enum class map_access
152  {
153  read_only = 1,
154  write_only,
155  read_write,
157  };
158 
162  enum class memory_heap : uint32_t
163  {
164  unknown, // Usually indicates a resource that is reserved, but not yet bound to any memory.
165  gpu_only,
166  // Upload heap
167  cpu_to_gpu,
168  // Readback heap
169  gpu_to_cpu,
170  cpu_only,
171  custom
172  };
173 
178  enum class resource_type : uint32_t
179  {
180  unknown,
181  buffer,
182  texture_1d,
183  texture_2d,
184  texture_3d,
185  surface // Special type for resources that are implicitly both resource and render target view.
186  };
187 
191  enum class resource_flags : uint32_t
192  {
193  none = 0,
198  dynamic = (1 << 3),
203  immutable = (1 << 4),
207  cube_compatible = (1 << 2),
211  generate_mipmaps = (1 << 0),
216  shared = (1 << 1),
217  shared_nt_handle = (1 << 11),
221  sparse_binding = (1 << 18),
222  };
224 
229  enum class resource_usage : uint32_t
230  {
231  undefined = 0,
232 
233  index_buffer = 0x2,
234  vertex_buffer = 0x1,
235  constant_buffer = 0x8000,
236  stream_output = 0x100,
237  indirect_argument = 0x200,
238 
239  depth_stencil = 0x30,
240  depth_stencil_read = 0x20,
241  depth_stencil_write = 0x10,
242  render_target = 0x4,
243  shader_resource = 0xC0,
244  shader_resource_pixel = 0x80,
246  unordered_access = 0x8,
247 
248  copy_dest = 0x400,
249  copy_source = 0x800,
250  resolve_dest = 0x1000,
251  resolve_source = 0x2000,
252 
253  acceleration_structure = 0x400000,
254 
255  // The following are special resource states and may only be used in barriers:
256 
257  general = 0x80000000,
258  present = 0x80000000 | render_target | copy_source,
260  };
262 
266  struct [[nodiscard]] resource_desc
267  {
268  constexpr resource_desc() : texture({ 0, 0, 0, 0, format::unknown, 0 }) {}
269  constexpr resource_desc(uint64_t size, memory_heap heap, resource_usage usage, resource_flags flags = resource_flags::none) :
270  type(resource_type::buffer), buffer({ size }), heap(heap), usage(usage), flags(flags) {}
271  constexpr resource_desc(uint32_t width, uint32_t height, uint16_t layers, uint16_t levels, format format, uint16_t samples, memory_heap heap, resource_usage usage, resource_flags flags = resource_flags::none) :
272  type(resource_type::texture_2d), texture({ width, height, layers, levels, format, samples }), heap(heap), usage(usage), flags(flags) {}
273  constexpr resource_desc(resource_type type, uint32_t width, uint32_t height, uint16_t depth_or_layers, uint16_t levels, format format, uint16_t samples, memory_heap heap, resource_usage usage, resource_flags flags = resource_flags::none) :
274  type(type), texture({ width, height, depth_or_layers, levels, format, samples }), heap(heap), usage(usage), flags(flags) {}
275 
280 
281  union
282  {
286  struct
287  {
291  uint64_t size = 0;
295  uint32_t stride = 0;
297 
301  struct
302  {
306  uint32_t width = 1;
310  uint32_t height = 1;
314  uint16_t depth_or_layers = 1;
319  uint16_t levels = 1;
327  uint16_t samples = 1;
328  } texture;
329  };
330 
344  };
345 
362 
366  enum class resource_view_type : uint32_t
367  {
368  unknown,
369  buffer,
370  texture_1d,
372  texture_2d,
376  texture_3d,
377  texture_cube,
380  };
381 
385  struct [[nodiscard]] resource_view_desc
386  {
387  constexpr resource_view_desc() : texture({ 0, 0, 0, 0 }) {}
388  constexpr resource_view_desc(format format, uint64_t offset, uint64_t size) :
389  type(resource_view_type::buffer), format(format), buffer({ offset, size }) {}
390  constexpr resource_view_desc(format format, uint32_t first_level, uint32_t levels, uint32_t first_layer, uint32_t layers) :
391  type(resource_view_type::texture_2d), format(format), texture({ first_level, levels, first_layer, layers }) {}
392  constexpr resource_view_desc(resource_view_type type, format format, uint64_t offset, uint64_t size) :
393  type(type), format(format), buffer({ offset, size }) {}
394  constexpr resource_view_desc(resource_view_type type, format format, uint32_t first_level, uint32_t levels, uint32_t first_layer, uint32_t layers) :
395  type(type), format(format), texture({ first_level, levels, first_layer, layers }) {}
396  constexpr explicit resource_view_desc(format format) : type(resource_view_type::texture_2d), format(format), texture({ 0, 1, 0, 1 }) {}
397 
406 
407  union
408  {
412  struct
413  {
417  uint64_t offset = 0;
422  uint64_t size = UINT64_MAX;
424 
428  struct
429  {
433  uint32_t first_level = 0;
438  uint32_t level_count = UINT32_MAX;
442  uint32_t first_layer = 0;
447  uint32_t layer_count = UINT32_MAX;
448  } texture;
449  };
450  };
451 
468 
473  {
474  uint32_t left = 0;
475  uint32_t top = 0;
476  uint32_t front = 0;
477  uint32_t right = 0;
478  uint32_t bottom = 0;
479  uint32_t back = 0;
480 
481  constexpr uint32_t width() const { return right - left; }
482  constexpr uint32_t height() const { return bottom - top; }
483  constexpr uint32_t depth() const { return back - front; }
484  };
485 
490  {
494  void *data = nullptr;
499  uint32_t row_pitch = 0;
504  uint32_t slice_pitch = 0;
505  };
506 
510  enum class render_pass_load_op : uint32_t
511  {
512  load,
513  clear,
514  discard,
515  no_access
516  };
517 
521  enum class render_pass_store_op : uint32_t
522  {
523  store,
524  discard,
525  no_access
526  };
527 
532  {
556  float clear_depth = 0.0f;
560  uint8_t clear_stencil = 0;
561  };
562 
567  {
583  float clear_color[4] = { 0.0f, 0.0f, 0.0f, 0.0f };
584  };
585 
590  {
591  top_level = 0,
592  bottom_level = 1,
593  generic = 2
594  };
595 
600  {
601  clone = 0,
602  compact = 1,
603  serialize = 2,
604  deserialize = 3
605  };
606 
611  {
612  build = 0,
613  update = 1
614  };
615 
620  {
621  none = 0,
622  allow_update = (1 << 0),
623  allow_compaction = (1 << 1),
624  prefer_fast_trace = (1 << 2),
625  prefer_fast_build = (1 << 3),
626  minimize_memory_usage = (1 << 4)
627  };
629 
634  {
635  triangles = 0,
636  aabbs = 1,
637  instances = 2
638  };
639 
644  {
645  none = 0,
646  opaque = (1 << 0),
648  };
650 
656  {
657  float transform[3][4];
658  uint32_t custom_index : 24;
659  uint32_t mask : 8;
661  uint32_t flags : 8;
663  };
664 
669  {
671  constexpr acceleration_structure_build_input(api::resource vertex_buffer, uint64_t vertex_offset, uint32_t vertex_count, uint64_t vertex_stride, api::format vertex_format, api::resource index_buffer, uint64_t index_offset, uint32_t index_count, api::format index_format, uint64_t transform_address = 0) : type(acceleration_structure_build_input_type::triangles), triangles({ vertex_buffer, vertex_offset, vertex_count, vertex_stride, vertex_format, index_buffer, index_offset, index_count, index_format, transform_address }) {}
672  constexpr acceleration_structure_build_input(api::resource aabb_buffer, uint64_t aabb_offset, uint32_t aabb_count, uint64_t aabb_stride) : type(acceleration_structure_build_input_type::aabbs), aabbs({ aabb_buffer, aabb_offset, aabb_count, aabb_stride }) {}
673  constexpr acceleration_structure_build_input(api::resource instance_buffer, uint64_t instance_offset, uint32_t instance_count, bool array_of_pointers = false) : type(acceleration_structure_build_input_type::instances), instances({ instance_buffer, instance_offset, instance_count, array_of_pointers }) {}
674 
679 
680  union
681  {
685  struct
686  {
688  uint64_t vertex_offset = 0;
689  uint32_t vertex_count = 0;
690  uint64_t vertex_stride = 0;
693  uint64_t index_offset = 0;
694  uint32_t index_count = 0;
696  api::resource transform_buffer = {};
697  uint64_t transform_offset = 0;
699 
703  struct
704  {
706  uint64_t offset = 0;
707  uint32_t count = 0;
708  uint64_t stride = 0;
709  } aabbs;
710 
714  struct
715  {
716  api::resource buffer = {};
717  uint64_t offset = 0;
718  uint32_t count = 0;
719  bool array_of_pointers = false;
721  };
722 
727  };
728 } }
resource_view_type
Type of a resource view. This identifies how a resource view interprets the data of its resource.
Definition: reshade_api_resource.hpp:367
acceleration_structure_build_mode
Type of an acceleration structure build operation.
Definition: reshade_api_resource.hpp:611
acceleration_structure_type
Type of an acceleration structure.
Definition: reshade_api_resource.hpp:590
compare_op
Comparison operations.
Definition: reshade_api_resource.hpp:35
render_pass_store_op
Specifies how the contents of a render target or depth-stencil view are treated at the end of a rende...
Definition: reshade_api_resource.hpp:522
resource_type
Type of a resource. This is specified during creation and is immutable. Various operations may have s...
Definition: reshade_api_resource.hpp:179
memory_heap
Memory heap types, which give a hint as to where to place the allocation for a resource.
Definition: reshade_api_resource.hpp:163
acceleration_structure_build_input_type
Type of an acceleration structure structure build input.
Definition: reshade_api_resource.hpp:634
render_pass_load_op
Specifies how the contents of a render target or depth-stencil view are treated at the start of a ren...
Definition: reshade_api_resource.hpp:511
map_access
Memory mapping access types.
Definition: reshade_api_resource.hpp:152
acceleration_structure_copy_mode
Type of an acceleration structure copy operation.
Definition: reshade_api_resource.hpp:600
acceleration_structure_build_flags
Flags that specify additional parameters to an acceleration structure build operation.
Definition: reshade_api_resource.hpp:620
acceleration_structure_build_input_flags
Flags that specify additional parameters of an acceleration structure build input.
Definition: reshade_api_resource.hpp:644
@ flags
Additional pipeline creation flags. Sub-object data is a pointer to a pipeline_flags value.
format
Available data and texture formats. This is mostly compatible with 'DXGI_FORMAT'.
Definition: reshade_api_format.hpp:18
texture_address_mode
Sampling behavior at texture coordinates outside the bounds of a texture resource.
Definition: reshade_api_resource.hpp:77
filter_mode
Texture filtering modes available for texture sampling operations.
Definition: reshade_api_resource.hpp:50
resource_flags
Flags that specify additional parameters of a resource.
Definition: reshade_api_resource.hpp:192
@ generate_mipmaps
Required to use the resource with command_list::generate_mipmaps.
@ immutable
Immutable resources can never be written to again after creationn, either by the CPU or the GPU....
@ shared
Shared resources can be imported/exported from/to different graphics APIs and/or processes....
@ cube_compatible
Required to create resource_view_type::texture_cube or resource_view_type::texture_cube_array views o...
@ dynamic
Dynamic resources can be frequently updated during a frame, with previous contents automatically bein...
@ sparse_binding
Resource is backed using sparse memory binding.
resource_usage
Flags that specify how a resource is used. This needs to be specified during creation and is also use...
Definition: reshade_api_resource.hpp:230
Definition: reshade.hpp:56
#define RESHADE_DEFINE_ENUM_FLAG_OPERATORS(type)
Definition: reshade_api_resource.hpp:16
#define RESHADE_DEFINE_HANDLE(name)
Definition: reshade_api_resource.hpp:8
Describes a build input for an acceleration structure build operation.
Definition: reshade_api_resource.hpp:669
constexpr acceleration_structure_build_input()
Definition: reshade_api_resource.hpp:670
constexpr acceleration_structure_build_input(api::resource vertex_buffer, uint64_t vertex_offset, uint32_t vertex_count, uint64_t vertex_stride, api::format vertex_format, api::resource index_buffer, uint64_t index_offset, uint32_t index_count, api::format index_format, uint64_t transform_address=0)
Definition: reshade_api_resource.hpp:671
constexpr acceleration_structure_build_input(api::resource instance_buffer, uint64_t instance_offset, uint32_t instance_count, bool array_of_pointers=false)
Definition: reshade_api_resource.hpp:673
constexpr acceleration_structure_build_input(api::resource aabb_buffer, uint64_t aabb_offset, uint32_t aabb_count, uint64_t aabb_stride)
Definition: reshade_api_resource.hpp:672
Describes a single instance in a top-level acceleration structure. The data in acceleration_structure...
Definition: reshade_api_resource.hpp:656
uint32_t shader_binding_table_offset
Definition: reshade_api_resource.hpp:660
uint32_t mask
Definition: reshade_api_resource.hpp:659
uint32_t flags
Definition: reshade_api_resource.hpp:661
uint32_t custom_index
Definition: reshade_api_resource.hpp:658
uint64_t acceleration_structure_gpu_address
Definition: reshade_api_resource.hpp:662
Describes a depth-stencil view and how it is treated at the start and end of a render pass.
Definition: reshade_api_resource.hpp:532
render_pass_load_op depth_load_op
Specifies how the depth contents of the depth-stencil view are treated at the start of the render pas...
Definition: reshade_api_resource.hpp:540
render_pass_store_op depth_store_op
Specifies how the depth contents of the depth-stencil view are treated at the end of the render pass.
Definition: reshade_api_resource.hpp:544
render_pass_store_op stencil_store_op
Specifies how the stencil contents of the depth-stencil view are treated at the end of the render pas...
Definition: reshade_api_resource.hpp:552
uint8_t clear_stencil
Value the stencil contents of the depth-stencil resource is cleared to when stencil_load_op is render...
Definition: reshade_api_resource.hpp:560
render_pass_load_op stencil_load_op
Specifies how the stencil contents of the depth-stencil view are treated at the start of the render p...
Definition: reshade_api_resource.hpp:548
resource_view view
Depth-stencil resource view.
Definition: reshade_api_resource.hpp:536
float clear_depth
Value the depth contents of the depth-stencil resource is cleared to when depth_load_op is render_pas...
Definition: reshade_api_resource.hpp:556
Describes a render target view and how it is treated at the start and end of a render pass.
Definition: reshade_api_resource.hpp:567
render_pass_store_op store_op
Specifies how the contents of the render target view are treated at the end of the render pass.
Definition: reshade_api_resource.hpp:579
resource_view view
Render target resource view.
Definition: reshade_api_resource.hpp:571
float clear_color[4]
Value the render target resource is cleared to when load_op is render_pass_load_op::clear.
Definition: reshade_api_resource.hpp:583
render_pass_load_op load_op
Specifies how the contents of the render target view are treated at the start of the render pass.
Definition: reshade_api_resource.hpp:575
Describes a resource, such as a buffer or texture.
Definition: reshade_api_resource.hpp:267
constexpr resource_desc(uint32_t width, uint32_t height, uint16_t layers, uint16_t levels, format format, uint16_t samples, memory_heap heap, resource_usage usage, resource_flags flags=resource_flags::none)
Definition: reshade_api_resource.hpp:271
constexpr resource_desc(uint64_t size, memory_heap heap, resource_usage usage, resource_flags flags=resource_flags::none)
Definition: reshade_api_resource.hpp:269
constexpr resource_desc(resource_type type, uint32_t width, uint32_t height, uint16_t depth_or_layers, uint16_t levels, format format, uint16_t samples, memory_heap heap, resource_usage usage, resource_flags flags=resource_flags::none)
Definition: reshade_api_resource.hpp:273
constexpr resource_desc()
Definition: reshade_api_resource.hpp:268
Describes a resource view, which specifies how to interpret the data of a resource.
Definition: reshade_api_resource.hpp:386
constexpr resource_view_desc(resource_view_type type, format format, uint32_t first_level, uint32_t levels, uint32_t first_layer, uint32_t layers)
Definition: reshade_api_resource.hpp:394
constexpr resource_view_desc()
Definition: reshade_api_resource.hpp:387
constexpr resource_view_desc(format format)
Definition: reshade_api_resource.hpp:396
constexpr resource_view_desc(format format, uint32_t first_level, uint32_t levels, uint32_t first_layer, uint32_t layers)
Definition: reshade_api_resource.hpp:390
constexpr resource_view_desc(format format, uint64_t offset, uint64_t size)
Definition: reshade_api_resource.hpp:388
constexpr resource_view_desc(resource_view_type type, format format, uint64_t offset, uint64_t size)
Definition: reshade_api_resource.hpp:392
An opaque handle to a resource view object (depth-stencil, render target, shader resource view,...
Definition: reshade_api_resource.hpp:467
An opaque handle to a resource object (buffer, texture, ...).
Definition: reshade_api_resource.hpp:361
Describes a sampler state.
Definition: reshade_api_resource.hpp:89
filter_mode filter
Filtering mode to use when sampling a texture.
Definition: reshade_api_resource.hpp:93
float mip_lod_bias
Offset applied to the calculated mipmap level when sampling a texture.
Definition: reshade_api_resource.hpp:109
texture_address_mode address_u
Method to use for resolving U texture coordinates outside 0 to 1 range.
Definition: reshade_api_resource.hpp:97
float max_lod
Upper end of the mipmap range to clamp access to.
Definition: reshade_api_resource.hpp:129
float border_color[4]
RGBA value to return for texture coordinates outside 0 to 1 range when addressing mode is texture_add...
Definition: reshade_api_resource.hpp:121
float min_lod
Lower end of the mipmap range to clamp access to.
Definition: reshade_api_resource.hpp:125
float max_anisotropy
Clamping value to use when filtering mode is filter_mode::anisotropic.
Definition: reshade_api_resource.hpp:113
texture_address_mode address_v
Method to use for resolving V texture coordinates outside 0 to 1 range.
Definition: reshade_api_resource.hpp:101
texture_address_mode address_w
Method to use for resolving W texture coordinates outside 0 to 1 range.
Definition: reshade_api_resource.hpp:105
An opaque handle to a sampler state object.
Definition: reshade_api_resource.hpp:146
Describes a region inside a subresource.
Definition: reshade_api_resource.hpp:473
uint32_t right
Definition: reshade_api_resource.hpp:477
constexpr uint32_t height() const
Definition: reshade_api_resource.hpp:482
uint32_t left
Definition: reshade_api_resource.hpp:474
uint32_t back
Definition: reshade_api_resource.hpp:479
uint32_t bottom
Definition: reshade_api_resource.hpp:478
uint32_t top
Definition: reshade_api_resource.hpp:475
uint32_t front
Definition: reshade_api_resource.hpp:476
constexpr uint32_t width() const
Definition: reshade_api_resource.hpp:481
constexpr uint32_t depth() const
Definition: reshade_api_resource.hpp:483
Describes the data of a subresource.
Definition: reshade_api_resource.hpp:490
uint32_t slice_pitch
Depth pitch of the data (added to the data pointer to move between texture depth/array slices,...
Definition: reshade_api_resource.hpp:504
void * data
Pointer to the data.
Definition: reshade_api_resource.hpp:494
uint32_t row_pitch
Row pitch of the data (added to the data pointer to move between texture rows, unused for buffers and...
Definition: reshade_api_resource.hpp:499