Lines Matching refs:sctx

33 static void emit_shader_query(struct si_context *sctx)
35 assert(!list_is_empty(&sctx->shader_query_buffers));
38 list_last_entry(&sctx->shader_query_buffers, struct gfx10_sh_query_buffer, list);
42 static void gfx10_release_query_buffers(struct si_context *sctx,
57 if (qbuf->list.next == &sctx->shader_query_buffers)
59 if (qbuf->list.prev == &sctx->shader_query_buffers)
68 static bool gfx10_alloc_query_buffer(struct si_context *sctx)
70 if (si_is_atom_dirty(sctx, &sctx->atoms.s.shader_query))
75 if (!list_is_empty(&sctx->shader_query_buffers)) {
76 qbuf = list_last_entry(&sctx->shader_query_buffers, struct gfx10_sh_query_buffer, list);
80 qbuf = list_first_entry(&sctx->shader_query_buffers, struct gfx10_sh_query_buffer, list);
82 !si_cs_is_buffer_referenced(sctx, qbuf->buf->buf, RADEON_USAGE_READWRITE) &&
83 sctx->ws->buffer_wait(sctx->ws, qbuf->buf->buf, 0, RADEON_USAGE_READWRITE)) {
96 struct si_screen *screen = sctx->screen;
111 uint64_t *results = sctx->ws->buffer_map(sctx->ws, qbuf->buf->buf, NULL,
122 list_addtail(&qbuf->list, &sctx->shader_query_buffers);
124 qbuf->refcount = sctx->num_active_shader_queries;
131 si_set_internal_shader_buffer(sctx, SI_GS_QUERY_BUF, &sbuf);
132 SET_FIELD(sctx->current_gs_state, GS_STATE_STREAMOUT_QUERY_ENABLED, 1);
134 si_mark_atom_dirty(sctx, &sctx->atoms.s.shader_query);
138 static void gfx10_sh_query_destroy(struct si_context *sctx, struct si_query *rquery)
141 gfx10_release_query_buffers(sctx, query->first, query->last);
145 static bool gfx10_sh_query_begin(struct si_context *sctx, struct si_query *rquery)
149 gfx10_release_query_buffers(sctx, query->first, query->last);
152 if (unlikely(!gfx10_alloc_query_buffer(sctx)))
155 query->first = list_last_entry(&sctx->shader_query_buffers, struct gfx10_sh_query_buffer, list);
158 sctx->num_active_shader_queries++;
164 static bool gfx10_sh_query_end(struct si_context *sctx, struct si_query *rquery)
171 query->last = list_last_entry(&sctx->shader_query_buffers, struct gfx10_sh_query_buffer, list);
179 si_cp_release_mem(sctx, &sctx->gfx_cs, V_028A90_BOTTOM_OF_PIPE_TS, 0, EOP_DST_SEL_MEM,
184 sctx->num_active_shader_queries--;
186 if (sctx->num_active_shader_queries <= 0 || !si_is_atom_dirty(sctx, &sctx->atoms.s.shader_query)) {
187 si_set_internal_shader_buffer(sctx, SI_GS_QUERY_BUF, NULL);
188 SET_FIELD(sctx->current_gs_state, GS_STATE_STREAMOUT_QUERY_ENABLED, 0);
193 si_set_atom_dirty(sctx, &sctx->atoms.s.shader_query, false);
233 static bool gfx10_sh_query_get_result(struct si_context *sctx, struct si_query *rquery, bool wait,
250 map = sctx->ws->buffer_map(sctx->ws, qbuf->buf->buf, NULL, usage);
252 map = si_buffer_map(sctx, qbuf->buf, usage);
278 static void gfx10_sh_query_get_result_resource(struct si_context *sctx, struct si_query *rquery,
289 if (!sctx->sh_query_result_shader) {
290 sctx->sh_query_result_shader = gfx10_create_sh_query_result_cs(sctx);
291 if (!sctx->sh_query_result_shader)
296 u_suballocator_alloc(&sctx->allocator_zeroed_memory, 16, 16, &tmp_buffer_offset, &tmp_buffer);
301 si_save_qbo_state(sctx, &saved_state);
390 sctx->b.set_constant_buffer(&sctx->b, PIPE_SHADER_COMPUTE, 0, false, &constant_buffer);
403 si_cp_wait_mem(sctx, &sctx->gfx_cs, va, 0x00000001, 0x00000001, 0);
408 si_launch_grid_internal_ssbos(sctx, &grid, sctx->sh_query_result_shader,
417 si_restore_qbo_state(sctx, &saved_state);
443 void gfx10_init_query(struct si_context *sctx)
445 list_inithead(&sctx->shader_query_buffers);
446 sctx->atoms.s.shader_query.emit = emit_shader_query;
449 void gfx10_destroy_query(struct si_context *sctx)
451 if (!sctx->shader_query_buffers.next)
454 while (!list_is_empty(&sctx->shader_query_buffers)) {
456 list_first_entry(&sctx->shader_query_buffers, struct gfx10_sh_query_buffer, list);