static void r300_dummy_vertex_shader( struct r300_context* r300, struct r300_vertex_shader* shader) { struct ureg_program *ureg; struct ureg_dst dst; struct ureg_src imm; /* Make a simple vertex shader which outputs (0, 0, 0, 1), * effectively rendering nothing. */ ureg = ureg_create(TGSI_PROCESSOR_VERTEX); dst = ureg_DECL_output(ureg, TGSI_SEMANTIC_POSITION, 0); imm = ureg_imm4f(ureg, 0, 0, 0, 1); ureg_MOV(ureg, dst, imm); ureg_END(ureg); shader->state.tokens = tgsi_dup_tokens(ureg_finalize(ureg)); ureg_destroy(ureg); shader->dummy = TRUE; r300_init_vs_outputs(r300, shader); r300_translate_vertex_shader(r300, shader); }
static void r300_bind_vs_state(struct pipe_context* pipe, void* shader) { struct r300_context* r300 = r300_context(pipe); draw_flush(r300->draw); if (r300_screen(pipe->screen)->caps->has_tcl) { struct r300_vertex_shader* vs = (struct r300_vertex_shader*)shader; if (vs == NULL) { r300->vs = NULL; return; } else if (!vs->translated) { r300_translate_vertex_shader(r300, vs); } draw_bind_vertex_shader(r300->draw, vs->draw); r300->vs = vs; r300->dirty_state |= R300_NEW_VERTEX_SHADER | R300_NEW_VERTEX_SHADER_CONSTANTS; } else { draw_bind_vertex_shader(r300->draw, (struct draw_vertex_shader*)shader); } }