Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/mesa
Path: blob/21.2-virgl/src/gallium/drivers/r600/r600_state_common.c
4570 views
1
/*
2
* Copyright 2010 Red Hat Inc.
3
* 2010 Jerome Glisse
4
*
5
* Permission is hereby granted, free of charge, to any person obtaining a
6
* copy of this software and associated documentation files (the "Software"),
7
* to deal in the Software without restriction, including without limitation
8
* on the rights to use, copy, modify, merge, publish, distribute, sub
9
* license, and/or sell copies of the Software, and to permit persons to whom
10
* the Software is furnished to do so, subject to the following conditions:
11
*
12
* The above copyright notice and this permission notice (including the next
13
* paragraph) shall be included in all copies or substantial portions of the
14
* Software.
15
*
16
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
* FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
19
* THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
20
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
21
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
22
* USE OR OTHER DEALINGS IN THE SOFTWARE.
23
*
24
* Authors: Dave Airlie <[email protected]>
25
* Jerome Glisse <[email protected]>
26
*/
27
#include "r600_formats.h"
28
#include "r600_shader.h"
29
#include "r600d.h"
30
31
#include "util/format/u_format_s3tc.h"
32
#include "util/u_draw.h"
33
#include "util/u_index_modify.h"
34
#include "util/u_memory.h"
35
#include "util/u_upload_mgr.h"
36
#include "util/u_math.h"
37
#include "tgsi/tgsi_parse.h"
38
#include "tgsi/tgsi_scan.h"
39
#include "tgsi/tgsi_ureg.h"
40
41
#include "nir.h"
42
#include "nir/nir_to_tgsi_info.h"
43
#include "tgsi/tgsi_from_mesa.h"
44
45
void r600_init_command_buffer(struct r600_command_buffer *cb, unsigned num_dw)
46
{
47
assert(!cb->buf);
48
cb->buf = CALLOC(1, 4 * num_dw);
49
cb->max_num_dw = num_dw;
50
}
51
52
void r600_release_command_buffer(struct r600_command_buffer *cb)
53
{
54
FREE(cb->buf);
55
}
56
57
void r600_add_atom(struct r600_context *rctx,
58
struct r600_atom *atom,
59
unsigned id)
60
{
61
assert(id < R600_NUM_ATOMS);
62
assert(rctx->atoms[id] == NULL);
63
rctx->atoms[id] = atom;
64
atom->id = id;
65
}
66
67
void r600_init_atom(struct r600_context *rctx,
68
struct r600_atom *atom,
69
unsigned id,
70
void (*emit)(struct r600_context *ctx, struct r600_atom *state),
71
unsigned num_dw)
72
{
73
atom->emit = (void*)emit;
74
atom->num_dw = num_dw;
75
r600_add_atom(rctx, atom, id);
76
}
77
78
void r600_emit_cso_state(struct r600_context *rctx, struct r600_atom *atom)
79
{
80
r600_emit_command_buffer(&rctx->b.gfx.cs, ((struct r600_cso_state*)atom)->cb);
81
}
82
83
void r600_emit_alphatest_state(struct r600_context *rctx, struct r600_atom *atom)
84
{
85
struct radeon_cmdbuf *cs = &rctx->b.gfx.cs;
86
struct r600_alphatest_state *a = (struct r600_alphatest_state*)atom;
87
unsigned alpha_ref = a->sx_alpha_ref;
88
89
if (rctx->b.chip_class >= EVERGREEN && a->cb0_export_16bpc) {
90
alpha_ref &= ~0x1FFF;
91
}
92
93
radeon_set_context_reg(cs, R_028410_SX_ALPHA_TEST_CONTROL,
94
a->sx_alpha_test_control |
95
S_028410_ALPHA_TEST_BYPASS(a->bypass));
96
radeon_set_context_reg(cs, R_028438_SX_ALPHA_REF, alpha_ref);
97
}
98
99
static void r600_memory_barrier(struct pipe_context *ctx, unsigned flags)
100
{
101
struct r600_context *rctx = (struct r600_context *)ctx;
102
103
if (!(flags & ~PIPE_BARRIER_UPDATE))
104
return;
105
106
if (flags & PIPE_BARRIER_CONSTANT_BUFFER)
107
rctx->b.flags |= R600_CONTEXT_INV_CONST_CACHE;
108
109
if (flags & (PIPE_BARRIER_VERTEX_BUFFER |
110
PIPE_BARRIER_SHADER_BUFFER |
111
PIPE_BARRIER_TEXTURE |
112
PIPE_BARRIER_IMAGE |
113
PIPE_BARRIER_STREAMOUT_BUFFER |
114
PIPE_BARRIER_GLOBAL_BUFFER)) {
115
rctx->b.flags |= R600_CONTEXT_INV_VERTEX_CACHE|
116
R600_CONTEXT_INV_TEX_CACHE;
117
}
118
119
if (flags & (PIPE_BARRIER_FRAMEBUFFER|
120
PIPE_BARRIER_IMAGE))
121
rctx->b.flags |= R600_CONTEXT_FLUSH_AND_INV;
122
123
rctx->b.flags |= R600_CONTEXT_WAIT_3D_IDLE;
124
}
125
126
static void r600_texture_barrier(struct pipe_context *ctx, unsigned flags)
127
{
128
struct r600_context *rctx = (struct r600_context *)ctx;
129
130
rctx->b.flags |= R600_CONTEXT_INV_TEX_CACHE |
131
R600_CONTEXT_FLUSH_AND_INV_CB |
132
R600_CONTEXT_FLUSH_AND_INV |
133
R600_CONTEXT_WAIT_3D_IDLE;
134
rctx->framebuffer.do_update_surf_dirtiness = true;
135
}
136
137
static unsigned r600_conv_pipe_prim(unsigned prim)
138
{
139
static const unsigned prim_conv[] = {
140
[PIPE_PRIM_POINTS] = V_008958_DI_PT_POINTLIST,
141
[PIPE_PRIM_LINES] = V_008958_DI_PT_LINELIST,
142
[PIPE_PRIM_LINE_LOOP] = V_008958_DI_PT_LINELOOP,
143
[PIPE_PRIM_LINE_STRIP] = V_008958_DI_PT_LINESTRIP,
144
[PIPE_PRIM_TRIANGLES] = V_008958_DI_PT_TRILIST,
145
[PIPE_PRIM_TRIANGLE_STRIP] = V_008958_DI_PT_TRISTRIP,
146
[PIPE_PRIM_TRIANGLE_FAN] = V_008958_DI_PT_TRIFAN,
147
[PIPE_PRIM_QUADS] = V_008958_DI_PT_QUADLIST,
148
[PIPE_PRIM_QUAD_STRIP] = V_008958_DI_PT_QUADSTRIP,
149
[PIPE_PRIM_POLYGON] = V_008958_DI_PT_POLYGON,
150
[PIPE_PRIM_LINES_ADJACENCY] = V_008958_DI_PT_LINELIST_ADJ,
151
[PIPE_PRIM_LINE_STRIP_ADJACENCY] = V_008958_DI_PT_LINESTRIP_ADJ,
152
[PIPE_PRIM_TRIANGLES_ADJACENCY] = V_008958_DI_PT_TRILIST_ADJ,
153
[PIPE_PRIM_TRIANGLE_STRIP_ADJACENCY] = V_008958_DI_PT_TRISTRIP_ADJ,
154
[PIPE_PRIM_PATCHES] = V_008958_DI_PT_PATCH,
155
[R600_PRIM_RECTANGLE_LIST] = V_008958_DI_PT_RECTLIST
156
};
157
assert(prim < ARRAY_SIZE(prim_conv));
158
return prim_conv[prim];
159
}
160
161
unsigned r600_conv_prim_to_gs_out(unsigned mode)
162
{
163
static const int prim_conv[] = {
164
[PIPE_PRIM_POINTS] = V_028A6C_OUTPRIM_TYPE_POINTLIST,
165
[PIPE_PRIM_LINES] = V_028A6C_OUTPRIM_TYPE_LINESTRIP,
166
[PIPE_PRIM_LINE_LOOP] = V_028A6C_OUTPRIM_TYPE_LINESTRIP,
167
[PIPE_PRIM_LINE_STRIP] = V_028A6C_OUTPRIM_TYPE_LINESTRIP,
168
[PIPE_PRIM_TRIANGLES] = V_028A6C_OUTPRIM_TYPE_TRISTRIP,
169
[PIPE_PRIM_TRIANGLE_STRIP] = V_028A6C_OUTPRIM_TYPE_TRISTRIP,
170
[PIPE_PRIM_TRIANGLE_FAN] = V_028A6C_OUTPRIM_TYPE_TRISTRIP,
171
[PIPE_PRIM_QUADS] = V_028A6C_OUTPRIM_TYPE_TRISTRIP,
172
[PIPE_PRIM_QUAD_STRIP] = V_028A6C_OUTPRIM_TYPE_TRISTRIP,
173
[PIPE_PRIM_POLYGON] = V_028A6C_OUTPRIM_TYPE_TRISTRIP,
174
[PIPE_PRIM_LINES_ADJACENCY] = V_028A6C_OUTPRIM_TYPE_LINESTRIP,
175
[PIPE_PRIM_LINE_STRIP_ADJACENCY] = V_028A6C_OUTPRIM_TYPE_LINESTRIP,
176
[PIPE_PRIM_TRIANGLES_ADJACENCY] = V_028A6C_OUTPRIM_TYPE_TRISTRIP,
177
[PIPE_PRIM_TRIANGLE_STRIP_ADJACENCY] = V_028A6C_OUTPRIM_TYPE_TRISTRIP,
178
[PIPE_PRIM_PATCHES] = V_028A6C_OUTPRIM_TYPE_POINTLIST,
179
[R600_PRIM_RECTANGLE_LIST] = V_028A6C_OUTPRIM_TYPE_TRISTRIP
180
};
181
assert(mode < ARRAY_SIZE(prim_conv));
182
183
return prim_conv[mode];
184
}
185
186
/* common state between evergreen and r600 */
187
188
static void r600_bind_blend_state_internal(struct r600_context *rctx,
189
struct r600_blend_state *blend, bool blend_disable)
190
{
191
unsigned color_control;
192
bool update_cb = false;
193
194
rctx->alpha_to_one = blend->alpha_to_one;
195
rctx->dual_src_blend = blend->dual_src_blend;
196
197
if (!blend_disable) {
198
r600_set_cso_state_with_cb(rctx, &rctx->blend_state, blend, &blend->buffer);
199
color_control = blend->cb_color_control;
200
} else {
201
/* Blending is disabled. */
202
r600_set_cso_state_with_cb(rctx, &rctx->blend_state, blend, &blend->buffer_no_blend);
203
color_control = blend->cb_color_control_no_blend;
204
}
205
206
/* Update derived states. */
207
if (rctx->cb_misc_state.blend_colormask != blend->cb_target_mask) {
208
rctx->cb_misc_state.blend_colormask = blend->cb_target_mask;
209
update_cb = true;
210
}
211
if (rctx->b.chip_class <= R700 &&
212
rctx->cb_misc_state.cb_color_control != color_control) {
213
rctx->cb_misc_state.cb_color_control = color_control;
214
update_cb = true;
215
}
216
if (rctx->cb_misc_state.dual_src_blend != blend->dual_src_blend) {
217
rctx->cb_misc_state.dual_src_blend = blend->dual_src_blend;
218
update_cb = true;
219
}
220
if (update_cb) {
221
r600_mark_atom_dirty(rctx, &rctx->cb_misc_state.atom);
222
}
223
if (rctx->framebuffer.dual_src_blend != blend->dual_src_blend) {
224
rctx->framebuffer.dual_src_blend = blend->dual_src_blend;
225
r600_mark_atom_dirty(rctx, &rctx->framebuffer.atom);
226
}
227
}
228
229
static void r600_bind_blend_state(struct pipe_context *ctx, void *state)
230
{
231
struct r600_context *rctx = (struct r600_context *)ctx;
232
struct r600_blend_state *blend = (struct r600_blend_state *)state;
233
234
if (!blend) {
235
r600_set_cso_state_with_cb(rctx, &rctx->blend_state, NULL, NULL);
236
return;
237
}
238
239
r600_bind_blend_state_internal(rctx, blend, rctx->force_blend_disable);
240
}
241
242
static void r600_set_blend_color(struct pipe_context *ctx,
243
const struct pipe_blend_color *state)
244
{
245
struct r600_context *rctx = (struct r600_context *)ctx;
246
247
rctx->blend_color.state = *state;
248
r600_mark_atom_dirty(rctx, &rctx->blend_color.atom);
249
}
250
251
void r600_emit_blend_color(struct r600_context *rctx, struct r600_atom *atom)
252
{
253
struct radeon_cmdbuf *cs = &rctx->b.gfx.cs;
254
struct pipe_blend_color *state = &rctx->blend_color.state;
255
256
radeon_set_context_reg_seq(cs, R_028414_CB_BLEND_RED, 4);
257
radeon_emit(cs, fui(state->color[0])); /* R_028414_CB_BLEND_RED */
258
radeon_emit(cs, fui(state->color[1])); /* R_028418_CB_BLEND_GREEN */
259
radeon_emit(cs, fui(state->color[2])); /* R_02841C_CB_BLEND_BLUE */
260
radeon_emit(cs, fui(state->color[3])); /* R_028420_CB_BLEND_ALPHA */
261
}
262
263
void r600_emit_vgt_state(struct r600_context *rctx, struct r600_atom *atom)
264
{
265
struct radeon_cmdbuf *cs = &rctx->b.gfx.cs;
266
struct r600_vgt_state *a = (struct r600_vgt_state *)atom;
267
268
radeon_set_context_reg(cs, R_028A94_VGT_MULTI_PRIM_IB_RESET_EN, a->vgt_multi_prim_ib_reset_en);
269
radeon_set_context_reg_seq(cs, R_028408_VGT_INDX_OFFSET, 2);
270
radeon_emit(cs, a->vgt_indx_offset); /* R_028408_VGT_INDX_OFFSET */
271
radeon_emit(cs, a->vgt_multi_prim_ib_reset_indx); /* R_02840C_VGT_MULTI_PRIM_IB_RESET_INDX */
272
if (a->last_draw_was_indirect) {
273
a->last_draw_was_indirect = false;
274
radeon_set_ctl_const(cs, R_03CFF0_SQ_VTX_BASE_VTX_LOC, 0);
275
}
276
}
277
278
static void r600_set_clip_state(struct pipe_context *ctx,
279
const struct pipe_clip_state *state)
280
{
281
struct r600_context *rctx = (struct r600_context *)ctx;
282
283
rctx->clip_state.state = *state;
284
r600_mark_atom_dirty(rctx, &rctx->clip_state.atom);
285
rctx->driver_consts[PIPE_SHADER_VERTEX].vs_ucp_dirty = true;
286
}
287
288
static void r600_set_stencil_ref(struct pipe_context *ctx,
289
const struct r600_stencil_ref state)
290
{
291
struct r600_context *rctx = (struct r600_context *)ctx;
292
293
rctx->stencil_ref.state = state;
294
r600_mark_atom_dirty(rctx, &rctx->stencil_ref.atom);
295
}
296
297
void r600_emit_stencil_ref(struct r600_context *rctx, struct r600_atom *atom)
298
{
299
struct radeon_cmdbuf *cs = &rctx->b.gfx.cs;
300
struct r600_stencil_ref_state *a = (struct r600_stencil_ref_state*)atom;
301
302
radeon_set_context_reg_seq(cs, R_028430_DB_STENCILREFMASK, 2);
303
radeon_emit(cs, /* R_028430_DB_STENCILREFMASK */
304
S_028430_STENCILREF(a->state.ref_value[0]) |
305
S_028430_STENCILMASK(a->state.valuemask[0]) |
306
S_028430_STENCILWRITEMASK(a->state.writemask[0]));
307
radeon_emit(cs, /* R_028434_DB_STENCILREFMASK_BF */
308
S_028434_STENCILREF_BF(a->state.ref_value[1]) |
309
S_028434_STENCILMASK_BF(a->state.valuemask[1]) |
310
S_028434_STENCILWRITEMASK_BF(a->state.writemask[1]));
311
}
312
313
static void r600_set_pipe_stencil_ref(struct pipe_context *ctx,
314
const struct pipe_stencil_ref state)
315
{
316
struct r600_context *rctx = (struct r600_context *)ctx;
317
struct r600_dsa_state *dsa = (struct r600_dsa_state*)rctx->dsa_state.cso;
318
struct r600_stencil_ref ref;
319
320
rctx->stencil_ref.pipe_state = state;
321
322
if (!dsa)
323
return;
324
325
ref.ref_value[0] = state.ref_value[0];
326
ref.ref_value[1] = state.ref_value[1];
327
ref.valuemask[0] = dsa->valuemask[0];
328
ref.valuemask[1] = dsa->valuemask[1];
329
ref.writemask[0] = dsa->writemask[0];
330
ref.writemask[1] = dsa->writemask[1];
331
332
r600_set_stencil_ref(ctx, ref);
333
}
334
335
static void r600_bind_dsa_state(struct pipe_context *ctx, void *state)
336
{
337
struct r600_context *rctx = (struct r600_context *)ctx;
338
struct r600_dsa_state *dsa = state;
339
struct r600_stencil_ref ref;
340
341
if (!state) {
342
r600_set_cso_state_with_cb(rctx, &rctx->dsa_state, NULL, NULL);
343
return;
344
}
345
346
r600_set_cso_state_with_cb(rctx, &rctx->dsa_state, dsa, &dsa->buffer);
347
348
ref.ref_value[0] = rctx->stencil_ref.pipe_state.ref_value[0];
349
ref.ref_value[1] = rctx->stencil_ref.pipe_state.ref_value[1];
350
ref.valuemask[0] = dsa->valuemask[0];
351
ref.valuemask[1] = dsa->valuemask[1];
352
ref.writemask[0] = dsa->writemask[0];
353
ref.writemask[1] = dsa->writemask[1];
354
if (rctx->zwritemask != dsa->zwritemask) {
355
rctx->zwritemask = dsa->zwritemask;
356
if (rctx->b.chip_class >= EVERGREEN) {
357
/* work around some issue when not writing to zbuffer
358
* we are having lockup on evergreen so do not enable
359
* hyperz when not writing zbuffer
360
*/
361
r600_mark_atom_dirty(rctx, &rctx->db_misc_state.atom);
362
}
363
}
364
365
r600_set_stencil_ref(ctx, ref);
366
367
/* Update alphatest state. */
368
if (rctx->alphatest_state.sx_alpha_test_control != dsa->sx_alpha_test_control ||
369
rctx->alphatest_state.sx_alpha_ref != dsa->alpha_ref) {
370
rctx->alphatest_state.sx_alpha_test_control = dsa->sx_alpha_test_control;
371
rctx->alphatest_state.sx_alpha_ref = dsa->alpha_ref;
372
r600_mark_atom_dirty(rctx, &rctx->alphatest_state.atom);
373
}
374
}
375
376
static void r600_bind_rs_state(struct pipe_context *ctx, void *state)
377
{
378
struct r600_rasterizer_state *rs = (struct r600_rasterizer_state *)state;
379
struct r600_context *rctx = (struct r600_context *)ctx;
380
381
if (!state)
382
return;
383
384
rctx->rasterizer = rs;
385
386
r600_set_cso_state_with_cb(rctx, &rctx->rasterizer_state, rs, &rs->buffer);
387
388
if (rs->offset_enable &&
389
(rs->offset_units != rctx->poly_offset_state.offset_units ||
390
rs->offset_scale != rctx->poly_offset_state.offset_scale ||
391
rs->offset_units_unscaled != rctx->poly_offset_state.offset_units_unscaled)) {
392
rctx->poly_offset_state.offset_units = rs->offset_units;
393
rctx->poly_offset_state.offset_scale = rs->offset_scale;
394
rctx->poly_offset_state.offset_units_unscaled = rs->offset_units_unscaled;
395
r600_mark_atom_dirty(rctx, &rctx->poly_offset_state.atom);
396
}
397
398
/* Update clip_misc_state. */
399
if (rctx->clip_misc_state.pa_cl_clip_cntl != rs->pa_cl_clip_cntl ||
400
rctx->clip_misc_state.clip_plane_enable != rs->clip_plane_enable) {
401
rctx->clip_misc_state.pa_cl_clip_cntl = rs->pa_cl_clip_cntl;
402
rctx->clip_misc_state.clip_plane_enable = rs->clip_plane_enable;
403
r600_mark_atom_dirty(rctx, &rctx->clip_misc_state.atom);
404
}
405
406
r600_viewport_set_rast_deps(&rctx->b, rs->scissor_enable, rs->clip_halfz);
407
408
/* Re-emit PA_SC_LINE_STIPPLE. */
409
rctx->last_primitive_type = -1;
410
}
411
412
static void r600_delete_rs_state(struct pipe_context *ctx, void *state)
413
{
414
struct r600_rasterizer_state *rs = (struct r600_rasterizer_state *)state;
415
416
r600_release_command_buffer(&rs->buffer);
417
FREE(rs);
418
}
419
420
static void r600_sampler_view_destroy(struct pipe_context *ctx,
421
struct pipe_sampler_view *state)
422
{
423
struct r600_pipe_sampler_view *view = (struct r600_pipe_sampler_view *)state;
424
425
if (view->tex_resource->gpu_address &&
426
view->tex_resource->b.b.target == PIPE_BUFFER)
427
list_delinit(&view->list);
428
429
pipe_resource_reference(&state->texture, NULL);
430
FREE(view);
431
}
432
433
void r600_sampler_states_dirty(struct r600_context *rctx,
434
struct r600_sampler_states *state)
435
{
436
if (state->dirty_mask) {
437
if (state->dirty_mask & state->has_bordercolor_mask) {
438
rctx->b.flags |= R600_CONTEXT_WAIT_3D_IDLE;
439
}
440
state->atom.num_dw =
441
util_bitcount(state->dirty_mask & state->has_bordercolor_mask) * 11 +
442
util_bitcount(state->dirty_mask & ~state->has_bordercolor_mask) * 5;
443
r600_mark_atom_dirty(rctx, &state->atom);
444
}
445
}
446
447
static void r600_bind_sampler_states(struct pipe_context *pipe,
448
enum pipe_shader_type shader,
449
unsigned start,
450
unsigned count, void **states)
451
{
452
struct r600_context *rctx = (struct r600_context *)pipe;
453
struct r600_textures_info *dst = &rctx->samplers[shader];
454
struct r600_pipe_sampler_state **rstates = (struct r600_pipe_sampler_state**)states;
455
int seamless_cube_map = -1;
456
unsigned i;
457
/* This sets 1-bit for states with index >= count. */
458
uint32_t disable_mask = ~((1ull << count) - 1);
459
/* These are the new states set by this function. */
460
uint32_t new_mask = 0;
461
462
assert(start == 0); /* XXX fix below */
463
464
if (!states) {
465
disable_mask = ~0u;
466
count = 0;
467
}
468
469
for (i = 0; i < count; i++) {
470
struct r600_pipe_sampler_state *rstate = rstates[i];
471
472
if (rstate == dst->states.states[i]) {
473
continue;
474
}
475
476
if (rstate) {
477
if (rstate->border_color_use) {
478
dst->states.has_bordercolor_mask |= 1 << i;
479
} else {
480
dst->states.has_bordercolor_mask &= ~(1 << i);
481
}
482
seamless_cube_map = rstate->seamless_cube_map;
483
484
new_mask |= 1 << i;
485
} else {
486
disable_mask |= 1 << i;
487
}
488
}
489
490
memcpy(dst->states.states, rstates, sizeof(void*) * count);
491
memset(dst->states.states + count, 0, sizeof(void*) * (NUM_TEX_UNITS - count));
492
493
dst->states.enabled_mask &= ~disable_mask;
494
dst->states.dirty_mask &= dst->states.enabled_mask;
495
dst->states.enabled_mask |= new_mask;
496
dst->states.dirty_mask |= new_mask;
497
dst->states.has_bordercolor_mask &= dst->states.enabled_mask;
498
499
r600_sampler_states_dirty(rctx, &dst->states);
500
501
/* Seamless cubemap state. */
502
if (rctx->b.chip_class <= R700 &&
503
seamless_cube_map != -1 &&
504
seamless_cube_map != rctx->seamless_cube_map.enabled) {
505
/* change in TA_CNTL_AUX need a pipeline flush */
506
rctx->b.flags |= R600_CONTEXT_WAIT_3D_IDLE;
507
rctx->seamless_cube_map.enabled = seamless_cube_map;
508
r600_mark_atom_dirty(rctx, &rctx->seamless_cube_map.atom);
509
}
510
}
511
512
static void r600_delete_sampler_state(struct pipe_context *ctx, void *state)
513
{
514
free(state);
515
}
516
517
static void r600_delete_blend_state(struct pipe_context *ctx, void *state)
518
{
519
struct r600_context *rctx = (struct r600_context *)ctx;
520
struct r600_blend_state *blend = (struct r600_blend_state*)state;
521
522
if (rctx->blend_state.cso == state) {
523
ctx->bind_blend_state(ctx, NULL);
524
}
525
526
r600_release_command_buffer(&blend->buffer);
527
r600_release_command_buffer(&blend->buffer_no_blend);
528
FREE(blend);
529
}
530
531
static void r600_delete_dsa_state(struct pipe_context *ctx, void *state)
532
{
533
struct r600_context *rctx = (struct r600_context *)ctx;
534
struct r600_dsa_state *dsa = (struct r600_dsa_state *)state;
535
536
if (rctx->dsa_state.cso == state) {
537
ctx->bind_depth_stencil_alpha_state(ctx, NULL);
538
}
539
540
r600_release_command_buffer(&dsa->buffer);
541
free(dsa);
542
}
543
544
static void r600_bind_vertex_elements(struct pipe_context *ctx, void *state)
545
{
546
struct r600_context *rctx = (struct r600_context *)ctx;
547
548
r600_set_cso_state(rctx, &rctx->vertex_fetch_shader, state);
549
}
550
551
static void r600_delete_vertex_elements(struct pipe_context *ctx, void *state)
552
{
553
struct r600_fetch_shader *shader = (struct r600_fetch_shader*)state;
554
if (shader)
555
r600_resource_reference(&shader->buffer, NULL);
556
FREE(shader);
557
}
558
559
void r600_vertex_buffers_dirty(struct r600_context *rctx)
560
{
561
if (rctx->vertex_buffer_state.dirty_mask) {
562
rctx->vertex_buffer_state.atom.num_dw = (rctx->b.chip_class >= EVERGREEN ? 12 : 11) *
563
util_bitcount(rctx->vertex_buffer_state.dirty_mask);
564
r600_mark_atom_dirty(rctx, &rctx->vertex_buffer_state.atom);
565
}
566
}
567
568
static void r600_set_vertex_buffers(struct pipe_context *ctx,
569
unsigned start_slot, unsigned count,
570
unsigned unbind_num_trailing_slots,
571
bool take_ownership,
572
const struct pipe_vertex_buffer *input)
573
{
574
struct r600_context *rctx = (struct r600_context *)ctx;
575
struct r600_vertexbuf_state *state = &rctx->vertex_buffer_state;
576
struct pipe_vertex_buffer *vb = state->vb + start_slot;
577
unsigned i;
578
uint32_t disable_mask = 0;
579
/* These are the new buffers set by this function. */
580
uint32_t new_buffer_mask = 0;
581
582
/* Set vertex buffers. */
583
if (input) {
584
for (i = 0; i < count; i++) {
585
if ((input[i].buffer.resource != vb[i].buffer.resource) ||
586
(vb[i].stride != input[i].stride) ||
587
(vb[i].buffer_offset != input[i].buffer_offset) ||
588
(vb[i].is_user_buffer != input[i].is_user_buffer)) {
589
if (input[i].buffer.resource) {
590
vb[i].stride = input[i].stride;
591
vb[i].buffer_offset = input[i].buffer_offset;
592
if (take_ownership) {
593
pipe_resource_reference(&vb[i].buffer.resource, NULL);
594
vb[i].buffer.resource = input[i].buffer.resource;
595
} else {
596
pipe_resource_reference(&vb[i].buffer.resource,
597
input[i].buffer.resource);
598
}
599
new_buffer_mask |= 1 << i;
600
r600_context_add_resource_size(ctx, input[i].buffer.resource);
601
} else {
602
pipe_resource_reference(&vb[i].buffer.resource, NULL);
603
disable_mask |= 1 << i;
604
}
605
}
606
}
607
} else {
608
for (i = 0; i < count; i++) {
609
pipe_resource_reference(&vb[i].buffer.resource, NULL);
610
}
611
disable_mask = ((1ull << count) - 1);
612
}
613
614
for (i = 0; i < unbind_num_trailing_slots; i++) {
615
pipe_resource_reference(&vb[count + i].buffer.resource, NULL);
616
}
617
disable_mask |= ((1ull << unbind_num_trailing_slots) - 1) << count;
618
619
disable_mask <<= start_slot;
620
new_buffer_mask <<= start_slot;
621
622
rctx->vertex_buffer_state.enabled_mask &= ~disable_mask;
623
rctx->vertex_buffer_state.dirty_mask &= rctx->vertex_buffer_state.enabled_mask;
624
rctx->vertex_buffer_state.enabled_mask |= new_buffer_mask;
625
rctx->vertex_buffer_state.dirty_mask |= new_buffer_mask;
626
627
r600_vertex_buffers_dirty(rctx);
628
}
629
630
void r600_sampler_views_dirty(struct r600_context *rctx,
631
struct r600_samplerview_state *state)
632
{
633
if (state->dirty_mask) {
634
state->atom.num_dw = (rctx->b.chip_class >= EVERGREEN ? 14 : 13) *
635
util_bitcount(state->dirty_mask);
636
r600_mark_atom_dirty(rctx, &state->atom);
637
}
638
}
639
640
static void r600_set_sampler_views(struct pipe_context *pipe,
641
enum pipe_shader_type shader,
642
unsigned start, unsigned count,
643
unsigned unbind_num_trailing_slots,
644
struct pipe_sampler_view **views)
645
{
646
struct r600_context *rctx = (struct r600_context *) pipe;
647
struct r600_textures_info *dst = &rctx->samplers[shader];
648
struct r600_pipe_sampler_view **rviews = (struct r600_pipe_sampler_view **)views;
649
uint32_t dirty_sampler_states_mask = 0;
650
unsigned i;
651
/* This sets 1-bit for textures with index >= count. */
652
uint32_t disable_mask = ~((1ull << count) - 1);
653
/* These are the new textures set by this function. */
654
uint32_t new_mask = 0;
655
656
/* Set textures with index >= count to NULL. */
657
uint32_t remaining_mask;
658
659
assert(start == 0); /* XXX fix below */
660
661
if (!views) {
662
disable_mask = ~0u;
663
count = 0;
664
}
665
666
remaining_mask = dst->views.enabled_mask & disable_mask;
667
668
while (remaining_mask) {
669
i = u_bit_scan(&remaining_mask);
670
assert(dst->views.views[i]);
671
672
pipe_sampler_view_reference((struct pipe_sampler_view **)&dst->views.views[i], NULL);
673
}
674
675
for (i = 0; i < count; i++) {
676
if (rviews[i] == dst->views.views[i]) {
677
continue;
678
}
679
680
if (rviews[i]) {
681
struct r600_texture *rtex =
682
(struct r600_texture*)rviews[i]->base.texture;
683
bool is_buffer = rviews[i]->base.texture->target == PIPE_BUFFER;
684
685
if (!is_buffer && rtex->db_compatible) {
686
dst->views.compressed_depthtex_mask |= 1 << i;
687
} else {
688
dst->views.compressed_depthtex_mask &= ~(1 << i);
689
}
690
691
/* Track compressed colorbuffers. */
692
if (!is_buffer && rtex->cmask.size) {
693
dst->views.compressed_colortex_mask |= 1 << i;
694
} else {
695
dst->views.compressed_colortex_mask &= ~(1 << i);
696
}
697
698
/* Changing from array to non-arrays textures and vice versa requires
699
* updating TEX_ARRAY_OVERRIDE in sampler states on R6xx-R7xx. */
700
if (rctx->b.chip_class <= R700 &&
701
(dst->states.enabled_mask & (1 << i)) &&
702
(rviews[i]->base.texture->target == PIPE_TEXTURE_1D_ARRAY ||
703
rviews[i]->base.texture->target == PIPE_TEXTURE_2D_ARRAY) != dst->is_array_sampler[i]) {
704
dirty_sampler_states_mask |= 1 << i;
705
}
706
707
pipe_sampler_view_reference((struct pipe_sampler_view **)&dst->views.views[i], views[i]);
708
new_mask |= 1 << i;
709
r600_context_add_resource_size(pipe, views[i]->texture);
710
} else {
711
pipe_sampler_view_reference((struct pipe_sampler_view **)&dst->views.views[i], NULL);
712
disable_mask |= 1 << i;
713
}
714
}
715
716
dst->views.enabled_mask &= ~disable_mask;
717
dst->views.dirty_mask &= dst->views.enabled_mask;
718
dst->views.enabled_mask |= new_mask;
719
dst->views.dirty_mask |= new_mask;
720
dst->views.compressed_depthtex_mask &= dst->views.enabled_mask;
721
dst->views.compressed_colortex_mask &= dst->views.enabled_mask;
722
dst->views.dirty_buffer_constants = TRUE;
723
r600_sampler_views_dirty(rctx, &dst->views);
724
725
if (dirty_sampler_states_mask) {
726
dst->states.dirty_mask |= dirty_sampler_states_mask;
727
r600_sampler_states_dirty(rctx, &dst->states);
728
}
729
}
730
731
static void r600_update_compressed_colortex_mask(struct r600_samplerview_state *views)
732
{
733
uint32_t mask = views->enabled_mask;
734
735
while (mask) {
736
unsigned i = u_bit_scan(&mask);
737
struct pipe_resource *res = views->views[i]->base.texture;
738
739
if (res && res->target != PIPE_BUFFER) {
740
struct r600_texture *rtex = (struct r600_texture *)res;
741
742
if (rtex->cmask.size) {
743
views->compressed_colortex_mask |= 1 << i;
744
} else {
745
views->compressed_colortex_mask &= ~(1 << i);
746
}
747
}
748
}
749
}
750
751
static int r600_get_hw_atomic_count(const struct pipe_context *ctx,
752
enum pipe_shader_type shader)
753
{
754
const struct r600_context *rctx = (struct r600_context *)ctx;
755
int value = 0;
756
switch (shader) {
757
case PIPE_SHADER_FRAGMENT:
758
case PIPE_SHADER_COMPUTE:
759
default:
760
break;
761
case PIPE_SHADER_VERTEX:
762
value = rctx->ps_shader->info.file_count[TGSI_FILE_HW_ATOMIC];
763
break;
764
case PIPE_SHADER_GEOMETRY:
765
value = rctx->ps_shader->info.file_count[TGSI_FILE_HW_ATOMIC] +
766
rctx->vs_shader->info.file_count[TGSI_FILE_HW_ATOMIC];
767
break;
768
case PIPE_SHADER_TESS_EVAL:
769
value = rctx->ps_shader->info.file_count[TGSI_FILE_HW_ATOMIC] +
770
rctx->vs_shader->info.file_count[TGSI_FILE_HW_ATOMIC] +
771
(rctx->gs_shader ? rctx->gs_shader->info.file_count[TGSI_FILE_HW_ATOMIC] : 0);
772
break;
773
case PIPE_SHADER_TESS_CTRL:
774
value = rctx->ps_shader->info.file_count[TGSI_FILE_HW_ATOMIC] +
775
rctx->vs_shader->info.file_count[TGSI_FILE_HW_ATOMIC] +
776
(rctx->gs_shader ? rctx->gs_shader->info.file_count[TGSI_FILE_HW_ATOMIC] : 0) +
777
rctx->tes_shader->info.file_count[TGSI_FILE_HW_ATOMIC];
778
break;
779
}
780
return value;
781
}
782
783
static void r600_update_compressed_colortex_mask_images(struct r600_image_state *images)
784
{
785
uint32_t mask = images->enabled_mask;
786
787
while (mask) {
788
unsigned i = u_bit_scan(&mask);
789
struct pipe_resource *res = images->views[i].base.resource;
790
791
if (res && res->target != PIPE_BUFFER) {
792
struct r600_texture *rtex = (struct r600_texture *)res;
793
794
if (rtex->cmask.size) {
795
images->compressed_colortex_mask |= 1 << i;
796
} else {
797
images->compressed_colortex_mask &= ~(1 << i);
798
}
799
}
800
}
801
}
802
803
/* Compute the key for the hw shader variant */
804
static inline void r600_shader_selector_key(const struct pipe_context *ctx,
805
const struct r600_pipe_shader_selector *sel,
806
union r600_shader_key *key)
807
{
808
const struct r600_context *rctx = (struct r600_context *)ctx;
809
memset(key, 0, sizeof(*key));
810
811
switch (sel->type) {
812
case PIPE_SHADER_VERTEX: {
813
key->vs.as_ls = (rctx->tes_shader != NULL);
814
if (!key->vs.as_ls)
815
key->vs.as_es = (rctx->gs_shader != NULL);
816
817
if (rctx->ps_shader->current->shader.gs_prim_id_input && !rctx->gs_shader) {
818
key->vs.as_gs_a = true;
819
key->vs.prim_id_out = rctx->ps_shader->current->shader.input[rctx->ps_shader->current->shader.ps_prim_id_input].spi_sid;
820
}
821
key->vs.first_atomic_counter = r600_get_hw_atomic_count(ctx, PIPE_SHADER_VERTEX);
822
break;
823
}
824
case PIPE_SHADER_GEOMETRY:
825
key->gs.first_atomic_counter = r600_get_hw_atomic_count(ctx, PIPE_SHADER_GEOMETRY);
826
key->gs.tri_strip_adj_fix = rctx->gs_tri_strip_adj_fix;
827
break;
828
case PIPE_SHADER_FRAGMENT: {
829
if (rctx->ps_shader->info.images_declared)
830
key->ps.image_size_const_offset = util_last_bit(rctx->samplers[PIPE_SHADER_FRAGMENT].views.enabled_mask);
831
key->ps.first_atomic_counter = r600_get_hw_atomic_count(ctx, PIPE_SHADER_FRAGMENT);
832
key->ps.color_two_side = rctx->rasterizer && rctx->rasterizer->two_side;
833
key->ps.alpha_to_one = rctx->alpha_to_one &&
834
rctx->rasterizer && rctx->rasterizer->multisample_enable &&
835
!rctx->framebuffer.cb0_is_integer;
836
key->ps.nr_cbufs = rctx->framebuffer.state.nr_cbufs;
837
key->ps.apply_sample_id_mask = (rctx->ps_iter_samples > 1) || !rctx->rasterizer->multisample_enable;
838
/* Dual-source blending only makes sense with nr_cbufs == 1. */
839
if (key->ps.nr_cbufs == 1 && rctx->dual_src_blend) {
840
key->ps.nr_cbufs = 2;
841
key->ps.dual_source_blend = 1;
842
}
843
break;
844
}
845
case PIPE_SHADER_TESS_EVAL:
846
key->tes.as_es = (rctx->gs_shader != NULL);
847
key->tes.first_atomic_counter = r600_get_hw_atomic_count(ctx, PIPE_SHADER_TESS_EVAL);
848
break;
849
case PIPE_SHADER_TESS_CTRL:
850
key->tcs.prim_mode = rctx->tes_shader->info.properties[TGSI_PROPERTY_TES_PRIM_MODE];
851
key->tcs.first_atomic_counter = r600_get_hw_atomic_count(ctx, PIPE_SHADER_TESS_CTRL);
852
break;
853
case PIPE_SHADER_COMPUTE:
854
break;
855
default:
856
assert(0);
857
}
858
}
859
860
/* Select the hw shader variant depending on the current state.
861
* (*dirty) is set to 1 if current variant was changed */
862
int r600_shader_select(struct pipe_context *ctx,
863
struct r600_pipe_shader_selector* sel,
864
bool *dirty)
865
{
866
union r600_shader_key key;
867
struct r600_pipe_shader * shader = NULL;
868
int r;
869
870
r600_shader_selector_key(ctx, sel, &key);
871
872
/* Check if we don't need to change anything.
873
* This path is also used for most shaders that don't need multiple
874
* variants, it will cost just a computation of the key and this
875
* test. */
876
if (likely(sel->current && memcmp(&sel->current->key, &key, sizeof(key)) == 0)) {
877
return 0;
878
}
879
880
/* lookup if we have other variants in the list */
881
if (sel->num_shaders > 1) {
882
struct r600_pipe_shader *p = sel->current, *c = p->next_variant;
883
884
while (c && memcmp(&c->key, &key, sizeof(key)) != 0) {
885
p = c;
886
c = c->next_variant;
887
}
888
889
if (c) {
890
p->next_variant = c->next_variant;
891
shader = c;
892
}
893
}
894
895
if (unlikely(!shader)) {
896
shader = CALLOC(1, sizeof(struct r600_pipe_shader));
897
shader->selector = sel;
898
899
r = r600_pipe_shader_create(ctx, shader, key);
900
if (unlikely(r)) {
901
R600_ERR("Failed to build shader variant (type=%u) %d\n",
902
sel->type, r);
903
sel->current = NULL;
904
FREE(shader);
905
return r;
906
}
907
908
/* We don't know the value of nr_ps_max_color_exports until we built
909
* at least one variant, so we may need to recompute the key after
910
* building first variant. */
911
if (sel->type == PIPE_SHADER_FRAGMENT &&
912
sel->num_shaders == 0) {
913
sel->nr_ps_max_color_exports = shader->shader.nr_ps_max_color_exports;
914
r600_shader_selector_key(ctx, sel, &key);
915
}
916
917
memcpy(&shader->key, &key, sizeof(key));
918
sel->num_shaders++;
919
}
920
921
if (dirty)
922
*dirty = true;
923
924
shader->next_variant = sel->current;
925
sel->current = shader;
926
927
return 0;
928
}
929
930
struct r600_pipe_shader_selector *r600_create_shader_state_tokens(struct pipe_context *ctx,
931
const void *prog, enum pipe_shader_ir ir,
932
unsigned pipe_shader_type)
933
{
934
struct r600_pipe_shader_selector *sel = CALLOC_STRUCT(r600_pipe_shader_selector);
935
936
sel->type = pipe_shader_type;
937
if (ir == PIPE_SHADER_IR_TGSI) {
938
sel->tokens = tgsi_dup_tokens((const struct tgsi_token *)prog);
939
tgsi_scan_shader(sel->tokens, &sel->info);
940
} else if (ir == PIPE_SHADER_IR_NIR){
941
sel->nir = nir_shader_clone(NULL, (const nir_shader *)prog);
942
nir_tgsi_scan_shader(sel->nir, &sel->info, true);
943
}
944
return sel;
945
}
946
947
static void *r600_create_shader_state(struct pipe_context *ctx,
948
const struct pipe_shader_state *state,
949
unsigned pipe_shader_type)
950
{
951
int i;
952
struct r600_pipe_shader_selector *sel;
953
954
if (state->type == PIPE_SHADER_IR_TGSI)
955
sel = r600_create_shader_state_tokens(ctx, state->tokens, state->type, pipe_shader_type);
956
else if (state->type == PIPE_SHADER_IR_NIR) {
957
sel = r600_create_shader_state_tokens(ctx, state->ir.nir, state->type, pipe_shader_type);
958
} else
959
assert(0 && "Unknown shader type\n");
960
961
sel->ir_type = state->type;
962
sel->so = state->stream_output;
963
964
switch (pipe_shader_type) {
965
case PIPE_SHADER_GEOMETRY:
966
sel->gs_output_prim =
967
sel->info.properties[TGSI_PROPERTY_GS_OUTPUT_PRIM];
968
sel->gs_max_out_vertices =
969
sel->info.properties[TGSI_PROPERTY_GS_MAX_OUTPUT_VERTICES];
970
sel->gs_num_invocations =
971
sel->info.properties[TGSI_PROPERTY_GS_INVOCATIONS];
972
break;
973
case PIPE_SHADER_VERTEX:
974
case PIPE_SHADER_TESS_CTRL:
975
sel->lds_patch_outputs_written_mask = 0;
976
sel->lds_outputs_written_mask = 0;
977
978
for (i = 0; i < sel->info.num_outputs; i++) {
979
unsigned name = sel->info.output_semantic_name[i];
980
unsigned index = sel->info.output_semantic_index[i];
981
982
switch (name) {
983
case TGSI_SEMANTIC_TESSINNER:
984
case TGSI_SEMANTIC_TESSOUTER:
985
case TGSI_SEMANTIC_PATCH:
986
sel->lds_patch_outputs_written_mask |=
987
1ull << r600_get_lds_unique_index(name, index);
988
break;
989
default:
990
sel->lds_outputs_written_mask |=
991
1ull << r600_get_lds_unique_index(name, index);
992
}
993
}
994
break;
995
default:
996
break;
997
}
998
999
return sel;
1000
}
1001
1002
static void *r600_create_ps_state(struct pipe_context *ctx,
1003
const struct pipe_shader_state *state)
1004
{
1005
return r600_create_shader_state(ctx, state, PIPE_SHADER_FRAGMENT);
1006
}
1007
1008
static void *r600_create_vs_state(struct pipe_context *ctx,
1009
const struct pipe_shader_state *state)
1010
{
1011
return r600_create_shader_state(ctx, state, PIPE_SHADER_VERTEX);
1012
}
1013
1014
static void *r600_create_gs_state(struct pipe_context *ctx,
1015
const struct pipe_shader_state *state)
1016
{
1017
return r600_create_shader_state(ctx, state, PIPE_SHADER_GEOMETRY);
1018
}
1019
1020
static void *r600_create_tcs_state(struct pipe_context *ctx,
1021
const struct pipe_shader_state *state)
1022
{
1023
return r600_create_shader_state(ctx, state, PIPE_SHADER_TESS_CTRL);
1024
}
1025
1026
static void *r600_create_tes_state(struct pipe_context *ctx,
1027
const struct pipe_shader_state *state)
1028
{
1029
return r600_create_shader_state(ctx, state, PIPE_SHADER_TESS_EVAL);
1030
}
1031
1032
static void r600_bind_ps_state(struct pipe_context *ctx, void *state)
1033
{
1034
struct r600_context *rctx = (struct r600_context *)ctx;
1035
1036
if (!state)
1037
state = rctx->dummy_pixel_shader;
1038
1039
rctx->ps_shader = (struct r600_pipe_shader_selector *)state;
1040
}
1041
1042
static struct tgsi_shader_info *r600_get_vs_info(struct r600_context *rctx)
1043
{
1044
if (rctx->gs_shader)
1045
return &rctx->gs_shader->info;
1046
else if (rctx->tes_shader)
1047
return &rctx->tes_shader->info;
1048
else if (rctx->vs_shader)
1049
return &rctx->vs_shader->info;
1050
else
1051
return NULL;
1052
}
1053
1054
static void r600_bind_vs_state(struct pipe_context *ctx, void *state)
1055
{
1056
struct r600_context *rctx = (struct r600_context *)ctx;
1057
1058
if (!state || rctx->vs_shader == state)
1059
return;
1060
1061
rctx->vs_shader = (struct r600_pipe_shader_selector *)state;
1062
r600_update_vs_writes_viewport_index(&rctx->b, r600_get_vs_info(rctx));
1063
1064
if (rctx->vs_shader->so.num_outputs)
1065
rctx->b.streamout.stride_in_dw = rctx->vs_shader->so.stride;
1066
}
1067
1068
static void r600_bind_gs_state(struct pipe_context *ctx, void *state)
1069
{
1070
struct r600_context *rctx = (struct r600_context *)ctx;
1071
1072
if (state == rctx->gs_shader)
1073
return;
1074
1075
rctx->gs_shader = (struct r600_pipe_shader_selector *)state;
1076
r600_update_vs_writes_viewport_index(&rctx->b, r600_get_vs_info(rctx));
1077
1078
if (!state)
1079
return;
1080
1081
if (rctx->gs_shader->so.num_outputs)
1082
rctx->b.streamout.stride_in_dw = rctx->gs_shader->so.stride;
1083
}
1084
1085
static void r600_bind_tcs_state(struct pipe_context *ctx, void *state)
1086
{
1087
struct r600_context *rctx = (struct r600_context *)ctx;
1088
1089
rctx->tcs_shader = (struct r600_pipe_shader_selector *)state;
1090
}
1091
1092
static void r600_bind_tes_state(struct pipe_context *ctx, void *state)
1093
{
1094
struct r600_context *rctx = (struct r600_context *)ctx;
1095
1096
if (state == rctx->tes_shader)
1097
return;
1098
1099
rctx->tes_shader = (struct r600_pipe_shader_selector *)state;
1100
r600_update_vs_writes_viewport_index(&rctx->b, r600_get_vs_info(rctx));
1101
1102
if (!state)
1103
return;
1104
1105
if (rctx->tes_shader->so.num_outputs)
1106
rctx->b.streamout.stride_in_dw = rctx->tes_shader->so.stride;
1107
}
1108
1109
void r600_delete_shader_selector(struct pipe_context *ctx,
1110
struct r600_pipe_shader_selector *sel)
1111
{
1112
struct r600_pipe_shader *p = sel->current, *c;
1113
while (p) {
1114
c = p->next_variant;
1115
r600_pipe_shader_destroy(ctx, p);
1116
free(p);
1117
p = c;
1118
}
1119
1120
if (sel->ir_type == PIPE_SHADER_IR_TGSI) {
1121
free(sel->tokens);
1122
/* We might have converted the TGSI shader to a NIR shader */
1123
if (sel->nir)
1124
ralloc_free(sel->nir);
1125
}
1126
else if (sel->ir_type == PIPE_SHADER_IR_NIR)
1127
ralloc_free(sel->nir);
1128
free(sel);
1129
}
1130
1131
1132
static void r600_delete_ps_state(struct pipe_context *ctx, void *state)
1133
{
1134
struct r600_context *rctx = (struct r600_context *)ctx;
1135
struct r600_pipe_shader_selector *sel = (struct r600_pipe_shader_selector *)state;
1136
1137
if (rctx->ps_shader == sel) {
1138
rctx->ps_shader = NULL;
1139
}
1140
1141
r600_delete_shader_selector(ctx, sel);
1142
}
1143
1144
static void r600_delete_vs_state(struct pipe_context *ctx, void *state)
1145
{
1146
struct r600_context *rctx = (struct r600_context *)ctx;
1147
struct r600_pipe_shader_selector *sel = (struct r600_pipe_shader_selector *)state;
1148
1149
if (rctx->vs_shader == sel) {
1150
rctx->vs_shader = NULL;
1151
}
1152
1153
r600_delete_shader_selector(ctx, sel);
1154
}
1155
1156
1157
static void r600_delete_gs_state(struct pipe_context *ctx, void *state)
1158
{
1159
struct r600_context *rctx = (struct r600_context *)ctx;
1160
struct r600_pipe_shader_selector *sel = (struct r600_pipe_shader_selector *)state;
1161
1162
if (rctx->gs_shader == sel) {
1163
rctx->gs_shader = NULL;
1164
}
1165
1166
r600_delete_shader_selector(ctx, sel);
1167
}
1168
1169
static void r600_delete_tcs_state(struct pipe_context *ctx, void *state)
1170
{
1171
struct r600_context *rctx = (struct r600_context *)ctx;
1172
struct r600_pipe_shader_selector *sel = (struct r600_pipe_shader_selector *)state;
1173
1174
if (rctx->tcs_shader == sel) {
1175
rctx->tcs_shader = NULL;
1176
}
1177
1178
r600_delete_shader_selector(ctx, sel);
1179
}
1180
1181
static void r600_delete_tes_state(struct pipe_context *ctx, void *state)
1182
{
1183
struct r600_context *rctx = (struct r600_context *)ctx;
1184
struct r600_pipe_shader_selector *sel = (struct r600_pipe_shader_selector *)state;
1185
1186
if (rctx->tes_shader == sel) {
1187
rctx->tes_shader = NULL;
1188
}
1189
1190
r600_delete_shader_selector(ctx, sel);
1191
}
1192
1193
void r600_constant_buffers_dirty(struct r600_context *rctx, struct r600_constbuf_state *state)
1194
{
1195
if (state->dirty_mask) {
1196
state->atom.num_dw = rctx->b.chip_class >= EVERGREEN ? util_bitcount(state->dirty_mask)*20
1197
: util_bitcount(state->dirty_mask)*19;
1198
r600_mark_atom_dirty(rctx, &state->atom);
1199
}
1200
}
1201
1202
static void r600_set_constant_buffer(struct pipe_context *ctx,
1203
enum pipe_shader_type shader, uint index,
1204
bool take_ownership,
1205
const struct pipe_constant_buffer *input)
1206
{
1207
struct r600_context *rctx = (struct r600_context *)ctx;
1208
struct r600_constbuf_state *state = &rctx->constbuf_state[shader];
1209
struct pipe_constant_buffer *cb;
1210
const uint8_t *ptr;
1211
1212
/* Note that the gallium frontend can unbind constant buffers by
1213
* passing NULL here.
1214
*/
1215
if (unlikely(!input || (!input->buffer && !input->user_buffer))) {
1216
state->enabled_mask &= ~(1 << index);
1217
state->dirty_mask &= ~(1 << index);
1218
pipe_resource_reference(&state->cb[index].buffer, NULL);
1219
return;
1220
}
1221
1222
cb = &state->cb[index];
1223
cb->buffer_size = input->buffer_size;
1224
1225
ptr = input->user_buffer;
1226
1227
if (ptr) {
1228
/* Upload the user buffer. */
1229
if (R600_BIG_ENDIAN) {
1230
uint32_t *tmpPtr;
1231
unsigned i, size = input->buffer_size;
1232
1233
if (!(tmpPtr = malloc(size))) {
1234
R600_ERR("Failed to allocate BE swap buffer.\n");
1235
return;
1236
}
1237
1238
for (i = 0; i < size / 4; ++i) {
1239
tmpPtr[i] = util_cpu_to_le32(((uint32_t *)ptr)[i]);
1240
}
1241
1242
u_upload_data(ctx->stream_uploader, 0, size, 256,
1243
tmpPtr, &cb->buffer_offset, &cb->buffer);
1244
free(tmpPtr);
1245
} else {
1246
u_upload_data(ctx->stream_uploader, 0,
1247
input->buffer_size, 256, ptr,
1248
&cb->buffer_offset, &cb->buffer);
1249
}
1250
/* account it in gtt */
1251
rctx->b.gtt += input->buffer_size;
1252
} else {
1253
/* Setup the hw buffer. */
1254
cb->buffer_offset = input->buffer_offset;
1255
if (take_ownership) {
1256
pipe_resource_reference(&cb->buffer, NULL);
1257
cb->buffer = input->buffer;
1258
} else {
1259
pipe_resource_reference(&cb->buffer, input->buffer);
1260
}
1261
r600_context_add_resource_size(ctx, input->buffer);
1262
}
1263
1264
state->enabled_mask |= 1 << index;
1265
state->dirty_mask |= 1 << index;
1266
r600_constant_buffers_dirty(rctx, state);
1267
}
1268
1269
static void r600_set_sample_mask(struct pipe_context *pipe, unsigned sample_mask)
1270
{
1271
struct r600_context *rctx = (struct r600_context*)pipe;
1272
1273
if (rctx->sample_mask.sample_mask == (uint16_t)sample_mask)
1274
return;
1275
1276
rctx->sample_mask.sample_mask = sample_mask;
1277
r600_mark_atom_dirty(rctx, &rctx->sample_mask.atom);
1278
}
1279
1280
void r600_update_driver_const_buffers(struct r600_context *rctx, bool compute_only)
1281
{
1282
int sh, size;
1283
void *ptr;
1284
struct pipe_constant_buffer cb;
1285
int start, end;
1286
1287
start = compute_only ? PIPE_SHADER_COMPUTE : 0;
1288
end = compute_only ? PIPE_SHADER_TYPES : PIPE_SHADER_COMPUTE;
1289
1290
for (sh = start; sh < end; sh++) {
1291
struct r600_shader_driver_constants_info *info = &rctx->driver_consts[sh];
1292
if (!info->vs_ucp_dirty &&
1293
!info->texture_const_dirty &&
1294
!info->ps_sample_pos_dirty &&
1295
!info->tcs_default_levels_dirty &&
1296
!info->cs_block_grid_size_dirty)
1297
continue;
1298
1299
ptr = info->constants;
1300
size = info->alloc_size;
1301
if (info->vs_ucp_dirty) {
1302
assert(sh == PIPE_SHADER_VERTEX);
1303
if (!size) {
1304
ptr = rctx->clip_state.state.ucp;
1305
size = R600_UCP_SIZE;
1306
} else {
1307
memcpy(ptr, rctx->clip_state.state.ucp, R600_UCP_SIZE);
1308
}
1309
info->vs_ucp_dirty = false;
1310
}
1311
1312
else if (info->ps_sample_pos_dirty) {
1313
assert(sh == PIPE_SHADER_FRAGMENT);
1314
if (!size) {
1315
ptr = rctx->sample_positions;
1316
size = R600_UCP_SIZE;
1317
} else {
1318
memcpy(ptr, rctx->sample_positions, R600_UCP_SIZE);
1319
}
1320
info->ps_sample_pos_dirty = false;
1321
}
1322
1323
else if (info->cs_block_grid_size_dirty) {
1324
assert(sh == PIPE_SHADER_COMPUTE);
1325
if (!size) {
1326
ptr = rctx->cs_block_grid_sizes;
1327
size = R600_CS_BLOCK_GRID_SIZE;
1328
} else {
1329
memcpy(ptr, rctx->cs_block_grid_sizes, R600_CS_BLOCK_GRID_SIZE);
1330
}
1331
info->cs_block_grid_size_dirty = false;
1332
}
1333
1334
else if (info->tcs_default_levels_dirty) {
1335
/*
1336
* We'd only really need this for default tcs shader.
1337
*/
1338
assert(sh == PIPE_SHADER_TESS_CTRL);
1339
if (!size) {
1340
ptr = rctx->tess_state;
1341
size = R600_TCS_DEFAULT_LEVELS_SIZE;
1342
} else {
1343
memcpy(ptr, rctx->tess_state, R600_TCS_DEFAULT_LEVELS_SIZE);
1344
}
1345
info->tcs_default_levels_dirty = false;
1346
}
1347
1348
if (info->texture_const_dirty) {
1349
assert (ptr);
1350
assert (size);
1351
if (sh == PIPE_SHADER_VERTEX)
1352
memcpy(ptr, rctx->clip_state.state.ucp, R600_UCP_SIZE);
1353
if (sh == PIPE_SHADER_FRAGMENT)
1354
memcpy(ptr, rctx->sample_positions, R600_UCP_SIZE);
1355
if (sh == PIPE_SHADER_COMPUTE)
1356
memcpy(ptr, rctx->cs_block_grid_sizes, R600_CS_BLOCK_GRID_SIZE);
1357
if (sh == PIPE_SHADER_TESS_CTRL)
1358
memcpy(ptr, rctx->tess_state, R600_TCS_DEFAULT_LEVELS_SIZE);
1359
}
1360
info->texture_const_dirty = false;
1361
1362
cb.buffer = NULL;
1363
cb.user_buffer = ptr;
1364
cb.buffer_offset = 0;
1365
cb.buffer_size = size;
1366
rctx->b.b.set_constant_buffer(&rctx->b.b, sh, R600_BUFFER_INFO_CONST_BUFFER, false, &cb);
1367
pipe_resource_reference(&cb.buffer, NULL);
1368
}
1369
}
1370
1371
static void *r600_alloc_buf_consts(struct r600_context *rctx, int shader_type,
1372
unsigned array_size, uint32_t *base_offset)
1373
{
1374
struct r600_shader_driver_constants_info *info = &rctx->driver_consts[shader_type];
1375
if (array_size + R600_UCP_SIZE > info->alloc_size) {
1376
info->constants = realloc(info->constants, array_size + R600_UCP_SIZE);
1377
info->alloc_size = array_size + R600_UCP_SIZE;
1378
}
1379
memset(info->constants + (R600_UCP_SIZE / 4), 0, array_size);
1380
info->texture_const_dirty = true;
1381
*base_offset = R600_UCP_SIZE;
1382
return info->constants;
1383
}
1384
/*
1385
* On r600/700 hw we don't have vertex fetch swizzle, though TBO
1386
* doesn't require full swizzles it does need masking and setting alpha
1387
* to one, so we setup a set of 5 constants with the masks + alpha value
1388
* then in the shader, we AND the 4 components with 0xffffffff or 0,
1389
* then OR the alpha with the value given here.
1390
* We use a 6th constant to store the txq buffer size in
1391
* we use 7th slot for number of cube layers in a cube map array.
1392
*/
1393
static void r600_setup_buffer_constants(struct r600_context *rctx, int shader_type)
1394
{
1395
struct r600_textures_info *samplers = &rctx->samplers[shader_type];
1396
int bits;
1397
uint32_t array_size;
1398
int i, j;
1399
uint32_t *constants;
1400
uint32_t base_offset;
1401
if (!samplers->views.dirty_buffer_constants)
1402
return;
1403
1404
samplers->views.dirty_buffer_constants = FALSE;
1405
1406
bits = util_last_bit(samplers->views.enabled_mask);
1407
array_size = bits * 8 * sizeof(uint32_t);
1408
1409
constants = r600_alloc_buf_consts(rctx, shader_type, array_size, &base_offset);
1410
1411
for (i = 0; i < bits; i++) {
1412
if (samplers->views.enabled_mask & (1 << i)) {
1413
int offset = (base_offset / 4) + i * 8;
1414
const struct util_format_description *desc;
1415
desc = util_format_description(samplers->views.views[i]->base.format);
1416
1417
for (j = 0; j < 4; j++)
1418
if (j < desc->nr_channels)
1419
constants[offset+j] = 0xffffffff;
1420
else
1421
constants[offset+j] = 0x0;
1422
if (desc->nr_channels < 4) {
1423
if (desc->channel[0].pure_integer)
1424
constants[offset+4] = 1;
1425
else
1426
constants[offset+4] = fui(1.0);
1427
} else
1428
constants[offset + 4] = 0;
1429
1430
constants[offset + 5] = samplers->views.views[i]->base.u.buf.size /
1431
util_format_get_blocksize(samplers->views.views[i]->base.format);
1432
constants[offset + 6] = samplers->views.views[i]->base.texture->array_size / 6;
1433
}
1434
}
1435
1436
}
1437
1438
/* On evergreen we store one value
1439
* 1. number of cube layers in a cube map array.
1440
*/
1441
void eg_setup_buffer_constants(struct r600_context *rctx, int shader_type)
1442
{
1443
struct r600_textures_info *samplers = &rctx->samplers[shader_type];
1444
struct r600_image_state *images = NULL;
1445
int bits, sview_bits, img_bits;
1446
uint32_t array_size;
1447
int i;
1448
uint32_t *constants;
1449
uint32_t base_offset;
1450
1451
if (shader_type == PIPE_SHADER_FRAGMENT) {
1452
images = &rctx->fragment_images;
1453
} else if (shader_type == PIPE_SHADER_COMPUTE) {
1454
images = &rctx->compute_images;
1455
}
1456
1457
if (!samplers->views.dirty_buffer_constants &&
1458
!(images && images->dirty_buffer_constants))
1459
return;
1460
1461
if (images)
1462
images->dirty_buffer_constants = FALSE;
1463
samplers->views.dirty_buffer_constants = FALSE;
1464
1465
bits = sview_bits = util_last_bit(samplers->views.enabled_mask);
1466
if (images)
1467
bits += util_last_bit(images->enabled_mask);
1468
img_bits = bits;
1469
1470
array_size = bits * sizeof(uint32_t);
1471
1472
constants = r600_alloc_buf_consts(rctx, shader_type, array_size,
1473
&base_offset);
1474
1475
for (i = 0; i < sview_bits; i++) {
1476
if (samplers->views.enabled_mask & (1 << i)) {
1477
uint32_t offset = (base_offset / 4) + i;
1478
constants[offset] = samplers->views.views[i]->base.texture->array_size / 6;
1479
}
1480
}
1481
if (images) {
1482
for (i = sview_bits; i < img_bits; i++) {
1483
int idx = i - sview_bits;
1484
if (images->enabled_mask & (1 << idx)) {
1485
uint32_t offset = (base_offset / 4) + i;
1486
constants[offset] = images->views[idx].base.resource->array_size / 6;
1487
}
1488
}
1489
}
1490
}
1491
1492
/* set sample xy locations as array of fragment shader constants */
1493
void r600_set_sample_locations_constant_buffer(struct r600_context *rctx)
1494
{
1495
struct pipe_context *ctx = &rctx->b.b;
1496
1497
assert(rctx->framebuffer.nr_samples < R600_UCP_SIZE);
1498
assert(rctx->framebuffer.nr_samples <= ARRAY_SIZE(rctx->sample_positions)/4);
1499
1500
memset(rctx->sample_positions, 0, 4 * 4 * 16);
1501
for (unsigned i = 0; i < rctx->framebuffer.nr_samples; i++) {
1502
ctx->get_sample_position(ctx, rctx->framebuffer.nr_samples, i, &rctx->sample_positions[4*i]);
1503
/* Also fill in center-zeroed positions used for interpolateAtSample */
1504
rctx->sample_positions[4*i + 2] = rctx->sample_positions[4*i + 0] - 0.5f;
1505
rctx->sample_positions[4*i + 3] = rctx->sample_positions[4*i + 1] - 0.5f;
1506
}
1507
1508
rctx->driver_consts[PIPE_SHADER_FRAGMENT].ps_sample_pos_dirty = true;
1509
}
1510
1511
static void update_shader_atom(struct pipe_context *ctx,
1512
struct r600_shader_state *state,
1513
struct r600_pipe_shader *shader)
1514
{
1515
struct r600_context *rctx = (struct r600_context *)ctx;
1516
1517
state->shader = shader;
1518
if (shader) {
1519
state->atom.num_dw = shader->command_buffer.num_dw;
1520
r600_context_add_resource_size(ctx, (struct pipe_resource *)shader->bo);
1521
} else {
1522
state->atom.num_dw = 0;
1523
}
1524
r600_mark_atom_dirty(rctx, &state->atom);
1525
}
1526
1527
static void update_gs_block_state(struct r600_context *rctx, unsigned enable)
1528
{
1529
if (rctx->shader_stages.geom_enable != enable) {
1530
rctx->shader_stages.geom_enable = enable;
1531
r600_mark_atom_dirty(rctx, &rctx->shader_stages.atom);
1532
}
1533
1534
if (rctx->gs_rings.enable != enable) {
1535
rctx->gs_rings.enable = enable;
1536
r600_mark_atom_dirty(rctx, &rctx->gs_rings.atom);
1537
1538
if (enable && !rctx->gs_rings.esgs_ring.buffer) {
1539
unsigned size = 0x1C000;
1540
rctx->gs_rings.esgs_ring.buffer =
1541
pipe_buffer_create(rctx->b.b.screen, 0,
1542
PIPE_USAGE_DEFAULT, size);
1543
rctx->gs_rings.esgs_ring.buffer_size = size;
1544
1545
size = 0x4000000;
1546
1547
rctx->gs_rings.gsvs_ring.buffer =
1548
pipe_buffer_create(rctx->b.b.screen, 0,
1549
PIPE_USAGE_DEFAULT, size);
1550
rctx->gs_rings.gsvs_ring.buffer_size = size;
1551
}
1552
1553
if (enable) {
1554
r600_set_constant_buffer(&rctx->b.b, PIPE_SHADER_GEOMETRY,
1555
R600_GS_RING_CONST_BUFFER, false, &rctx->gs_rings.esgs_ring);
1556
if (rctx->tes_shader) {
1557
r600_set_constant_buffer(&rctx->b.b, PIPE_SHADER_TESS_EVAL,
1558
R600_GS_RING_CONST_BUFFER, false, &rctx->gs_rings.gsvs_ring);
1559
} else {
1560
r600_set_constant_buffer(&rctx->b.b, PIPE_SHADER_VERTEX,
1561
R600_GS_RING_CONST_BUFFER, false, &rctx->gs_rings.gsvs_ring);
1562
}
1563
} else {
1564
r600_set_constant_buffer(&rctx->b.b, PIPE_SHADER_GEOMETRY,
1565
R600_GS_RING_CONST_BUFFER, false, NULL);
1566
r600_set_constant_buffer(&rctx->b.b, PIPE_SHADER_VERTEX,
1567
R600_GS_RING_CONST_BUFFER, false, NULL);
1568
r600_set_constant_buffer(&rctx->b.b, PIPE_SHADER_TESS_EVAL,
1569
R600_GS_RING_CONST_BUFFER, false, NULL);
1570
}
1571
}
1572
}
1573
1574
static void r600_update_clip_state(struct r600_context *rctx,
1575
struct r600_pipe_shader *current)
1576
{
1577
if (current->pa_cl_vs_out_cntl != rctx->clip_misc_state.pa_cl_vs_out_cntl ||
1578
current->shader.clip_dist_write != rctx->clip_misc_state.clip_dist_write ||
1579
current->shader.cull_dist_write != rctx->clip_misc_state.cull_dist_write ||
1580
current->shader.vs_position_window_space != rctx->clip_misc_state.clip_disable ||
1581
current->shader.vs_out_viewport != rctx->clip_misc_state.vs_out_viewport) {
1582
rctx->clip_misc_state.pa_cl_vs_out_cntl = current->pa_cl_vs_out_cntl;
1583
rctx->clip_misc_state.clip_dist_write = current->shader.clip_dist_write;
1584
rctx->clip_misc_state.cull_dist_write = current->shader.cull_dist_write;
1585
rctx->clip_misc_state.clip_disable = current->shader.vs_position_window_space;
1586
rctx->clip_misc_state.vs_out_viewport = current->shader.vs_out_viewport;
1587
r600_mark_atom_dirty(rctx, &rctx->clip_misc_state.atom);
1588
}
1589
}
1590
1591
static void r600_generate_fixed_func_tcs(struct r600_context *rctx)
1592
{
1593
struct ureg_src const0, const1;
1594
struct ureg_dst tessouter, tessinner;
1595
struct ureg_program *ureg = ureg_create(PIPE_SHADER_TESS_CTRL);
1596
1597
if (!ureg)
1598
return; /* if we get here, we're screwed */
1599
1600
assert(!rctx->fixed_func_tcs_shader);
1601
1602
ureg_DECL_constant2D(ureg, 0, 1, R600_BUFFER_INFO_CONST_BUFFER);
1603
const0 = ureg_src_dimension(ureg_src_register(TGSI_FILE_CONSTANT, 0),
1604
R600_BUFFER_INFO_CONST_BUFFER);
1605
const1 = ureg_src_dimension(ureg_src_register(TGSI_FILE_CONSTANT, 1),
1606
R600_BUFFER_INFO_CONST_BUFFER);
1607
1608
tessouter = ureg_DECL_output(ureg, TGSI_SEMANTIC_TESSOUTER, 0);
1609
tessinner = ureg_DECL_output(ureg, TGSI_SEMANTIC_TESSINNER, 0);
1610
1611
ureg_MOV(ureg, tessouter, const0);
1612
ureg_MOV(ureg, tessinner, const1);
1613
ureg_END(ureg);
1614
1615
rctx->fixed_func_tcs_shader =
1616
ureg_create_shader_and_destroy(ureg, &rctx->b.b);
1617
}
1618
1619
void r600_update_compressed_resource_state(struct r600_context *rctx, bool compute_only)
1620
{
1621
unsigned i;
1622
unsigned counter;
1623
1624
counter = p_atomic_read(&rctx->screen->b.compressed_colortex_counter);
1625
if (counter != rctx->b.last_compressed_colortex_counter) {
1626
rctx->b.last_compressed_colortex_counter = counter;
1627
1628
if (compute_only) {
1629
r600_update_compressed_colortex_mask(&rctx->samplers[PIPE_SHADER_COMPUTE].views);
1630
} else {
1631
for (i = 0; i < PIPE_SHADER_TYPES; ++i) {
1632
r600_update_compressed_colortex_mask(&rctx->samplers[i].views);
1633
}
1634
}
1635
if (!compute_only)
1636
r600_update_compressed_colortex_mask_images(&rctx->fragment_images);
1637
r600_update_compressed_colortex_mask_images(&rctx->compute_images);
1638
}
1639
1640
/* Decompress textures if needed. */
1641
for (i = 0; i < PIPE_SHADER_TYPES; i++) {
1642
struct r600_samplerview_state *views = &rctx->samplers[i].views;
1643
1644
if (compute_only)
1645
if (i != PIPE_SHADER_COMPUTE)
1646
continue;
1647
if (views->compressed_depthtex_mask) {
1648
r600_decompress_depth_textures(rctx, views);
1649
}
1650
if (views->compressed_colortex_mask) {
1651
r600_decompress_color_textures(rctx, views);
1652
}
1653
}
1654
1655
{
1656
struct r600_image_state *istate;
1657
1658
if (!compute_only) {
1659
istate = &rctx->fragment_images;
1660
if (istate->compressed_depthtex_mask)
1661
r600_decompress_depth_images(rctx, istate);
1662
if (istate->compressed_colortex_mask)
1663
r600_decompress_color_images(rctx, istate);
1664
}
1665
1666
istate = &rctx->compute_images;
1667
if (istate->compressed_depthtex_mask)
1668
r600_decompress_depth_images(rctx, istate);
1669
if (istate->compressed_colortex_mask)
1670
r600_decompress_color_images(rctx, istate);
1671
}
1672
}
1673
1674
/* update MEM_SCRATCH buffers if needed */
1675
void r600_setup_scratch_area_for_shader(struct r600_context *rctx,
1676
struct r600_pipe_shader *shader, struct r600_scratch_buffer *scratch,
1677
unsigned ring_base_reg, unsigned item_size_reg, unsigned ring_size_reg)
1678
{
1679
unsigned num_ses = rctx->screen->b.info.max_se;
1680
unsigned num_pipes = rctx->screen->b.info.r600_max_quad_pipes;
1681
unsigned nthreads = 128;
1682
1683
unsigned itemsize = shader->scratch_space_needed * 4;
1684
unsigned size = align(itemsize * nthreads * num_pipes * num_ses * 4, 256);
1685
1686
if (scratch->dirty ||
1687
unlikely(shader->scratch_space_needed != scratch->item_size ||
1688
size > scratch->size)) {
1689
struct radeon_cmdbuf *cs = &rctx->b.gfx.cs;
1690
1691
scratch->dirty = false;
1692
1693
if (size > scratch->size) {
1694
// Release prior one if any
1695
if (scratch->buffer) {
1696
pipe_resource_reference((struct pipe_resource**)&scratch->buffer, NULL);
1697
}
1698
1699
scratch->buffer = (struct r600_resource *)pipe_buffer_create(rctx->b.b.screen, PIPE_BIND_CUSTOM,
1700
PIPE_USAGE_DEFAULT, size);
1701
if (scratch->buffer) {
1702
scratch->size = size;
1703
}
1704
}
1705
1706
scratch->item_size = shader->scratch_space_needed;
1707
1708
radeon_set_config_reg(cs, R_008040_WAIT_UNTIL, S_008040_WAIT_3D_IDLE(1));
1709
radeon_emit(cs, PKT3(PKT3_EVENT_WRITE, 0, 0));
1710
radeon_emit(cs, EVENT_TYPE(EVENT_TYPE_VGT_FLUSH));
1711
1712
// multi-SE chips need programming per SE
1713
for (unsigned se = 0; se < num_ses; se++) {
1714
struct r600_resource *rbuffer = scratch->buffer;
1715
unsigned size_per_se = size / num_ses;
1716
1717
// Direct to particular SE
1718
if (num_ses > 1) {
1719
radeon_set_config_reg(cs, EG_0802C_GRBM_GFX_INDEX,
1720
S_0802C_INSTANCE_INDEX(0) |
1721
S_0802C_SE_INDEX(se) |
1722
S_0802C_INSTANCE_BROADCAST_WRITES(1) |
1723
S_0802C_SE_BROADCAST_WRITES(0));
1724
}
1725
1726
radeon_set_config_reg(cs, ring_base_reg, (rbuffer->gpu_address + size_per_se * se) >> 8);
1727
radeon_emit(cs, PKT3(PKT3_NOP, 0, 0));
1728
radeon_emit(cs, radeon_add_to_buffer_list(&rctx->b, &rctx->b.gfx, rbuffer,
1729
RADEON_USAGE_READWRITE,
1730
RADEON_PRIO_SCRATCH_BUFFER));
1731
radeon_set_context_reg(cs, item_size_reg, itemsize);
1732
radeon_set_config_reg(cs, ring_size_reg, size_per_se >> 8);
1733
}
1734
1735
// Restore broadcast mode
1736
if (num_ses > 1) {
1737
radeon_set_config_reg(cs, EG_0802C_GRBM_GFX_INDEX,
1738
S_0802C_INSTANCE_INDEX(0) |
1739
S_0802C_SE_INDEX(0) |
1740
S_0802C_INSTANCE_BROADCAST_WRITES(1) |
1741
S_0802C_SE_BROADCAST_WRITES(1));
1742
}
1743
1744
radeon_set_config_reg(cs, R_008040_WAIT_UNTIL, S_008040_WAIT_3D_IDLE(1));
1745
radeon_emit(cs, PKT3(PKT3_EVENT_WRITE, 0, 0));
1746
radeon_emit(cs, EVENT_TYPE(EVENT_TYPE_VGT_FLUSH));
1747
}
1748
}
1749
1750
void r600_setup_scratch_buffers(struct r600_context *rctx) {
1751
static const struct {
1752
unsigned ring_base;
1753
unsigned item_size;
1754
unsigned ring_size;
1755
} regs[R600_NUM_HW_STAGES] = {
1756
[R600_HW_STAGE_PS] = { R_008C68_SQ_PSTMP_RING_BASE, R_0288BC_SQ_PSTMP_RING_ITEMSIZE, R_008C6C_SQ_PSTMP_RING_SIZE },
1757
[R600_HW_STAGE_VS] = { R_008C60_SQ_VSTMP_RING_BASE, R_0288B8_SQ_VSTMP_RING_ITEMSIZE, R_008C64_SQ_VSTMP_RING_SIZE },
1758
[R600_HW_STAGE_GS] = { R_008C58_SQ_GSTMP_RING_BASE, R_0288B4_SQ_GSTMP_RING_ITEMSIZE, R_008C5C_SQ_GSTMP_RING_SIZE },
1759
[R600_HW_STAGE_ES] = { R_008C50_SQ_ESTMP_RING_BASE, R_0288B0_SQ_ESTMP_RING_ITEMSIZE, R_008C54_SQ_ESTMP_RING_SIZE }
1760
};
1761
1762
for (unsigned i = 0; i < R600_NUM_HW_STAGES; i++) {
1763
struct r600_pipe_shader *stage = rctx->hw_shader_stages[i].shader;
1764
1765
if (stage && unlikely(stage->scratch_space_needed)) {
1766
r600_setup_scratch_area_for_shader(rctx, stage,
1767
&rctx->scratch_buffers[i], regs[i].ring_base, regs[i].item_size, regs[i].ring_size);
1768
}
1769
}
1770
}
1771
1772
#define SELECT_SHADER_OR_FAIL(x) do { \
1773
r600_shader_select(ctx, rctx->x##_shader, &x##_dirty); \
1774
if (unlikely(!rctx->x##_shader->current)) \
1775
return false; \
1776
} while(0)
1777
1778
#define UPDATE_SHADER(hw, sw) do { \
1779
if (sw##_dirty || (rctx->hw_shader_stages[(hw)].shader != rctx->sw##_shader->current)) \
1780
update_shader_atom(ctx, &rctx->hw_shader_stages[(hw)], rctx->sw##_shader->current); \
1781
} while(0)
1782
1783
#define UPDATE_SHADER_CLIP(hw, sw) do { \
1784
if (sw##_dirty || (rctx->hw_shader_stages[(hw)].shader != rctx->sw##_shader->current)) { \
1785
update_shader_atom(ctx, &rctx->hw_shader_stages[(hw)], rctx->sw##_shader->current); \
1786
clip_so_current = rctx->sw##_shader->current; \
1787
} \
1788
} while(0)
1789
1790
#define UPDATE_SHADER_GS(hw, hw2, sw) do { \
1791
if (sw##_dirty || (rctx->hw_shader_stages[(hw)].shader != rctx->sw##_shader->current)) { \
1792
update_shader_atom(ctx, &rctx->hw_shader_stages[(hw)], rctx->sw##_shader->current); \
1793
update_shader_atom(ctx, &rctx->hw_shader_stages[(hw2)], rctx->sw##_shader->current->gs_copy_shader); \
1794
clip_so_current = rctx->sw##_shader->current->gs_copy_shader; \
1795
} \
1796
} while(0)
1797
1798
#define SET_NULL_SHADER(hw) do { \
1799
if (rctx->hw_shader_stages[(hw)].shader) \
1800
update_shader_atom(ctx, &rctx->hw_shader_stages[(hw)], NULL); \
1801
} while (0)
1802
1803
static bool r600_update_derived_state(struct r600_context *rctx)
1804
{
1805
struct pipe_context * ctx = (struct pipe_context*)rctx;
1806
bool ps_dirty = false, vs_dirty = false, gs_dirty = false;
1807
bool tcs_dirty = false, tes_dirty = false, fixed_func_tcs_dirty = false;
1808
bool blend_disable;
1809
bool need_buf_const;
1810
struct r600_pipe_shader *clip_so_current = NULL;
1811
1812
if (!rctx->blitter->running)
1813
r600_update_compressed_resource_state(rctx, false);
1814
1815
SELECT_SHADER_OR_FAIL(ps);
1816
1817
r600_mark_atom_dirty(rctx, &rctx->shader_stages.atom);
1818
1819
update_gs_block_state(rctx, rctx->gs_shader != NULL);
1820
1821
if (rctx->gs_shader)
1822
SELECT_SHADER_OR_FAIL(gs);
1823
1824
/* Hull Shader */
1825
if (rctx->tcs_shader) {
1826
SELECT_SHADER_OR_FAIL(tcs);
1827
1828
UPDATE_SHADER(EG_HW_STAGE_HS, tcs);
1829
} else if (rctx->tes_shader) {
1830
if (!rctx->fixed_func_tcs_shader) {
1831
r600_generate_fixed_func_tcs(rctx);
1832
if (!rctx->fixed_func_tcs_shader)
1833
return false;
1834
1835
}
1836
SELECT_SHADER_OR_FAIL(fixed_func_tcs);
1837
1838
UPDATE_SHADER(EG_HW_STAGE_HS, fixed_func_tcs);
1839
} else
1840
SET_NULL_SHADER(EG_HW_STAGE_HS);
1841
1842
if (rctx->tes_shader) {
1843
SELECT_SHADER_OR_FAIL(tes);
1844
}
1845
1846
SELECT_SHADER_OR_FAIL(vs);
1847
1848
if (rctx->gs_shader) {
1849
if (!rctx->shader_stages.geom_enable) {
1850
rctx->shader_stages.geom_enable = true;
1851
r600_mark_atom_dirty(rctx, &rctx->shader_stages.atom);
1852
}
1853
1854
/* gs_shader provides GS and VS (copy shader) */
1855
UPDATE_SHADER_GS(R600_HW_STAGE_GS, R600_HW_STAGE_VS, gs);
1856
1857
/* vs_shader is used as ES */
1858
1859
if (rctx->tes_shader) {
1860
/* VS goes to LS, TES goes to ES */
1861
UPDATE_SHADER(R600_HW_STAGE_ES, tes);
1862
UPDATE_SHADER(EG_HW_STAGE_LS, vs);
1863
} else {
1864
/* vs_shader is used as ES */
1865
UPDATE_SHADER(R600_HW_STAGE_ES, vs);
1866
SET_NULL_SHADER(EG_HW_STAGE_LS);
1867
}
1868
} else {
1869
if (unlikely(rctx->hw_shader_stages[R600_HW_STAGE_GS].shader)) {
1870
SET_NULL_SHADER(R600_HW_STAGE_GS);
1871
SET_NULL_SHADER(R600_HW_STAGE_ES);
1872
rctx->shader_stages.geom_enable = false;
1873
r600_mark_atom_dirty(rctx, &rctx->shader_stages.atom);
1874
}
1875
1876
if (rctx->tes_shader) {
1877
/* if TES is loaded and no geometry, TES runs on hw VS, VS runs on hw LS */
1878
UPDATE_SHADER_CLIP(R600_HW_STAGE_VS, tes);
1879
UPDATE_SHADER(EG_HW_STAGE_LS, vs);
1880
} else {
1881
SET_NULL_SHADER(EG_HW_STAGE_LS);
1882
UPDATE_SHADER_CLIP(R600_HW_STAGE_VS, vs);
1883
}
1884
}
1885
1886
/*
1887
* XXX: I believe there's some fatal flaw in the dirty state logic when
1888
* enabling/disabling tes.
1889
* VS/ES share all buffer/resource/sampler slots. If TES is enabled,
1890
* it will therefore overwrite the VS slots. If it now gets disabled,
1891
* the VS needs to rebind all buffer/resource/sampler slots - not only
1892
* has TES overwritten the corresponding slots, but when the VS was
1893
* operating as LS the things with correpsonding dirty bits got bound
1894
* to LS slots and won't reflect what is dirty as VS stage even if the
1895
* TES didn't overwrite it. The story for re-enabled TES is similar.
1896
* In any case, we're not allowed to submit any TES state when
1897
* TES is disabled (the gallium frontend may not do this but this looks
1898
* like an optimization to me, not something which can be relied on).
1899
*/
1900
1901
/* Update clip misc state. */
1902
if (clip_so_current) {
1903
r600_update_clip_state(rctx, clip_so_current);
1904
rctx->b.streamout.enabled_stream_buffers_mask = clip_so_current->enabled_stream_buffers_mask;
1905
}
1906
1907
if (unlikely(ps_dirty || rctx->hw_shader_stages[R600_HW_STAGE_PS].shader != rctx->ps_shader->current ||
1908
rctx->rasterizer->sprite_coord_enable != rctx->ps_shader->current->sprite_coord_enable ||
1909
rctx->rasterizer->flatshade != rctx->ps_shader->current->flatshade)) {
1910
1911
if (rctx->cb_misc_state.nr_ps_color_outputs != rctx->ps_shader->current->nr_ps_color_outputs ||
1912
rctx->cb_misc_state.ps_color_export_mask != rctx->ps_shader->current->ps_color_export_mask) {
1913
rctx->cb_misc_state.nr_ps_color_outputs = rctx->ps_shader->current->nr_ps_color_outputs;
1914
rctx->cb_misc_state.ps_color_export_mask = rctx->ps_shader->current->ps_color_export_mask;
1915
r600_mark_atom_dirty(rctx, &rctx->cb_misc_state.atom);
1916
}
1917
1918
if (rctx->b.chip_class <= R700) {
1919
bool multiwrite = rctx->ps_shader->current->shader.fs_write_all;
1920
1921
if (rctx->cb_misc_state.multiwrite != multiwrite) {
1922
rctx->cb_misc_state.multiwrite = multiwrite;
1923
r600_mark_atom_dirty(rctx, &rctx->cb_misc_state.atom);
1924
}
1925
}
1926
1927
if (unlikely(!ps_dirty && rctx->ps_shader && rctx->rasterizer &&
1928
((rctx->rasterizer->sprite_coord_enable != rctx->ps_shader->current->sprite_coord_enable) ||
1929
(rctx->rasterizer->flatshade != rctx->ps_shader->current->flatshade)))) {
1930
1931
if (rctx->b.chip_class >= EVERGREEN)
1932
evergreen_update_ps_state(ctx, rctx->ps_shader->current);
1933
else
1934
r600_update_ps_state(ctx, rctx->ps_shader->current);
1935
}
1936
1937
r600_mark_atom_dirty(rctx, &rctx->shader_stages.atom);
1938
}
1939
UPDATE_SHADER(R600_HW_STAGE_PS, ps);
1940
1941
if (rctx->b.chip_class >= EVERGREEN) {
1942
evergreen_update_db_shader_control(rctx);
1943
} else {
1944
r600_update_db_shader_control(rctx);
1945
}
1946
1947
/* For each shader stage that needs to spill, set up buffer for MEM_SCRATCH */
1948
if (rctx->b.chip_class >= EVERGREEN) {
1949
evergreen_setup_scratch_buffers(rctx);
1950
} else {
1951
r600_setup_scratch_buffers(rctx);
1952
}
1953
1954
/* on R600 we stuff masks + txq info into one constant buffer */
1955
/* on evergreen we only need a txq info one */
1956
if (rctx->ps_shader) {
1957
need_buf_const = rctx->ps_shader->current->shader.uses_tex_buffers || rctx->ps_shader->current->shader.has_txq_cube_array_z_comp;
1958
if (need_buf_const) {
1959
if (rctx->b.chip_class < EVERGREEN)
1960
r600_setup_buffer_constants(rctx, PIPE_SHADER_FRAGMENT);
1961
else
1962
eg_setup_buffer_constants(rctx, PIPE_SHADER_FRAGMENT);
1963
}
1964
}
1965
1966
if (rctx->vs_shader) {
1967
need_buf_const = rctx->vs_shader->current->shader.uses_tex_buffers || rctx->vs_shader->current->shader.has_txq_cube_array_z_comp;
1968
if (need_buf_const) {
1969
if (rctx->b.chip_class < EVERGREEN)
1970
r600_setup_buffer_constants(rctx, PIPE_SHADER_VERTEX);
1971
else
1972
eg_setup_buffer_constants(rctx, PIPE_SHADER_VERTEX);
1973
}
1974
}
1975
1976
if (rctx->gs_shader) {
1977
need_buf_const = rctx->gs_shader->current->shader.uses_tex_buffers || rctx->gs_shader->current->shader.has_txq_cube_array_z_comp;
1978
if (need_buf_const) {
1979
if (rctx->b.chip_class < EVERGREEN)
1980
r600_setup_buffer_constants(rctx, PIPE_SHADER_GEOMETRY);
1981
else
1982
eg_setup_buffer_constants(rctx, PIPE_SHADER_GEOMETRY);
1983
}
1984
}
1985
1986
if (rctx->tes_shader) {
1987
assert(rctx->b.chip_class >= EVERGREEN);
1988
need_buf_const = rctx->tes_shader->current->shader.uses_tex_buffers ||
1989
rctx->tes_shader->current->shader.has_txq_cube_array_z_comp;
1990
if (need_buf_const) {
1991
eg_setup_buffer_constants(rctx, PIPE_SHADER_TESS_EVAL);
1992
}
1993
if (rctx->tcs_shader) {
1994
need_buf_const = rctx->tcs_shader->current->shader.uses_tex_buffers ||
1995
rctx->tcs_shader->current->shader.has_txq_cube_array_z_comp;
1996
if (need_buf_const) {
1997
eg_setup_buffer_constants(rctx, PIPE_SHADER_TESS_CTRL);
1998
}
1999
}
2000
}
2001
2002
r600_update_driver_const_buffers(rctx, false);
2003
2004
if (rctx->b.chip_class < EVERGREEN && rctx->ps_shader && rctx->vs_shader) {
2005
if (!r600_adjust_gprs(rctx)) {
2006
/* discard rendering */
2007
return false;
2008
}
2009
}
2010
2011
if (rctx->b.chip_class == EVERGREEN) {
2012
if (!evergreen_adjust_gprs(rctx)) {
2013
/* discard rendering */
2014
return false;
2015
}
2016
}
2017
2018
blend_disable = (rctx->dual_src_blend &&
2019
rctx->ps_shader->current->nr_ps_color_outputs < 2);
2020
2021
if (blend_disable != rctx->force_blend_disable) {
2022
rctx->force_blend_disable = blend_disable;
2023
r600_bind_blend_state_internal(rctx,
2024
rctx->blend_state.cso,
2025
blend_disable);
2026
}
2027
2028
return true;
2029
}
2030
2031
void r600_emit_clip_misc_state(struct r600_context *rctx, struct r600_atom *atom)
2032
{
2033
struct radeon_cmdbuf *cs = &rctx->b.gfx.cs;
2034
struct r600_clip_misc_state *state = &rctx->clip_misc_state;
2035
2036
radeon_set_context_reg(cs, R_028810_PA_CL_CLIP_CNTL,
2037
state->pa_cl_clip_cntl |
2038
(state->clip_dist_write ? 0 : state->clip_plane_enable & 0x3F) |
2039
S_028810_CLIP_DISABLE(state->clip_disable));
2040
radeon_set_context_reg(cs, R_02881C_PA_CL_VS_OUT_CNTL,
2041
state->pa_cl_vs_out_cntl |
2042
(state->clip_plane_enable & state->clip_dist_write) |
2043
(state->cull_dist_write << 8));
2044
/* reuse needs to be set off if we write oViewport */
2045
if (rctx->b.chip_class >= EVERGREEN)
2046
radeon_set_context_reg(cs, R_028AB4_VGT_REUSE_OFF,
2047
S_028AB4_REUSE_OFF(state->vs_out_viewport));
2048
}
2049
2050
/* rast_prim is the primitive type after GS. */
2051
static inline void r600_emit_rasterizer_prim_state(struct r600_context *rctx)
2052
{
2053
struct radeon_cmdbuf *cs = &rctx->b.gfx.cs;
2054
enum pipe_prim_type rast_prim = rctx->current_rast_prim;
2055
2056
/* Skip this if not rendering lines. */
2057
if (rast_prim != PIPE_PRIM_LINES &&
2058
rast_prim != PIPE_PRIM_LINE_LOOP &&
2059
rast_prim != PIPE_PRIM_LINE_STRIP &&
2060
rast_prim != PIPE_PRIM_LINES_ADJACENCY &&
2061
rast_prim != PIPE_PRIM_LINE_STRIP_ADJACENCY)
2062
return;
2063
2064
if (rast_prim == rctx->last_rast_prim)
2065
return;
2066
2067
/* For lines, reset the stipple pattern at each primitive. Otherwise,
2068
* reset the stipple pattern at each packet (line strips, line loops).
2069
*/
2070
radeon_set_context_reg(cs, R_028A0C_PA_SC_LINE_STIPPLE,
2071
S_028A0C_AUTO_RESET_CNTL(rast_prim == PIPE_PRIM_LINES ? 1 : 2) |
2072
(rctx->rasterizer ? rctx->rasterizer->pa_sc_line_stipple : 0));
2073
rctx->last_rast_prim = rast_prim;
2074
}
2075
2076
static void r600_draw_vbo(struct pipe_context *ctx, const struct pipe_draw_info *info,
2077
unsigned drawid_offset,
2078
const struct pipe_draw_indirect_info *indirect,
2079
const struct pipe_draw_start_count_bias *draws,
2080
unsigned num_draws)
2081
{
2082
if (num_draws > 1) {
2083
util_draw_multi(ctx, info, drawid_offset, indirect, draws, num_draws);
2084
return;
2085
}
2086
2087
struct r600_context *rctx = (struct r600_context *)ctx;
2088
struct pipe_resource *indexbuf = !info->index_size || info->has_user_indices ? NULL : info->index.resource;
2089
struct radeon_cmdbuf *cs = &rctx->b.gfx.cs;
2090
bool render_cond_bit = rctx->b.render_cond && !rctx->b.render_cond_force_off;
2091
bool has_user_indices = info->index_size && info->has_user_indices;
2092
uint64_t mask;
2093
unsigned num_patches, dirty_tex_counter, index_offset = 0;
2094
unsigned index_size = info->index_size;
2095
int index_bias;
2096
struct r600_shader_atomic combined_atomics[8];
2097
uint8_t atomic_used_mask = 0;
2098
struct pipe_stream_output_target *count_from_so = NULL;
2099
2100
if (indirect && indirect->count_from_stream_output) {
2101
count_from_so = indirect->count_from_stream_output;
2102
indirect = NULL;
2103
}
2104
2105
if (!indirect && !draws[0].count && (index_size || !count_from_so)) {
2106
return;
2107
}
2108
2109
if (unlikely(!rctx->vs_shader)) {
2110
assert(0);
2111
return;
2112
}
2113
if (unlikely(!rctx->ps_shader &&
2114
(!rctx->rasterizer || !rctx->rasterizer->rasterizer_discard))) {
2115
assert(0);
2116
return;
2117
}
2118
2119
/* make sure that the gfx ring is only one active */
2120
if (radeon_emitted(&rctx->b.dma.cs, 0)) {
2121
rctx->b.dma.flush(rctx, PIPE_FLUSH_ASYNC, NULL);
2122
}
2123
2124
if (rctx->cmd_buf_is_compute) {
2125
rctx->b.gfx.flush(rctx, PIPE_FLUSH_ASYNC, NULL);
2126
rctx->cmd_buf_is_compute = false;
2127
}
2128
2129
/* Re-emit the framebuffer state if needed. */
2130
dirty_tex_counter = p_atomic_read(&rctx->b.screen->dirty_tex_counter);
2131
if (unlikely(dirty_tex_counter != rctx->b.last_dirty_tex_counter)) {
2132
rctx->b.last_dirty_tex_counter = dirty_tex_counter;
2133
r600_mark_atom_dirty(rctx, &rctx->framebuffer.atom);
2134
rctx->framebuffer.do_update_surf_dirtiness = true;
2135
}
2136
2137
if (rctx->gs_shader) {
2138
/* Determine whether the GS triangle strip adjacency fix should
2139
* be applied. Rotate every other triangle if
2140
* - triangle strips with adjacency are fed to the GS and
2141
* - primitive restart is disabled (the rotation doesn't help
2142
* when the restart occurs after an odd number of triangles).
2143
*/
2144
bool gs_tri_strip_adj_fix =
2145
!rctx->tes_shader &&
2146
info->mode == PIPE_PRIM_TRIANGLE_STRIP_ADJACENCY &&
2147
!info->primitive_restart;
2148
if (gs_tri_strip_adj_fix != rctx->gs_tri_strip_adj_fix)
2149
rctx->gs_tri_strip_adj_fix = gs_tri_strip_adj_fix;
2150
}
2151
if (!r600_update_derived_state(rctx)) {
2152
/* useless to render because current rendering command
2153
* can't be achieved
2154
*/
2155
return;
2156
}
2157
2158
rctx->current_rast_prim = (rctx->gs_shader)? rctx->gs_shader->gs_output_prim
2159
: (rctx->tes_shader)? rctx->tes_shader->info.properties[TGSI_PROPERTY_TES_PRIM_MODE]
2160
: info->mode;
2161
2162
if (rctx->b.chip_class >= EVERGREEN) {
2163
evergreen_emit_atomic_buffer_setup_count(rctx, NULL, combined_atomics, &atomic_used_mask);
2164
}
2165
2166
if (index_size) {
2167
index_offset += draws[0].start * index_size;
2168
2169
/* Translate 8-bit indices to 16-bit. */
2170
if (unlikely(index_size == 1)) {
2171
struct pipe_resource *out_buffer = NULL;
2172
unsigned out_offset;
2173
void *ptr;
2174
unsigned start, count;
2175
2176
if (likely(!indirect)) {
2177
start = 0;
2178
count = draws[0].count;
2179
}
2180
else {
2181
/* Have to get start/count from indirect buffer, slow path ahead... */
2182
struct r600_resource *indirect_resource = (struct r600_resource *)indirect->buffer;
2183
unsigned *data = r600_buffer_map_sync_with_rings(&rctx->b, indirect_resource,
2184
PIPE_MAP_READ);
2185
if (data) {
2186
data += indirect->offset / sizeof(unsigned);
2187
start = data[2] * index_size;
2188
count = data[0];
2189
}
2190
else {
2191
start = 0;
2192
count = 0;
2193
}
2194
}
2195
2196
u_upload_alloc(ctx->stream_uploader, start, count * 2,
2197
256, &out_offset, &out_buffer, &ptr);
2198
if (unlikely(!ptr))
2199
return;
2200
2201
util_shorten_ubyte_elts_to_userptr(
2202
&rctx->b.b, info, 0, 0, index_offset, count, ptr);
2203
2204
indexbuf = out_buffer;
2205
index_offset = out_offset;
2206
index_size = 2;
2207
has_user_indices = false;
2208
}
2209
2210
/* Upload the index buffer.
2211
* The upload is skipped for small index counts on little-endian machines
2212
* and the indices are emitted via PKT3_DRAW_INDEX_IMMD.
2213
* Indirect draws never use immediate indices.
2214
* Note: Instanced rendering in combination with immediate indices hangs. */
2215
if (has_user_indices && (R600_BIG_ENDIAN || indirect ||
2216
info->instance_count > 1 ||
2217
draws[0].count*index_size > 20)) {
2218
unsigned start_offset = draws[0].start * index_size;
2219
indexbuf = NULL;
2220
u_upload_data(ctx->stream_uploader, start_offset,
2221
draws[0].count * index_size, 256,
2222
(char*)info->index.user + start_offset,
2223
&index_offset, &indexbuf);
2224
index_offset -= start_offset;
2225
has_user_indices = false;
2226
}
2227
index_bias = draws->index_bias;
2228
} else {
2229
index_bias = indirect ? 0 : draws[0].start;
2230
}
2231
2232
/* Set the index offset and primitive restart. */
2233
bool restart_index_changed = info->primitive_restart &&
2234
rctx->vgt_state.vgt_multi_prim_ib_reset_indx != info->restart_index;
2235
2236
if (rctx->vgt_state.vgt_multi_prim_ib_reset_en != info->primitive_restart ||
2237
restart_index_changed ||
2238
rctx->vgt_state.vgt_indx_offset != index_bias ||
2239
(rctx->vgt_state.last_draw_was_indirect && !indirect)) {
2240
rctx->vgt_state.vgt_multi_prim_ib_reset_en = info->primitive_restart;
2241
rctx->vgt_state.vgt_multi_prim_ib_reset_indx = info->restart_index;
2242
rctx->vgt_state.vgt_indx_offset = index_bias;
2243
r600_mark_atom_dirty(rctx, &rctx->vgt_state.atom);
2244
}
2245
2246
/* Workaround for hardware deadlock on certain R600 ASICs: write into a CB register. */
2247
if (rctx->b.chip_class == R600) {
2248
rctx->b.flags |= R600_CONTEXT_PS_PARTIAL_FLUSH;
2249
r600_mark_atom_dirty(rctx, &rctx->cb_misc_state.atom);
2250
}
2251
2252
if (rctx->b.chip_class >= EVERGREEN)
2253
evergreen_setup_tess_constants(rctx, info, &num_patches);
2254
2255
/* Emit states. */
2256
r600_need_cs_space(rctx, has_user_indices ? 5 : 0, TRUE, util_bitcount(atomic_used_mask));
2257
r600_flush_emit(rctx);
2258
2259
mask = rctx->dirty_atoms;
2260
while (mask != 0) {
2261
r600_emit_atom(rctx, rctx->atoms[u_bit_scan64(&mask)]);
2262
}
2263
2264
if (rctx->b.chip_class >= EVERGREEN) {
2265
evergreen_emit_atomic_buffer_setup(rctx, false, combined_atomics, atomic_used_mask);
2266
}
2267
2268
if (rctx->b.chip_class == CAYMAN) {
2269
/* Copied from radeonsi. */
2270
unsigned primgroup_size = 128; /* recommended without a GS */
2271
bool ia_switch_on_eop = false;
2272
bool partial_vs_wave = false;
2273
2274
if (rctx->gs_shader)
2275
primgroup_size = 64; /* recommended with a GS */
2276
2277
if ((rctx->rasterizer && rctx->rasterizer->pa_sc_line_stipple) ||
2278
(rctx->b.screen->debug_flags & DBG_SWITCH_ON_EOP)) {
2279
ia_switch_on_eop = true;
2280
}
2281
2282
if (r600_get_strmout_en(&rctx->b))
2283
partial_vs_wave = true;
2284
2285
radeon_set_context_reg(cs, CM_R_028AA8_IA_MULTI_VGT_PARAM,
2286
S_028AA8_SWITCH_ON_EOP(ia_switch_on_eop) |
2287
S_028AA8_PARTIAL_VS_WAVE_ON(partial_vs_wave) |
2288
S_028AA8_PRIMGROUP_SIZE(primgroup_size - 1));
2289
}
2290
2291
if (rctx->b.chip_class >= EVERGREEN) {
2292
uint32_t ls_hs_config = evergreen_get_ls_hs_config(rctx, info,
2293
num_patches);
2294
2295
evergreen_set_ls_hs_config(rctx, cs, ls_hs_config);
2296
evergreen_set_lds_alloc(rctx, cs, rctx->lds_alloc);
2297
}
2298
2299
/* On R6xx, CULL_FRONT=1 culls all points, lines, and rectangles,
2300
* even though it should have no effect on those. */
2301
if (rctx->b.chip_class == R600 && rctx->rasterizer) {
2302
unsigned su_sc_mode_cntl = rctx->rasterizer->pa_su_sc_mode_cntl;
2303
unsigned prim = info->mode;
2304
2305
if (rctx->gs_shader) {
2306
prim = rctx->gs_shader->gs_output_prim;
2307
}
2308
prim = r600_conv_prim_to_gs_out(prim); /* decrease the number of types to 3 */
2309
2310
if (prim == V_028A6C_OUTPRIM_TYPE_POINTLIST ||
2311
prim == V_028A6C_OUTPRIM_TYPE_LINESTRIP ||
2312
info->mode == R600_PRIM_RECTANGLE_LIST) {
2313
su_sc_mode_cntl &= C_028814_CULL_FRONT;
2314
}
2315
radeon_set_context_reg(cs, R_028814_PA_SU_SC_MODE_CNTL, su_sc_mode_cntl);
2316
}
2317
2318
/* Update start instance. */
2319
if (!indirect && rctx->last_start_instance != info->start_instance) {
2320
radeon_set_ctl_const(cs, R_03CFF4_SQ_VTX_START_INST_LOC, info->start_instance);
2321
rctx->last_start_instance = info->start_instance;
2322
}
2323
2324
/* Update the primitive type. */
2325
if (rctx->last_primitive_type != info->mode) {
2326
r600_emit_rasterizer_prim_state(rctx);
2327
radeon_set_config_reg(cs, R_008958_VGT_PRIMITIVE_TYPE,
2328
r600_conv_pipe_prim(info->mode));
2329
2330
rctx->last_primitive_type = info->mode;
2331
}
2332
2333
/* Draw packets. */
2334
if (likely(!indirect)) {
2335
radeon_emit(cs, PKT3(PKT3_NUM_INSTANCES, 0, 0));
2336
radeon_emit(cs, info->instance_count);
2337
} else {
2338
uint64_t va = r600_resource(indirect->buffer)->gpu_address;
2339
assert(rctx->b.chip_class >= EVERGREEN);
2340
2341
// Invalidate so non-indirect draw calls reset this state
2342
rctx->vgt_state.last_draw_was_indirect = true;
2343
rctx->last_start_instance = -1;
2344
2345
radeon_emit(cs, PKT3(EG_PKT3_SET_BASE, 2, 0));
2346
radeon_emit(cs, EG_DRAW_INDEX_INDIRECT_PATCH_TABLE_BASE);
2347
radeon_emit(cs, va);
2348
radeon_emit(cs, (va >> 32UL) & 0xFF);
2349
2350
radeon_emit(cs, PKT3(PKT3_NOP, 0, 0));
2351
radeon_emit(cs, radeon_add_to_buffer_list(&rctx->b, &rctx->b.gfx,
2352
(struct r600_resource*)indirect->buffer,
2353
RADEON_USAGE_READ,
2354
RADEON_PRIO_DRAW_INDIRECT));
2355
}
2356
2357
if (index_size) {
2358
radeon_emit(cs, PKT3(PKT3_INDEX_TYPE, 0, 0));
2359
radeon_emit(cs, index_size == 4 ?
2360
(VGT_INDEX_32 | (R600_BIG_ENDIAN ? VGT_DMA_SWAP_32_BIT : 0)) :
2361
(VGT_INDEX_16 | (R600_BIG_ENDIAN ? VGT_DMA_SWAP_16_BIT : 0)));
2362
2363
if (has_user_indices) {
2364
unsigned size_bytes = draws[0].count*index_size;
2365
unsigned size_dw = align(size_bytes, 4) / 4;
2366
radeon_emit(cs, PKT3(PKT3_DRAW_INDEX_IMMD, 1 + size_dw, render_cond_bit));
2367
radeon_emit(cs, draws[0].count);
2368
radeon_emit(cs, V_0287F0_DI_SRC_SEL_IMMEDIATE);
2369
radeon_emit_array(cs, info->index.user + draws[0].start * index_size, size_dw);
2370
} else {
2371
uint64_t va = r600_resource(indexbuf)->gpu_address + index_offset;
2372
2373
if (likely(!indirect)) {
2374
radeon_emit(cs, PKT3(PKT3_DRAW_INDEX, 3, render_cond_bit));
2375
radeon_emit(cs, va);
2376
radeon_emit(cs, (va >> 32UL) & 0xFF);
2377
radeon_emit(cs, draws[0].count);
2378
radeon_emit(cs, V_0287F0_DI_SRC_SEL_DMA);
2379
radeon_emit(cs, PKT3(PKT3_NOP, 0, 0));
2380
radeon_emit(cs, radeon_add_to_buffer_list(&rctx->b, &rctx->b.gfx,
2381
(struct r600_resource*)indexbuf,
2382
RADEON_USAGE_READ,
2383
RADEON_PRIO_INDEX_BUFFER));
2384
}
2385
else {
2386
uint32_t max_size = (indexbuf->width0 - index_offset) / index_size;
2387
2388
radeon_emit(cs, PKT3(EG_PKT3_INDEX_BASE, 1, 0));
2389
radeon_emit(cs, va);
2390
radeon_emit(cs, (va >> 32UL) & 0xFF);
2391
2392
radeon_emit(cs, PKT3(PKT3_NOP, 0, 0));
2393
radeon_emit(cs, radeon_add_to_buffer_list(&rctx->b, &rctx->b.gfx,
2394
(struct r600_resource*)indexbuf,
2395
RADEON_USAGE_READ,
2396
RADEON_PRIO_INDEX_BUFFER));
2397
2398
radeon_emit(cs, PKT3(EG_PKT3_INDEX_BUFFER_SIZE, 0, 0));
2399
radeon_emit(cs, max_size);
2400
2401
radeon_emit(cs, PKT3(EG_PKT3_DRAW_INDEX_INDIRECT, 1, render_cond_bit));
2402
radeon_emit(cs, indirect->offset);
2403
radeon_emit(cs, V_0287F0_DI_SRC_SEL_DMA);
2404
}
2405
}
2406
} else {
2407
if (unlikely(count_from_so)) {
2408
struct r600_so_target *t = (struct r600_so_target*)count_from_so;
2409
uint64_t va = t->buf_filled_size->gpu_address + t->buf_filled_size_offset;
2410
2411
radeon_set_context_reg(cs, R_028B30_VGT_STRMOUT_DRAW_OPAQUE_VERTEX_STRIDE, t->stride_in_dw);
2412
2413
radeon_emit(cs, PKT3(PKT3_COPY_DW, 4, 0));
2414
radeon_emit(cs, COPY_DW_SRC_IS_MEM | COPY_DW_DST_IS_REG);
2415
radeon_emit(cs, va & 0xFFFFFFFFUL); /* src address lo */
2416
radeon_emit(cs, (va >> 32UL) & 0xFFUL); /* src address hi */
2417
radeon_emit(cs, R_028B2C_VGT_STRMOUT_DRAW_OPAQUE_BUFFER_FILLED_SIZE >> 2); /* dst register */
2418
radeon_emit(cs, 0); /* unused */
2419
2420
radeon_emit(cs, PKT3(PKT3_NOP, 0, 0));
2421
radeon_emit(cs, radeon_add_to_buffer_list(&rctx->b, &rctx->b.gfx,
2422
t->buf_filled_size, RADEON_USAGE_READ,
2423
RADEON_PRIO_SO_FILLED_SIZE));
2424
}
2425
2426
if (likely(!indirect)) {
2427
radeon_emit(cs, PKT3(PKT3_DRAW_INDEX_AUTO, 1, render_cond_bit));
2428
radeon_emit(cs, draws[0].count);
2429
}
2430
else {
2431
radeon_emit(cs, PKT3(EG_PKT3_DRAW_INDIRECT, 1, render_cond_bit));
2432
radeon_emit(cs, indirect->offset);
2433
}
2434
radeon_emit(cs, V_0287F0_DI_SRC_SEL_AUTO_INDEX |
2435
(count_from_so ? S_0287F0_USE_OPAQUE(1) : 0));
2436
}
2437
2438
/* SMX returns CONTEXT_DONE too early workaround */
2439
if (rctx->b.family == CHIP_R600 ||
2440
rctx->b.family == CHIP_RV610 ||
2441
rctx->b.family == CHIP_RV630 ||
2442
rctx->b.family == CHIP_RV635) {
2443
/* if we have gs shader or streamout
2444
we need to do a wait idle after every draw */
2445
if (rctx->gs_shader || r600_get_strmout_en(&rctx->b)) {
2446
radeon_set_config_reg(cs, R_008040_WAIT_UNTIL, S_008040_WAIT_3D_IDLE(1));
2447
}
2448
}
2449
2450
/* ES ring rolling over at EOP - workaround */
2451
if (rctx->b.chip_class == R600) {
2452
radeon_emit(cs, PKT3(PKT3_EVENT_WRITE, 0, 0));
2453
radeon_emit(cs, EVENT_TYPE(EVENT_TYPE_SQ_NON_EVENT));
2454
}
2455
2456
2457
if (rctx->b.chip_class >= EVERGREEN)
2458
evergreen_emit_atomic_buffer_save(rctx, false, combined_atomics, &atomic_used_mask);
2459
2460
if (rctx->trace_buf)
2461
eg_trace_emit(rctx);
2462
2463
if (rctx->framebuffer.do_update_surf_dirtiness) {
2464
/* Set the depth buffer as dirty. */
2465
if (rctx->framebuffer.state.zsbuf) {
2466
struct pipe_surface *surf = rctx->framebuffer.state.zsbuf;
2467
struct r600_texture *rtex = (struct r600_texture *)surf->texture;
2468
2469
rtex->dirty_level_mask |= 1 << surf->u.tex.level;
2470
2471
if (rtex->surface.has_stencil)
2472
rtex->stencil_dirty_level_mask |= 1 << surf->u.tex.level;
2473
}
2474
if (rctx->framebuffer.compressed_cb_mask) {
2475
struct pipe_surface *surf;
2476
struct r600_texture *rtex;
2477
unsigned mask = rctx->framebuffer.compressed_cb_mask;
2478
2479
do {
2480
unsigned i = u_bit_scan(&mask);
2481
surf = rctx->framebuffer.state.cbufs[i];
2482
rtex = (struct r600_texture*)surf->texture;
2483
2484
rtex->dirty_level_mask |= 1 << surf->u.tex.level;
2485
2486
} while (mask);
2487
}
2488
rctx->framebuffer.do_update_surf_dirtiness = false;
2489
}
2490
2491
if (index_size && indexbuf != info->index.resource)
2492
pipe_resource_reference(&indexbuf, NULL);
2493
rctx->b.num_draw_calls++;
2494
}
2495
2496
uint32_t r600_translate_stencil_op(int s_op)
2497
{
2498
switch (s_op) {
2499
case PIPE_STENCIL_OP_KEEP:
2500
return V_028800_STENCIL_KEEP;
2501
case PIPE_STENCIL_OP_ZERO:
2502
return V_028800_STENCIL_ZERO;
2503
case PIPE_STENCIL_OP_REPLACE:
2504
return V_028800_STENCIL_REPLACE;
2505
case PIPE_STENCIL_OP_INCR:
2506
return V_028800_STENCIL_INCR;
2507
case PIPE_STENCIL_OP_DECR:
2508
return V_028800_STENCIL_DECR;
2509
case PIPE_STENCIL_OP_INCR_WRAP:
2510
return V_028800_STENCIL_INCR_WRAP;
2511
case PIPE_STENCIL_OP_DECR_WRAP:
2512
return V_028800_STENCIL_DECR_WRAP;
2513
case PIPE_STENCIL_OP_INVERT:
2514
return V_028800_STENCIL_INVERT;
2515
default:
2516
R600_ERR("Unknown stencil op %d", s_op);
2517
assert(0);
2518
break;
2519
}
2520
return 0;
2521
}
2522
2523
uint32_t r600_translate_fill(uint32_t func)
2524
{
2525
switch(func) {
2526
case PIPE_POLYGON_MODE_FILL:
2527
return 2;
2528
case PIPE_POLYGON_MODE_LINE:
2529
return 1;
2530
case PIPE_POLYGON_MODE_POINT:
2531
return 0;
2532
default:
2533
assert(0);
2534
return 0;
2535
}
2536
}
2537
2538
unsigned r600_tex_wrap(unsigned wrap)
2539
{
2540
switch (wrap) {
2541
default:
2542
case PIPE_TEX_WRAP_REPEAT:
2543
return V_03C000_SQ_TEX_WRAP;
2544
case PIPE_TEX_WRAP_CLAMP:
2545
return V_03C000_SQ_TEX_CLAMP_HALF_BORDER;
2546
case PIPE_TEX_WRAP_CLAMP_TO_EDGE:
2547
return V_03C000_SQ_TEX_CLAMP_LAST_TEXEL;
2548
case PIPE_TEX_WRAP_CLAMP_TO_BORDER:
2549
return V_03C000_SQ_TEX_CLAMP_BORDER;
2550
case PIPE_TEX_WRAP_MIRROR_REPEAT:
2551
return V_03C000_SQ_TEX_MIRROR;
2552
case PIPE_TEX_WRAP_MIRROR_CLAMP:
2553
return V_03C000_SQ_TEX_MIRROR_ONCE_HALF_BORDER;
2554
case PIPE_TEX_WRAP_MIRROR_CLAMP_TO_EDGE:
2555
return V_03C000_SQ_TEX_MIRROR_ONCE_LAST_TEXEL;
2556
case PIPE_TEX_WRAP_MIRROR_CLAMP_TO_BORDER:
2557
return V_03C000_SQ_TEX_MIRROR_ONCE_BORDER;
2558
}
2559
}
2560
2561
unsigned r600_tex_mipfilter(unsigned filter)
2562
{
2563
switch (filter) {
2564
case PIPE_TEX_MIPFILTER_NEAREST:
2565
return V_03C000_SQ_TEX_Z_FILTER_POINT;
2566
case PIPE_TEX_MIPFILTER_LINEAR:
2567
return V_03C000_SQ_TEX_Z_FILTER_LINEAR;
2568
default:
2569
case PIPE_TEX_MIPFILTER_NONE:
2570
return V_03C000_SQ_TEX_Z_FILTER_NONE;
2571
}
2572
}
2573
2574
unsigned r600_tex_compare(unsigned compare)
2575
{
2576
switch (compare) {
2577
default:
2578
case PIPE_FUNC_NEVER:
2579
return V_03C000_SQ_TEX_DEPTH_COMPARE_NEVER;
2580
case PIPE_FUNC_LESS:
2581
return V_03C000_SQ_TEX_DEPTH_COMPARE_LESS;
2582
case PIPE_FUNC_EQUAL:
2583
return V_03C000_SQ_TEX_DEPTH_COMPARE_EQUAL;
2584
case PIPE_FUNC_LEQUAL:
2585
return V_03C000_SQ_TEX_DEPTH_COMPARE_LESSEQUAL;
2586
case PIPE_FUNC_GREATER:
2587
return V_03C000_SQ_TEX_DEPTH_COMPARE_GREATER;
2588
case PIPE_FUNC_NOTEQUAL:
2589
return V_03C000_SQ_TEX_DEPTH_COMPARE_NOTEQUAL;
2590
case PIPE_FUNC_GEQUAL:
2591
return V_03C000_SQ_TEX_DEPTH_COMPARE_GREATEREQUAL;
2592
case PIPE_FUNC_ALWAYS:
2593
return V_03C000_SQ_TEX_DEPTH_COMPARE_ALWAYS;
2594
}
2595
}
2596
2597
static bool wrap_mode_uses_border_color(unsigned wrap, bool linear_filter)
2598
{
2599
return wrap == PIPE_TEX_WRAP_CLAMP_TO_BORDER ||
2600
wrap == PIPE_TEX_WRAP_MIRROR_CLAMP_TO_BORDER ||
2601
(linear_filter &&
2602
(wrap == PIPE_TEX_WRAP_CLAMP ||
2603
wrap == PIPE_TEX_WRAP_MIRROR_CLAMP));
2604
}
2605
2606
bool sampler_state_needs_border_color(const struct pipe_sampler_state *state)
2607
{
2608
bool linear_filter = state->min_img_filter != PIPE_TEX_FILTER_NEAREST ||
2609
state->mag_img_filter != PIPE_TEX_FILTER_NEAREST;
2610
2611
return (state->border_color.ui[0] || state->border_color.ui[1] ||
2612
state->border_color.ui[2] || state->border_color.ui[3]) &&
2613
(wrap_mode_uses_border_color(state->wrap_s, linear_filter) ||
2614
wrap_mode_uses_border_color(state->wrap_t, linear_filter) ||
2615
wrap_mode_uses_border_color(state->wrap_r, linear_filter));
2616
}
2617
2618
void r600_emit_shader(struct r600_context *rctx, struct r600_atom *a)
2619
{
2620
2621
struct radeon_cmdbuf *cs = &rctx->b.gfx.cs;
2622
struct r600_pipe_shader *shader = ((struct r600_shader_state*)a)->shader;
2623
2624
if (!shader)
2625
return;
2626
2627
r600_emit_command_buffer(cs, &shader->command_buffer);
2628
radeon_emit(cs, PKT3(PKT3_NOP, 0, 0));
2629
radeon_emit(cs, radeon_add_to_buffer_list(&rctx->b, &rctx->b.gfx, shader->bo,
2630
RADEON_USAGE_READ, RADEON_PRIO_SHADER_BINARY));
2631
}
2632
2633
unsigned r600_get_swizzle_combined(const unsigned char *swizzle_format,
2634
const unsigned char *swizzle_view,
2635
boolean vtx)
2636
{
2637
unsigned i;
2638
unsigned char swizzle[4];
2639
unsigned result = 0;
2640
const uint32_t tex_swizzle_shift[4] = {
2641
16, 19, 22, 25,
2642
};
2643
const uint32_t vtx_swizzle_shift[4] = {
2644
3, 6, 9, 12,
2645
};
2646
const uint32_t swizzle_bit[4] = {
2647
0, 1, 2, 3,
2648
};
2649
const uint32_t *swizzle_shift = tex_swizzle_shift;
2650
2651
if (vtx)
2652
swizzle_shift = vtx_swizzle_shift;
2653
2654
if (swizzle_view) {
2655
util_format_compose_swizzles(swizzle_format, swizzle_view, swizzle);
2656
} else {
2657
memcpy(swizzle, swizzle_format, 4);
2658
}
2659
2660
/* Get swizzle. */
2661
for (i = 0; i < 4; i++) {
2662
switch (swizzle[i]) {
2663
case PIPE_SWIZZLE_Y:
2664
result |= swizzle_bit[1] << swizzle_shift[i];
2665
break;
2666
case PIPE_SWIZZLE_Z:
2667
result |= swizzle_bit[2] << swizzle_shift[i];
2668
break;
2669
case PIPE_SWIZZLE_W:
2670
result |= swizzle_bit[3] << swizzle_shift[i];
2671
break;
2672
case PIPE_SWIZZLE_0:
2673
result |= V_038010_SQ_SEL_0 << swizzle_shift[i];
2674
break;
2675
case PIPE_SWIZZLE_1:
2676
result |= V_038010_SQ_SEL_1 << swizzle_shift[i];
2677
break;
2678
default: /* PIPE_SWIZZLE_X */
2679
result |= swizzle_bit[0] << swizzle_shift[i];
2680
}
2681
}
2682
return result;
2683
}
2684
2685
/* texture format translate */
2686
uint32_t r600_translate_texformat(struct pipe_screen *screen,
2687
enum pipe_format format,
2688
const unsigned char *swizzle_view,
2689
uint32_t *word4_p, uint32_t *yuv_format_p,
2690
bool do_endian_swap)
2691
{
2692
struct r600_screen *rscreen = (struct r600_screen *)screen;
2693
uint32_t result = 0, word4 = 0, yuv_format = 0;
2694
const struct util_format_description *desc;
2695
boolean uniform = TRUE;
2696
bool is_srgb_valid = FALSE;
2697
const unsigned char swizzle_xxxx[4] = {0, 0, 0, 0};
2698
const unsigned char swizzle_yyyy[4] = {1, 1, 1, 1};
2699
const unsigned char swizzle_xxxy[4] = {0, 0, 0, 1};
2700
const unsigned char swizzle_zyx1[4] = {2, 1, 0, 5};
2701
const unsigned char swizzle_zyxw[4] = {2, 1, 0, 3};
2702
2703
int i;
2704
const uint32_t sign_bit[4] = {
2705
S_038010_FORMAT_COMP_X(V_038010_SQ_FORMAT_COMP_SIGNED),
2706
S_038010_FORMAT_COMP_Y(V_038010_SQ_FORMAT_COMP_SIGNED),
2707
S_038010_FORMAT_COMP_Z(V_038010_SQ_FORMAT_COMP_SIGNED),
2708
S_038010_FORMAT_COMP_W(V_038010_SQ_FORMAT_COMP_SIGNED)
2709
};
2710
2711
/* Need to replace the specified texture formats in case of big-endian.
2712
* These formats are formats that have channels with number of bits
2713
* not divisible by 8.
2714
* Mesa conversion functions don't swap bits for those formats, and because
2715
* we transmit this over a serial bus to the GPU (PCIe), the
2716
* bit-endianess is important!!!
2717
* In case we have an "opposite" format, just use that for the swizzling
2718
* information. If we don't have such an "opposite" format, we need
2719
* to use a fixed swizzle info instead (see below)
2720
*/
2721
if (format == PIPE_FORMAT_R4A4_UNORM && do_endian_swap)
2722
format = PIPE_FORMAT_A4R4_UNORM;
2723
2724
desc = util_format_description(format);
2725
if (!desc)
2726
goto out_unknown;
2727
2728
/* Depth and stencil swizzling is handled separately. */
2729
if (desc->colorspace != UTIL_FORMAT_COLORSPACE_ZS) {
2730
/* Need to check for specific texture formats that don't have
2731
* an "opposite" format we can use. For those formats, we directly
2732
* specify the swizzling, which is the LE swizzling as defined in
2733
* u_format.csv
2734
*/
2735
if (do_endian_swap) {
2736
if (format == PIPE_FORMAT_L4A4_UNORM)
2737
word4 |= r600_get_swizzle_combined(swizzle_xxxy, swizzle_view, FALSE);
2738
else if (format == PIPE_FORMAT_B4G4R4A4_UNORM)
2739
word4 |= r600_get_swizzle_combined(swizzle_zyxw, swizzle_view, FALSE);
2740
else if (format == PIPE_FORMAT_B4G4R4X4_UNORM || format == PIPE_FORMAT_B5G6R5_UNORM)
2741
word4 |= r600_get_swizzle_combined(swizzle_zyx1, swizzle_view, FALSE);
2742
else
2743
word4 |= r600_get_swizzle_combined(desc->swizzle, swizzle_view, FALSE);
2744
} else {
2745
word4 |= r600_get_swizzle_combined(desc->swizzle, swizzle_view, FALSE);
2746
}
2747
}
2748
2749
/* Colorspace (return non-RGB formats directly). */
2750
switch (desc->colorspace) {
2751
/* Depth stencil formats */
2752
case UTIL_FORMAT_COLORSPACE_ZS:
2753
switch (format) {
2754
/* Depth sampler formats. */
2755
case PIPE_FORMAT_Z16_UNORM:
2756
word4 |= r600_get_swizzle_combined(swizzle_xxxx, swizzle_view, FALSE);
2757
result = FMT_16;
2758
goto out_word4;
2759
case PIPE_FORMAT_Z24X8_UNORM:
2760
case PIPE_FORMAT_Z24_UNORM_S8_UINT:
2761
word4 |= r600_get_swizzle_combined(swizzle_xxxx, swizzle_view, FALSE);
2762
result = FMT_8_24;
2763
goto out_word4;
2764
case PIPE_FORMAT_X8Z24_UNORM:
2765
case PIPE_FORMAT_S8_UINT_Z24_UNORM:
2766
if (rscreen->b.chip_class < EVERGREEN)
2767
goto out_unknown;
2768
word4 |= r600_get_swizzle_combined(swizzle_yyyy, swizzle_view, FALSE);
2769
result = FMT_24_8;
2770
goto out_word4;
2771
case PIPE_FORMAT_Z32_FLOAT:
2772
word4 |= r600_get_swizzle_combined(swizzle_xxxx, swizzle_view, FALSE);
2773
result = FMT_32_FLOAT;
2774
goto out_word4;
2775
case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT:
2776
word4 |= r600_get_swizzle_combined(swizzle_xxxx, swizzle_view, FALSE);
2777
result = FMT_X24_8_32_FLOAT;
2778
goto out_word4;
2779
/* Stencil sampler formats. */
2780
case PIPE_FORMAT_S8_UINT:
2781
word4 |= S_038010_NUM_FORMAT_ALL(V_038010_SQ_NUM_FORMAT_INT);
2782
word4 |= r600_get_swizzle_combined(swizzle_xxxx, swizzle_view, FALSE);
2783
result = FMT_8;
2784
goto out_word4;
2785
case PIPE_FORMAT_X24S8_UINT:
2786
word4 |= S_038010_NUM_FORMAT_ALL(V_038010_SQ_NUM_FORMAT_INT);
2787
word4 |= r600_get_swizzle_combined(swizzle_yyyy, swizzle_view, FALSE);
2788
result = FMT_8_24;
2789
goto out_word4;
2790
case PIPE_FORMAT_S8X24_UINT:
2791
if (rscreen->b.chip_class < EVERGREEN)
2792
goto out_unknown;
2793
word4 |= S_038010_NUM_FORMAT_ALL(V_038010_SQ_NUM_FORMAT_INT);
2794
word4 |= r600_get_swizzle_combined(swizzle_xxxx, swizzle_view, FALSE);
2795
result = FMT_24_8;
2796
goto out_word4;
2797
case PIPE_FORMAT_X32_S8X24_UINT:
2798
word4 |= S_038010_NUM_FORMAT_ALL(V_038010_SQ_NUM_FORMAT_INT);
2799
word4 |= r600_get_swizzle_combined(swizzle_yyyy, swizzle_view, FALSE);
2800
result = FMT_X24_8_32_FLOAT;
2801
goto out_word4;
2802
default:
2803
goto out_unknown;
2804
}
2805
2806
case UTIL_FORMAT_COLORSPACE_YUV:
2807
yuv_format |= (1 << 30);
2808
switch (format) {
2809
case PIPE_FORMAT_UYVY:
2810
case PIPE_FORMAT_YUYV:
2811
default:
2812
break;
2813
}
2814
goto out_unknown; /* XXX */
2815
2816
case UTIL_FORMAT_COLORSPACE_SRGB:
2817
word4 |= S_038010_FORCE_DEGAMMA(1);
2818
break;
2819
2820
default:
2821
break;
2822
}
2823
2824
if (desc->layout == UTIL_FORMAT_LAYOUT_RGTC) {
2825
switch (format) {
2826
case PIPE_FORMAT_RGTC1_SNORM:
2827
case PIPE_FORMAT_LATC1_SNORM:
2828
word4 |= sign_bit[0];
2829
FALLTHROUGH;
2830
case PIPE_FORMAT_RGTC1_UNORM:
2831
case PIPE_FORMAT_LATC1_UNORM:
2832
result = FMT_BC4;
2833
goto out_word4;
2834
case PIPE_FORMAT_RGTC2_SNORM:
2835
case PIPE_FORMAT_LATC2_SNORM:
2836
word4 |= sign_bit[0] | sign_bit[1];
2837
FALLTHROUGH;
2838
case PIPE_FORMAT_RGTC2_UNORM:
2839
case PIPE_FORMAT_LATC2_UNORM:
2840
result = FMT_BC5;
2841
goto out_word4;
2842
default:
2843
goto out_unknown;
2844
}
2845
}
2846
2847
if (desc->layout == UTIL_FORMAT_LAYOUT_S3TC) {
2848
switch (format) {
2849
case PIPE_FORMAT_DXT1_RGB:
2850
case PIPE_FORMAT_DXT1_RGBA:
2851
case PIPE_FORMAT_DXT1_SRGB:
2852
case PIPE_FORMAT_DXT1_SRGBA:
2853
result = FMT_BC1;
2854
is_srgb_valid = TRUE;
2855
goto out_word4;
2856
case PIPE_FORMAT_DXT3_RGBA:
2857
case PIPE_FORMAT_DXT3_SRGBA:
2858
result = FMT_BC2;
2859
is_srgb_valid = TRUE;
2860
goto out_word4;
2861
case PIPE_FORMAT_DXT5_RGBA:
2862
case PIPE_FORMAT_DXT5_SRGBA:
2863
result = FMT_BC3;
2864
is_srgb_valid = TRUE;
2865
goto out_word4;
2866
default:
2867
goto out_unknown;
2868
}
2869
}
2870
2871
if (desc->layout == UTIL_FORMAT_LAYOUT_BPTC) {
2872
if (rscreen->b.chip_class < EVERGREEN)
2873
goto out_unknown;
2874
2875
switch (format) {
2876
case PIPE_FORMAT_BPTC_RGBA_UNORM:
2877
case PIPE_FORMAT_BPTC_SRGBA:
2878
result = FMT_BC7;
2879
is_srgb_valid = TRUE;
2880
goto out_word4;
2881
case PIPE_FORMAT_BPTC_RGB_FLOAT:
2882
word4 |= sign_bit[0] | sign_bit[1] | sign_bit[2];
2883
FALLTHROUGH;
2884
case PIPE_FORMAT_BPTC_RGB_UFLOAT:
2885
result = FMT_BC6;
2886
goto out_word4;
2887
default:
2888
goto out_unknown;
2889
}
2890
}
2891
2892
if (desc->layout == UTIL_FORMAT_LAYOUT_SUBSAMPLED) {
2893
switch (format) {
2894
case PIPE_FORMAT_R8G8_B8G8_UNORM:
2895
case PIPE_FORMAT_G8R8_B8R8_UNORM:
2896
result = FMT_GB_GR;
2897
goto out_word4;
2898
case PIPE_FORMAT_G8R8_G8B8_UNORM:
2899
case PIPE_FORMAT_R8G8_R8B8_UNORM:
2900
result = FMT_BG_RG;
2901
goto out_word4;
2902
default:
2903
goto out_unknown;
2904
}
2905
}
2906
2907
if (format == PIPE_FORMAT_R9G9B9E5_FLOAT) {
2908
result = FMT_5_9_9_9_SHAREDEXP;
2909
goto out_word4;
2910
} else if (format == PIPE_FORMAT_R11G11B10_FLOAT) {
2911
result = FMT_10_11_11_FLOAT;
2912
goto out_word4;
2913
}
2914
2915
2916
for (i = 0; i < desc->nr_channels; i++) {
2917
if (desc->channel[i].type == UTIL_FORMAT_TYPE_SIGNED) {
2918
word4 |= sign_bit[i];
2919
}
2920
}
2921
2922
/* R8G8Bx_SNORM - XXX CxV8U8 */
2923
2924
/* See whether the components are of the same size. */
2925
for (i = 1; i < desc->nr_channels; i++) {
2926
uniform = uniform && desc->channel[0].size == desc->channel[i].size;
2927
}
2928
2929
/* Non-uniform formats. */
2930
if (!uniform) {
2931
if (desc->colorspace != UTIL_FORMAT_COLORSPACE_SRGB &&
2932
desc->channel[0].pure_integer)
2933
word4 |= S_038010_NUM_FORMAT_ALL(V_038010_SQ_NUM_FORMAT_INT);
2934
switch(desc->nr_channels) {
2935
case 3:
2936
if (desc->channel[0].size == 5 &&
2937
desc->channel[1].size == 6 &&
2938
desc->channel[2].size == 5) {
2939
result = FMT_5_6_5;
2940
goto out_word4;
2941
}
2942
goto out_unknown;
2943
case 4:
2944
if (desc->channel[0].size == 5 &&
2945
desc->channel[1].size == 5 &&
2946
desc->channel[2].size == 5 &&
2947
desc->channel[3].size == 1) {
2948
result = FMT_1_5_5_5;
2949
goto out_word4;
2950
}
2951
if (desc->channel[0].size == 10 &&
2952
desc->channel[1].size == 10 &&
2953
desc->channel[2].size == 10 &&
2954
desc->channel[3].size == 2) {
2955
result = FMT_2_10_10_10;
2956
goto out_word4;
2957
}
2958
goto out_unknown;
2959
}
2960
goto out_unknown;
2961
}
2962
2963
/* Find the first non-VOID channel. */
2964
for (i = 0; i < 4; i++) {
2965
if (desc->channel[i].type != UTIL_FORMAT_TYPE_VOID) {
2966
break;
2967
}
2968
}
2969
2970
if (i == 4)
2971
goto out_unknown;
2972
2973
/* uniform formats */
2974
switch (desc->channel[i].type) {
2975
case UTIL_FORMAT_TYPE_UNSIGNED:
2976
case UTIL_FORMAT_TYPE_SIGNED:
2977
#if 0
2978
if (!desc->channel[i].normalized &&
2979
desc->colorspace != UTIL_FORMAT_COLORSPACE_SRGB) {
2980
goto out_unknown;
2981
}
2982
#endif
2983
if (desc->colorspace != UTIL_FORMAT_COLORSPACE_SRGB &&
2984
desc->channel[i].pure_integer)
2985
word4 |= S_038010_NUM_FORMAT_ALL(V_038010_SQ_NUM_FORMAT_INT);
2986
2987
switch (desc->channel[i].size) {
2988
case 4:
2989
switch (desc->nr_channels) {
2990
case 2:
2991
result = FMT_4_4;
2992
goto out_word4;
2993
case 4:
2994
result = FMT_4_4_4_4;
2995
goto out_word4;
2996
}
2997
goto out_unknown;
2998
case 8:
2999
switch (desc->nr_channels) {
3000
case 1:
3001
result = FMT_8;
3002
is_srgb_valid = TRUE;
3003
goto out_word4;
3004
case 2:
3005
result = FMT_8_8;
3006
goto out_word4;
3007
case 4:
3008
result = FMT_8_8_8_8;
3009
is_srgb_valid = TRUE;
3010
goto out_word4;
3011
}
3012
goto out_unknown;
3013
case 16:
3014
switch (desc->nr_channels) {
3015
case 1:
3016
result = FMT_16;
3017
goto out_word4;
3018
case 2:
3019
result = FMT_16_16;
3020
goto out_word4;
3021
case 4:
3022
result = FMT_16_16_16_16;
3023
goto out_word4;
3024
}
3025
goto out_unknown;
3026
case 32:
3027
switch (desc->nr_channels) {
3028
case 1:
3029
result = FMT_32;
3030
goto out_word4;
3031
case 2:
3032
result = FMT_32_32;
3033
goto out_word4;
3034
case 4:
3035
result = FMT_32_32_32_32;
3036
goto out_word4;
3037
}
3038
}
3039
goto out_unknown;
3040
3041
case UTIL_FORMAT_TYPE_FLOAT:
3042
switch (desc->channel[i].size) {
3043
case 16:
3044
switch (desc->nr_channels) {
3045
case 1:
3046
result = FMT_16_FLOAT;
3047
goto out_word4;
3048
case 2:
3049
result = FMT_16_16_FLOAT;
3050
goto out_word4;
3051
case 4:
3052
result = FMT_16_16_16_16_FLOAT;
3053
goto out_word4;
3054
}
3055
goto out_unknown;
3056
case 32:
3057
switch (desc->nr_channels) {
3058
case 1:
3059
result = FMT_32_FLOAT;
3060
goto out_word4;
3061
case 2:
3062
result = FMT_32_32_FLOAT;
3063
goto out_word4;
3064
case 4:
3065
result = FMT_32_32_32_32_FLOAT;
3066
goto out_word4;
3067
}
3068
}
3069
goto out_unknown;
3070
}
3071
3072
out_word4:
3073
3074
if (desc->colorspace == UTIL_FORMAT_COLORSPACE_SRGB && !is_srgb_valid)
3075
return ~0;
3076
if (word4_p)
3077
*word4_p = word4;
3078
if (yuv_format_p)
3079
*yuv_format_p = yuv_format;
3080
return result;
3081
out_unknown:
3082
/* R600_ERR("Unable to handle texformat %d %s\n", format, util_format_name(format)); */
3083
return ~0;
3084
}
3085
3086
uint32_t r600_translate_colorformat(enum chip_class chip, enum pipe_format format,
3087
bool do_endian_swap)
3088
{
3089
const struct util_format_description *desc = util_format_description(format);
3090
int channel = util_format_get_first_non_void_channel(format);
3091
bool is_float;
3092
if (!desc)
3093
return ~0U;
3094
3095
#define HAS_SIZE(x,y,z,w) \
3096
(desc->channel[0].size == (x) && desc->channel[1].size == (y) && \
3097
desc->channel[2].size == (z) && desc->channel[3].size == (w))
3098
3099
if (format == PIPE_FORMAT_R11G11B10_FLOAT) /* isn't plain */
3100
return V_0280A0_COLOR_10_11_11_FLOAT;
3101
3102
if (desc->layout != UTIL_FORMAT_LAYOUT_PLAIN ||
3103
channel == -1)
3104
return ~0U;
3105
3106
is_float = desc->channel[channel].type == UTIL_FORMAT_TYPE_FLOAT;
3107
3108
switch (desc->nr_channels) {
3109
case 1:
3110
switch (desc->channel[0].size) {
3111
case 8:
3112
return V_0280A0_COLOR_8;
3113
case 16:
3114
if (is_float)
3115
return V_0280A0_COLOR_16_FLOAT;
3116
else
3117
return V_0280A0_COLOR_16;
3118
case 32:
3119
if (is_float)
3120
return V_0280A0_COLOR_32_FLOAT;
3121
else
3122
return V_0280A0_COLOR_32;
3123
}
3124
break;
3125
case 2:
3126
if (desc->channel[0].size == desc->channel[1].size) {
3127
switch (desc->channel[0].size) {
3128
case 4:
3129
if (chip <= R700)
3130
return V_0280A0_COLOR_4_4;
3131
else
3132
return ~0U; /* removed on Evergreen */
3133
case 8:
3134
return V_0280A0_COLOR_8_8;
3135
case 16:
3136
if (is_float)
3137
return V_0280A0_COLOR_16_16_FLOAT;
3138
else
3139
return V_0280A0_COLOR_16_16;
3140
case 32:
3141
if (is_float)
3142
return V_0280A0_COLOR_32_32_FLOAT;
3143
else
3144
return V_0280A0_COLOR_32_32;
3145
}
3146
} else if (HAS_SIZE(8,24,0,0)) {
3147
return (do_endian_swap ? V_0280A0_COLOR_8_24 : V_0280A0_COLOR_24_8);
3148
} else if (HAS_SIZE(24,8,0,0)) {
3149
return V_0280A0_COLOR_8_24;
3150
}
3151
break;
3152
case 3:
3153
if (HAS_SIZE(5,6,5,0)) {
3154
return V_0280A0_COLOR_5_6_5;
3155
} else if (HAS_SIZE(32,8,24,0)) {
3156
return V_0280A0_COLOR_X24_8_32_FLOAT;
3157
}
3158
break;
3159
case 4:
3160
if (desc->channel[0].size == desc->channel[1].size &&
3161
desc->channel[0].size == desc->channel[2].size &&
3162
desc->channel[0].size == desc->channel[3].size) {
3163
switch (desc->channel[0].size) {
3164
case 4:
3165
return V_0280A0_COLOR_4_4_4_4;
3166
case 8:
3167
return V_0280A0_COLOR_8_8_8_8;
3168
case 16:
3169
if (is_float)
3170
return V_0280A0_COLOR_16_16_16_16_FLOAT;
3171
else
3172
return V_0280A0_COLOR_16_16_16_16;
3173
case 32:
3174
if (is_float)
3175
return V_0280A0_COLOR_32_32_32_32_FLOAT;
3176
else
3177
return V_0280A0_COLOR_32_32_32_32;
3178
}
3179
} else if (HAS_SIZE(5,5,5,1)) {
3180
return V_0280A0_COLOR_1_5_5_5;
3181
} else if (HAS_SIZE(10,10,10,2)) {
3182
return V_0280A0_COLOR_2_10_10_10;
3183
}
3184
break;
3185
}
3186
return ~0U;
3187
}
3188
3189
uint32_t r600_colorformat_endian_swap(uint32_t colorformat, bool do_endian_swap)
3190
{
3191
if (R600_BIG_ENDIAN) {
3192
switch(colorformat) {
3193
/* 8-bit buffers. */
3194
case V_0280A0_COLOR_4_4:
3195
case V_0280A0_COLOR_8:
3196
return ENDIAN_NONE;
3197
3198
/* 16-bit buffers. */
3199
case V_0280A0_COLOR_8_8:
3200
/*
3201
* No need to do endian swaps on array formats,
3202
* as mesa<-->pipe formats conversion take into account
3203
* the endianess
3204
*/
3205
return ENDIAN_NONE;
3206
3207
case V_0280A0_COLOR_5_6_5:
3208
case V_0280A0_COLOR_1_5_5_5:
3209
case V_0280A0_COLOR_4_4_4_4:
3210
case V_0280A0_COLOR_16:
3211
return (do_endian_swap ? ENDIAN_8IN16 : ENDIAN_NONE);
3212
3213
/* 32-bit buffers. */
3214
case V_0280A0_COLOR_8_8_8_8:
3215
/*
3216
* No need to do endian swaps on array formats,
3217
* as mesa<-->pipe formats conversion take into account
3218
* the endianess
3219
*/
3220
return ENDIAN_NONE;
3221
3222
case V_0280A0_COLOR_2_10_10_10:
3223
case V_0280A0_COLOR_8_24:
3224
case V_0280A0_COLOR_24_8:
3225
case V_0280A0_COLOR_32_FLOAT:
3226
return (do_endian_swap ? ENDIAN_8IN32 : ENDIAN_NONE);
3227
3228
case V_0280A0_COLOR_16_16_FLOAT:
3229
case V_0280A0_COLOR_16_16:
3230
return ENDIAN_8IN16;
3231
3232
/* 64-bit buffers. */
3233
case V_0280A0_COLOR_16_16_16_16:
3234
case V_0280A0_COLOR_16_16_16_16_FLOAT:
3235
return ENDIAN_8IN16;
3236
3237
case V_0280A0_COLOR_32_32_FLOAT:
3238
case V_0280A0_COLOR_32_32:
3239
case V_0280A0_COLOR_X24_8_32_FLOAT:
3240
return ENDIAN_8IN32;
3241
3242
/* 128-bit buffers. */
3243
case V_0280A0_COLOR_32_32_32_32_FLOAT:
3244
case V_0280A0_COLOR_32_32_32_32:
3245
return ENDIAN_8IN32;
3246
default:
3247
return ENDIAN_NONE; /* Unsupported. */
3248
}
3249
} else {
3250
return ENDIAN_NONE;
3251
}
3252
}
3253
3254
static void r600_invalidate_buffer(struct pipe_context *ctx, struct pipe_resource *buf)
3255
{
3256
struct r600_context *rctx = (struct r600_context*)ctx;
3257
struct r600_resource *rbuffer = r600_resource(buf);
3258
unsigned i, shader, mask;
3259
struct r600_pipe_sampler_view *view;
3260
3261
/* Reallocate the buffer in the same pipe_resource. */
3262
r600_alloc_resource(&rctx->screen->b, rbuffer);
3263
3264
/* We changed the buffer, now we need to bind it where the old one was bound. */
3265
/* Vertex buffers. */
3266
mask = rctx->vertex_buffer_state.enabled_mask;
3267
while (mask) {
3268
i = u_bit_scan(&mask);
3269
if (rctx->vertex_buffer_state.vb[i].buffer.resource == &rbuffer->b.b) {
3270
rctx->vertex_buffer_state.dirty_mask |= 1 << i;
3271
r600_vertex_buffers_dirty(rctx);
3272
}
3273
}
3274
/* Streamout buffers. */
3275
for (i = 0; i < rctx->b.streamout.num_targets; i++) {
3276
if (rctx->b.streamout.targets[i] &&
3277
rctx->b.streamout.targets[i]->b.buffer == &rbuffer->b.b) {
3278
if (rctx->b.streamout.begin_emitted) {
3279
r600_emit_streamout_end(&rctx->b);
3280
}
3281
rctx->b.streamout.append_bitmask = rctx->b.streamout.enabled_mask;
3282
r600_streamout_buffers_dirty(&rctx->b);
3283
}
3284
}
3285
3286
/* Constant buffers. */
3287
for (shader = 0; shader < PIPE_SHADER_TYPES; shader++) {
3288
struct r600_constbuf_state *state = &rctx->constbuf_state[shader];
3289
bool found = false;
3290
uint32_t mask = state->enabled_mask;
3291
3292
while (mask) {
3293
unsigned i = u_bit_scan(&mask);
3294
if (state->cb[i].buffer == &rbuffer->b.b) {
3295
found = true;
3296
state->dirty_mask |= 1 << i;
3297
}
3298
}
3299
if (found) {
3300
r600_constant_buffers_dirty(rctx, state);
3301
}
3302
}
3303
3304
/* Texture buffer objects - update the virtual addresses in descriptors. */
3305
LIST_FOR_EACH_ENTRY(view, &rctx->texture_buffers, list) {
3306
if (view->base.texture == &rbuffer->b.b) {
3307
uint64_t offset = view->base.u.buf.offset;
3308
uint64_t va = rbuffer->gpu_address + offset;
3309
3310
view->tex_resource_words[0] = va;
3311
view->tex_resource_words[2] &= C_038008_BASE_ADDRESS_HI;
3312
view->tex_resource_words[2] |= S_038008_BASE_ADDRESS_HI(va >> 32);
3313
}
3314
}
3315
/* Texture buffer objects - make bindings dirty if needed. */
3316
for (shader = 0; shader < PIPE_SHADER_TYPES; shader++) {
3317
struct r600_samplerview_state *state = &rctx->samplers[shader].views;
3318
bool found = false;
3319
uint32_t mask = state->enabled_mask;
3320
3321
while (mask) {
3322
unsigned i = u_bit_scan(&mask);
3323
if (state->views[i]->base.texture == &rbuffer->b.b) {
3324
found = true;
3325
state->dirty_mask |= 1 << i;
3326
}
3327
}
3328
if (found) {
3329
r600_sampler_views_dirty(rctx, state);
3330
}
3331
}
3332
3333
/* SSBOs */
3334
struct r600_image_state *istate = &rctx->fragment_buffers;
3335
{
3336
uint32_t mask = istate->enabled_mask;
3337
bool found = false;
3338
while (mask) {
3339
unsigned i = u_bit_scan(&mask);
3340
if (istate->views[i].base.resource == &rbuffer->b.b) {
3341
found = true;
3342
istate->dirty_mask |= 1 << i;
3343
}
3344
}
3345
if (found) {
3346
r600_mark_atom_dirty(rctx, &istate->atom);
3347
}
3348
}
3349
3350
}
3351
3352
static void r600_set_active_query_state(struct pipe_context *ctx, bool enable)
3353
{
3354
struct r600_context *rctx = (struct r600_context*)ctx;
3355
3356
/* Pipeline stat & streamout queries. */
3357
if (enable) {
3358
rctx->b.flags &= ~R600_CONTEXT_STOP_PIPELINE_STATS;
3359
rctx->b.flags |= R600_CONTEXT_START_PIPELINE_STATS;
3360
} else {
3361
rctx->b.flags &= ~R600_CONTEXT_START_PIPELINE_STATS;
3362
rctx->b.flags |= R600_CONTEXT_STOP_PIPELINE_STATS;
3363
}
3364
3365
/* Occlusion queries. */
3366
if (rctx->db_misc_state.occlusion_queries_disabled != !enable) {
3367
rctx->db_misc_state.occlusion_queries_disabled = !enable;
3368
r600_mark_atom_dirty(rctx, &rctx->db_misc_state.atom);
3369
}
3370
}
3371
3372
static void r600_need_gfx_cs_space(struct pipe_context *ctx, unsigned num_dw,
3373
bool include_draw_vbo)
3374
{
3375
r600_need_cs_space((struct r600_context*)ctx, num_dw, include_draw_vbo, 0);
3376
}
3377
3378
/* keep this at the end of this file, please */
3379
void r600_init_common_state_functions(struct r600_context *rctx)
3380
{
3381
rctx->b.b.create_fs_state = r600_create_ps_state;
3382
rctx->b.b.create_vs_state = r600_create_vs_state;
3383
rctx->b.b.create_gs_state = r600_create_gs_state;
3384
rctx->b.b.create_tcs_state = r600_create_tcs_state;
3385
rctx->b.b.create_tes_state = r600_create_tes_state;
3386
rctx->b.b.create_vertex_elements_state = r600_create_vertex_fetch_shader;
3387
rctx->b.b.bind_blend_state = r600_bind_blend_state;
3388
rctx->b.b.bind_depth_stencil_alpha_state = r600_bind_dsa_state;
3389
rctx->b.b.bind_sampler_states = r600_bind_sampler_states;
3390
rctx->b.b.bind_fs_state = r600_bind_ps_state;
3391
rctx->b.b.bind_rasterizer_state = r600_bind_rs_state;
3392
rctx->b.b.bind_vertex_elements_state = r600_bind_vertex_elements;
3393
rctx->b.b.bind_vs_state = r600_bind_vs_state;
3394
rctx->b.b.bind_gs_state = r600_bind_gs_state;
3395
rctx->b.b.bind_tcs_state = r600_bind_tcs_state;
3396
rctx->b.b.bind_tes_state = r600_bind_tes_state;
3397
rctx->b.b.delete_blend_state = r600_delete_blend_state;
3398
rctx->b.b.delete_depth_stencil_alpha_state = r600_delete_dsa_state;
3399
rctx->b.b.delete_fs_state = r600_delete_ps_state;
3400
rctx->b.b.delete_rasterizer_state = r600_delete_rs_state;
3401
rctx->b.b.delete_sampler_state = r600_delete_sampler_state;
3402
rctx->b.b.delete_vertex_elements_state = r600_delete_vertex_elements;
3403
rctx->b.b.delete_vs_state = r600_delete_vs_state;
3404
rctx->b.b.delete_gs_state = r600_delete_gs_state;
3405
rctx->b.b.delete_tcs_state = r600_delete_tcs_state;
3406
rctx->b.b.delete_tes_state = r600_delete_tes_state;
3407
rctx->b.b.set_blend_color = r600_set_blend_color;
3408
rctx->b.b.set_clip_state = r600_set_clip_state;
3409
rctx->b.b.set_constant_buffer = r600_set_constant_buffer;
3410
rctx->b.b.set_sample_mask = r600_set_sample_mask;
3411
rctx->b.b.set_stencil_ref = r600_set_pipe_stencil_ref;
3412
rctx->b.b.set_vertex_buffers = r600_set_vertex_buffers;
3413
rctx->b.b.set_sampler_views = r600_set_sampler_views;
3414
rctx->b.b.sampler_view_destroy = r600_sampler_view_destroy;
3415
rctx->b.b.memory_barrier = r600_memory_barrier;
3416
rctx->b.b.texture_barrier = r600_texture_barrier;
3417
rctx->b.b.set_stream_output_targets = r600_set_streamout_targets;
3418
rctx->b.b.set_active_query_state = r600_set_active_query_state;
3419
3420
rctx->b.b.draw_vbo = r600_draw_vbo;
3421
rctx->b.invalidate_buffer = r600_invalidate_buffer;
3422
rctx->b.need_gfx_cs_space = r600_need_gfx_cs_space;
3423
}
3424
3425