static void gen_vertex_data(struct vl_compositor *c, struct vl_compositor_state *s, struct u_rect *dirty) { struct vertex2f *vb; struct pipe_transfer *buf_transfer; unsigned i; assert(c); vb = pipe_buffer_map(c->pipe, c->vertex_buf.buffer, PIPE_TRANSFER_WRITE | PIPE_TRANSFER_DISCARD_RANGE | PIPE_TRANSFER_DONTBLOCK, &buf_transfer); if (!vb) { // If buffer is still locked from last draw create a new one create_vertex_buffer(c); vb = pipe_buffer_map(c->pipe, c->vertex_buf.buffer, PIPE_TRANSFER_WRITE | PIPE_TRANSFER_DISCARD_RANGE, &buf_transfer); } for (i = 0; i < VL_COMPOSITOR_MAX_LAYERS; i++) { if (s->used_layers & (1 << i)) { struct vl_compositor_layer *layer = &s->layers[i]; gen_rect_verts(vb, layer); vb += 20; if (!layer->viewport_valid) { layer->viewport.scale[0] = c->fb_state.width; layer->viewport.scale[1] = c->fb_state.height; layer->viewport.translate[0] = 0; layer->viewport.translate[1] = 0; } if (dirty && layer->clearing) { struct u_rect drawn = calc_drawn_area(s, layer); if ( dirty->x0 >= drawn.x0 && dirty->y0 >= drawn.y0 && dirty->x1 <= drawn.x1 && dirty->y1 <= drawn.y1) { // We clear the dirty area anyway, no need for clear_render_target dirty->x0 = dirty->y0 = MAX_DIRTY; dirty->x1 = dirty->y1 = MIN_DIRTY; } } } } pipe_buffer_unmap(c->pipe, buf_transfer); }
static void gen_vertex_data(struct vl_compositor *c, struct vl_compositor_state *s, struct u_rect *dirty) { struct vertex2f *vb; unsigned i; assert(c); /* Allocate new memory for vertices. */ u_upload_alloc(c->upload, 0, c->vertex_buf.stride * VL_COMPOSITOR_MAX_LAYERS * 4, /* size */ &c->vertex_buf.buffer_offset, &c->vertex_buf.buffer, (void**)&vb); for (i = 0; i < VL_COMPOSITOR_MAX_LAYERS; i++) { if (s->used_layers & (1 << i)) { struct vl_compositor_layer *layer = &s->layers[i]; gen_rect_verts(vb, layer); vb += 20; if (!layer->viewport_valid) { layer->viewport.scale[0] = c->fb_state.width; layer->viewport.scale[1] = c->fb_state.height; layer->viewport.translate[0] = 0; layer->viewport.translate[1] = 0; } if (dirty && layer->clearing) { struct u_rect drawn = calc_drawn_area(s, layer); if ( dirty->x0 >= drawn.x0 && dirty->y0 >= drawn.y0 && dirty->x1 <= drawn.x1 && dirty->y1 <= drawn.y1) { // We clear the dirty area anyway, no need for clear_render_target dirty->x0 = dirty->y0 = MAX_DIRTY; dirty->x1 = dirty->y1 = MIN_DIRTY; } } } } u_upload_unmap(c->upload); }