xref: /aosp_15_r20/external/angle/src/libANGLE/renderer/d3d/DynamicImage2DHLSL.cpp (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2019 The ANGLE Project Authors. All rights reserved.
3*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
4*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file.
5*8975f5c5SAndroid Build Coastguard Worker //
6*8975f5c5SAndroid Build Coastguard Worker // DynamicImage2DHLSL.cpp: Implementation for link and run-time HLSL generation
7*8975f5c5SAndroid Build Coastguard Worker //
8*8975f5c5SAndroid Build Coastguard Worker 
9*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/d3d/DynamicImage2DHLSL.h"
10*8975f5c5SAndroid Build Coastguard Worker 
11*8975f5c5SAndroid Build Coastguard Worker #include "common/string_utils.h"
12*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/d3d/ProgramD3D.h"
13*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/d3d/ProgramExecutableD3D.h"
14*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/d3d/ShaderD3D.h"
15*8975f5c5SAndroid Build Coastguard Worker 
16*8975f5c5SAndroid Build Coastguard Worker using namespace gl;
17*8975f5c5SAndroid Build Coastguard Worker 
18*8975f5c5SAndroid Build Coastguard Worker namespace rx
19*8975f5c5SAndroid Build Coastguard Worker {
20*8975f5c5SAndroid Build Coastguard Worker 
21*8975f5c5SAndroid Build Coastguard Worker namespace
22*8975f5c5SAndroid Build Coastguard Worker {
23*8975f5c5SAndroid Build Coastguard Worker 
24*8975f5c5SAndroid Build Coastguard Worker enum Image2DHLSLGroup
25*8975f5c5SAndroid Build Coastguard Worker {
26*8975f5c5SAndroid Build Coastguard Worker     IMAGE2D_R_FLOAT4,
27*8975f5c5SAndroid Build Coastguard Worker     IMAGE2D_MIN = IMAGE2D_R_FLOAT4,
28*8975f5c5SAndroid Build Coastguard Worker     IMAGE2D_R_UNORM,
29*8975f5c5SAndroid Build Coastguard Worker     IMAGE2D_R_SNORM,
30*8975f5c5SAndroid Build Coastguard Worker     IMAGE2D_R_UINT4,
31*8975f5c5SAndroid Build Coastguard Worker     IMAGE2D_R_INT4,
32*8975f5c5SAndroid Build Coastguard Worker     IMAGE2D_W_FLOAT4,
33*8975f5c5SAndroid Build Coastguard Worker     IMAGE2D_W_UNORM,
34*8975f5c5SAndroid Build Coastguard Worker     IMAGE2D_W_SNORM,
35*8975f5c5SAndroid Build Coastguard Worker     IMAGE2D_W_UINT4,
36*8975f5c5SAndroid Build Coastguard Worker     IMAGE2D_W_INT4,
37*8975f5c5SAndroid Build Coastguard Worker     IMAGE2D_UNKNOWN,
38*8975f5c5SAndroid Build Coastguard Worker     IMAGE2D_MAX = IMAGE2D_UNKNOWN
39*8975f5c5SAndroid Build Coastguard Worker };
40*8975f5c5SAndroid Build Coastguard Worker 
41*8975f5c5SAndroid Build Coastguard Worker enum Image2DMethod
42*8975f5c5SAndroid Build Coastguard Worker {
43*8975f5c5SAndroid Build Coastguard Worker     IMAGE2DSIZE,
44*8975f5c5SAndroid Build Coastguard Worker     IMAGE2DLOAD,
45*8975f5c5SAndroid Build Coastguard Worker     IMAGE2DSTORE
46*8975f5c5SAndroid Build Coastguard Worker };
47*8975f5c5SAndroid Build Coastguard Worker 
image2DHLSLGroup(const sh::ShaderVariable & uniform)48*8975f5c5SAndroid Build Coastguard Worker Image2DHLSLGroup image2DHLSLGroup(const sh::ShaderVariable &uniform)
49*8975f5c5SAndroid Build Coastguard Worker {
50*8975f5c5SAndroid Build Coastguard Worker     GLenum format = uniform.imageUnitFormat;
51*8975f5c5SAndroid Build Coastguard Worker     bool readonly = uniform.readonly;
52*8975f5c5SAndroid Build Coastguard Worker     switch (uniform.type)
53*8975f5c5SAndroid Build Coastguard Worker     {
54*8975f5c5SAndroid Build Coastguard Worker         case GL_IMAGE_2D:
55*8975f5c5SAndroid Build Coastguard Worker         {
56*8975f5c5SAndroid Build Coastguard Worker             switch (format)
57*8975f5c5SAndroid Build Coastguard Worker             {
58*8975f5c5SAndroid Build Coastguard Worker                 case GL_RGBA32F:
59*8975f5c5SAndroid Build Coastguard Worker                 case GL_RGBA16F:
60*8975f5c5SAndroid Build Coastguard Worker                 case GL_R32F:
61*8975f5c5SAndroid Build Coastguard Worker                     return readonly ? IMAGE2D_R_FLOAT4 : IMAGE2D_W_FLOAT4;
62*8975f5c5SAndroid Build Coastguard Worker                 case GL_RGBA8:
63*8975f5c5SAndroid Build Coastguard Worker                     return readonly ? IMAGE2D_R_UNORM : IMAGE2D_W_UNORM;
64*8975f5c5SAndroid Build Coastguard Worker                 case GL_RGBA8_SNORM:
65*8975f5c5SAndroid Build Coastguard Worker                     return readonly ? IMAGE2D_R_SNORM : IMAGE2D_W_SNORM;
66*8975f5c5SAndroid Build Coastguard Worker                 default:
67*8975f5c5SAndroid Build Coastguard Worker                     UNREACHABLE();
68*8975f5c5SAndroid Build Coastguard Worker                     return IMAGE2D_UNKNOWN;
69*8975f5c5SAndroid Build Coastguard Worker             }
70*8975f5c5SAndroid Build Coastguard Worker         }
71*8975f5c5SAndroid Build Coastguard Worker         case GL_INT_IMAGE_2D:
72*8975f5c5SAndroid Build Coastguard Worker         {
73*8975f5c5SAndroid Build Coastguard Worker             switch (format)
74*8975f5c5SAndroid Build Coastguard Worker             {
75*8975f5c5SAndroid Build Coastguard Worker                 case GL_RGBA32I:
76*8975f5c5SAndroid Build Coastguard Worker                 case GL_RGBA16I:
77*8975f5c5SAndroid Build Coastguard Worker                 case GL_RGBA8I:
78*8975f5c5SAndroid Build Coastguard Worker                 case GL_R32I:
79*8975f5c5SAndroid Build Coastguard Worker                     return readonly ? IMAGE2D_R_INT4 : IMAGE2D_W_INT4;
80*8975f5c5SAndroid Build Coastguard Worker                 default:
81*8975f5c5SAndroid Build Coastguard Worker                     UNREACHABLE();
82*8975f5c5SAndroid Build Coastguard Worker                     return IMAGE2D_UNKNOWN;
83*8975f5c5SAndroid Build Coastguard Worker             }
84*8975f5c5SAndroid Build Coastguard Worker         }
85*8975f5c5SAndroid Build Coastguard Worker         case GL_UNSIGNED_INT_IMAGE_2D:
86*8975f5c5SAndroid Build Coastguard Worker         {
87*8975f5c5SAndroid Build Coastguard Worker             switch (format)
88*8975f5c5SAndroid Build Coastguard Worker             {
89*8975f5c5SAndroid Build Coastguard Worker                 case GL_RGBA32UI:
90*8975f5c5SAndroid Build Coastguard Worker                 case GL_RGBA16UI:
91*8975f5c5SAndroid Build Coastguard Worker                 case GL_RGBA8UI:
92*8975f5c5SAndroid Build Coastguard Worker                 case GL_R32UI:
93*8975f5c5SAndroid Build Coastguard Worker                     return readonly ? IMAGE2D_R_UINT4 : IMAGE2D_W_UINT4;
94*8975f5c5SAndroid Build Coastguard Worker                 default:
95*8975f5c5SAndroid Build Coastguard Worker                     UNREACHABLE();
96*8975f5c5SAndroid Build Coastguard Worker                     return IMAGE2D_UNKNOWN;
97*8975f5c5SAndroid Build Coastguard Worker             }
98*8975f5c5SAndroid Build Coastguard Worker         }
99*8975f5c5SAndroid Build Coastguard Worker         default:
100*8975f5c5SAndroid Build Coastguard Worker             UNREACHABLE();
101*8975f5c5SAndroid Build Coastguard Worker             return IMAGE2D_UNKNOWN;
102*8975f5c5SAndroid Build Coastguard Worker     }
103*8975f5c5SAndroid Build Coastguard Worker }
104*8975f5c5SAndroid Build Coastguard Worker 
Image2DHLSLGroupSuffix(Image2DHLSLGroup group)105*8975f5c5SAndroid Build Coastguard Worker std::string Image2DHLSLGroupSuffix(Image2DHLSLGroup group)
106*8975f5c5SAndroid Build Coastguard Worker {
107*8975f5c5SAndroid Build Coastguard Worker     switch (group)
108*8975f5c5SAndroid Build Coastguard Worker     {
109*8975f5c5SAndroid Build Coastguard Worker         case IMAGE2D_R_FLOAT4:
110*8975f5c5SAndroid Build Coastguard Worker             return "2D";
111*8975f5c5SAndroid Build Coastguard Worker         case IMAGE2D_R_UNORM:
112*8975f5c5SAndroid Build Coastguard Worker             return "2D_unorm_float4_";
113*8975f5c5SAndroid Build Coastguard Worker         case IMAGE2D_R_SNORM:
114*8975f5c5SAndroid Build Coastguard Worker             return "2D_snorm_float4_";
115*8975f5c5SAndroid Build Coastguard Worker         case IMAGE2D_R_UINT4:
116*8975f5c5SAndroid Build Coastguard Worker             return "2D_uint4_";
117*8975f5c5SAndroid Build Coastguard Worker         case IMAGE2D_R_INT4:
118*8975f5c5SAndroid Build Coastguard Worker             return "2D_int4_";
119*8975f5c5SAndroid Build Coastguard Worker         case IMAGE2D_W_FLOAT4:
120*8975f5c5SAndroid Build Coastguard Worker             return "RW2D_float4_";
121*8975f5c5SAndroid Build Coastguard Worker         case IMAGE2D_W_UNORM:
122*8975f5c5SAndroid Build Coastguard Worker             return "RW2D_unorm_float4_";
123*8975f5c5SAndroid Build Coastguard Worker         case IMAGE2D_W_SNORM:
124*8975f5c5SAndroid Build Coastguard Worker             return "RW2D_snorm_float4_";
125*8975f5c5SAndroid Build Coastguard Worker         case IMAGE2D_W_UINT4:
126*8975f5c5SAndroid Build Coastguard Worker             return "RW2D_uint4_";
127*8975f5c5SAndroid Build Coastguard Worker         case IMAGE2D_W_INT4:
128*8975f5c5SAndroid Build Coastguard Worker             return "RW2D_int4_";
129*8975f5c5SAndroid Build Coastguard Worker         default:
130*8975f5c5SAndroid Build Coastguard Worker             UNREACHABLE();
131*8975f5c5SAndroid Build Coastguard Worker     }
132*8975f5c5SAndroid Build Coastguard Worker 
133*8975f5c5SAndroid Build Coastguard Worker     return "<unknown group type>";
134*8975f5c5SAndroid Build Coastguard Worker }
135*8975f5c5SAndroid Build Coastguard Worker 
Image2DHLSLTextureString(Image2DHLSLGroup group,gl::TextureType type,bool rasterOrdered)136*8975f5c5SAndroid Build Coastguard Worker std::string Image2DHLSLTextureString(Image2DHLSLGroup group,
137*8975f5c5SAndroid Build Coastguard Worker                                      gl::TextureType type,
138*8975f5c5SAndroid Build Coastguard Worker                                      bool rasterOrdered)
139*8975f5c5SAndroid Build Coastguard Worker {
140*8975f5c5SAndroid Build Coastguard Worker     std::string textureString;
141*8975f5c5SAndroid Build Coastguard Worker     switch (group)
142*8975f5c5SAndroid Build Coastguard Worker     {
143*8975f5c5SAndroid Build Coastguard Worker         case IMAGE2D_R_FLOAT4:
144*8975f5c5SAndroid Build Coastguard Worker         case IMAGE2D_R_UNORM:
145*8975f5c5SAndroid Build Coastguard Worker         case IMAGE2D_R_SNORM:
146*8975f5c5SAndroid Build Coastguard Worker         case IMAGE2D_R_UINT4:
147*8975f5c5SAndroid Build Coastguard Worker         case IMAGE2D_R_INT4:
148*8975f5c5SAndroid Build Coastguard Worker             break;
149*8975f5c5SAndroid Build Coastguard Worker         case IMAGE2D_W_FLOAT4:
150*8975f5c5SAndroid Build Coastguard Worker         case IMAGE2D_W_UNORM:
151*8975f5c5SAndroid Build Coastguard Worker         case IMAGE2D_W_SNORM:
152*8975f5c5SAndroid Build Coastguard Worker         case IMAGE2D_W_UINT4:
153*8975f5c5SAndroid Build Coastguard Worker         case IMAGE2D_W_INT4:
154*8975f5c5SAndroid Build Coastguard Worker             textureString += rasterOrdered ? "RasterizerOrdered" : "RW";
155*8975f5c5SAndroid Build Coastguard Worker             break;
156*8975f5c5SAndroid Build Coastguard Worker         default:
157*8975f5c5SAndroid Build Coastguard Worker             UNREACHABLE();
158*8975f5c5SAndroid Build Coastguard Worker     }
159*8975f5c5SAndroid Build Coastguard Worker 
160*8975f5c5SAndroid Build Coastguard Worker     textureString += "Texture";
161*8975f5c5SAndroid Build Coastguard Worker 
162*8975f5c5SAndroid Build Coastguard Worker     switch (type)
163*8975f5c5SAndroid Build Coastguard Worker     {
164*8975f5c5SAndroid Build Coastguard Worker         case gl::TextureType::_2D:
165*8975f5c5SAndroid Build Coastguard Worker             textureString += "2D";
166*8975f5c5SAndroid Build Coastguard Worker             break;
167*8975f5c5SAndroid Build Coastguard Worker         case gl::TextureType::_3D:
168*8975f5c5SAndroid Build Coastguard Worker             textureString += "3D";
169*8975f5c5SAndroid Build Coastguard Worker             break;
170*8975f5c5SAndroid Build Coastguard Worker         case gl::TextureType::_2DArray:
171*8975f5c5SAndroid Build Coastguard Worker             textureString += "2DArray";
172*8975f5c5SAndroid Build Coastguard Worker             break;
173*8975f5c5SAndroid Build Coastguard Worker         default:
174*8975f5c5SAndroid Build Coastguard Worker             UNREACHABLE();
175*8975f5c5SAndroid Build Coastguard Worker     }
176*8975f5c5SAndroid Build Coastguard Worker 
177*8975f5c5SAndroid Build Coastguard Worker     switch (group)
178*8975f5c5SAndroid Build Coastguard Worker     {
179*8975f5c5SAndroid Build Coastguard Worker         case IMAGE2D_R_FLOAT4:
180*8975f5c5SAndroid Build Coastguard Worker         case IMAGE2D_W_FLOAT4:
181*8975f5c5SAndroid Build Coastguard Worker             textureString += "<float4>";
182*8975f5c5SAndroid Build Coastguard Worker             break;
183*8975f5c5SAndroid Build Coastguard Worker         case IMAGE2D_R_UNORM:
184*8975f5c5SAndroid Build Coastguard Worker         case IMAGE2D_W_UNORM:
185*8975f5c5SAndroid Build Coastguard Worker             textureString += "<unorm float4>";
186*8975f5c5SAndroid Build Coastguard Worker             break;
187*8975f5c5SAndroid Build Coastguard Worker         case IMAGE2D_R_SNORM:
188*8975f5c5SAndroid Build Coastguard Worker         case IMAGE2D_W_SNORM:
189*8975f5c5SAndroid Build Coastguard Worker             textureString += "<snorm float4>";
190*8975f5c5SAndroid Build Coastguard Worker             break;
191*8975f5c5SAndroid Build Coastguard Worker         case IMAGE2D_R_UINT4:
192*8975f5c5SAndroid Build Coastguard Worker         case IMAGE2D_W_UINT4:
193*8975f5c5SAndroid Build Coastguard Worker             textureString += "<uint4>";
194*8975f5c5SAndroid Build Coastguard Worker             break;
195*8975f5c5SAndroid Build Coastguard Worker         case IMAGE2D_R_INT4:
196*8975f5c5SAndroid Build Coastguard Worker         case IMAGE2D_W_INT4:
197*8975f5c5SAndroid Build Coastguard Worker             textureString += "<int4>";
198*8975f5c5SAndroid Build Coastguard Worker             break;
199*8975f5c5SAndroid Build Coastguard Worker         default:
200*8975f5c5SAndroid Build Coastguard Worker             UNREACHABLE();
201*8975f5c5SAndroid Build Coastguard Worker     }
202*8975f5c5SAndroid Build Coastguard Worker 
203*8975f5c5SAndroid Build Coastguard Worker     return textureString;
204*8975f5c5SAndroid Build Coastguard Worker }
205*8975f5c5SAndroid Build Coastguard Worker 
Image2DHLSLGroupOffsetPrefix(Image2DHLSLGroup group)206*8975f5c5SAndroid Build Coastguard Worker std::string Image2DHLSLGroupOffsetPrefix(Image2DHLSLGroup group)
207*8975f5c5SAndroid Build Coastguard Worker {
208*8975f5c5SAndroid Build Coastguard Worker     switch (group)
209*8975f5c5SAndroid Build Coastguard Worker     {
210*8975f5c5SAndroid Build Coastguard Worker         case IMAGE2D_R_FLOAT4:
211*8975f5c5SAndroid Build Coastguard Worker         case IMAGE2D_R_UNORM:
212*8975f5c5SAndroid Build Coastguard Worker         case IMAGE2D_R_SNORM:
213*8975f5c5SAndroid Build Coastguard Worker         case IMAGE2D_R_UINT4:
214*8975f5c5SAndroid Build Coastguard Worker         case IMAGE2D_R_INT4:
215*8975f5c5SAndroid Build Coastguard Worker             return "readonlyImageIndexOffset";
216*8975f5c5SAndroid Build Coastguard Worker         case IMAGE2D_W_FLOAT4:
217*8975f5c5SAndroid Build Coastguard Worker         case IMAGE2D_W_UNORM:
218*8975f5c5SAndroid Build Coastguard Worker         case IMAGE2D_W_SNORM:
219*8975f5c5SAndroid Build Coastguard Worker         case IMAGE2D_W_UINT4:
220*8975f5c5SAndroid Build Coastguard Worker         case IMAGE2D_W_INT4:
221*8975f5c5SAndroid Build Coastguard Worker             return "imageIndexOffset";
222*8975f5c5SAndroid Build Coastguard Worker         default:
223*8975f5c5SAndroid Build Coastguard Worker             UNREACHABLE();
224*8975f5c5SAndroid Build Coastguard Worker     }
225*8975f5c5SAndroid Build Coastguard Worker 
226*8975f5c5SAndroid Build Coastguard Worker     return "<unknown group type>";
227*8975f5c5SAndroid Build Coastguard Worker }
228*8975f5c5SAndroid Build Coastguard Worker 
Image2DHLSLGroupDeclarationPrefix(Image2DHLSLGroup group)229*8975f5c5SAndroid Build Coastguard Worker std::string Image2DHLSLGroupDeclarationPrefix(Image2DHLSLGroup group)
230*8975f5c5SAndroid Build Coastguard Worker {
231*8975f5c5SAndroid Build Coastguard Worker     switch (group)
232*8975f5c5SAndroid Build Coastguard Worker     {
233*8975f5c5SAndroid Build Coastguard Worker         case IMAGE2D_R_FLOAT4:
234*8975f5c5SAndroid Build Coastguard Worker         case IMAGE2D_R_UNORM:
235*8975f5c5SAndroid Build Coastguard Worker         case IMAGE2D_R_SNORM:
236*8975f5c5SAndroid Build Coastguard Worker         case IMAGE2D_R_UINT4:
237*8975f5c5SAndroid Build Coastguard Worker         case IMAGE2D_R_INT4:
238*8975f5c5SAndroid Build Coastguard Worker             return "readonlyImages";
239*8975f5c5SAndroid Build Coastguard Worker         case IMAGE2D_W_FLOAT4:
240*8975f5c5SAndroid Build Coastguard Worker         case IMAGE2D_W_UNORM:
241*8975f5c5SAndroid Build Coastguard Worker         case IMAGE2D_W_SNORM:
242*8975f5c5SAndroid Build Coastguard Worker         case IMAGE2D_W_UINT4:
243*8975f5c5SAndroid Build Coastguard Worker         case IMAGE2D_W_INT4:
244*8975f5c5SAndroid Build Coastguard Worker             return "images";
245*8975f5c5SAndroid Build Coastguard Worker         default:
246*8975f5c5SAndroid Build Coastguard Worker             UNREACHABLE();
247*8975f5c5SAndroid Build Coastguard Worker     }
248*8975f5c5SAndroid Build Coastguard Worker 
249*8975f5c5SAndroid Build Coastguard Worker     return "<unknown group type>";
250*8975f5c5SAndroid Build Coastguard Worker }
251*8975f5c5SAndroid Build Coastguard Worker 
IsReadOnlyImage2DHLSLGroup(Image2DHLSLGroup group)252*8975f5c5SAndroid Build Coastguard Worker bool IsReadOnlyImage2DHLSLGroup(Image2DHLSLGroup group)
253*8975f5c5SAndroid Build Coastguard Worker {
254*8975f5c5SAndroid Build Coastguard Worker     switch (group)
255*8975f5c5SAndroid Build Coastguard Worker     {
256*8975f5c5SAndroid Build Coastguard Worker         case IMAGE2D_R_FLOAT4:
257*8975f5c5SAndroid Build Coastguard Worker         case IMAGE2D_R_UNORM:
258*8975f5c5SAndroid Build Coastguard Worker         case IMAGE2D_R_SNORM:
259*8975f5c5SAndroid Build Coastguard Worker         case IMAGE2D_R_UINT4:
260*8975f5c5SAndroid Build Coastguard Worker         case IMAGE2D_R_INT4:
261*8975f5c5SAndroid Build Coastguard Worker             return true;
262*8975f5c5SAndroid Build Coastguard Worker         case IMAGE2D_W_FLOAT4:
263*8975f5c5SAndroid Build Coastguard Worker         case IMAGE2D_W_UNORM:
264*8975f5c5SAndroid Build Coastguard Worker         case IMAGE2D_W_SNORM:
265*8975f5c5SAndroid Build Coastguard Worker         case IMAGE2D_W_UINT4:
266*8975f5c5SAndroid Build Coastguard Worker         case IMAGE2D_W_INT4:
267*8975f5c5SAndroid Build Coastguard Worker             return false;
268*8975f5c5SAndroid Build Coastguard Worker         default:
269*8975f5c5SAndroid Build Coastguard Worker             UNREACHABLE();
270*8975f5c5SAndroid Build Coastguard Worker     }
271*8975f5c5SAndroid Build Coastguard Worker     return false;
272*8975f5c5SAndroid Build Coastguard Worker }
273*8975f5c5SAndroid Build Coastguard Worker 
Image2DHLSLGroupRegisterSuffix(Image2DHLSLGroup group)274*8975f5c5SAndroid Build Coastguard Worker std::string Image2DHLSLGroupRegisterSuffix(Image2DHLSLGroup group)
275*8975f5c5SAndroid Build Coastguard Worker {
276*8975f5c5SAndroid Build Coastguard Worker     switch (group)
277*8975f5c5SAndroid Build Coastguard Worker     {
278*8975f5c5SAndroid Build Coastguard Worker         case IMAGE2D_R_FLOAT4:
279*8975f5c5SAndroid Build Coastguard Worker         case IMAGE2D_R_UNORM:
280*8975f5c5SAndroid Build Coastguard Worker         case IMAGE2D_R_SNORM:
281*8975f5c5SAndroid Build Coastguard Worker         case IMAGE2D_R_UINT4:
282*8975f5c5SAndroid Build Coastguard Worker         case IMAGE2D_R_INT4:
283*8975f5c5SAndroid Build Coastguard Worker             return "t";
284*8975f5c5SAndroid Build Coastguard Worker         case IMAGE2D_W_FLOAT4:
285*8975f5c5SAndroid Build Coastguard Worker         case IMAGE2D_W_UNORM:
286*8975f5c5SAndroid Build Coastguard Worker         case IMAGE2D_W_SNORM:
287*8975f5c5SAndroid Build Coastguard Worker         case IMAGE2D_W_UINT4:
288*8975f5c5SAndroid Build Coastguard Worker         case IMAGE2D_W_INT4:
289*8975f5c5SAndroid Build Coastguard Worker             return "u";
290*8975f5c5SAndroid Build Coastguard Worker         default:
291*8975f5c5SAndroid Build Coastguard Worker             UNREACHABLE();
292*8975f5c5SAndroid Build Coastguard Worker     }
293*8975f5c5SAndroid Build Coastguard Worker 
294*8975f5c5SAndroid Build Coastguard Worker     return "<unknown group type>";
295*8975f5c5SAndroid Build Coastguard Worker }
296*8975f5c5SAndroid Build Coastguard Worker 
Image2DHLSLGroupFunctionName(Image2DHLSLGroup group,Image2DMethod method)297*8975f5c5SAndroid Build Coastguard Worker std::string Image2DHLSLGroupFunctionName(Image2DHLSLGroup group, Image2DMethod method)
298*8975f5c5SAndroid Build Coastguard Worker {
299*8975f5c5SAndroid Build Coastguard Worker     std::string name = "gl_image";
300*8975f5c5SAndroid Build Coastguard Worker     name += Image2DHLSLGroupSuffix(group);
301*8975f5c5SAndroid Build Coastguard Worker     switch (method)
302*8975f5c5SAndroid Build Coastguard Worker     {
303*8975f5c5SAndroid Build Coastguard Worker         case IMAGE2DSIZE:
304*8975f5c5SAndroid Build Coastguard Worker             name += "Size";
305*8975f5c5SAndroid Build Coastguard Worker             break;
306*8975f5c5SAndroid Build Coastguard Worker         case IMAGE2DLOAD:
307*8975f5c5SAndroid Build Coastguard Worker             name += "Load";
308*8975f5c5SAndroid Build Coastguard Worker             break;
309*8975f5c5SAndroid Build Coastguard Worker         case IMAGE2DSTORE:
310*8975f5c5SAndroid Build Coastguard Worker             name += "Store";
311*8975f5c5SAndroid Build Coastguard Worker             break;
312*8975f5c5SAndroid Build Coastguard Worker         default:
313*8975f5c5SAndroid Build Coastguard Worker             UNREACHABLE();
314*8975f5c5SAndroid Build Coastguard Worker     }
315*8975f5c5SAndroid Build Coastguard Worker 
316*8975f5c5SAndroid Build Coastguard Worker     return name;
317*8975f5c5SAndroid Build Coastguard Worker }
318*8975f5c5SAndroid Build Coastguard Worker 
getImage2DGroupReturnType(Image2DHLSLGroup group,Image2DMethod method)319*8975f5c5SAndroid Build Coastguard Worker std::string getImage2DGroupReturnType(Image2DHLSLGroup group, Image2DMethod method)
320*8975f5c5SAndroid Build Coastguard Worker {
321*8975f5c5SAndroid Build Coastguard Worker     switch (method)
322*8975f5c5SAndroid Build Coastguard Worker     {
323*8975f5c5SAndroid Build Coastguard Worker         case IMAGE2DSIZE:
324*8975f5c5SAndroid Build Coastguard Worker             return "int2";
325*8975f5c5SAndroid Build Coastguard Worker         case IMAGE2DLOAD:
326*8975f5c5SAndroid Build Coastguard Worker             switch (group)
327*8975f5c5SAndroid Build Coastguard Worker             {
328*8975f5c5SAndroid Build Coastguard Worker                 case IMAGE2D_R_FLOAT4:
329*8975f5c5SAndroid Build Coastguard Worker                 case IMAGE2D_R_UNORM:
330*8975f5c5SAndroid Build Coastguard Worker                 case IMAGE2D_R_SNORM:
331*8975f5c5SAndroid Build Coastguard Worker                 case IMAGE2D_W_FLOAT4:
332*8975f5c5SAndroid Build Coastguard Worker                 case IMAGE2D_W_UNORM:
333*8975f5c5SAndroid Build Coastguard Worker                 case IMAGE2D_W_SNORM:
334*8975f5c5SAndroid Build Coastguard Worker                     return "float4";
335*8975f5c5SAndroid Build Coastguard Worker                 case IMAGE2D_R_UINT4:
336*8975f5c5SAndroid Build Coastguard Worker                 case IMAGE2D_W_UINT4:
337*8975f5c5SAndroid Build Coastguard Worker                     return "uint4";
338*8975f5c5SAndroid Build Coastguard Worker                 case IMAGE2D_R_INT4:
339*8975f5c5SAndroid Build Coastguard Worker                 case IMAGE2D_W_INT4:
340*8975f5c5SAndroid Build Coastguard Worker                     return "int4";
341*8975f5c5SAndroid Build Coastguard Worker                 default:
342*8975f5c5SAndroid Build Coastguard Worker                     UNREACHABLE();
343*8975f5c5SAndroid Build Coastguard Worker                     return "unknown group type";
344*8975f5c5SAndroid Build Coastguard Worker             }
345*8975f5c5SAndroid Build Coastguard Worker         case IMAGE2DSTORE:
346*8975f5c5SAndroid Build Coastguard Worker             return "void";
347*8975f5c5SAndroid Build Coastguard Worker         default:
348*8975f5c5SAndroid Build Coastguard Worker             UNREACHABLE();
349*8975f5c5SAndroid Build Coastguard Worker             return "unknown image method";
350*8975f5c5SAndroid Build Coastguard Worker     }
351*8975f5c5SAndroid Build Coastguard Worker }
352*8975f5c5SAndroid Build Coastguard Worker 
getImageMetadata(Image2DHLSLGroup group)353*8975f5c5SAndroid Build Coastguard Worker std::string getImageMetadata(Image2DHLSLGroup group)
354*8975f5c5SAndroid Build Coastguard Worker {
355*8975f5c5SAndroid Build Coastguard Worker     switch (group)
356*8975f5c5SAndroid Build Coastguard Worker     {
357*8975f5c5SAndroid Build Coastguard Worker         case IMAGE2D_R_FLOAT4:
358*8975f5c5SAndroid Build Coastguard Worker         case IMAGE2D_R_UNORM:
359*8975f5c5SAndroid Build Coastguard Worker         case IMAGE2D_R_SNORM:
360*8975f5c5SAndroid Build Coastguard Worker         case IMAGE2D_R_UINT4:
361*8975f5c5SAndroid Build Coastguard Worker         case IMAGE2D_R_INT4:
362*8975f5c5SAndroid Build Coastguard Worker             return "readonlyImageMetadata[imageIndex - readonlyImageIndexStart]";
363*8975f5c5SAndroid Build Coastguard Worker         case IMAGE2D_W_FLOAT4:
364*8975f5c5SAndroid Build Coastguard Worker         case IMAGE2D_W_UNORM:
365*8975f5c5SAndroid Build Coastguard Worker         case IMAGE2D_W_SNORM:
366*8975f5c5SAndroid Build Coastguard Worker         case IMAGE2D_W_UINT4:
367*8975f5c5SAndroid Build Coastguard Worker         case IMAGE2D_W_INT4:
368*8975f5c5SAndroid Build Coastguard Worker             return "imageMetadata[imageIndex - imageIndexStart]";
369*8975f5c5SAndroid Build Coastguard Worker         default:
370*8975f5c5SAndroid Build Coastguard Worker             UNREACHABLE();
371*8975f5c5SAndroid Build Coastguard Worker             return "unknown image method";
372*8975f5c5SAndroid Build Coastguard Worker     }
373*8975f5c5SAndroid Build Coastguard Worker }
374*8975f5c5SAndroid Build Coastguard Worker 
OutputImage2DFunctionArgumentList(std::ostringstream & out,Image2DHLSLGroup group,Image2DMethod method)375*8975f5c5SAndroid Build Coastguard Worker void OutputImage2DFunctionArgumentList(std::ostringstream &out,
376*8975f5c5SAndroid Build Coastguard Worker                                        Image2DHLSLGroup group,
377*8975f5c5SAndroid Build Coastguard Worker                                        Image2DMethod method)
378*8975f5c5SAndroid Build Coastguard Worker {
379*8975f5c5SAndroid Build Coastguard Worker     out << "uint imageIndex";
380*8975f5c5SAndroid Build Coastguard Worker 
381*8975f5c5SAndroid Build Coastguard Worker     if (method == IMAGE2DLOAD || method == IMAGE2DSTORE)
382*8975f5c5SAndroid Build Coastguard Worker     {
383*8975f5c5SAndroid Build Coastguard Worker         out << ", int2 p";
384*8975f5c5SAndroid Build Coastguard Worker         if (method == IMAGE2DSTORE)
385*8975f5c5SAndroid Build Coastguard Worker         {
386*8975f5c5SAndroid Build Coastguard Worker             switch (group)
387*8975f5c5SAndroid Build Coastguard Worker             {
388*8975f5c5SAndroid Build Coastguard Worker                 case IMAGE2D_R_FLOAT4:
389*8975f5c5SAndroid Build Coastguard Worker                 case IMAGE2D_R_UNORM:
390*8975f5c5SAndroid Build Coastguard Worker                 case IMAGE2D_R_SNORM:
391*8975f5c5SAndroid Build Coastguard Worker                 case IMAGE2D_W_FLOAT4:
392*8975f5c5SAndroid Build Coastguard Worker                 case IMAGE2D_W_UNORM:
393*8975f5c5SAndroid Build Coastguard Worker                 case IMAGE2D_W_SNORM:
394*8975f5c5SAndroid Build Coastguard Worker                     out << ", float4 data";
395*8975f5c5SAndroid Build Coastguard Worker                     break;
396*8975f5c5SAndroid Build Coastguard Worker                 case IMAGE2D_R_UINT4:
397*8975f5c5SAndroid Build Coastguard Worker                 case IMAGE2D_W_UINT4:
398*8975f5c5SAndroid Build Coastguard Worker                     out << ", uint4 data";
399*8975f5c5SAndroid Build Coastguard Worker                     break;
400*8975f5c5SAndroid Build Coastguard Worker                 case IMAGE2D_R_INT4:
401*8975f5c5SAndroid Build Coastguard Worker                 case IMAGE2D_W_INT4:
402*8975f5c5SAndroid Build Coastguard Worker                     out << ", int4 data";
403*8975f5c5SAndroid Build Coastguard Worker                     break;
404*8975f5c5SAndroid Build Coastguard Worker                 default:
405*8975f5c5SAndroid Build Coastguard Worker                     UNREACHABLE();
406*8975f5c5SAndroid Build Coastguard Worker             }
407*8975f5c5SAndroid Build Coastguard Worker         }
408*8975f5c5SAndroid Build Coastguard Worker     }
409*8975f5c5SAndroid Build Coastguard Worker }
410*8975f5c5SAndroid Build Coastguard Worker 
OutputImage2DSizeFunction(std::ostringstream & out,Image2DHLSLGroup textureGroup,unsigned int totalCount,unsigned int texture2DCount,unsigned int texture3DCount,unsigned int texture2DArrayCount,const std::string & offsetStr,const std::string & declarationStr)411*8975f5c5SAndroid Build Coastguard Worker void OutputImage2DSizeFunction(std::ostringstream &out,
412*8975f5c5SAndroid Build Coastguard Worker                                Image2DHLSLGroup textureGroup,
413*8975f5c5SAndroid Build Coastguard Worker                                unsigned int totalCount,
414*8975f5c5SAndroid Build Coastguard Worker                                unsigned int texture2DCount,
415*8975f5c5SAndroid Build Coastguard Worker                                unsigned int texture3DCount,
416*8975f5c5SAndroid Build Coastguard Worker                                unsigned int texture2DArrayCount,
417*8975f5c5SAndroid Build Coastguard Worker                                const std::string &offsetStr,
418*8975f5c5SAndroid Build Coastguard Worker                                const std::string &declarationStr)
419*8975f5c5SAndroid Build Coastguard Worker {
420*8975f5c5SAndroid Build Coastguard Worker     out << getImage2DGroupReturnType(textureGroup, IMAGE2DSIZE) << " "
421*8975f5c5SAndroid Build Coastguard Worker         << Image2DHLSLGroupFunctionName(textureGroup, IMAGE2DSIZE) << "(";
422*8975f5c5SAndroid Build Coastguard Worker     OutputImage2DFunctionArgumentList(out, textureGroup, IMAGE2DSIZE);
423*8975f5c5SAndroid Build Coastguard Worker     out << ")\n"
424*8975f5c5SAndroid Build Coastguard Worker            "{\n";
425*8975f5c5SAndroid Build Coastguard Worker     out << "    uint width, height;\n";
426*8975f5c5SAndroid Build Coastguard Worker 
427*8975f5c5SAndroid Build Coastguard Worker     if (texture2DCount > 0)
428*8975f5c5SAndroid Build Coastguard Worker     {
429*8975f5c5SAndroid Build Coastguard Worker         if (texture2DCount == totalCount)
430*8975f5c5SAndroid Build Coastguard Worker         {
431*8975f5c5SAndroid Build Coastguard Worker             out << "    const uint index = imageIndex -  " << offsetStr << "2D;\n";
432*8975f5c5SAndroid Build Coastguard Worker             out << "    " << declarationStr << "2D[index].GetDimensions(width, height);\n";
433*8975f5c5SAndroid Build Coastguard Worker         }
434*8975f5c5SAndroid Build Coastguard Worker         else
435*8975f5c5SAndroid Build Coastguard Worker         {
436*8975f5c5SAndroid Build Coastguard Worker             out << "    if (imageIndex >= " << offsetStr << "2D && imageIndex < " << offsetStr
437*8975f5c5SAndroid Build Coastguard Worker                 << "2D + " << texture2DCount << ")\n";
438*8975f5c5SAndroid Build Coastguard Worker             out << "    {\n";
439*8975f5c5SAndroid Build Coastguard Worker             out << "        const uint index = imageIndex -  " << offsetStr << "2D;\n";
440*8975f5c5SAndroid Build Coastguard Worker             out << "        " << declarationStr << "2D[index].GetDimensions(width, height);\n";
441*8975f5c5SAndroid Build Coastguard Worker             out << "    }\n";
442*8975f5c5SAndroid Build Coastguard Worker         }
443*8975f5c5SAndroid Build Coastguard Worker     }
444*8975f5c5SAndroid Build Coastguard Worker 
445*8975f5c5SAndroid Build Coastguard Worker     if (texture3DCount > 0)
446*8975f5c5SAndroid Build Coastguard Worker     {
447*8975f5c5SAndroid Build Coastguard Worker         if (texture3DCount == totalCount)
448*8975f5c5SAndroid Build Coastguard Worker         {
449*8975f5c5SAndroid Build Coastguard Worker             out << "    const uint index = imageIndex -  " << offsetStr << "3D;\n";
450*8975f5c5SAndroid Build Coastguard Worker             out << "    uint depth;\n";
451*8975f5c5SAndroid Build Coastguard Worker             out << "    " << declarationStr << "3D[index].GetDimensions(width, height, depth);\n";
452*8975f5c5SAndroid Build Coastguard Worker         }
453*8975f5c5SAndroid Build Coastguard Worker         else
454*8975f5c5SAndroid Build Coastguard Worker         {
455*8975f5c5SAndroid Build Coastguard Worker             if (texture2DArrayCount == 0)
456*8975f5c5SAndroid Build Coastguard Worker             {
457*8975f5c5SAndroid Build Coastguard Worker                 out << "    else\n";
458*8975f5c5SAndroid Build Coastguard Worker             }
459*8975f5c5SAndroid Build Coastguard Worker             else
460*8975f5c5SAndroid Build Coastguard Worker             {
461*8975f5c5SAndroid Build Coastguard Worker                 if (texture2DCount == 0)
462*8975f5c5SAndroid Build Coastguard Worker                 {
463*8975f5c5SAndroid Build Coastguard Worker                     out << "    if ";
464*8975f5c5SAndroid Build Coastguard Worker                 }
465*8975f5c5SAndroid Build Coastguard Worker                 else
466*8975f5c5SAndroid Build Coastguard Worker                 {
467*8975f5c5SAndroid Build Coastguard Worker                     out << "    else if";
468*8975f5c5SAndroid Build Coastguard Worker                 }
469*8975f5c5SAndroid Build Coastguard Worker                 out << "(imageIndex >= " << offsetStr << "3D && imageIndex < " << offsetStr
470*8975f5c5SAndroid Build Coastguard Worker                     << "3D + " << texture3DCount << ")\n";
471*8975f5c5SAndroid Build Coastguard Worker             }
472*8975f5c5SAndroid Build Coastguard Worker             out << "    {\n";
473*8975f5c5SAndroid Build Coastguard Worker             out << "        const uint index = imageIndex -  " << offsetStr << "3D;\n";
474*8975f5c5SAndroid Build Coastguard Worker             out << "        uint depth;\n";
475*8975f5c5SAndroid Build Coastguard Worker             out << "        " << declarationStr
476*8975f5c5SAndroid Build Coastguard Worker                 << "3D[index].GetDimensions(width, height, depth);\n";
477*8975f5c5SAndroid Build Coastguard Worker             out << "    }\n";
478*8975f5c5SAndroid Build Coastguard Worker         }
479*8975f5c5SAndroid Build Coastguard Worker     }
480*8975f5c5SAndroid Build Coastguard Worker 
481*8975f5c5SAndroid Build Coastguard Worker     if (texture2DArrayCount > 0)
482*8975f5c5SAndroid Build Coastguard Worker     {
483*8975f5c5SAndroid Build Coastguard Worker         if (texture2DArrayCount == totalCount)
484*8975f5c5SAndroid Build Coastguard Worker         {
485*8975f5c5SAndroid Build Coastguard Worker             out << "    const uint index = imageIndex -  " << offsetStr << "2DArray;\n";
486*8975f5c5SAndroid Build Coastguard Worker             out << "    uint depth;\n";
487*8975f5c5SAndroid Build Coastguard Worker             out << "    " << declarationStr
488*8975f5c5SAndroid Build Coastguard Worker                 << "2DArray[index].GetDimensions(width, height, depth);\n";
489*8975f5c5SAndroid Build Coastguard Worker         }
490*8975f5c5SAndroid Build Coastguard Worker         else
491*8975f5c5SAndroid Build Coastguard Worker         {
492*8975f5c5SAndroid Build Coastguard Worker             out << "    else\n";
493*8975f5c5SAndroid Build Coastguard Worker             out << "    {\n";
494*8975f5c5SAndroid Build Coastguard Worker             out << "        const uint index = imageIndex -  " << offsetStr << "2DArray;\n";
495*8975f5c5SAndroid Build Coastguard Worker             out << "        uint depth;\n";
496*8975f5c5SAndroid Build Coastguard Worker             out << "        " << declarationStr
497*8975f5c5SAndroid Build Coastguard Worker                 << "2DArray[index].GetDimensions(width, height, depth);\n";
498*8975f5c5SAndroid Build Coastguard Worker             out << "    }\n";
499*8975f5c5SAndroid Build Coastguard Worker         }
500*8975f5c5SAndroid Build Coastguard Worker     }
501*8975f5c5SAndroid Build Coastguard Worker     out << "    return int2(width, height);\n";
502*8975f5c5SAndroid Build Coastguard Worker 
503*8975f5c5SAndroid Build Coastguard Worker     out << "}\n";
504*8975f5c5SAndroid Build Coastguard Worker }
505*8975f5c5SAndroid Build Coastguard Worker 
OutputImage2DLoadFunction(std::ostringstream & out,Image2DHLSLGroup textureGroup,unsigned int totalCount,unsigned int texture2DCount,unsigned int texture3DCount,unsigned int texture2DArrayCount,const std::string & offsetStr,const std::string & declarationStr)506*8975f5c5SAndroid Build Coastguard Worker void OutputImage2DLoadFunction(std::ostringstream &out,
507*8975f5c5SAndroid Build Coastguard Worker                                Image2DHLSLGroup textureGroup,
508*8975f5c5SAndroid Build Coastguard Worker                                unsigned int totalCount,
509*8975f5c5SAndroid Build Coastguard Worker                                unsigned int texture2DCount,
510*8975f5c5SAndroid Build Coastguard Worker                                unsigned int texture3DCount,
511*8975f5c5SAndroid Build Coastguard Worker                                unsigned int texture2DArrayCount,
512*8975f5c5SAndroid Build Coastguard Worker                                const std::string &offsetStr,
513*8975f5c5SAndroid Build Coastguard Worker                                const std::string &declarationStr)
514*8975f5c5SAndroid Build Coastguard Worker {
515*8975f5c5SAndroid Build Coastguard Worker     out << getImage2DGroupReturnType(textureGroup, IMAGE2DLOAD) << " "
516*8975f5c5SAndroid Build Coastguard Worker         << Image2DHLSLGroupFunctionName(textureGroup, IMAGE2DLOAD) << "(";
517*8975f5c5SAndroid Build Coastguard Worker     OutputImage2DFunctionArgumentList(out, textureGroup, IMAGE2DLOAD);
518*8975f5c5SAndroid Build Coastguard Worker     out << ")\n"
519*8975f5c5SAndroid Build Coastguard Worker            "{\n";
520*8975f5c5SAndroid Build Coastguard Worker 
521*8975f5c5SAndroid Build Coastguard Worker     out << "    " << getImage2DGroupReturnType(textureGroup, IMAGE2DLOAD) << " result;\n";
522*8975f5c5SAndroid Build Coastguard Worker 
523*8975f5c5SAndroid Build Coastguard Worker     if (texture2DCount > 0)
524*8975f5c5SAndroid Build Coastguard Worker     {
525*8975f5c5SAndroid Build Coastguard Worker         if (texture2DCount == totalCount)
526*8975f5c5SAndroid Build Coastguard Worker         {
527*8975f5c5SAndroid Build Coastguard Worker             out << "    const uint index = imageIndex -  " << offsetStr << "2D;\n";
528*8975f5c5SAndroid Build Coastguard Worker             out << "    result = " << declarationStr << "2D[index][uint2(p.x, p.y)];\n";
529*8975f5c5SAndroid Build Coastguard Worker         }
530*8975f5c5SAndroid Build Coastguard Worker         else
531*8975f5c5SAndroid Build Coastguard Worker         {
532*8975f5c5SAndroid Build Coastguard Worker             out << "    if (imageIndex >= " << offsetStr << "2D && imageIndex < " << offsetStr
533*8975f5c5SAndroid Build Coastguard Worker                 << "2D + " << texture2DCount << ")\n";
534*8975f5c5SAndroid Build Coastguard Worker             out << "    {\n";
535*8975f5c5SAndroid Build Coastguard Worker             out << "        const uint index = imageIndex -  " << offsetStr << "2D;\n";
536*8975f5c5SAndroid Build Coastguard Worker             out << "        result = " << declarationStr << "2D[index][uint2(p.x, p.y)];\n";
537*8975f5c5SAndroid Build Coastguard Worker             out << "    }\n";
538*8975f5c5SAndroid Build Coastguard Worker         }
539*8975f5c5SAndroid Build Coastguard Worker     }
540*8975f5c5SAndroid Build Coastguard Worker 
541*8975f5c5SAndroid Build Coastguard Worker     if (texture3DCount > 0)
542*8975f5c5SAndroid Build Coastguard Worker     {
543*8975f5c5SAndroid Build Coastguard Worker         if (texture3DCount == totalCount)
544*8975f5c5SAndroid Build Coastguard Worker         {
545*8975f5c5SAndroid Build Coastguard Worker             out << "    const uint index = imageIndex -  " << offsetStr << "3D;\n";
546*8975f5c5SAndroid Build Coastguard Worker             out << "    result = " << declarationStr << "3D[index][uint3(p.x, p.y, "
547*8975f5c5SAndroid Build Coastguard Worker                 << getImageMetadata(textureGroup) << ".layer)];\n";
548*8975f5c5SAndroid Build Coastguard Worker         }
549*8975f5c5SAndroid Build Coastguard Worker         else
550*8975f5c5SAndroid Build Coastguard Worker         {
551*8975f5c5SAndroid Build Coastguard Worker             if (texture2DArrayCount == 0)
552*8975f5c5SAndroid Build Coastguard Worker             {
553*8975f5c5SAndroid Build Coastguard Worker                 out << "    else\n";
554*8975f5c5SAndroid Build Coastguard Worker             }
555*8975f5c5SAndroid Build Coastguard Worker             else
556*8975f5c5SAndroid Build Coastguard Worker             {
557*8975f5c5SAndroid Build Coastguard Worker                 if (texture2DCount == 0)
558*8975f5c5SAndroid Build Coastguard Worker                 {
559*8975f5c5SAndroid Build Coastguard Worker                     out << "    if ";
560*8975f5c5SAndroid Build Coastguard Worker                 }
561*8975f5c5SAndroid Build Coastguard Worker                 else
562*8975f5c5SAndroid Build Coastguard Worker                 {
563*8975f5c5SAndroid Build Coastguard Worker                     out << "    else if";
564*8975f5c5SAndroid Build Coastguard Worker                 }
565*8975f5c5SAndroid Build Coastguard Worker                 out << "(imageIndex >= " << offsetStr << "3D && imageIndex < " << offsetStr
566*8975f5c5SAndroid Build Coastguard Worker                     << "3D + " << texture3DCount << ")\n";
567*8975f5c5SAndroid Build Coastguard Worker             }
568*8975f5c5SAndroid Build Coastguard Worker             out << "    {\n";
569*8975f5c5SAndroid Build Coastguard Worker             out << "        const uint index = imageIndex -  " << offsetStr << "3D;\n";
570*8975f5c5SAndroid Build Coastguard Worker             out << "        result = " << declarationStr << "3D[index][uint3(p.x, p.y, "
571*8975f5c5SAndroid Build Coastguard Worker                 << getImageMetadata(textureGroup) << ".layer)];\n";
572*8975f5c5SAndroid Build Coastguard Worker             out << "    }\n";
573*8975f5c5SAndroid Build Coastguard Worker         }
574*8975f5c5SAndroid Build Coastguard Worker     }
575*8975f5c5SAndroid Build Coastguard Worker 
576*8975f5c5SAndroid Build Coastguard Worker     if (texture2DArrayCount > 0)
577*8975f5c5SAndroid Build Coastguard Worker     {
578*8975f5c5SAndroid Build Coastguard Worker         if (texture2DArrayCount == totalCount)
579*8975f5c5SAndroid Build Coastguard Worker         {
580*8975f5c5SAndroid Build Coastguard Worker             out << "    const uint index = imageIndex -  " << offsetStr << "2DArray;\n";
581*8975f5c5SAndroid Build Coastguard Worker             out << "    result = " << declarationStr << "2DArray[index][uint3(p.x, p.y, "
582*8975f5c5SAndroid Build Coastguard Worker                 << getImageMetadata(textureGroup) << ".layer)];\n";
583*8975f5c5SAndroid Build Coastguard Worker         }
584*8975f5c5SAndroid Build Coastguard Worker         else
585*8975f5c5SAndroid Build Coastguard Worker         {
586*8975f5c5SAndroid Build Coastguard Worker             out << "    else\n";
587*8975f5c5SAndroid Build Coastguard Worker             out << "    {\n";
588*8975f5c5SAndroid Build Coastguard Worker             out << "        const uint index = imageIndex -  " << offsetStr << "2DArray;\n";
589*8975f5c5SAndroid Build Coastguard Worker             out << "        result = " << declarationStr << "2DArray[index][uint3(p.x, p.y, "
590*8975f5c5SAndroid Build Coastguard Worker                 << getImageMetadata(textureGroup) << ".layer)];\n";
591*8975f5c5SAndroid Build Coastguard Worker             out << "    }\n";
592*8975f5c5SAndroid Build Coastguard Worker         }
593*8975f5c5SAndroid Build Coastguard Worker     }
594*8975f5c5SAndroid Build Coastguard Worker 
595*8975f5c5SAndroid Build Coastguard Worker     out << "    return result;\n";
596*8975f5c5SAndroid Build Coastguard Worker     out << "}\n";
597*8975f5c5SAndroid Build Coastguard Worker }
598*8975f5c5SAndroid Build Coastguard Worker 
OutputImage2DStoreFunction(std::ostringstream & out,Image2DHLSLGroup textureGroup,unsigned int totalCount,unsigned int texture2DCount,unsigned int texture3DCount,unsigned int texture2DArrayCount,const std::string & offsetStr,const std::string & declarationStr)599*8975f5c5SAndroid Build Coastguard Worker void OutputImage2DStoreFunction(std::ostringstream &out,
600*8975f5c5SAndroid Build Coastguard Worker                                 Image2DHLSLGroup textureGroup,
601*8975f5c5SAndroid Build Coastguard Worker                                 unsigned int totalCount,
602*8975f5c5SAndroid Build Coastguard Worker                                 unsigned int texture2DCount,
603*8975f5c5SAndroid Build Coastguard Worker                                 unsigned int texture3DCount,
604*8975f5c5SAndroid Build Coastguard Worker                                 unsigned int texture2DArrayCount,
605*8975f5c5SAndroid Build Coastguard Worker                                 const std::string &offsetStr,
606*8975f5c5SAndroid Build Coastguard Worker                                 const std::string &declarationStr)
607*8975f5c5SAndroid Build Coastguard Worker {
608*8975f5c5SAndroid Build Coastguard Worker     out << getImage2DGroupReturnType(textureGroup, IMAGE2DSTORE) << " "
609*8975f5c5SAndroid Build Coastguard Worker         << Image2DHLSLGroupFunctionName(textureGroup, IMAGE2DSTORE) << "(";
610*8975f5c5SAndroid Build Coastguard Worker     OutputImage2DFunctionArgumentList(out, textureGroup, IMAGE2DSTORE);
611*8975f5c5SAndroid Build Coastguard Worker     out << ")\n"
612*8975f5c5SAndroid Build Coastguard Worker            "{\n";
613*8975f5c5SAndroid Build Coastguard Worker 
614*8975f5c5SAndroid Build Coastguard Worker     if (texture2DCount > 0)
615*8975f5c5SAndroid Build Coastguard Worker     {
616*8975f5c5SAndroid Build Coastguard Worker         if (texture2DCount == totalCount)
617*8975f5c5SAndroid Build Coastguard Worker         {
618*8975f5c5SAndroid Build Coastguard Worker             out << "    const uint index = imageIndex -  " << offsetStr << "2D;\n";
619*8975f5c5SAndroid Build Coastguard Worker             out << "    " << declarationStr << "2D[index][uint2(p.x, p.y)] = data;\n";
620*8975f5c5SAndroid Build Coastguard Worker         }
621*8975f5c5SAndroid Build Coastguard Worker         else
622*8975f5c5SAndroid Build Coastguard Worker         {
623*8975f5c5SAndroid Build Coastguard Worker             out << "    if (imageIndex >= " << offsetStr << "2D && imageIndex < " << offsetStr
624*8975f5c5SAndroid Build Coastguard Worker                 << "2D + " << texture2DCount << ")\n";
625*8975f5c5SAndroid Build Coastguard Worker             out << "    {\n";
626*8975f5c5SAndroid Build Coastguard Worker             out << "        const uint index = imageIndex -  " << offsetStr << "2D;\n";
627*8975f5c5SAndroid Build Coastguard Worker             out << "        " << declarationStr << "2D[index][uint2(p.x, p.y)] = data;\n";
628*8975f5c5SAndroid Build Coastguard Worker             out << "    }\n";
629*8975f5c5SAndroid Build Coastguard Worker         }
630*8975f5c5SAndroid Build Coastguard Worker     }
631*8975f5c5SAndroid Build Coastguard Worker 
632*8975f5c5SAndroid Build Coastguard Worker     if (texture3DCount > 0)
633*8975f5c5SAndroid Build Coastguard Worker     {
634*8975f5c5SAndroid Build Coastguard Worker         if (texture3DCount == totalCount)
635*8975f5c5SAndroid Build Coastguard Worker         {
636*8975f5c5SAndroid Build Coastguard Worker             out << "    const uint index = imageIndex -  " << offsetStr << "3D;\n";
637*8975f5c5SAndroid Build Coastguard Worker             out << "    " << declarationStr << "3D[index][uint3(p.x, p.y, "
638*8975f5c5SAndroid Build Coastguard Worker                 << getImageMetadata(textureGroup) << ".layer)] = data;\n";
639*8975f5c5SAndroid Build Coastguard Worker         }
640*8975f5c5SAndroid Build Coastguard Worker         else
641*8975f5c5SAndroid Build Coastguard Worker         {
642*8975f5c5SAndroid Build Coastguard Worker             if (texture2DArrayCount == 0)
643*8975f5c5SAndroid Build Coastguard Worker             {
644*8975f5c5SAndroid Build Coastguard Worker                 out << "    else\n";
645*8975f5c5SAndroid Build Coastguard Worker             }
646*8975f5c5SAndroid Build Coastguard Worker             else
647*8975f5c5SAndroid Build Coastguard Worker             {
648*8975f5c5SAndroid Build Coastguard Worker                 if (texture2DCount == 0)
649*8975f5c5SAndroid Build Coastguard Worker                 {
650*8975f5c5SAndroid Build Coastguard Worker                     out << "    if ";
651*8975f5c5SAndroid Build Coastguard Worker                 }
652*8975f5c5SAndroid Build Coastguard Worker                 else
653*8975f5c5SAndroid Build Coastguard Worker                 {
654*8975f5c5SAndroid Build Coastguard Worker                     out << "    else if";
655*8975f5c5SAndroid Build Coastguard Worker                 }
656*8975f5c5SAndroid Build Coastguard Worker                 out << "(imageIndex >= " << offsetStr << "3D && imageIndex < " << offsetStr
657*8975f5c5SAndroid Build Coastguard Worker                     << "3D + " << texture3DCount << ")\n";
658*8975f5c5SAndroid Build Coastguard Worker             }
659*8975f5c5SAndroid Build Coastguard Worker             out << "    {\n";
660*8975f5c5SAndroid Build Coastguard Worker             out << "        const uint index = imageIndex -  " << offsetStr << "3D;\n";
661*8975f5c5SAndroid Build Coastguard Worker             out << "        " << declarationStr << "3D[index][uint3(p.x, p.y, "
662*8975f5c5SAndroid Build Coastguard Worker                 << getImageMetadata(textureGroup) << ".layer)] = data;\n";
663*8975f5c5SAndroid Build Coastguard Worker             out << "    }\n";
664*8975f5c5SAndroid Build Coastguard Worker         }
665*8975f5c5SAndroid Build Coastguard Worker     }
666*8975f5c5SAndroid Build Coastguard Worker 
667*8975f5c5SAndroid Build Coastguard Worker     if (texture2DArrayCount > 0)
668*8975f5c5SAndroid Build Coastguard Worker     {
669*8975f5c5SAndroid Build Coastguard Worker         if (texture2DArrayCount == totalCount)
670*8975f5c5SAndroid Build Coastguard Worker         {
671*8975f5c5SAndroid Build Coastguard Worker             out << "    const uint index = imageIndex -  " << offsetStr << "2DArray;\n";
672*8975f5c5SAndroid Build Coastguard Worker             out << "    " << declarationStr << "2DArray[index][uint3(p.x, p.y, "
673*8975f5c5SAndroid Build Coastguard Worker                 << getImageMetadata(textureGroup) << ".layer)] = data;\n";
674*8975f5c5SAndroid Build Coastguard Worker         }
675*8975f5c5SAndroid Build Coastguard Worker         else
676*8975f5c5SAndroid Build Coastguard Worker         {
677*8975f5c5SAndroid Build Coastguard Worker             out << "    else\n";
678*8975f5c5SAndroid Build Coastguard Worker             out << "    {\n";
679*8975f5c5SAndroid Build Coastguard Worker             out << "        const uint index = imageIndex -  " << offsetStr << "2DArray;\n";
680*8975f5c5SAndroid Build Coastguard Worker             out << "        " << declarationStr << "2DArray[index][uint3(p.x, p.y, "
681*8975f5c5SAndroid Build Coastguard Worker                 << getImageMetadata(textureGroup) << ".layer)] = data;\n";
682*8975f5c5SAndroid Build Coastguard Worker             out << "    }\n";
683*8975f5c5SAndroid Build Coastguard Worker         }
684*8975f5c5SAndroid Build Coastguard Worker     }
685*8975f5c5SAndroid Build Coastguard Worker 
686*8975f5c5SAndroid Build Coastguard Worker     out << "}\n";
687*8975f5c5SAndroid Build Coastguard Worker }
688*8975f5c5SAndroid Build Coastguard Worker 
GetImage2DRegisterIndex(Image2DHLSLGroup textureGroup,unsigned int * groupTextureRegisterIndex,unsigned int * groupRWTextureRegisterIndex)689*8975f5c5SAndroid Build Coastguard Worker unsigned int *GetImage2DRegisterIndex(Image2DHLSLGroup textureGroup,
690*8975f5c5SAndroid Build Coastguard Worker                                       unsigned int *groupTextureRegisterIndex,
691*8975f5c5SAndroid Build Coastguard Worker                                       unsigned int *groupRWTextureRegisterIndex)
692*8975f5c5SAndroid Build Coastguard Worker {
693*8975f5c5SAndroid Build Coastguard Worker     switch (textureGroup)
694*8975f5c5SAndroid Build Coastguard Worker     {
695*8975f5c5SAndroid Build Coastguard Worker         case IMAGE2D_R_FLOAT4:
696*8975f5c5SAndroid Build Coastguard Worker         case IMAGE2D_R_UNORM:
697*8975f5c5SAndroid Build Coastguard Worker         case IMAGE2D_R_SNORM:
698*8975f5c5SAndroid Build Coastguard Worker         case IMAGE2D_R_UINT4:
699*8975f5c5SAndroid Build Coastguard Worker         case IMAGE2D_R_INT4:
700*8975f5c5SAndroid Build Coastguard Worker             return groupTextureRegisterIndex;
701*8975f5c5SAndroid Build Coastguard Worker         case IMAGE2D_W_FLOAT4:
702*8975f5c5SAndroid Build Coastguard Worker         case IMAGE2D_W_UNORM:
703*8975f5c5SAndroid Build Coastguard Worker         case IMAGE2D_W_SNORM:
704*8975f5c5SAndroid Build Coastguard Worker         case IMAGE2D_W_UINT4:
705*8975f5c5SAndroid Build Coastguard Worker         case IMAGE2D_W_INT4:
706*8975f5c5SAndroid Build Coastguard Worker             return groupRWTextureRegisterIndex;
707*8975f5c5SAndroid Build Coastguard Worker         default:
708*8975f5c5SAndroid Build Coastguard Worker             UNREACHABLE();
709*8975f5c5SAndroid Build Coastguard Worker             return nullptr;
710*8975f5c5SAndroid Build Coastguard Worker     }
711*8975f5c5SAndroid Build Coastguard Worker }
712*8975f5c5SAndroid Build Coastguard Worker 
OutputHLSLImage2DUniformGroup(ProgramExecutableD3D & executableD3D,gl::ShaderType shaderType,const SharedCompiledShaderStateD3D & shaderData,std::ostringstream & out,const Image2DHLSLGroup textureGroup,const std::vector<sh::ShaderVariable> & group,const gl::ImageUnitTextureTypeMap & image2DBindLayout,unsigned int baseUAVRegister,unsigned int * groupTextureRegisterIndex,unsigned int * groupRWTextureRegisterIndex,unsigned int * image2DTexture3D,unsigned int * image2DTexture2DArray,unsigned int * image2DTexture2D)713*8975f5c5SAndroid Build Coastguard Worker void OutputHLSLImage2DUniformGroup(ProgramExecutableD3D &executableD3D,
714*8975f5c5SAndroid Build Coastguard Worker                                    gl::ShaderType shaderType,
715*8975f5c5SAndroid Build Coastguard Worker                                    const SharedCompiledShaderStateD3D &shaderData,
716*8975f5c5SAndroid Build Coastguard Worker                                    std::ostringstream &out,
717*8975f5c5SAndroid Build Coastguard Worker                                    const Image2DHLSLGroup textureGroup,
718*8975f5c5SAndroid Build Coastguard Worker                                    const std::vector<sh::ShaderVariable> &group,
719*8975f5c5SAndroid Build Coastguard Worker                                    const gl::ImageUnitTextureTypeMap &image2DBindLayout,
720*8975f5c5SAndroid Build Coastguard Worker                                    unsigned int baseUAVRegister,
721*8975f5c5SAndroid Build Coastguard Worker                                    unsigned int *groupTextureRegisterIndex,
722*8975f5c5SAndroid Build Coastguard Worker                                    unsigned int *groupRWTextureRegisterIndex,
723*8975f5c5SAndroid Build Coastguard Worker                                    unsigned int *image2DTexture3D,
724*8975f5c5SAndroid Build Coastguard Worker                                    unsigned int *image2DTexture2DArray,
725*8975f5c5SAndroid Build Coastguard Worker                                    unsigned int *image2DTexture2D)
726*8975f5c5SAndroid Build Coastguard Worker {
727*8975f5c5SAndroid Build Coastguard Worker     if (group.empty())
728*8975f5c5SAndroid Build Coastguard Worker     {
729*8975f5c5SAndroid Build Coastguard Worker         return;
730*8975f5c5SAndroid Build Coastguard Worker     }
731*8975f5c5SAndroid Build Coastguard Worker 
732*8975f5c5SAndroid Build Coastguard Worker     unsigned int texture2DCount = 0, texture3DCount = 0, texture2DArrayCount = 0;
733*8975f5c5SAndroid Build Coastguard Worker     bool texture2DRasterOrdered = false, texture3DRasterOrdered = false,
734*8975f5c5SAndroid Build Coastguard Worker          texture2DArrayRasterOrdered = false;
735*8975f5c5SAndroid Build Coastguard Worker     for (const sh::ShaderVariable &uniform : group)
736*8975f5c5SAndroid Build Coastguard Worker     {
737*8975f5c5SAndroid Build Coastguard Worker         if (!executableD3D.hasNamedUniform(uniform.name))
738*8975f5c5SAndroid Build Coastguard Worker         {
739*8975f5c5SAndroid Build Coastguard Worker             continue;
740*8975f5c5SAndroid Build Coastguard Worker         }
741*8975f5c5SAndroid Build Coastguard Worker         for (unsigned int index = 0; index < uniform.getArraySizeProduct(); index++)
742*8975f5c5SAndroid Build Coastguard Worker         {
743*8975f5c5SAndroid Build Coastguard Worker             switch (image2DBindLayout.at(uniform.binding + index))
744*8975f5c5SAndroid Build Coastguard Worker             {
745*8975f5c5SAndroid Build Coastguard Worker                 case gl::TextureType::_2D:
746*8975f5c5SAndroid Build Coastguard Worker                     texture2DCount++;
747*8975f5c5SAndroid Build Coastguard Worker                     texture2DRasterOrdered |= uniform.rasterOrdered;
748*8975f5c5SAndroid Build Coastguard Worker                     break;
749*8975f5c5SAndroid Build Coastguard Worker                 case gl::TextureType::_3D:
750*8975f5c5SAndroid Build Coastguard Worker                     texture3DCount++;
751*8975f5c5SAndroid Build Coastguard Worker                     texture3DRasterOrdered |= uniform.rasterOrdered;
752*8975f5c5SAndroid Build Coastguard Worker                     break;
753*8975f5c5SAndroid Build Coastguard Worker                 case gl::TextureType::_2DArray:
754*8975f5c5SAndroid Build Coastguard Worker                 case gl::TextureType::CubeMap:
755*8975f5c5SAndroid Build Coastguard Worker                     texture2DArrayCount++;
756*8975f5c5SAndroid Build Coastguard Worker                     texture2DArrayRasterOrdered |= uniform.rasterOrdered;
757*8975f5c5SAndroid Build Coastguard Worker                     break;
758*8975f5c5SAndroid Build Coastguard Worker                 default:
759*8975f5c5SAndroid Build Coastguard Worker                     UNREACHABLE();
760*8975f5c5SAndroid Build Coastguard Worker             }
761*8975f5c5SAndroid Build Coastguard Worker         }
762*8975f5c5SAndroid Build Coastguard Worker     }
763*8975f5c5SAndroid Build Coastguard Worker 
764*8975f5c5SAndroid Build Coastguard Worker     unsigned int totalCount            = texture2DCount + texture3DCount + texture2DArrayCount;
765*8975f5c5SAndroid Build Coastguard Worker     unsigned int *image2DRegisterIndex = GetImage2DRegisterIndex(
766*8975f5c5SAndroid Build Coastguard Worker         textureGroup, groupTextureRegisterIndex, groupRWTextureRegisterIndex);
767*8975f5c5SAndroid Build Coastguard Worker     unsigned int texture2DRegisterIndex      = *image2DRegisterIndex;
768*8975f5c5SAndroid Build Coastguard Worker     unsigned int texture3DRegisterIndex      = texture2DRegisterIndex + texture2DCount;
769*8975f5c5SAndroid Build Coastguard Worker     unsigned int texture2DArrayRegisterIndex = texture3DRegisterIndex + texture3DCount;
770*8975f5c5SAndroid Build Coastguard Worker     *image2DRegisterIndex += totalCount;
771*8975f5c5SAndroid Build Coastguard Worker 
772*8975f5c5SAndroid Build Coastguard Worker     unsigned int baseRegister = IsReadOnlyImage2DHLSLGroup(textureGroup) ? 0 : baseUAVRegister;
773*8975f5c5SAndroid Build Coastguard Worker 
774*8975f5c5SAndroid Build Coastguard Worker     std::string offsetStr =
775*8975f5c5SAndroid Build Coastguard Worker         Image2DHLSLGroupOffsetPrefix(textureGroup) + Image2DHLSLGroupSuffix(textureGroup);
776*8975f5c5SAndroid Build Coastguard Worker     std::string declarationStr =
777*8975f5c5SAndroid Build Coastguard Worker         Image2DHLSLGroupDeclarationPrefix(textureGroup) + Image2DHLSLGroupSuffix(textureGroup);
778*8975f5c5SAndroid Build Coastguard Worker     std::string registerStr = Image2DHLSLGroupRegisterSuffix(textureGroup);
779*8975f5c5SAndroid Build Coastguard Worker     if (texture2DCount > 0)
780*8975f5c5SAndroid Build Coastguard Worker     {
781*8975f5c5SAndroid Build Coastguard Worker         out << "static const uint " << offsetStr << "2D = " << texture2DRegisterIndex << ";\n";
782*8975f5c5SAndroid Build Coastguard Worker         out << "uniform "
783*8975f5c5SAndroid Build Coastguard Worker             << Image2DHLSLTextureString(textureGroup, gl::TextureType::_2D, texture2DRasterOrdered)
784*8975f5c5SAndroid Build Coastguard Worker             << " " << declarationStr << "2D[" << texture2DCount << "]"
785*8975f5c5SAndroid Build Coastguard Worker             << " : register(" << registerStr << baseRegister + texture2DRegisterIndex << ");\n";
786*8975f5c5SAndroid Build Coastguard Worker     }
787*8975f5c5SAndroid Build Coastguard Worker     if (texture3DCount > 0)
788*8975f5c5SAndroid Build Coastguard Worker     {
789*8975f5c5SAndroid Build Coastguard Worker         out << "static const uint " << offsetStr << "3D = " << texture3DRegisterIndex << ";\n";
790*8975f5c5SAndroid Build Coastguard Worker         out << "uniform "
791*8975f5c5SAndroid Build Coastguard Worker             << Image2DHLSLTextureString(textureGroup, gl::TextureType::_3D, texture3DRasterOrdered)
792*8975f5c5SAndroid Build Coastguard Worker             << " " << declarationStr << "3D[" << texture3DCount << "]"
793*8975f5c5SAndroid Build Coastguard Worker             << " : register(" << registerStr << baseRegister + texture3DRegisterIndex << ");\n";
794*8975f5c5SAndroid Build Coastguard Worker     }
795*8975f5c5SAndroid Build Coastguard Worker     if (texture2DArrayCount > 0)
796*8975f5c5SAndroid Build Coastguard Worker     {
797*8975f5c5SAndroid Build Coastguard Worker         out << "static const uint " << offsetStr << "2DArray = " << texture2DArrayRegisterIndex
798*8975f5c5SAndroid Build Coastguard Worker             << ";\n";
799*8975f5c5SAndroid Build Coastguard Worker         out << "uniform "
800*8975f5c5SAndroid Build Coastguard Worker             << Image2DHLSLTextureString(textureGroup, gl::TextureType::_2DArray,
801*8975f5c5SAndroid Build Coastguard Worker                                         texture2DArrayRasterOrdered)
802*8975f5c5SAndroid Build Coastguard Worker             << " " << declarationStr << "2DArray[" << texture2DArrayCount << "]"
803*8975f5c5SAndroid Build Coastguard Worker             << " : register(" << registerStr << baseRegister + texture2DArrayRegisterIndex
804*8975f5c5SAndroid Build Coastguard Worker             << ");\n";
805*8975f5c5SAndroid Build Coastguard Worker     }
806*8975f5c5SAndroid Build Coastguard Worker     for (const sh::ShaderVariable &uniform : group)
807*8975f5c5SAndroid Build Coastguard Worker     {
808*8975f5c5SAndroid Build Coastguard Worker         if (!executableD3D.hasNamedUniform(uniform.name))
809*8975f5c5SAndroid Build Coastguard Worker         {
810*8975f5c5SAndroid Build Coastguard Worker             continue;
811*8975f5c5SAndroid Build Coastguard Worker         }
812*8975f5c5SAndroid Build Coastguard Worker 
813*8975f5c5SAndroid Build Coastguard Worker         out << "static const uint " << DecorateVariable(uniform.name)
814*8975f5c5SAndroid Build Coastguard Worker             << ArrayIndexString(uniform.arraySizes) << " = {";
815*8975f5c5SAndroid Build Coastguard Worker         for (unsigned int index = 0; index < uniform.getArraySizeProduct(); index++)
816*8975f5c5SAndroid Build Coastguard Worker         {
817*8975f5c5SAndroid Build Coastguard Worker             if (index > 0)
818*8975f5c5SAndroid Build Coastguard Worker             {
819*8975f5c5SAndroid Build Coastguard Worker                 out << ", ";
820*8975f5c5SAndroid Build Coastguard Worker             }
821*8975f5c5SAndroid Build Coastguard Worker             switch (image2DBindLayout.at(uniform.binding + index))
822*8975f5c5SAndroid Build Coastguard Worker             {
823*8975f5c5SAndroid Build Coastguard Worker                 case gl::TextureType::_2D:
824*8975f5c5SAndroid Build Coastguard Worker                 {
825*8975f5c5SAndroid Build Coastguard Worker                     out << texture2DRegisterIndex;
826*8975f5c5SAndroid Build Coastguard Worker                     executableD3D.assignImage2DRegisters(shaderType, texture2DRegisterIndex,
827*8975f5c5SAndroid Build Coastguard Worker                                                          uniform.binding + index, uniform.readonly);
828*8975f5c5SAndroid Build Coastguard Worker                     texture2DRegisterIndex++;
829*8975f5c5SAndroid Build Coastguard Worker                     break;
830*8975f5c5SAndroid Build Coastguard Worker                 }
831*8975f5c5SAndroid Build Coastguard Worker                 case gl::TextureType::_3D:
832*8975f5c5SAndroid Build Coastguard Worker                 {
833*8975f5c5SAndroid Build Coastguard Worker                     out << texture3DRegisterIndex;
834*8975f5c5SAndroid Build Coastguard Worker                     executableD3D.assignImage2DRegisters(shaderType, texture3DRegisterIndex,
835*8975f5c5SAndroid Build Coastguard Worker                                                          uniform.binding + index, uniform.readonly);
836*8975f5c5SAndroid Build Coastguard Worker                     texture3DRegisterIndex++;
837*8975f5c5SAndroid Build Coastguard Worker                     break;
838*8975f5c5SAndroid Build Coastguard Worker                 }
839*8975f5c5SAndroid Build Coastguard Worker                 case gl::TextureType::_2DArray:
840*8975f5c5SAndroid Build Coastguard Worker                 case gl::TextureType::CubeMap:
841*8975f5c5SAndroid Build Coastguard Worker                 {
842*8975f5c5SAndroid Build Coastguard Worker                     out << texture2DArrayRegisterIndex;
843*8975f5c5SAndroid Build Coastguard Worker                     executableD3D.assignImage2DRegisters(shaderType, texture2DArrayRegisterIndex,
844*8975f5c5SAndroid Build Coastguard Worker                                                          uniform.binding + index, uniform.readonly);
845*8975f5c5SAndroid Build Coastguard Worker                     texture2DArrayRegisterIndex++;
846*8975f5c5SAndroid Build Coastguard Worker                     break;
847*8975f5c5SAndroid Build Coastguard Worker                 }
848*8975f5c5SAndroid Build Coastguard Worker                 default:
849*8975f5c5SAndroid Build Coastguard Worker                     UNREACHABLE();
850*8975f5c5SAndroid Build Coastguard Worker             }
851*8975f5c5SAndroid Build Coastguard Worker         }
852*8975f5c5SAndroid Build Coastguard Worker         out << "};\n";
853*8975f5c5SAndroid Build Coastguard Worker     }
854*8975f5c5SAndroid Build Coastguard Worker 
855*8975f5c5SAndroid Build Coastguard Worker     if (shaderData->useImage2DFunction(Image2DHLSLGroupFunctionName(textureGroup, IMAGE2DSIZE)))
856*8975f5c5SAndroid Build Coastguard Worker     {
857*8975f5c5SAndroid Build Coastguard Worker         OutputImage2DSizeFunction(out, textureGroup, totalCount, texture2DCount, texture3DCount,
858*8975f5c5SAndroid Build Coastguard Worker                                   texture2DArrayCount, offsetStr, declarationStr);
859*8975f5c5SAndroid Build Coastguard Worker     }
860*8975f5c5SAndroid Build Coastguard Worker     if (shaderData->useImage2DFunction(Image2DHLSLGroupFunctionName(textureGroup, IMAGE2DLOAD)))
861*8975f5c5SAndroid Build Coastguard Worker     {
862*8975f5c5SAndroid Build Coastguard Worker         OutputImage2DLoadFunction(out, textureGroup, totalCount, texture2DCount, texture3DCount,
863*8975f5c5SAndroid Build Coastguard Worker                                   texture2DArrayCount, offsetStr, declarationStr);
864*8975f5c5SAndroid Build Coastguard Worker     }
865*8975f5c5SAndroid Build Coastguard Worker     if (shaderData->useImage2DFunction(Image2DHLSLGroupFunctionName(textureGroup, IMAGE2DSTORE)))
866*8975f5c5SAndroid Build Coastguard Worker     {
867*8975f5c5SAndroid Build Coastguard Worker         OutputImage2DStoreFunction(out, textureGroup, totalCount, texture2DCount, texture3DCount,
868*8975f5c5SAndroid Build Coastguard Worker                                    texture2DArrayCount, offsetStr, declarationStr);
869*8975f5c5SAndroid Build Coastguard Worker     }
870*8975f5c5SAndroid Build Coastguard Worker }
871*8975f5c5SAndroid Build Coastguard Worker 
872*8975f5c5SAndroid Build Coastguard Worker // kImage2DFunctionString must be the same as outputHLSL.
873*8975f5c5SAndroid Build Coastguard Worker constexpr const char kImage2DFunctionString[] = "// @@ IMAGE2D DECLARATION FUNCTION STRING @@";
874*8975f5c5SAndroid Build Coastguard Worker }  // anonymous namespace
875*8975f5c5SAndroid Build Coastguard Worker 
GenerateShaderForImage2DBindSignatureImpl(ProgramExecutableD3D & executableD3D,gl::ShaderType shaderType,const SharedCompiledShaderStateD3D & shaderData,const std::string & shaderHLSL,std::vector<sh::ShaderVariable> & image2DUniforms,const gl::ImageUnitTextureTypeMap & image2DBindLayout,unsigned int baseUAVRegister)876*8975f5c5SAndroid Build Coastguard Worker std::string GenerateShaderForImage2DBindSignatureImpl(
877*8975f5c5SAndroid Build Coastguard Worker     ProgramExecutableD3D &executableD3D,
878*8975f5c5SAndroid Build Coastguard Worker     gl::ShaderType shaderType,
879*8975f5c5SAndroid Build Coastguard Worker     const SharedCompiledShaderStateD3D &shaderData,
880*8975f5c5SAndroid Build Coastguard Worker     const std::string &shaderHLSL,
881*8975f5c5SAndroid Build Coastguard Worker     std::vector<sh::ShaderVariable> &image2DUniforms,
882*8975f5c5SAndroid Build Coastguard Worker     const gl::ImageUnitTextureTypeMap &image2DBindLayout,
883*8975f5c5SAndroid Build Coastguard Worker     unsigned int baseUAVRegister)
884*8975f5c5SAndroid Build Coastguard Worker {
885*8975f5c5SAndroid Build Coastguard Worker     std::vector<std::vector<sh::ShaderVariable>> groupedImage2DUniforms(IMAGE2D_MAX + 1);
886*8975f5c5SAndroid Build Coastguard Worker     unsigned int image2DTexture3DCount = 0, image2DTexture2DArrayCount = 0;
887*8975f5c5SAndroid Build Coastguard Worker     for (sh::ShaderVariable &image2D : image2DUniforms)
888*8975f5c5SAndroid Build Coastguard Worker     {
889*8975f5c5SAndroid Build Coastguard Worker         for (unsigned int index = 0; index < image2D.getArraySizeProduct(); index++)
890*8975f5c5SAndroid Build Coastguard Worker         {
891*8975f5c5SAndroid Build Coastguard Worker             // Any image variable declared without a binding qualifier is initially bound to unit
892*8975f5c5SAndroid Build Coastguard Worker             // zero.
893*8975f5c5SAndroid Build Coastguard Worker             if (image2D.binding == -1)
894*8975f5c5SAndroid Build Coastguard Worker             {
895*8975f5c5SAndroid Build Coastguard Worker                 image2D.binding = 0;
896*8975f5c5SAndroid Build Coastguard Worker             }
897*8975f5c5SAndroid Build Coastguard Worker             switch (image2DBindLayout.at(image2D.binding + index))
898*8975f5c5SAndroid Build Coastguard Worker             {
899*8975f5c5SAndroid Build Coastguard Worker                 case gl::TextureType::_2D:
900*8975f5c5SAndroid Build Coastguard Worker                     break;
901*8975f5c5SAndroid Build Coastguard Worker                 case gl::TextureType::_3D:
902*8975f5c5SAndroid Build Coastguard Worker                     image2DTexture3DCount++;
903*8975f5c5SAndroid Build Coastguard Worker                     break;
904*8975f5c5SAndroid Build Coastguard Worker                 case gl::TextureType::_2DArray:
905*8975f5c5SAndroid Build Coastguard Worker                 case gl::TextureType::CubeMap:
906*8975f5c5SAndroid Build Coastguard Worker                     image2DTexture2DArrayCount++;
907*8975f5c5SAndroid Build Coastguard Worker                     break;
908*8975f5c5SAndroid Build Coastguard Worker                 default:
909*8975f5c5SAndroid Build Coastguard Worker                     UNREACHABLE();
910*8975f5c5SAndroid Build Coastguard Worker             }
911*8975f5c5SAndroid Build Coastguard Worker         }
912*8975f5c5SAndroid Build Coastguard Worker         Image2DHLSLGroup group = image2DHLSLGroup(image2D);
913*8975f5c5SAndroid Build Coastguard Worker         groupedImage2DUniforms[group].push_back(image2D);
914*8975f5c5SAndroid Build Coastguard Worker     }
915*8975f5c5SAndroid Build Coastguard Worker 
916*8975f5c5SAndroid Build Coastguard Worker     unsigned int groupTextureRegisterIndex   = shaderData->readonlyImage2DRegisterIndex;
917*8975f5c5SAndroid Build Coastguard Worker     unsigned int groupRWTextureRegisterIndex = shaderData->image2DRegisterIndex;
918*8975f5c5SAndroid Build Coastguard Worker     unsigned int image2DTexture3DIndex       = 0;
919*8975f5c5SAndroid Build Coastguard Worker     unsigned int image2DTexture2DArrayIndex  = image2DTexture3DCount;
920*8975f5c5SAndroid Build Coastguard Worker     unsigned int image2DTexture2DIndex       = image2DTexture3DCount + image2DTexture2DArrayCount;
921*8975f5c5SAndroid Build Coastguard Worker     std::ostringstream out;
922*8975f5c5SAndroid Build Coastguard Worker 
923*8975f5c5SAndroid Build Coastguard Worker     for (int groupId = IMAGE2D_MIN; groupId < IMAGE2D_MAX; ++groupId)
924*8975f5c5SAndroid Build Coastguard Worker     {
925*8975f5c5SAndroid Build Coastguard Worker         OutputHLSLImage2DUniformGroup(
926*8975f5c5SAndroid Build Coastguard Worker             executableD3D, shaderType, shaderData, out, Image2DHLSLGroup(groupId),
927*8975f5c5SAndroid Build Coastguard Worker             groupedImage2DUniforms[groupId], image2DBindLayout, baseUAVRegister,
928*8975f5c5SAndroid Build Coastguard Worker             &groupTextureRegisterIndex, &groupRWTextureRegisterIndex, &image2DTexture3DIndex,
929*8975f5c5SAndroid Build Coastguard Worker             &image2DTexture2DArrayIndex, &image2DTexture2DIndex);
930*8975f5c5SAndroid Build Coastguard Worker     }
931*8975f5c5SAndroid Build Coastguard Worker 
932*8975f5c5SAndroid Build Coastguard Worker     std::string result = shaderHLSL;
933*8975f5c5SAndroid Build Coastguard Worker     bool success       = angle::ReplaceSubstring(&result, kImage2DFunctionString, out.str());
934*8975f5c5SAndroid Build Coastguard Worker     ASSERT(success);
935*8975f5c5SAndroid Build Coastguard Worker 
936*8975f5c5SAndroid Build Coastguard Worker     return result;
937*8975f5c5SAndroid Build Coastguard Worker }
938*8975f5c5SAndroid Build Coastguard Worker 
939*8975f5c5SAndroid Build Coastguard Worker }  // namespace rx
940