Lines Matching refs:mgr

128 u_vbuf_create_vertex_elements(struct u_vbuf *mgr, unsigned count,
130 static void u_vbuf_delete_vertex_elements(struct u_vbuf *mgr, void *cso);
179 struct u_vbuf *mgr = CALLOC_STRUCT(u_vbuf);
181 mgr->caps = *caps;
182 mgr->pipe = pipe;
183 mgr->cso_cache = cso_cache_create();
184 mgr->translate_cache = translate_cache_create();
185 memset(mgr->fallback_vbs, ~0, sizeof(mgr->fallback_vbs));
187 mgr->uploader = u_upload_create(pipe, 1024 * 1024, 4,
190 return mgr;
196 u_vbuf_set_vertex_elements_internal(struct u_vbuf *mgr, unsigned count,
199 struct pipe_context *pipe = mgr->pipe;
211 iter = cso_find_state_template(mgr->cso_cache, hash_key, CSO_VELEMENTS,
217 cso->data = u_vbuf_create_vertex_elements(mgr, count, states);
219 cso->context = (void*)mgr;
221 iter = cso_insert_state(mgr->cso_cache, hash_key, CSO_VELEMENTS, cso);
229 if (ve != mgr->ve)
234 void u_vbuf_set_vertex_elements(struct u_vbuf *mgr, unsigned count,
237 mgr->ve = u_vbuf_set_vertex_elements_internal(mgr, count, states);
240 void u_vbuf_destroy(struct u_vbuf *mgr)
244 mgr->pipe->set_vertex_buffers(mgr->pipe, 0, NULL);
246 for (i = 0; i < mgr->nr_vertex_buffers; i++) {
247 pipe_resource_reference(&mgr->vertex_buffer[i].buffer, NULL);
249 for (i = 0; i < mgr->nr_real_vertex_buffers; i++) {
250 pipe_resource_reference(&mgr->real_vertex_buffer[i].buffer, NULL);
253 translate_cache_destroy(mgr->translate_cache);
254 u_upload_destroy(mgr->uploader);
255 cso_cache_delete(mgr->cso_cache);
256 FREE(mgr);
260 u_vbuf_translate_buffers(struct u_vbuf *mgr, struct translate_key *key,
274 tr = translate_cache_find(mgr->translate_cache, key);
277 for (i = 0; i < mgr->nr_vertex_buffers; i++) {
279 struct pipe_vertex_buffer *vb = &mgr->vertex_buffer[i];
293 map = pipe_buffer_map_range(mgr->pipe, vb->buffer, offset, size,
308 struct pipe_index_buffer *ib = &mgr->index_buffer;
316 err = u_upload_alloc(mgr->uploader, 0,
326 map = pipe_buffer_map_range(mgr->pipe, ib->buffer, offset,
344 pipe_buffer_unmap(mgr->pipe, transfer);
348 err = u_upload_alloc(mgr->uploader,
362 for (i = 0; i < mgr->nr_vertex_buffers; i++) {
364 pipe_buffer_unmap(mgr->pipe, vb_transfer[i]);
369 mgr->real_vertex_buffer[out_vb].buffer_offset = out_offset;
370 mgr->real_vertex_buffer[out_vb].stride = key->output_stride;
374 &mgr->real_vertex_buffer[out_vb].buffer, NULL);
375 mgr->real_vertex_buffer[out_vb].buffer = out_buffer;
381 u_vbuf_translate_find_free_vb_slots(struct u_vbuf *mgr,
388 mgr->ve->incompatible_vb_mask_all | mgr->incompatible_vb_mask |
389 ~((1 << mgr->nr_vertex_buffers) - 1);
400 mgr->nr_real_vertex_buffers = mgr->nr_vertex_buffers;
406 if (index >= mgr->nr_real_vertex_buffers) {
407 mgr->nr_real_vertex_buffers = index + 1;
413 memcpy(mgr->fallback_vbs, fallback_vbs, sizeof(fallback_vbs));
418 u_vbuf_translate_begin(struct u_vbuf *mgr,
446 for (i = 0; i < mgr->ve->count; i++) {
447 unsigned vb_index = mgr->ve->ve[i].vertex_buffer_index;
449 if (!mgr->vertex_buffer[vb_index].stride) {
450 if (!(mgr->ve->incompatible_elem_mask & (1 << i)) &&
451 !(mgr->incompatible_vb_mask & (1 << vb_index))) {
455 } else if (mgr->ve->ve[i].instance_divisor) {
456 if (!(mgr->ve->incompatible_elem_mask & (1 << i)) &&
457 !(mgr->incompatible_vb_mask & (1 << vb_index))) {
463 !(mgr->ve->incompatible_elem_mask & (1 << i)) &&
464 !(mgr->incompatible_vb_mask & (1 << vb_index))) {
474 if (!u_vbuf_translate_find_free_vb_slots(mgr, mask)) {
479 for (i = 0; i < mgr->ve->count; i++) {
482 unsigned bit, vb_index = mgr->ve->ve[i].vertex_buffer_index;
485 if (!(mgr->ve->incompatible_elem_mask & (1 << i)) &&
486 !(mgr->incompatible_vb_mask & (1 << vb_index)) &&
499 assert(translate_is_output_format_supported(mgr->ve->native_format[i]));
510 te->input_format = mgr->ve->ve[i].src_format;
511 te->input_offset = mgr->ve->ve[i].src_offset;
512 te->output_format = mgr->ve->native_format[i];
515 k->output_stride += mgr->ve->native_format_size[i];
523 err = u_vbuf_translate_buffers(mgr, &key[type], mask[type],
524 mgr->fallback_vbs[type],
533 mgr->real_vertex_buffer[mgr->fallback_vbs[VB_CONST]].stride = 0;
539 for (i = 0; i < mgr->ve->count; i++) {
543 mgr->fallback_velems[i].instance_divisor = mgr->ve->ve[i].instance_divisor;
544 mgr->fallback_velems[i].src_format = te->output_format;
545 mgr->fallback_velems[i].src_offset = te->output_offset;
546 mgr->fallback_velems[i].vertex_buffer_index = mgr->fallback_vbs[type];
556 memcpy(&mgr->fallback_velems[i], &mgr->ve->ve[i],
561 u_vbuf_set_vertex_elements_internal(mgr, mgr->ve->count,
562 mgr->fallback_velems);
563 mgr->using_translate = TRUE;
567 static void u_vbuf_translate_end(struct u_vbuf *mgr)
572 mgr->pipe->bind_vertex_elements_state(mgr->pipe, mgr->ve->driver_cso);
573 mgr->using_translate = FALSE;
577 unsigned vb = mgr->fallback_vbs[i];
579 pipe_resource_reference(&mgr->real_vertex_buffer[vb].buffer, NULL);
580 mgr->fallback_vbs[i] = ~0;
583 mgr->nr_real_vertex_buffers = mgr->nr_vertex_buffers;
590 u_vbuf_create_vertex_elements(struct u_vbuf *mgr, unsigned count,
593 struct pipe_context *pipe = mgr->pipe;
620 if (!mgr->caps.format_fixed32) {
629 if (!mgr->caps.format_float16) {
638 if (!mgr->caps.format_float64) {
647 if (!mgr->caps.format_norm32) {
660 if (!mgr->caps.format_scaled32) {
680 (!mgr->caps.velem_src_offset_unaligned &&
693 if (!mgr->caps.velem_src_offset_unaligned) {
704 static void u_vbuf_delete_vertex_elements(struct u_vbuf *mgr, void *cso)
706 struct pipe_context *pipe = mgr->pipe;
713 void u_vbuf_set_vertex_buffers(struct u_vbuf *mgr, unsigned count,
718 mgr->user_vb_mask = 0;
719 mgr->incompatible_vb_mask = 0;
720 mgr->nonzero_stride_vb_mask = 0;
724 struct pipe_vertex_buffer *orig_vb = &mgr->vertex_buffer[i];
725 struct pipe_vertex_buffer *real_vb = &mgr->real_vertex_buffer[i];
735 mgr->nonzero_stride_vb_mask |= 1 << i;
743 if ((!mgr->caps.buffer_offset_unaligned && vb->buffer_offset % 4 != 0) ||
744 (!mgr->caps.buffer_stride_unaligned && vb->stride % 4 != 0)) {
745 mgr->incompatible_vb_mask |= 1 << i;
750 if (!mgr->caps.user_vertex_buffers && vb->user_buffer) {
751 mgr->user_vb_mask |= 1 << i;
760 for (i = count; i < mgr->nr_vertex_buffers; i++) {
761 pipe_resource_reference(&mgr->vertex_buffer[i].buffer, NULL);
763 for (i = count; i < mgr->nr_real_vertex_buffers; i++) {
764 pipe_resource_reference(&mgr->real_vertex_buffer[i].buffer, NULL);
767 mgr->nr_vertex_buffers = count;
768 mgr->nr_real_vertex_buffers = count;
769 mgr->vertex_buffers_dirty = TRUE;
772 void u_vbuf_set_index_buffer(struct u_vbuf *mgr,
775 struct pipe_context *pipe = mgr->pipe;
779 pipe_resource_reference(&mgr->index_buffer.buffer, ib->buffer);
780 memcpy(&mgr->index_buffer, ib, sizeof(*ib));
782 pipe_resource_reference(&mgr->index_buffer.buffer, NULL);
789 u_vbuf_upload_buffers(struct u_vbuf *mgr,
794 unsigned nr_velems = mgr->ve->count;
795 unsigned nr_vbufs = mgr->nr_vertex_buffers;
797 mgr->using_translate ? mgr->fallback_velems : mgr->ve->ve;
805 struct pipe_vertex_buffer *vb = &mgr->vertex_buffer[index];
809 if (index == mgr->fallback_vbs[VB_VERTEX] ||
810 index == mgr->fallback_vbs[VB_INSTANCE] ||
811 index == mgr->fallback_vbs[VB_CONST]) {
824 size = mgr->ve->src_format_size[i];
829 size = vb->stride * (count - 1) + mgr->ve->src_format_size[i];
833 size = vb->stride * (num_vertices - 1) + mgr->ve->src_format_size[i];
862 real_vb = &mgr->real_vertex_buffer[i];
863 ptr = mgr->vertex_buffer[i].user_buffer;
865 err = u_upload_data(mgr->uploader, start, end - start, ptr + start,
876 static boolean u_vbuf_need_minmax_index(struct u_vbuf *mgr)
881 return ((mgr->user_vb_mask | mgr->incompatible_vb_mask |
882 mgr->ve->incompatible_vb_mask_any) &
883 mgr->ve->noninstance_vb_mask_any & mgr->nonzero_stride_vb_mask) != 0;
886 static boolean u_vbuf_mapping_vertex_buffer_blocks(struct u_vbuf *mgr)
892 return (~mgr->user_vb_mask & ~mgr->incompatible_vb_mask &
893 mgr->ve->compatible_vb_mask_all & mgr->ve->noninstance_vb_mask_any &
894 mgr->nonzero_stride_vb_mask) != 0;
996 void u_vbuf_draw_vbo(struct u_vbuf *mgr, const struct pipe_draw_info *info)
998 struct pipe_context *pipe = mgr->pipe;
1002 uint32_t user_vb_mask = mgr->user_vb_mask;
1005 if (!mgr->incompatible_vb_mask &&
1006 !mgr->ve->incompatible_elem_mask &&
1009 if (mgr->vertex_buffers_dirty) {
1010 pipe->set_vertex_buffers(pipe, mgr->nr_real_vertex_buffers,
1011 mgr->real_vertex_buffer);
1012 mgr->vertex_buffers_dirty = FALSE;
1021 if (u_vbuf_need_minmax_index(mgr)) {
1028 u_vbuf_get_minmax_index(mgr->pipe, &mgr->index_buffer, info,
1044 !u_vbuf_mapping_vertex_buffer_blocks(mgr)) {
1047 user_vb_mask &= ~(mgr->nonzero_stride_vb_mask &
1048 mgr->ve->noninstance_vb_mask_any);
1064 mgr->incompatible_vb_mask ||
1065 mgr->ve->incompatible_elem_mask) {
1066 if (!u_vbuf_translate_begin(mgr, start_vertex, num_vertices,
1074 user_vb_mask &= ~(mgr->incompatible_vb_mask |
1075 mgr->ve->incompatible_vb_mask_all);
1080 if (u_vbuf_upload_buffers(mgr, start_vertex, num_vertices,
1097 for (i = 0; i < mgr->nr_vertex_buffers; i++) {
1099 util_dump_vertex_buffer(stdout, mgr->vertex_buffer+i);
1102 for (i = 0; i < mgr->nr_real_vertex_buffers; i++) {
1104 util_dump_vertex_buffer(stdout, mgr->real_vertex_buffer+i);
1109 u_upload_unmap(mgr->uploader);
1110 pipe->set_vertex_buffers(pipe, mgr->nr_real_vertex_buffers,
1111 mgr->real_vertex_buffer);
1126 if (mgr->using_translate) {
1127 u_vbuf_translate_end(mgr);
1129 mgr->vertex_buffers_dirty = TRUE;
1132 void u_vbuf_save_vertex_elements(struct u_vbuf *mgr)
1134 assert(!mgr->ve_saved);
1135 mgr->ve_saved = mgr->ve;
1138 void u_vbuf_restore_vertex_elements(struct u_vbuf *mgr)
1140 if (mgr->ve != mgr->ve_saved) {
1141 struct pipe_context *pipe = mgr->pipe;
1143 mgr->ve = mgr->ve_saved;
1145 mgr->ve ? mgr->ve->driver_cso : NULL);
1147 mgr->ve_saved = NULL;
1150 void u_vbuf_save_vertex_buffers(struct u_vbuf *mgr)
1152 util_copy_vertex_buffers(mgr->vertex_buffer_saved,
1153 &mgr->nr_vertex_buffers_saved,
1154 mgr->vertex_buffer,
1155 mgr->nr_vertex_buffers);
1158 void u_vbuf_restore_vertex_buffers(struct u_vbuf *mgr)
1162 u_vbuf_set_vertex_buffers(mgr, mgr->nr_vertex_buffers_saved,
1163 mgr->vertex_buffer_saved);
1164 for (i = 0; i < mgr->nr_vertex_buffers_saved; i++) {
1165 pipe_resource_reference(&mgr->vertex_buffer_saved[i].buffer, NULL);
1167 mgr->nr_vertex_buffers_saved = 0;