2 * Copyright (C) 2017-2018 Rob Clark <robclark@freedesktop.org>
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
11 * The above copyright notice and this permission notice (including the next
12 * paragraph) shall be included in all copies or substantial portions of the
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
24 * Rob Clark <robclark@freedesktop.org>
27 #include "ir3_image.h"
31 * SSBO/Image to/from IBO/tex hw mapping table:
35 ir3_ibo_mapping_init(struct ir3_ibo_mapping
*mapping
, unsigned num_textures
)
37 memset(mapping
, IBO_INVALID
, sizeof(*mapping
));
40 mapping
->tex_base
= num_textures
;
44 ir3_ssbo_to_ibo(struct ir3_ibo_mapping
*mapping
, unsigned ssbo
)
46 if (mapping
->ssbo_to_ibo
[ssbo
] == IBO_INVALID
) {
47 unsigned ibo
= mapping
->num_ibo
++;
48 mapping
->ssbo_to_ibo
[ssbo
] = ibo
;
49 mapping
->ibo_to_image
[ibo
] = IBO_SSBO
| ssbo
;
51 return mapping
->ssbo_to_ibo
[ssbo
];
55 ir3_ssbo_to_tex(struct ir3_ibo_mapping
*mapping
, unsigned ssbo
)
57 if (mapping
->ssbo_to_tex
[ssbo
] == IBO_INVALID
) {
58 unsigned tex
= mapping
->num_tex
++;
59 mapping
->ssbo_to_tex
[ssbo
] = tex
;
60 mapping
->tex_to_image
[tex
] = IBO_SSBO
| ssbo
;
62 return mapping
->ssbo_to_tex
[ssbo
] + mapping
->tex_base
;
66 ir3_image_to_ibo(struct ir3_ibo_mapping
*mapping
, unsigned image
)
68 if (mapping
->image_to_ibo
[image
] == IBO_INVALID
) {
69 unsigned ibo
= mapping
->num_ibo
++;
70 mapping
->image_to_ibo
[image
] = ibo
;
71 mapping
->ibo_to_image
[ibo
] = image
;
73 return mapping
->image_to_ibo
[image
];
77 ir3_image_to_tex(struct ir3_ibo_mapping
*mapping
, unsigned image
)
79 if (mapping
->image_to_tex
[image
] == IBO_INVALID
) {
80 unsigned tex
= mapping
->num_tex
++;
81 mapping
->image_to_tex
[image
] = tex
;
82 mapping
->tex_to_image
[tex
] = image
;
84 return mapping
->image_to_tex
[image
] + mapping
->tex_base
;
87 /* Helper to parse the deref for an image to get image slot. This should be
88 * mapped to tex or ibo idx using ir3_image_to_tex() or ir3_image_to_ibo().
91 ir3_get_image_slot(nir_deref_instr
*deref
)
94 unsigned inner_size
= 1;
96 while (deref
->deref_type
!= nir_deref_type_var
) {
97 assert(deref
->deref_type
== nir_deref_type_array
);
98 unsigned const_index
= nir_src_as_uint(deref
->arr
.index
);
100 /* Go to the next instruction */
101 deref
= nir_deref_instr_parent(deref
);
103 assert(glsl_type_is_array(deref
->type
));
104 const unsigned array_len
= glsl_get_length(deref
->type
);
105 loc
+= MIN2(const_index
, array_len
- 1) * inner_size
;
107 /* Update the inner size */
108 inner_size
*= array_len
;
111 loc
+= deref
->var
->data
.driver_location
;
116 /* see tex_info() for equiv logic for texture instructions.. it would be
117 * nice if this could be better unified..
120 ir3_get_image_coords(const nir_variable
*var
, unsigned *flagsp
)
122 const struct glsl_type
*type
= glsl_without_array(var
->type
);
123 unsigned coords
= glsl_get_sampler_coordinate_components(type
);
127 flags
|= IR3_INSTR_3D
;
129 if (glsl_sampler_type_is_array(type
))
130 flags
|= IR3_INSTR_A
;
139 ir3_get_image_type(const nir_variable
*var
)
141 switch (glsl_get_sampler_result_type(glsl_without_array(var
->type
))) {
146 case GLSL_TYPE_FLOAT
:
149 unreachable("bad sampler type.");
154 /* Returns the number of components for the different image formats
155 * supported by the GLES 3.1 spec, plus those added by the
156 * GL_NV_image_formats extension.
159 ir3_get_num_components_for_glformat(GLuint format
)
190 case GL_R11F_G11F_B10F
:
200 case GL_RGBA16_SNORM
:
210 /* Omitting the image format qualifier is allowed on desktop GL
211 * profiles. Assuming 4 components is always safe.
216 /* Return 4 components also for all other formats we don't know
217 * about. The format should have been validated already by
218 * the higher level API, but drop a debug message just in case.
220 debug_printf("Unhandled GL format %u while emitting imageStore()\n",