libgui 2.01
libgui is a GUI library for the GameCube, Wii, and Wii U
 
Loading...
Searching...
No Matches
Texture2DShader.cpp
1/****************************************************************************
2 * Platform Abstraction Layer (WUT driver)
3 * Daryl Borth 2026
4 * Texture2DShader.cpp
5 ***************************************************************************/
6#include <malloc.h>
7#include <string.h>
8#include "Texture2DShader.h"
9
10static const uint32_t cpVertexShaderProgram[] =
11{
12 0x00000000,0x00008009,0x20000000,0x000080a0,
13 0x3c200100,0x88060094,0x00400000,0x88042014,
14 0x00000000,0x00000000,0x00000000,0x00000000,
15 0x00000000,0x00000000,0x00000000,0x00000000,
16 0x00000000,0x00000000,0x00000000,0x00000000,
17 0x00000000,0x00000000,0x00000000,0x00000000,
18 0x00000000,0x00000000,0x00000000,0x00000000,
19 0x00000000,0x00000000,0x00000000,0x00000000,
20 0x00000000,0x00000000,0x00000000,0x00000000,
21 0x00000000,0x00000000,0x00000000,0x00000000,
22 0x00000000,0x00000000,0x00000000,0x00000000,
23 0x00000000,0x00000000,0x00000000,0x00000000,
24 0x00000000,0x00000000,0x00000000,0x00000000,
25 0x00000000,0x00000000,0x00000000,0x00000000,
26 0x00000000,0x00000000,0x00000000,0x00000000,
27 0x00000000,0x00000000,0x00000000,0x00000000,
28 0x02290001,0x80000000,0x02041f00,0x900c0020,
29 0x00a11f00,0xfc00624f,0xfd041f00,0x900c4060,
30 0x02001f80,0x900c0000,0x83f9223e,0x0000803f,
31 0xfe081f00,0x00080020,0xfe202081,0x10004040,
32 0xfea49f80,0xfd00620f,0xdb0f49c0,0xdb0fc940,
33 0xfea01f80,0x9000e06f,0x83f9223e,0x00000000,
34 0xfe0c1f80,0x00370000,0xffa01f00,0x80000040,
35 0xff101f00,0x800c0060,0x7f0c1f80,0x80370040,
36 0x0000103f,0x00000000,0xffa01f00,0x80000000,
37 0xff001f00,0x800c0020,0x02c51f01,0x80000040,
38 0xfeac9f80,0x80000060,0x0000103f,0x398ee33f,
39 0xfea01f00,0x80000000,0x02c19f01,0x9000e02f,
40 0x01c41f01,0x9000e04f,0x02c59f80,0x80000060,
41 0x398ee33f,0x00000000,0x01c49f01,0x80000020,
42 0x02c11f80,0x80000040,0x01e08f00,0xfe04624f,
43 0x01c01f81,0x7f08626f,0xfe2c2000,0x10004000,
44 0xfe28a080,0x10004020,0xeb825790,0xb6f711be,
45 0x7c0e2df2,0x81173cfa
46};
47
48static const uint32_t cpVertexShaderRegs[] = {
49 0x00000103,0x00000000,0x00000000,0x00000001,
50 0xffffff00,0xffffffff,0xffffffff,0xffffffff,
51 0xffffffff,0xffffffff,0xffffffff,0xffffffff,
52 0xffffffff,0xffffffff,0x00000000,0xfffffffc,
53 0x00000002,0x00000000,0x00000001,0x000000ff,
54 0x000000ff,0x000000ff,0x000000ff,0x000000ff,
55 0x000000ff,0x000000ff,0x000000ff,0x000000ff,
56 0x000000ff,0x000000ff,0x000000ff,0x000000ff,
57 0x000000ff,0x000000ff,0x000000ff,0x000000ff,
58 0x000000ff,0x000000ff,0x000000ff,0x000000ff,
59 0x000000ff,0x000000ff,0x000000ff,0x000000ff,
60 0x000000ff,0x000000ff,0x000000ff,0x000000ff,
61 0x000000ff,0x00000000,0x0000000e,0x00000010
62};
63
64static const uint32_t cPixelShaderProgram[] =
65{
66 0x20000000,0x00000ca4,0x0b000000,0x00000085,
67 0x24000000,0x000050a0,0xb0000000,0x000cc080,
68 0x39000000,0x00005ca0,0xb8000000,0x000cc080,
69 0x51000000,0x000078a0,0xc0000000,0x000cc080,
70 0x70000000,0x000064a0,0xc8000000,0x0008c080,
71 0x8a000000,0x00005ca0,0x0e000000,0x01008086,
72 0xce000000,0x0000c080,0xa2000000,0x00000ca8,
73 0x00800000,0x88062094,0x00000000,0x00000000,
74 0x00000000,0x00000000,0x00000000,0x00000000,
75 0x00000000,0x00000000,0x00000000,0x00000000,
76 0x00000000,0x00000000,0x00000000,0x00000000,
77 0x00000000,0x00000000,0x00000000,0x00000000,
78 0x00000000,0x00000000,0x00000000,0x00000000,
79 0x00000000,0x00000000,0x00000000,0x00000000,
80 0x00000000,0x00000000,0x00000000,0x00000000,
81 0x00000000,0x00000000,0x00000000,0x00000000,
82 0x00051f00,0x80060000,0x00011f80,0x80060040,
83 0xfec81f80,0xfb802320,0x01041f80,0x8c220000,
84 0x00a41f00,0xfc10620f,0x010d1f00,0x900c0021,
85 0x00091f00,0x80060040,0x00a01f80,0xfc10626f,
86 0x00000040,0x00000000,0xfe080000,0xfe8cc300,
87 0xfe088080,0xfe80c320,0x00a11f00,0xfe000200,
88 0x00a51f00,0xfe040220,0x00a19f00,0xfe000240,
89 0x00a59f00,0xfe040260,0x00a11f81,0xfe002600,
90 0x4260e5bc,0xa69bc4bc,0x0ad7a3bc,0x00000000,
91 0x00a11f00,0x06004200,0x00a59f00,0x06042220,
92 0x00a51f00,0x06044240,0x00a11f01,0x06008260,
93 0x00a51f81,0x06048620,0x6f1283bc,0x0ad7a3bc,
94 0xa69b44bc,0x00000000,0x00a41f00,0x80000000,
95 0x00a01f00,0x80000020,0x00ac1f00,0x80000040,
96 0x00a81f00,0x80000060,0x00a19f80,0x06000600,
97 0xcac3123c,0x6f1203bc,0x03a41f00,0xfe00620f,
98 0x03a01f00,0xfe04622f,0x03ac1f00,0xfe08624f,
99 0x03a81f00,0xfe0c626f,0x00a59f80,0x06040620,
100 0xcc28913b,0x6f1203bc,0x01a41f00,0xfe00620f,
101 0x01a01f00,0xfe04622f,0x01ac1f00,0xfe08624f,
102 0x01a81f00,0xfe0c626f,0x00a19f80,0x06002600,
103 0xe8eab03c,0x6f1283bb,0x02ac1f00,0xfe084200,
104 0x02a81f00,0xfe0c4220,0x02a41f00,0xfe004240,
105 0x02a01f00,0xfe044260,0x00a59f80,0x06042620,
106 0x92bb353d,0x6f1283bb,0x04a81f00,0x0204620f,
107 0x04ac1f00,0x0200662f,0x04a41f00,0x0208624f,
108 0x04a01f00,0x020c626f,0x00a19f80,0x06004600,
109 0xc4139f3d,0x6f12833b,0x00a41f00,0xfe08620f,
110 0x00a01f00,0xfe0c622f,0x00ac1f00,0xfe04624f,
111 0x00a81f00,0xfe00626f,0x00a59f80,0x06044620,
112 0xb950ed3d,0x6f12833b,0x01a41f00,0xfe00620f,
113 0x01a01f00,0xfe04622f,0x01ac1f00,0xfe08624f,
114 0x01a81f00,0xfe0c626f,0x00a19f80,0x06002600,
115 0xecd7163e,0x6f12033c,0x03a41f00,0xfe000200,
116 0x03a01f00,0xfe040220,0x03ac1f00,0xfe082240,
117 0x03a81f00,0xfe0c2260,0x00a59f80,0x06042620,
118 0x2168233e,0x6f12033c,0x00a11f00,0x06006200,
119 0x00a51f00,0x06046220,0x00a19f00,0x06006240,
120 0x00a59f00,0x06046260,0x00a11f81,0x0600e600,
121 0xa69b443c,0x6f12833c,0x0ad7a33c,0x00000000,
122 0x02ac1f00,0x0108620f,0x02a81f00,0x010c622f,
123 0x02a41f00,0x0000624f,0x02a01f00,0x0004666f,
124 0x00a59f80,0x0604e620,0xecd7163e,0x0ad7a33c,
125 0x04a81f00,0xfe04620f,0x04ac1f00,0xfe00622f,
126 0x04a41f00,0xfe08624f,0x04a01f00,0xfe0c626f,
127 0x00a19f80,0x06008600,0xb950ed3d,0xa69bc43c,
128 0x05a41f00,0xfe08620f,0x05a01f00,0xfe0c622f,
129 0x05ac1f00,0xfe04624f,0x05a81f00,0xfe00626f,
130 0x00a59f80,0x06048620,0xc4139f3d,0xa69bc43c,
131 0x03a41f00,0xfe00a200,0x03a01f00,0xfe04a220,
132 0x03ac1f00,0xfe086240,0x03a81f00,0xfe0c6260,
133 0x00a19f80,0x06006600,0x92bb353d,0x4260e53c,
134 0x00a51f80,0x06046220,0x4260e53c,0x00000000,
135 0x07ac1f00,0x0308620f,0x07a81f00,0x030c622f,
136 0x07a41f00,0x0500624f,0x07a01f80,0x0504626f,
137 0xe8eab03c,0x00000000,0x04a81f00,0xfe04620f,
138 0x04ac1f00,0xfe00622f,0x04a41f00,0xfe08624f,
139 0x04a01f80,0xfe0c626f,0xcac3123c,0x00000000,
140 0x06a41f00,0xfe08620f,0x06a01f00,0xfe0c622f,
141 0x06ac1f00,0xfe04624f,0x06a81f80,0xfe00626f,
142 0xcc28913b,0x00000000,0xfe20a000,0x9000e00f,
143 0xfe242000,0x9000e02f,0xfe28a001,0x9000e04f,
144 0xfe2c2081,0x9000e06f,0xfe28a081,0x80060020,
145 0xfee48f00,0x7f842300,0xfee40f00,0x7f802320,
146 0xfee48f01,0x7f8c2340,0xfee40f81,0x08842b60,
147 0x00202000,0x90002000,0x0024a000,0x90002020,
148 0x00282001,0x90002040,0x002ca081,0x90002060,
149 0x00000000,0x00000000,0x00000000,0x00000000,
150 0x00000000,0x00000000,0x00000000,0x00000000,
151 0x00000000,0x00000000,0x00000000,0x00000000,
152 0x00000000,0x00000000,0x00000000,0x00000000,
153 0x00000000,0x00000000,0x00000000,0x00000000,
154 0x10000000,0x03100df0,0x00008010,0xecdfea0d,
155 0x10000000,0x00100df0,0x0000a051,0xecdfea0d,
156 0x10000100,0x01100df0,0x00008010,0xecdfea0d,
157 0x10000200,0x02100df0,0x00000011,0xecdfea0d,
158 0x10000400,0x04100df0,0x0000b070,0xecdfea0d,
159 0x10000000,0x00100df0,0x00008010,0xecdfea0d,
160 0x10000100,0x01100df0,0x00008010,0xecdfea0d,
161 0x10000600,0x03100df0,0x00008010,0xecdfea0d,
162 0x10000200,0x02100df0,0x00008010,0xecdfea0d,
163 0x10000100,0x04100df0,0x00008010,0xecdfea0d,
164 0x10000300,0x05100df0,0x00008010,0xecdfea0d,
165 0x10000300,0x03100df0,0x0000a051,0xecdfea0d,
166 0x10000700,0x07100df0,0x00008010,0xecdfea0d,
167 0x10000400,0x04100df0,0x00008010,0xecdfea0d,
168 0x10000300,0x06100df0,0x00008010,0xecdfea0d,
169 0x10000000,0x00100df0,0x00008010,0xecdfea0d,
170 0xc8581837,0x22740275,0x281eddcc,0xfa8b9b65
171};
172static const uint32_t cPixelShaderRegs[] = {
173 0x00000109,0x00000002,0x14000001,0x00000000,
174 0x00000001,0x00000100,0x00000000,0x00000000,
175 0x00000000,0x00000000,0x00000000,0x00000000,
176 0x00000000,0x00000000,0x00000000,0x00000000,
177 0x00000000,0x00000000,0x00000000,0x00000000,
178 0x00000000,0x00000000,0x00000000,0x00000000,
179 0x00000000,0x00000000,0x00000000,0x00000000,
180 0x00000000,0x00000000,0x00000000,0x00000000,
181 0x00000000,0x00000000,0x00000000,0x00000000,
182 0x00000000,0x0000000f,0x00000001,0x00000010,
183 0x00000000
184};
185
186Texture2DShader * Texture2DShader::shaderInstance = nullptr;
187
188Texture2DShader::Texture2DShader()
189 : vertexShader(cuAttributeCount)
190{
191 pixelShader.setProgram(cPixelShaderProgram, sizeof(cPixelShaderProgram), cPixelShaderRegs, sizeof(cPixelShaderRegs));
192
193 blurLocation = 0;
194 colorIntensityLocation = 4;
195 pixelShader.addUniformVar((GX2UniformVar){ "unf_blur_texture_direction", GX2_SHADER_VAR_TYPE_FLOAT3, 1, blurLocation, -1 });
196 pixelShader.addUniformVar((GX2UniformVar){ "unf_color_intensity", GX2_SHADER_VAR_TYPE_FLOAT4, 1, colorIntensityLocation, -1 });
197
198 samplerLocation = 0;
199 pixelShader.addSamplerVar((GX2SamplerVar){ "sampl_texture", GX2_SAMPLER_VAR_TYPE_SAMPLER_2D, samplerLocation });
200
201 vertexShader.setProgram(cpVertexShaderProgram, sizeof(cpVertexShaderProgram), cpVertexShaderRegs, sizeof(cpVertexShaderRegs));
202
203 angleLocation = 0;
204 offsetLocation = 4;
205 scaleLocation = 8;
206 vertexShader.addUniformVar((GX2UniformVar){ "unf_angle", GX2_SHADER_VAR_TYPE_FLOAT, 1, angleLocation, -1 });
207 vertexShader.addUniformVar((GX2UniformVar){ "unf_offset", GX2_SHADER_VAR_TYPE_FLOAT3, 1, offsetLocation, -1 });
208 vertexShader.addUniformVar((GX2UniformVar){ "unf_scale", GX2_SHADER_VAR_TYPE_FLOAT3, 1, scaleLocation, -1 });
209
210 positionLocation = 0;
211 texCoordLocation = 1;
212 vertexShader.addAttribVar((GX2AttribVar){ "attr_position", GX2_SHADER_VAR_TYPE_FLOAT3, 0, positionLocation });
213 vertexShader.addAttribVar((GX2AttribVar){ "attr_texture_coord", GX2_SHADER_VAR_TYPE_FLOAT2, 0, texCoordLocation });
214
215 GX2InitAttribStream(vertexShader.getAttributeBuffer(0), positionLocation, 0, 0, GX2_ATTRIB_FORMAT_FLOAT_32_32_32);
216 GX2InitAttribStream(vertexShader.getAttributeBuffer(1), texCoordLocation, 1, 0, GX2_ATTRIB_FORMAT_FLOAT_32_32);
217
218 fetchShader = new FetchShader(vertexShader.getAttributeBuffer(), vertexShader.getAttributesCount());
219
220 // Model vertices must be aligned and can't land in a region GX2 can't
221 // see (e.g. the stack) - heap-allocated here, same as every other GX2
222 // vertex buffer in this driver.
223 posVtxs = static_cast<float *>(memalign(GX2_VERTEX_BUFFER_ALIGNMENT, ciPositionVtxsSize));
224 texCoords = static_cast<float *>(memalign(GX2_VERTEX_BUFFER_ALIGNMENT, ciTexCoordsVtxsSize));
225
226 // Defaults for a normal square, in the shader's local -1..1 space -
227 // setOffset()/setScale() place and size it in NDC space per draw call.
228 int i = 0;
229 posVtxs[i++] = -1.0f; posVtxs[i++] = -1.0f; posVtxs[i++] = 0.0f;
230 posVtxs[i++] = 1.0f; posVtxs[i++] = -1.0f; posVtxs[i++] = 0.0f;
231 posVtxs[i++] = 1.0f; posVtxs[i++] = 1.0f; posVtxs[i++] = 0.0f;
232 posVtxs[i++] = -1.0f; posVtxs[i++] = 1.0f; posVtxs[i++] = 0.0f;
233 GX2Invalidate(GX2_INVALIDATE_MODE_CPU_ATTRIBUTE_BUFFER, posVtxs, ciPositionVtxsSize);
234
235 i = 0;
236 texCoords[i++] = 0.0f; texCoords[i++] = 1.0f;
237 texCoords[i++] = 1.0f; texCoords[i++] = 1.0f;
238 texCoords[i++] = 1.0f; texCoords[i++] = 0.0f;
239 texCoords[i++] = 0.0f; texCoords[i++] = 0.0f;
240 GX2Invalidate(GX2_INVALIDATE_MODE_CPU_ATTRIBUTE_BUFFER, texCoords, ciTexCoordsVtxsSize);
241
242 memset(&rotatedBuffer, 0, sizeof(rotatedBuffer));
243 rotatedBuffer.flags = static_cast<GX2RResourceFlags>(
244 GX2R_RESOURCE_BIND_VERTEX_BUFFER | GX2R_RESOURCE_USAGE_CPU_WRITE | GX2R_RESOURCE_USAGE_GPU_READ);
245 rotatedBuffer.elemSize = cuRotatedSlotSize;
246 rotatedBuffer.elemCount = cuMaxRotatedDraws;
247 GX2RCreateBuffer(&rotatedBuffer);
248 rotatedSlot = 0;
249}
250
251Texture2DShader::~Texture2DShader()
252{
253 free(posVtxs);
254 free(texCoords);
255 if(GX2RBufferExists(&rotatedBuffer))
256 GX2RDestroyBufferEx(&rotatedBuffer, static_cast<GX2RResourceFlags>(0));
257 delete fetchShader;
258}
Owns the GX2 fetch shader program that binds vertex attribute streams to a vertex shader.
Definition FetchShader.h:17
Textured quad shader (images, glyphs), used by WutImageRenderer and WutGlyphRenderer.