Lines Matching defs:r300
73 static uint32_t r300_provoking_vertex_fixes(struct r300_context *r300,
76 struct r300_rs_state* rs = (struct r300_rs_state*)r300->rs_state.state;
118 void r500_emit_index_bias(struct r300_context *r300, int index_bias)
120 CS_LOCALS(r300);
128 static void r300_emit_draw_init(struct r300_context *r300, unsigned mode,
131 CS_LOCALS(r300);
137 r300_provoking_vertex_fixes(r300, mode));
150 static void r300_split_index_bias(struct r300_context *r300, int index_bias,
153 struct pipe_vertex_buffer *vb, *vbufs = r300->vertex_buffer;
154 struct pipe_vertex_element *velem = r300->velems->velem;
163 for (i = 0; i < r300->velems->count; i++) {
190 * \param r300 The context.
195 static boolean r300_reserve_cs_dwords(struct r300_context *r300,
206 cs_dwords += r300_get_num_dirty_dwords(r300);
208 if (r300->screen->caps.is_r500)
217 cs_dwords += r300_get_num_cs_end_dwords(r300);
220 if (!r300->rws->cs_check_space(&r300->cs, cs_dwords)) {
221 r300_flush(&r300->context, PIPE_FLUSH_ASYNC, NULL);
230 * \param r300 The context.
238 static boolean r300_emit_states(struct r300_context *r300,
252 if (!r300_emit_buffer_validate(r300, validate_vbos,
254 fprintf(stderr, "r300: CS space validation failed. "
261 r300_emit_dirty_state(r300);
263 if (r300->screen->caps.is_r500) {
264 if (r300->screen->caps.has_tcl)
265 r500_emit_index_bias(r300, index_bias);
267 r500_emit_index_bias(r300, 0);
271 (r300->vertex_arrays_dirty ||
272 r300->vertex_arrays_indexed != indexed ||
273 r300->vertex_arrays_offset != buffer_offset ||
274 r300->vertex_arrays_instance_id != instance_id)) {
275 r300_emit_vertex_arrays(r300, buffer_offset, indexed, instance_id);
277 r300->vertex_arrays_dirty = FALSE;
278 r300->vertex_arrays_indexed = indexed;
279 r300->vertex_arrays_offset = buffer_offset;
280 r300->vertex_arrays_instance_id = instance_id;
284 r300_emit_vertex_arrays_swtcl(r300, indexed);
292 * \param r300 The context.
301 static boolean r300_prepare_for_rendering(struct r300_context *r300,
310 if (r300_reserve_cs_dwords(r300, flags, cs_dwords))
313 return r300_emit_states(r300, flags, index_buffer, buffer_offset,
317 static boolean immd_is_good_idea(struct r300_context *r300,
320 if (DBG_ON(r300, DBG_NO_IMMD)) {
324 if (count * r300->velems->vertex_size_dwords > IMMD_DWORDS) {
328 /* Buffers can only be used for read by r300 (except query buffers, but
337 static void r300_draw_arrays_immediate(struct r300_context *r300,
343 unsigned vertex_element_count = r300->velems->count;
347 unsigned vertex_size = r300->velems->vertex_size_dwords;
363 CS_LOCALS(r300);
365 if (!r300_prepare_for_rendering(r300, PREP_EMIT_STATES, NULL, dwords, 0, 0, -1))
370 velem = &r300->velems->velem[i];
371 size[i] = r300->velems->format_size[i] / 4;
373 vbuf = &r300->vertex_buffer[vbi];
378 map[vbi] = (uint32_t*)r300->rws->buffer_map(r300->rws,
380 &r300->cs, PIPE_MAP_READ | PIPE_MAP_UNSYNCHRONIZED);
386 r300_emit_draw_init(r300, info->mode, draw->count-1);
403 static void r300_emit_draw_arrays(struct r300_context *r300,
408 CS_LOCALS(r300);
411 fprintf(stderr, "r300: Got a huge number of vertices: %i, "
416 r300_emit_draw_init(r300, mode, count-1);
429 static void r300_emit_draw_elements(struct r300_context *r300,
440 CS_LOCALS(r300);
443 fprintf(stderr, "r300: Got a huge number of vertices: %i, "
448 DBG(r300, DBG_DRAW, "r300: Indexbuf of %u indices, max %u\n",
451 r300_emit_draw_init(r300, mode, max_index);
501 static void r300_draw_elements_immediate(struct r300_context *r300,
511 CS_LOCALS(r300);
514 if (!r300_prepare_for_rendering(r300,
519 r300_emit_draw_init(r300, info->mode, info->max_index);
532 if (draw->index_bias && !r300->screen->caps.is_r500) {
556 if (draw->index_bias && !r300->screen->caps.is_r500) {
576 if (draw->index_bias && !r300->screen->caps.is_r500) {
587 static void r300_draw_elements(struct r300_context *r300,
598 boolean alt_num_verts = r300->screen->caps.is_r500 &&
604 if (draw->index_bias && !r300->screen->caps.is_r500) {
605 r300_split_index_bias(r300, draw->index_bias, &buffer_offset,
609 r300_translate_index_buffer(r300, info, &indexBuffer,
615 uint16_t *ptr = r300->rws->buffer_map(r300->rws, r300_resource(orgIndexBuffer)->buf,
616 &r300->cs,
626 r300_upload_index_buffer(r300, &indexBuffer, indexSize, &start,
631 r300_upload_index_buffer(r300, &indexBuffer, indexSize,
637 if (!r300_prepare_for_rendering(r300,
644 r300_emit_draw_elements(r300, indexBuffer, indexSize,
655 r300_emit_draw_elements(r300, indexBuffer, indexSize,
664 if (!r300_prepare_for_rendering(r300,
679 static void r300_draw_arrays(struct r300_context *r300,
684 boolean alt_num_verts = r300->screen->caps.is_r500 &&
691 if (!r300_prepare_for_rendering(r300,
697 r300_emit_draw_arrays(r300, info->mode, count);
705 r300_emit_draw_arrays(r300, info->mode, short_count);
712 if (!r300_prepare_for_rendering(r300,
721 static void r300_draw_arrays_instanced(struct r300_context *r300,
728 r300_draw_arrays(r300, info, draw, i);
731 static void r300_draw_elements_instanced(struct r300_context *r300,
738 r300_draw_elements(r300, info, draw, i);
741 static unsigned r300_max_vertex_count(struct r300_context *r300)
743 unsigned i, nr = r300->velems->count;
744 struct pipe_vertex_element *velems = r300->velems->velem;
749 &r300->vertex_buffer[velems[i].vertex_buffer_index];
776 value = r300->velems->format_size[i];
802 struct r300_context* r300 = r300_context(pipe);
806 if (r300->skip_rendering ||
811 if (r300->sprite_coord_enable != 0)
812 if ((info.mode == PIPE_PRIM_POINTS) != r300->is_point) {
813 r300->is_point = !r300->is_point;
814 r300_mark_atom_dirty(r300, &r300->rs_block_state);
817 r300_update_derived_state(r300);
820 if (r300_vs(r300)->shader->dummy)
825 unsigned max_count = r300_max_vertex_count(r300);
828 fprintf(stderr, "r300: Skipping a draw command. There is a buffer "
842 r300_draw_elements_immediate(r300, &info, &draw);
844 r300_draw_elements(r300, &info, &draw, -1);
847 r300_draw_elements_instanced(r300, &info, &draw);
851 if (immd_is_good_idea(r300, draw.count)) {
852 r300_draw_arrays_immediate(r300, &info, &draw);
854 r300_draw_arrays(r300, &info, &draw, -1);
857 r300_draw_arrays_instanced(r300, &info, &draw);
880 struct r300_context* r300 = r300_context(pipe);
883 if (r300->skip_rendering) {
891 draw_set_indexes(r300->draw,
898 if (r300->sprite_coord_enable != 0)
899 if ((info->mode == PIPE_PRIM_POINTS) != r300->is_point) {
900 r300->is_point = !r300->is_point;
901 r300_mark_atom_dirty(r300, &r300->rs_block_state);
904 r300_update_derived_state(r300);
906 draw_vbo(r300->draw, info, drawid_offset, NULL, &draw, 1, 0);
907 draw_flush(r300->draw);
916 struct r300_context* r300;
938 struct r300_context* r300 = r300render->r300;
940 return &r300->vertex_info;
948 struct r300_context* r300 = r300render->r300;
949 struct radeon_winsys *rws = r300->rws;
952 DBG(r300, DBG_DRAW, "r300: render_allocate_vertices (size: %d)\n", size);
954 if (!r300->vbo || size + r300->draw_vbo_offset > r300->vbo->size) {
955 pb_reference(&r300->vbo, NULL);
956 r300->vbo = NULL;
959 r300->vbo = rws->buffer_create(rws,
964 if (!r300->vbo) {
967 r300->draw_vbo_offset = 0;
968 r300render->vbo_ptr = rws->buffer_map(rws, r300->vbo, &r300->cs,
979 struct r300_context* r300 = r300render->r300;
981 DBG(r300, DBG_DRAW, "r300: render_map_vertices\n");
984 return r300render->vbo_ptr + r300->draw_vbo_offset;
992 struct r300_context* r300 = r300render->r300;
994 DBG(r300, DBG_DRAW, "r300: render_unmap_vertices\n");
1003 struct r300_context* r300 = r300render->r300;
1005 DBG(r300, DBG_DRAW, "r300: render_release_vertices\n");
1007 r300->draw_vbo_offset += r300render->vbo_max_used;
1025 struct r300_context* r300 = r300render->r300;
1030 CS_LOCALS(r300);
1036 DBG(r300, DBG_DRAW, "r300: render_draw_arrays (count: %d)\n", count);
1038 if (!r300_prepare_for_rendering(r300,
1046 r300_provoking_vertex_fixes(r300, r300render->prim));
1059 struct r300_context* r300 = r300render->r300;
1060 unsigned max_index = (r300->vbo->size - r300->draw_vbo_offset) /
1061 (r300render->r300->vertex_info.size * 4) - 1;
1065 CS_LOCALS(r300);
1066 DBG(r300, DBG_DRAW, "r300: render_draw_elements (count: %d)\n", count);
1068 u_upload_data(r300->uploader, 0, count * 2, 4, indices,
1074 if (!r300_prepare_for_rendering(r300,
1084 r300_provoking_vertex_fixes(r300, r300render->prim));
1106 static struct vbuf_render* r300_render_create(struct r300_context* r300)
1110 r300render->r300 = r300;
1128 struct draw_stage* r300_draw_stage(struct r300_context* r300)
1133 render = r300_render_create(r300);
1139 stage = draw_vbuf_stage(r300->draw, render);
1146 draw_set_render(r300->draw, render);
1168 struct r300_context *r300 = r300_context(util_blitter_get_pipe(blitter));
1169 unsigned last_sprite_coord_enable = r300->sprite_coord_enable;
1170 unsigned last_is_point = r300->is_point;
1174 type == UTIL_BLITTER_ATTRIB_COLOR || !r300->draw ? 8 : 4;
1178 CS_LOCALS(r300);
1182 if ((!r300->screen->caps.has_tcl && type == UTIL_BLITTER_ATTRIB_NONE) ||
1191 if (r300->skip_rendering)
1194 r300->context.bind_vertex_elements_state(&r300->context, vertex_elements_cso);
1195 r300->context.bind_vs_state(&r300->context, get_vs(blitter));
1198 r300->sprite_coord_enable = 1;
1199 r300->is_point = true;
1202 r300_update_derived_state(r300);
1205 r300->viewport_state.dirty = FALSE;
1207 if (!r300_prepare_for_rendering(r300, PREP_EMIT_STATES, NULL, dwords, 0, 0, -1))
1210 DBG(r300, DBG_DRAW, "r300: draw_rectangle\n");
1254 r300_mark_atom_dirty(r300, &r300->rs_state);
1255 r300_mark_atom_dirty(r300, &r300->viewport_state);
1257 r300->sprite_coord_enable = last_sprite_coord_enable;
1258 r300->is_point = last_is_point;
1261 void r300_init_render_functions(struct r300_context *r300)
1264 if (r300->screen->caps.has_tcl) {
1265 r300->context.draw_vbo = r300_draw_vbo;
1267 r300->context.draw_vbo = r300_swtcl_draw_vbo;
1271 if (!r300->screen->caps.is_r500)
1272 r300_plug_in_stencil_ref_fallback(r300);