ReXGlue SDK
Loading...
Searching...
No Matches
fetch.h
Go to the documentation of this file.
1
13
14#pragma once
15
16#include <algorithm>
17
18#include <rex/assert.h>
19#include <rex/types.h>
20#include <rex/xenos/format.h>
21#include <rex/xenos/state.h>
22
23namespace rex::xenos {
24
26// NOLINTNEXTLINE(performance-enum-size): Xenos bit field, MSVC packs per type
27enum class DataDimension : u32 {
28 k1D = 0,
29 k2DOrStacked = 1,
30 k3D = 2,
31 kCube = 3,
32};
33
34// NOLINTNEXTLINE(performance-enum-size): Xenos bit field, MSVC packs per type
35enum class ClampMode : u32 {
36 kRepeat = 0,
37 kMirroredRepeat = 1,
38 kClampToEdge = 2,
42 kClampToBorder = 6,
44};
45
51constexpr bool ClampModeUsesBorder(ClampMode clamp_mode) {
52 return clamp_mode == ClampMode::kClampToBorder || clamp_mode == ClampMode::kMirrorClampToBorder;
53}
54
56// NOLINTNEXTLINE(performance-enum-size): Xenos bit field, MSVC packs per type
57enum class TextureSign : u32 {
58 kUnsigned = 0,
59 kSigned = 1,
61 kGamma = 3,
62};
63
64// NOLINTNEXTLINE(performance-enum-size): Xenos bit field, MSVC packs per type
65enum class TextureFilter : u32 {
66 kPoint = 0,
67 kLinear = 1,
70};
71
72// NOLINTNEXTLINE(performance-enum-size): Xenos bit field, MSVC packs per type
73enum class AnisoFilter : u32 {
74 kDisabled = 0,
75 kMax11 = 1,
76 kMax21 = 2,
77 kMax41 = 3,
78 kMax81 = 4,
79 kMax161 = 5,
81};
82
83// NOLINTNEXTLINE(performance-enum-size): Xenos bit field, MSVC packs per type
84enum class BorderColor : u32 {
85 k_ABGR_Black = 0,
86 k_ABGR_White = 1,
89};
90
92// NOLINTNEXTLINE(performance-enum-size): Xenos bit field, MSVC packs per type
93enum class FetchOpDimension : u32 {
94 k1D = 0,
95 k2D = 1,
96 k3DOrStacked = 2,
97 kCube = 3,
98};
99
102 switch (dimension) {
103 case FetchOpDimension::k1D:
104 return 1;
105 case FetchOpDimension::k2D:
106 return 2;
107 case FetchOpDimension::k3DOrStacked:
108 case FetchOpDimension::kCube:
109 return 3;
110 default:
111 REX_UNHANDLED_CASE(dimension);
112 return 1;
113 }
114}
115
127#define REXGPU_SWIZZLE(x, y, z, w) \
128 (((::rex::xenos::REXGPU_SWIZZLE_##x) << 0) | ((::rex::xenos::REXGPU_SWIZZLE_##y) << 3) | \
129 ((::rex::xenos::REXGPU_SWIZZLE_##z) << 6) | ((::rex::xenos::REXGPU_SWIZZLE_##w) << 9))
130
131enum TextureSwizzle : u16 {
132 REXGPU_SWIZZLE_X = 0,
133 REXGPU_SWIZZLE_R = 0,
134 REXGPU_SWIZZLE_Y = 1,
135 REXGPU_SWIZZLE_G = 1,
136 REXGPU_SWIZZLE_Z = 2,
137 REXGPU_SWIZZLE_B = 2,
138 REXGPU_SWIZZLE_W = 3,
139 REXGPU_SWIZZLE_A = 3,
140 REXGPU_SWIZZLE_0 = 4,
141 REXGPU_SWIZZLE_1 = 5,
142 REXGPU_SWIZZLE_RRRR = REXGPU_SWIZZLE(R, R, R, R),
143 REXGPU_SWIZZLE_RGGG = REXGPU_SWIZZLE(R, G, G, G),
144 REXGPU_SWIZZLE_RGBB = REXGPU_SWIZZLE(R, G, B, B),
145 REXGPU_SWIZZLE_RGBA = REXGPU_SWIZZLE(R, G, B, A),
146 REXGPU_SWIZZLE_0000 = REXGPU_SWIZZLE(0, 0, 0, 0),
147};
148
150union alignas(u32) LoopConstant {
151 u32 value;
152 struct {
153 u32 count : 8;
154 u32 start : 8;
155 i32 step : 8;
156 u32 pad_24 : 8;
157 };
158};
159REX_STATIC_ASSERT_SIZE(LoopConstant, sizeof(u32));
160
162// NOLINTNEXTLINE(performance-enum-size): Xenos bit field, MSVC packs per type
163enum class FetchConstantType : u32 {
164 kInvalidTexture,
165 kInvalidVertex,
166 kTexture,
167 kVertex,
168};
169
170constexpr u32 kTextureFetchConstantCount = 32;
172constexpr u32 kVertexFetchConstantCount = 3 * kTextureFetchConstantCount;
173
175union alignas(u32) VertexFetch {
176 struct {
177 u32 dword_0;
178 u32 dword_1;
179 };
180 struct {
181 FetchConstantType type : 2;
182 u32 address : 30;
183
184 Endian endian : 2;
185 u32 size : 24;
186 u32 pad_26 : 6;
187 };
188};
189REX_STATIC_ASSERT_SIZE(VertexFetch, sizeof(u32) * 2);
190
193constexpr u32 kTextureSubresourceAlignmentBytes = 1 << kTextureSubresourceAlignmentBytesLog2;
194
195constexpr u32 kTexture1DMaxWidthLog2 = 24;
196constexpr u32 kTexture1DMaxWidth = 1 << kTexture1DMaxWidthLog2;
197constexpr u32 kTexture2DCubeMaxWidthHeightLog2 = 13;
198constexpr u32 kTexture2DCubeMaxWidthHeight = 1 << kTexture2DCubeMaxWidthHeightLog2;
199constexpr u32 kTexture2DMaxStackDepthLog2 = 6;
200constexpr u32 kTexture2DMaxStackDepth = 1 << kTexture2DMaxStackDepthLog2;
201constexpr u32 kTexture3DMaxWidthHeightLog2 = 11;
202constexpr u32 kTexture3DMaxWidthHeight = 1 << kTexture3DMaxWidthHeightLog2;
203constexpr u32 kTexture3DMaxDepthLog2 = 10;
204constexpr u32 kTexture3DMaxDepth = 1 << kTexture3DMaxDepthLog2;
205
206constexpr u32 kTextureMaxMips =
207 std::max(kTexture2DCubeMaxWidthHeightLog2, kTexture3DMaxWidthHeightLog2) + 1;
208
209constexpr u32 kTextureTileWidthHeightLog2 = 5;
210constexpr u32 kTextureTileWidthHeight = 1 << kTextureTileWidthHeightLog2;
212constexpr u32 kTextureTileDepthLog2 = 2;
213constexpr u32 kTextureTileDepth = 1 << kTextureTileDepthLog2;
214
221constexpr u32 GetTextureTiledXBaseGranularityLog2(bool is_3d, u32 bytes_per_block_log2) {
222 return 7 - std::min(UINT32_C(2), bytes_per_block_log2 + static_cast<u32>(is_3d));
223}
224
226constexpr u32 GetTextureTiledYBaseGranularityLog2(bool is_3d, u32 bytes_per_block_log2) {
227 return is_3d ? 5 : (7 - std::min(UINT32_C(2), bytes_per_block_log2));
228}
229
230constexpr u32 kTextureTiledZBaseGranularityLog2 = 3;
231constexpr u32 kTextureTiledZBaseGranularity = 1 << kTextureTiledZBaseGranularityLog2;
232
233constexpr u32 kTextureLinearRowAlignmentBytesLog2 = 8;
234constexpr u32 kTextureLinearRowAlignmentBytes = 1 << kTextureLinearRowAlignmentBytesLog2;
235
237union alignas(u32) TextureFetch {
238 struct {
239 u32 dword_0;
240 u32 dword_1;
241 u32 dword_2;
242 u32 dword_3;
243 u32 dword_4;
244 u32 dword_5;
245 };
246 struct {
247 FetchConstantType type : 2;
248 TextureSign sign_x : 2;
249 TextureSign sign_y : 2;
250 TextureSign sign_z : 2;
251 TextureSign sign_w : 2;
252 ClampMode clamp_x : 3;
253 ClampMode clamp_y : 3;
254 ClampMode clamp_z : 3;
255 u32 pad_19 : 3;
256 u32 pitch : 9;
257 u32 tiled : 1;
258
259 TextureFormat format : 6;
260 Endian endianness : 2;
261 u32 request_size : 2;
262 u32 stacked : 1;
263 u32 nearest_clamp_policy : 1;
264 u32 base_address : 20;
265
266 union {
267 struct {
268 u32 width : 24;
269 u32 pad_24 : 8;
270 } size_1d;
271 struct {
272 u32 width : 13;
273 u32 height : 13;
274 u32 stack_depth : 6;
275 } size_2d;
276 struct {
277 u32 width : 11;
278 u32 height : 11;
279 u32 depth : 10;
280 } size_3d;
281 };
282
283 u32 num_format : 1;
284 u32 swizzle : 12;
285 i32 exp_adjust : 6;
286 TextureFilter mag_filter : 2;
287 TextureFilter min_filter : 2;
288 TextureFilter mip_filter : 2;
289 AnisoFilter aniso_filter : 3;
290 ArbitraryFilter arbitrary_filter : 3;
291 u32 border_size : 1;
292
293 u32 vol_mag_filter : 1;
294 u32 vol_min_filter : 1;
295 u32 mip_min_level : 4;
296 u32 mip_max_level : 4;
297 u32 mag_aniso_walk : 1;
298 u32 min_aniso_walk : 1;
299 i32 lod_bias : 10;
300 i32 grad_exp_adjust_h : 5;
301 i32 grad_exp_adjust_v : 5;
302
303 BorderColor border_color : 2;
304 u32 force_bc_w_to_max : 1;
305 u32 tri_clamp : 2;
306 i32 aniso_bias : 4;
307 DataDimension dimension : 2;
308 u32 packed_mips : 1;
309 u32 mip_address : 20;
310 };
311};
312REX_STATIC_ASSERT_SIZE(TextureFetch, sizeof(u32) * 6);
313
315union alignas(u32) FetchGroup {
316 struct {
317 u32 dword_0;
318 u32 dword_1;
319 u32 dword_2;
320 u32 dword_3;
321 u32 dword_4;
322 u32 dword_5;
323 };
324 TextureFetch texture_fetch;
325 struct {
326 VertexFetch vertex_fetch_0;
327 VertexFetch vertex_fetch_1;
328 VertexFetch vertex_fetch_2;
329 };
330 struct {
331 u32 type_0 : 2;
332 u32 data_0_a : 30;
333 u32 data_0_b : 32;
334 u32 type_1 : 2;
335 u32 data_1_a : 30;
336 u32 data_1_b : 32;
337 u32 type_2 : 2;
338 u32 data_2_a : 30;
339 u32 data_2_b : 32;
340 };
341};
342REX_STATIC_ASSERT_SIZE(FetchGroup, sizeof(u32) * 6);
343
358union alignas(u32) MemExportStream {
359 struct {
360 u32 dword_0;
361 u32 dword_1;
362 u32 dword_2;
363 u32 dword_3;
364 };
365 struct {
366 u32 base_address : 30;
367 u32 const_0x1 : 2;
368
369 u32 const_0x4b000000;
370
371 Endian128 endianness : 3;
372 u32 unused_0 : 5;
373 ColorFormat format : 6;
374 u32 unused_1 : 2;
375 SurfaceNumberFormat num_format : 3;
376 u32 red_blue_swap : 1;
377 u32 const_0x4b0 : 12;
378
379 u32 index_count : 23;
380 u32 const_0x96 : 9;
381 };
382};
383REX_STATIC_ASSERT_SIZE(MemExportStream, sizeof(u32) * 4);
384
385} // namespace rex::xenos
#define REX_UNHANDLED_CASE(var)
Definition assert.h:119
int GetFetchOpDimensionComponentCount(FetchOpDimension dimension)
Definition fetch.h:101
AnisoFilter
Definition fetch.h:73
BorderColor
Definition fetch.h:84
@ k_ACBYCR_Black
Definition fetch.h:87
@ k_ACBCRY_Black
Definition fetch.h:88
ClampMode
Definition fetch.h:35
@ kMirrorClampToEdge
Definition fetch.h:39
@ kMirrorClampToBorder
Definition fetch.h:43
@ kMirrorClampToHalfway
Definition fetch.h:41
@ kClampToHalfway
Definition fetch.h:40
#define REXGPU_SWIZZLE(x, y, z, w)
Definition fetch.h:127
constexpr u32 GetTextureTiledYBaseGranularityLog2(bool is_3d, u32 bytes_per_block_log2)
Definition fetch.h:226
constexpr u32 kTextureSubresourceAlignmentBytesLog2
Definition fetch.h:192
constexpr bool ClampModeUsesBorder(ClampMode clamp_mode)
Definition fetch.h:51
constexpr u32 kVertexFetchConstantCount
Definition fetch.h:172
FetchConstantType
Definition fetch.h:163
TextureSign
Definition fetch.h:57
@ kUnsignedBiased
Definition fetch.h:60
@ kSigned
Definition fetch.h:59
@ kGamma
Definition fetch.h:61
constexpr u32 GetTextureTiledXBaseGranularityLog2(bool is_3d, u32 bytes_per_block_log2)
Definition fetch.h:221
TextureFilter
Definition fetch.h:65
@ kBaseMap
Definition fetch.h:68
@ kUseFetchConst
Definition fetch.h:69
DataDimension
Definition fetch.h:27
FetchOpDimension
Definition fetch.h:93
constexpr u32 kTextureTileDepthLog2
Definition fetch.h:212
Data, texture, vertex and render target formats and conversions.
SurfaceNumberFormat
Definition format.h:52
Endian
Definition format.h:27
Endian128
Definition format.h:36
TextureFormat
Definition format.h:198
ColorFormat
Definition format.h:267
Xenos pipeline state, shader and EDRAM enums.
ArbitraryFilter
Definition state.h:209
Integer types, byte order wrappers and size literals.
Definition fetch.h:315
Definition fetch.h:150
Definition fetch.h:358
Definition fetch.h:237
Definition fetch.h:175