static void r300_blitter_begin(struct r300_context* r300, enum r300_blitter_op op) { if ((op & R300_STOP_QUERY) && r300->query_current) { r300->blitter_saved_query = r300->query_current; r300_stop_query(r300); } /* Yeah we have to save all those states to ensure the blitter operation * is really transparent. The states will be restored by the blitter once * copying is done. */ util_blitter_save_blend(r300->blitter, r300->blend_state.state); util_blitter_save_depth_stencil_alpha(r300->blitter, r300->dsa_state.state); util_blitter_save_stencil_ref(r300->blitter, &(r300->stencil_ref)); util_blitter_save_rasterizer(r300->blitter, r300->rs_state.state); util_blitter_save_fragment_shader(r300->blitter, r300->fs.state); util_blitter_save_vertex_shader(r300->blitter, r300->vs_state.state); util_blitter_save_viewport(r300->blitter, &r300->viewport); util_blitter_save_clip(r300->blitter, (struct pipe_clip_state*)r300->clip_state.state); util_blitter_save_vertex_elements(r300->blitter, r300->velems); util_blitter_save_vertex_buffers(r300->blitter, r300->vbuf_mgr->nr_vertex_buffers, r300->vbuf_mgr->vertex_buffer); if (op & R300_SAVE_FRAMEBUFFER) { util_blitter_save_framebuffer(r300->blitter, r300->fb_state.state); } if (op & R300_SAVE_TEXTURES) { struct r300_textures_state* state = (struct r300_textures_state*)r300->textures_state.state; util_blitter_save_fragment_sampler_states( r300->blitter, state->sampler_state_count, (void**)state->sampler_states); util_blitter_save_fragment_sampler_views( r300->blitter, state->sampler_view_count, (struct pipe_sampler_view**)state->sampler_views); } if (op & R300_IGNORE_RENDER_COND) { /* Save the flag. */ r300->blitter_saved_skip_rendering = r300->skip_rendering+1; r300->skip_rendering = FALSE; } else { r300->blitter_saved_skip_rendering = 0; } }
static void r300_end_query(struct pipe_context* pipe, struct pipe_query* query) { struct r300_context* r300 = r300_context(pipe); struct r300_query *q = r300_query(query); if (q->type == PIPE_QUERY_GPU_FINISHED) { pb_reference(&q->buf, NULL); r300_flush(pipe, RADEON_FLUSH_ASYNC, (struct pipe_fence_handle**)&q->buf); return; } if (q != r300->query_current) { fprintf(stderr, "r300: end_query: Got invalid query.\n"); assert(0); return; } r300_stop_query(r300); }
static void r300_blitter_begin(struct r300_context* r300, enum r300_blitter_op op) { if (r300->query_current) { r300->blitter_saved_query = r300->query_current; r300_stop_query(r300); } /* Yeah we have to save all those states to ensure the blitter operation * is really transparent. The states will be restored by the blitter once * copying is done. */ util_blitter_save_blend(r300->blitter, r300->blend_state.state); util_blitter_save_depth_stencil_alpha(r300->blitter, r300->dsa_state.state); util_blitter_save_stencil_ref(r300->blitter, &(r300->stencil_ref)); util_blitter_save_rasterizer(r300->blitter, r300->rs_state.state); util_blitter_save_fragment_shader(r300->blitter, r300->fs.state); util_blitter_save_vertex_shader(r300->blitter, r300->vs_state.state); util_blitter_save_viewport(r300->blitter, &r300->viewport); util_blitter_save_clip(r300->blitter, (struct pipe_clip_state*)r300->clip_state.state); util_blitter_save_vertex_elements(r300->blitter, r300->velems); util_blitter_save_vertex_buffers(r300->blitter, r300->vertex_buffer_count, r300->vertex_buffer); if (op & (R300_CLEAR_SURFACE | R300_COPY)) util_blitter_save_framebuffer(r300->blitter, r300->fb_state.state); if (op & R300_COPY) { struct r300_textures_state* state = (struct r300_textures_state*)r300->textures_state.state; util_blitter_save_fragment_sampler_states( r300->blitter, state->sampler_state_count, (void**)state->sampler_states); util_blitter_save_fragment_sampler_views( r300->blitter, state->sampler_view_count, (struct pipe_sampler_view**)state->sampler_views); } }