2 * Copyright © 2015 Intel Corporation
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
20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
26 #include "glsl/ir_uniform.h"
31 vec4_visitor::emit_nir_code()
33 nir_shader
*nir
= prog
->nir
;
35 if (nir
->num_inputs
> 0)
36 nir_setup_inputs(nir
);
38 if (nir
->num_uniforms
> 0)
39 nir_setup_uniforms(nir
);
41 nir_setup_system_values(nir
);
43 /* get the main function and emit it */
44 nir_foreach_overload(nir
, overload
) {
45 assert(strcmp(overload
->function
->name
, "main") == 0);
46 assert(overload
->impl
);
47 nir_emit_impl(overload
->impl
);
52 vec4_visitor::nir_setup_system_value_intrinsic(nir_intrinsic_instr
*instr
)
56 switch (instr
->intrinsic
) {
57 case nir_intrinsic_load_vertex_id
:
58 unreachable("should be lowered by lower_vertex_id().");
60 case nir_intrinsic_load_vertex_id_zero_base
:
61 reg
= &this->nir_system_values
[SYSTEM_VALUE_VERTEX_ID_ZERO_BASE
];
62 if (reg
->file
== BAD_FILE
)
64 *this->make_reg_for_system_value(SYSTEM_VALUE_VERTEX_ID_ZERO_BASE
,
68 case nir_intrinsic_load_base_vertex
:
69 reg
= &this->nir_system_values
[SYSTEM_VALUE_BASE_VERTEX
];
70 if (reg
->file
== BAD_FILE
)
71 *reg
= *this->make_reg_for_system_value(SYSTEM_VALUE_BASE_VERTEX
,
75 case nir_intrinsic_load_instance_id
:
76 reg
= &this->nir_system_values
[SYSTEM_VALUE_INSTANCE_ID
];
77 if (reg
->file
== BAD_FILE
)
78 *reg
= *this->make_reg_for_system_value(SYSTEM_VALUE_INSTANCE_ID
,
88 setup_system_values_block(nir_block
*block
, void *void_visitor
)
90 vec4_visitor
*v
= (vec4_visitor
*)void_visitor
;
92 nir_foreach_instr(block
, instr
) {
93 if (instr
->type
!= nir_instr_type_intrinsic
)
96 nir_intrinsic_instr
*intrin
= nir_instr_as_intrinsic(instr
);
97 v
->nir_setup_system_value_intrinsic(intrin
);
104 vec4_visitor::nir_setup_system_values(nir_shader
*shader
)
106 nir_system_values
= ralloc_array(mem_ctx
, dst_reg
, SYSTEM_VALUE_MAX
);
108 nir_foreach_overload(shader
, overload
) {
109 assert(strcmp(overload
->function
->name
, "main") == 0);
110 assert(overload
->impl
);
111 nir_foreach_block(overload
->impl
, setup_system_values_block
, this);
116 vec4_visitor::nir_setup_inputs(nir_shader
*shader
)
118 nir_inputs
= ralloc_array(mem_ctx
, src_reg
, shader
->num_inputs
);
120 foreach_list_typed(nir_variable
, var
, node
, &shader
->inputs
) {
121 int offset
= var
->data
.driver_location
;
122 unsigned size
= type_size(var
->type
);
123 for (unsigned i
= 0; i
< size
; i
++) {
124 src_reg src
= src_reg(ATTR
, var
->data
.location
+ i
, var
->type
);
125 nir_inputs
[offset
+ i
] = src
;
131 vec4_visitor::nir_setup_uniforms(nir_shader
*shader
)
135 nir_uniform_driver_location
=
136 rzalloc_array(mem_ctx
, unsigned, this->uniform_array_size
);
139 foreach_list_typed(nir_variable
, var
, node
, &shader
->uniforms
) {
140 /* UBO's, atomics and samplers don't take up space in the
142 if (var
->interface_type
!= NULL
|| var
->type
->contains_atomic() ||
143 type_size(var
->type
) == 0) {
147 assert(uniforms
< uniform_array_size
);
148 this->uniform_size
[uniforms
] = type_size(var
->type
);
150 if (strncmp(var
->name
, "gl_", 3) == 0)
151 nir_setup_builtin_uniform(var
);
153 nir_setup_uniform(var
);
156 /* ARB_vertex_program is not supported yet */
157 assert("Not implemented");
162 vec4_visitor::nir_setup_uniform(nir_variable
*var
)
164 int namelen
= strlen(var
->name
);
166 /* The data for our (non-builtin) uniforms is stored in a series of
167 * gl_uniform_driver_storage structs for each subcomponent that
168 * glGetUniformLocation() could name. We know it's been set up in the same
169 * order we'd walk the type, so walk the list of storage and find anything
170 * with our name, or the prefix of a component that starts with our name.
172 for (unsigned u
= 0; u
< shader_prog
->NumUniformStorage
; u
++) {
173 struct gl_uniform_storage
*storage
= &shader_prog
->UniformStorage
[u
];
175 if (storage
->builtin
)
178 if (strncmp(var
->name
, storage
->name
, namelen
) != 0 ||
179 (storage
->name
[namelen
] != 0 &&
180 storage
->name
[namelen
] != '.' &&
181 storage
->name
[namelen
] != '[')) {
185 gl_constant_value
*components
= storage
->storage
;
186 unsigned vector_count
= (MAX2(storage
->array_elements
, 1) *
187 storage
->type
->matrix_columns
);
189 for (unsigned s
= 0; s
< vector_count
; s
++) {
190 assert(uniforms
< uniform_array_size
);
191 uniform_vector_size
[uniforms
] = storage
->type
->vector_elements
;
194 for (i
= 0; i
< uniform_vector_size
[uniforms
]; i
++) {
195 stage_prog_data
->param
[uniforms
* 4 + i
] = components
;
199 static const gl_constant_value zero
= { 0.0 };
200 stage_prog_data
->param
[uniforms
* 4 + i
] = &zero
;
203 nir_uniform_driver_location
[uniforms
] = var
->data
.driver_location
;
210 vec4_visitor::nir_setup_builtin_uniform(nir_variable
*var
)
212 const nir_state_slot
*const slots
= var
->state_slots
;
213 assert(var
->state_slots
!= NULL
);
215 for (unsigned int i
= 0; i
< var
->num_state_slots
; i
++) {
216 /* This state reference has already been setup by ir_to_mesa,
217 * but we'll get the same index back here. We can reference
218 * ParameterValues directly, since unlike brw_fs.cpp, we never
219 * add new state references during compile.
221 int index
= _mesa_add_state_reference(this->prog
->Parameters
,
222 (gl_state_index
*)slots
[i
].tokens
);
223 gl_constant_value
*values
=
224 &this->prog
->Parameters
->ParameterValues
[index
][0];
226 assert(uniforms
< uniform_array_size
);
228 for (unsigned j
= 0; j
< 4; j
++)
229 stage_prog_data
->param
[uniforms
* 4 + j
] =
230 &values
[GET_SWZ(slots
[i
].swizzle
, j
)];
232 this->uniform_vector_size
[uniforms
] =
233 (var
->type
->is_scalar() || var
->type
->is_vector() ||
234 var
->type
->is_matrix() ? var
->type
->vector_elements
: 4);
236 nir_uniform_driver_location
[uniforms
] = var
->data
.driver_location
;
242 vec4_visitor::nir_emit_impl(nir_function_impl
*impl
)
244 nir_locals
= ralloc_array(mem_ctx
, dst_reg
, impl
->reg_alloc
);
246 foreach_list_typed(nir_register
, reg
, node
, &impl
->registers
) {
247 unsigned array_elems
=
248 reg
->num_array_elems
== 0 ? 1 : reg
->num_array_elems
;
250 nir_locals
[reg
->index
] = dst_reg(GRF
, alloc
.allocate(array_elems
));
253 nir_emit_cf_list(&impl
->body
);
257 vec4_visitor::nir_emit_cf_list(exec_list
*list
)
259 exec_list_validate(list
);
260 foreach_list_typed(nir_cf_node
, node
, node
, list
) {
261 switch (node
->type
) {
263 nir_emit_if(nir_cf_node_as_if(node
));
266 case nir_cf_node_loop
:
267 nir_emit_loop(nir_cf_node_as_loop(node
));
270 case nir_cf_node_block
:
271 nir_emit_block(nir_cf_node_as_block(node
));
275 unreachable("Invalid CFG node block");
281 vec4_visitor::nir_emit_if(nir_if
*if_stmt
)
283 /* @TODO: Not yet implemented */
287 vec4_visitor::nir_emit_loop(nir_loop
*loop
)
289 /* @TODO: Not yet implemented */
293 vec4_visitor::nir_emit_block(nir_block
*block
)
295 nir_foreach_instr(block
, instr
) {
296 nir_emit_instr(instr
);
301 vec4_visitor::nir_emit_instr(nir_instr
*instr
)
303 this->base_ir
= instr
;
305 switch (instr
->type
) {
306 case nir_instr_type_load_const
:
307 nir_emit_load_const(nir_instr_as_load_const(instr
));
310 case nir_instr_type_intrinsic
:
311 nir_emit_intrinsic(nir_instr_as_intrinsic(instr
));
314 case nir_instr_type_alu
:
315 nir_emit_alu(nir_instr_as_alu(instr
));
318 case nir_instr_type_jump
:
319 nir_emit_jump(nir_instr_as_jump(instr
));
322 case nir_instr_type_tex
:
323 nir_emit_texture(nir_instr_as_tex(instr
));
327 fprintf(stderr
, "VS instruction not yet implemented by NIR->vec4\n");
333 vec4_visitor::nir_emit_load_const(nir_load_const_instr
*instr
)
335 /* @TODO: Not yet implemented */
339 vec4_visitor::nir_emit_intrinsic(nir_intrinsic_instr
*instr
)
341 switch (instr
->intrinsic
) {
343 case nir_intrinsic_load_input_indirect
:
345 case nir_intrinsic_load_input
:
346 /* @TODO: Not yet implemented */
349 case nir_intrinsic_store_output_indirect
:
351 case nir_intrinsic_store_output
:
352 /* @TODO: Not yet implemented */
355 case nir_intrinsic_load_vertex_id
:
356 unreachable("should be lowered by lower_vertex_id()");
358 case nir_intrinsic_load_vertex_id_zero_base
:
359 /* @TODO: Not yet implemented */
362 case nir_intrinsic_load_base_vertex
:
363 /* @TODO: Not yet implemented */
366 case nir_intrinsic_load_instance_id
:
367 /* @TODO: Not yet implemented */
370 case nir_intrinsic_load_uniform_indirect
:
372 case nir_intrinsic_load_uniform
:
373 /* @TODO: Not yet implemented */
376 case nir_intrinsic_atomic_counter_read
:
377 case nir_intrinsic_atomic_counter_inc
:
378 case nir_intrinsic_atomic_counter_dec
:
379 /* @TODO: Not yet implemented */
382 case nir_intrinsic_load_ubo_indirect
:
384 case nir_intrinsic_load_ubo
:
385 /* @TODO: Not yet implemented */
389 unreachable("Unknown intrinsic");
394 vec4_visitor::nir_emit_alu(nir_alu_instr
*instr
)
396 /* @TODO: Not yet implemented */
400 vec4_visitor::nir_emit_jump(nir_jump_instr
*instr
)
402 /* @TODO: Not yet implemented */
406 vec4_visitor::nir_emit_texture(nir_tex_instr
*instr
)
408 /* @TODO: Not yet implemented */