vl_vertex_buffers.c revision 7cd1c62b6be88072e3d937b67c499592490927f1
1069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project/************************************************************************** 2069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * 3069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * Copyright 2010 Christian König 4069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * All Rights Reserved. 5069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * 6069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * Permission is hereby granted, free of charge, to any person obtaining a 7069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * copy of this software and associated documentation files (the 8069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * "Software"), to deal in the Software without restriction, including 9069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * without limitation the rights to use, copy, modify, merge, publish, 10069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * distribute, sub license, and/or sell copies of the Software, and to 11069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * permit persons to whom the Software is furnished to do so, subject to 12069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * the following conditions: 13069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * 14069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * The above copyright notice and this permission notice (including the 15069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * next paragraph) shall be included in all copies or substantial portions 16069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * of the Software. 17069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * 18069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 19069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 21069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR 22069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 23069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 24069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * 26069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project **************************************************************************/ 27069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 28069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project#include <assert.h> 29069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project#include "util/u_format.h" 30069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project#include "vl_vertex_buffers.h" 31069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project#include "vl_types.h" 32069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 33069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project/* vertices for a quad covering a block */ 34069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectstatic const struct vertex2f block_quad[4] = { 35069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project {0.0f, 0.0f}, {1.0f, 0.0f}, {1.0f, 1.0f}, {0.0f, 1.0f} 36069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project}; 37069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 38069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectstruct pipe_vertex_buffer 39069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectvl_vb_upload_quads(struct pipe_context *pipe) 40069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project{ 41069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project struct pipe_vertex_buffer quad; 42069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project struct pipe_transfer *buf_transfer; 43069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project struct vertex2f *v; 44069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 45069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project unsigned i; 46069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 47069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project assert(pipe); 48069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 49d42abb2fd917184764daf22f5f299e848b8701d7Narayan Kamath /* create buffer */ 50d42abb2fd917184764daf22f5f299e848b8701d7Narayan Kamath quad.stride = sizeof(struct vertex2f); 51d42abb2fd917184764daf22f5f299e848b8701d7Narayan Kamath quad.buffer_offset = 0; 52d42abb2fd917184764daf22f5f299e848b8701d7Narayan Kamath quad.buffer = pipe_buffer_create 53069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project ( 54069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project pipe->screen, 55d42abb2fd917184764daf22f5f299e848b8701d7Narayan Kamath PIPE_BIND_VERTEX_BUFFER, 56069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project PIPE_USAGE_STATIC, 57069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project sizeof(struct vertex2f) * 4 58069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project ); 59069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 60069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project if(!quad.buffer) 61069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project return quad; 62069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 63069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project /* and fill it */ 64069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project v = pipe_buffer_map 65069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project ( 66069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project pipe, 67069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project quad.buffer, 68069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project PIPE_TRANSFER_WRITE | PIPE_TRANSFER_DISCARD_RANGE, 69069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project &buf_transfer 70069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project ); 71069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 72069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project for (i = 0; i < 4; ++i, ++v) { 73069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project v->x = block_quad[i].x; 74069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project v->y = block_quad[i].y; 75069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 76069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 77069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project pipe_buffer_unmap(pipe, buf_transfer); 78069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 79069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project return quad; 80069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project} 81069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 82069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectstruct pipe_vertex_buffer 83069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectvl_vb_upload_pos(struct pipe_context *pipe, unsigned width, unsigned height) 84069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project{ 85069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project struct pipe_vertex_buffer pos; 86069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project struct pipe_transfer *buf_transfer; 87069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project struct vertex2s *v; 88069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 89069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project unsigned x, y; 90069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 91069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project assert(pipe); 92069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 93069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project /* create buffer */ 94069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project pos.stride = sizeof(struct vertex2s); 95069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project pos.buffer_offset = 0; 96069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project pos.buffer = pipe_buffer_create 97069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project ( 98069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project pipe->screen, 99069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project PIPE_BIND_VERTEX_BUFFER, 100069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project PIPE_USAGE_STATIC, 101069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project sizeof(struct vertex2s) * width * height 102069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project ); 103069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 104069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project if(!pos.buffer) 105069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project return pos; 106069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 107069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project /* and fill it */ 108069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project v = pipe_buffer_map 109069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project ( 110069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project pipe, 111069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project pos.buffer, 112069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project PIPE_TRANSFER_WRITE | PIPE_TRANSFER_DISCARD_RANGE, 113069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project &buf_transfer 114069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project ); 115069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 116069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project for ( y = 0; y < height; ++y) { 117069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project for ( x = 0; x < width; ++x, ++v) { 118069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project v->x = x; 119069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project v->y = y; 120069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 121069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 122069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 123069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project pipe_buffer_unmap(pipe, buf_transfer); 124069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 125069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project return pos; 126069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project} 127069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 128069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectstatic struct pipe_vertex_element 129069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectvl_vb_get_quad_vertex_element(void) 130069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project{ 131069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project struct pipe_vertex_element element; 132069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 133069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project /* setup rectangle element */ 134069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project element.src_offset = 0; 135069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project element.instance_divisor = 0; 136069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project element.vertex_buffer_index = 0; 137069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project element.src_format = PIPE_FORMAT_R32G32_FLOAT; 138069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 139069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project return element; 140069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project} 141069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 142069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectstatic void 143069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectvl_vb_element_helper(struct pipe_vertex_element* elements, unsigned num_elements, 144069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project unsigned vertex_buffer_index) 145069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project{ 146069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project unsigned i, offset = 0; 147069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 148069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project assert(elements && num_elements); 149069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 150069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project for ( i = 0; i < num_elements; ++i ) { 151069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project elements[i].src_offset = offset; 152069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project elements[i].instance_divisor = 1; 153069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project elements[i].vertex_buffer_index = vertex_buffer_index; 154069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project offset += util_format_get_blocksize(elements[i].src_format); 155069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 156069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project} 157069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 158069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectvoid * 159069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectvl_vb_get_ves_ycbcr(struct pipe_context *pipe) 160069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project{ 161069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project struct pipe_vertex_element vertex_elems[NUM_VS_INPUTS]; 162069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 163069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project assert(pipe); 164069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 165069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project memset(&vertex_elems, 0, sizeof(vertex_elems)); 166069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project vertex_elems[VS_I_RECT] = vl_vb_get_quad_vertex_element(); 167069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 168069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project /* Position element */ 169069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project vertex_elems[VS_I_VPOS].src_format = PIPE_FORMAT_R8G8B8A8_USCALED; 170069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 171069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project /* block num element */ 172069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project vertex_elems[VS_I_BLOCK_NUM].src_format = PIPE_FORMAT_R32_FLOAT; 173069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 174069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project vl_vb_element_helper(&vertex_elems[VS_I_VPOS], 2, 1); 175069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 176069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project return pipe->create_vertex_elements_state(pipe, 3, vertex_elems); 177069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project} 178069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 179069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectvoid * 180069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectvl_vb_get_ves_mv(struct pipe_context *pipe) 181069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project{ 182069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project struct pipe_vertex_element vertex_elems[NUM_VS_INPUTS]; 183069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 184069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project assert(pipe); 185069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 186069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project memset(&vertex_elems, 0, sizeof(vertex_elems)); 187069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project vertex_elems[VS_I_RECT] = vl_vb_get_quad_vertex_element(); 188069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 189069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project /* Position element */ 190069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project vertex_elems[VS_I_VPOS].src_format = PIPE_FORMAT_R16G16_SSCALED; 191069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 192069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project vl_vb_element_helper(&vertex_elems[VS_I_VPOS], 1, 1); 193069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 194069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project /* motion vector TOP element */ 195069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project vertex_elems[VS_I_MV_TOP].src_format = PIPE_FORMAT_R16G16B16A16_SSCALED; 196069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 197069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project /* motion vector BOTTOM element */ 198069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project vertex_elems[VS_I_MV_BOTTOM].src_format = PIPE_FORMAT_R16G16B16A16_SSCALED; 199069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 200069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project vl_vb_element_helper(&vertex_elems[VS_I_MV_TOP], 2, 2); 201069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 202069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project return pipe->create_vertex_elements_state(pipe, NUM_VS_INPUTS, vertex_elems); 203069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project} 204069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 205069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectbool 206069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectvl_vb_init(struct vl_vertex_buffer *buffer, struct pipe_context *pipe, 207069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project unsigned width, unsigned height) 208069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project{ 209069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project unsigned i, size; 210069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 211069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project assert(buffer); 212069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 213069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project buffer->width = width; 214069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project buffer->height = height; 215069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 216069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project size = width * height; 217069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 218069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project for (i = 0; i < VL_MAX_PLANES; ++i) { 219069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project buffer->ycbcr[i].resource = pipe_buffer_create 220069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project ( 221069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project pipe->screen, 222069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project PIPE_BIND_VERTEX_BUFFER, 223069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project PIPE_USAGE_STREAM, 224069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project sizeof(struct vl_ycbcr_block) * size * 4 225069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project ); 226069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project if (!buffer->ycbcr[i].resource) 227069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project goto error_ycbcr; 228069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 229069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 230069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project for (i = 0; i < VL_MAX_REF_FRAMES; ++i) { 231069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project buffer->mv[i].resource = pipe_buffer_create 232069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project ( 233069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project pipe->screen, 234069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project PIPE_BIND_VERTEX_BUFFER, 235069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project PIPE_USAGE_STREAM, 236069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project sizeof(struct vl_motionvector) * size 237069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project ); 238069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project if (!buffer->mv[i].resource) 239069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project goto error_mv; 240069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 241069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 242069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project vl_vb_map(buffer, pipe); 243069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project return true; 244069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 245069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projecterror_mv: 246069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project for (i = 0; i < VL_MAX_PLANES; ++i) 247069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project pipe_resource_reference(&buffer->mv[i].resource, NULL); 248069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 249069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projecterror_ycbcr: 250069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project for (i = 0; i < VL_MAX_PLANES; ++i) 251069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project pipe_resource_reference(&buffer->ycbcr[i].resource, NULL); 252069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project return false; 253069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project} 254069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 255069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectunsigned 256069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectvl_vb_attributes_per_plock(struct vl_vertex_buffer *buffer) 257069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project{ 258069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project return 1; 259069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project} 260069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 261069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectstruct pipe_vertex_buffer 262069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectvl_vb_get_ycbcr(struct vl_vertex_buffer *buffer, int component) 263069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project{ 264069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project struct pipe_vertex_buffer buf; 265069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 266069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project assert(buffer); 267069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 268069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project buf.stride = sizeof(struct vl_ycbcr_block); 269069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project buf.buffer_offset = 0; 270069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project buf.buffer = buffer->ycbcr[component].resource; 271069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 272069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project return buf; 273069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project} 274069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 275069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectstruct pipe_vertex_buffer 276069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectvl_vb_get_mv(struct vl_vertex_buffer *buffer, int motionvector) 277069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project{ 278069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project struct pipe_vertex_buffer buf; 279069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 280069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project assert(buffer); 281069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 282069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project buf.stride = sizeof(struct vl_motionvector); 283069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project buf.buffer_offset = 0; 284069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project buf.buffer = buffer->mv[motionvector].resource; 285069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 286069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project return buf; 287069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project} 288069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 289069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectvoid 290069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectvl_vb_map(struct vl_vertex_buffer *buffer, struct pipe_context *pipe) 291069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project{ 292069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project unsigned i; 293069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 294069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project assert(buffer && pipe); 295069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 296069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project for (i = 0; i < VL_MAX_PLANES; ++i) { 297069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project buffer->ycbcr[i].vertex_stream = pipe_buffer_map 298069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project ( 299069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project pipe, 300069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project buffer->ycbcr[i].resource, 301069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project PIPE_TRANSFER_WRITE | PIPE_TRANSFER_DISCARD_RANGE, 302069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project &buffer->ycbcr[i].transfer 303069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project ); 304069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 305069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 306069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project for (i = 0; i < VL_MAX_REF_FRAMES; ++i) { 307069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project buffer->mv[i].vertex_stream = pipe_buffer_map 308069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project ( 309069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project pipe, 310069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project buffer->mv[i].resource, 311069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project PIPE_TRANSFER_WRITE | PIPE_TRANSFER_DISCARD_RANGE, 312069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project &buffer->mv[i].transfer 313069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project ); 314069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 315069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 316069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project} 317069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 318069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectstruct vl_ycbcr_block * 319069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectvl_vb_get_ycbcr_stream(struct vl_vertex_buffer *buffer, int component) 320069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project{ 321069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project assert(buffer); 322069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project assert(component < VL_MAX_PLANES); 323069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 324069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project return buffer->ycbcr[component].vertex_stream; 325069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project} 326069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 327069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectunsigned 328069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectvl_vb_get_mv_stream_stride(struct vl_vertex_buffer *buffer) 329069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project{ 330069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project assert(buffer); 331069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 332069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project return buffer->width; 333069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project} 334069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 335069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectstruct vl_motionvector * 336069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectvl_vb_get_mv_stream(struct vl_vertex_buffer *buffer, int ref_frame) 337069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project{ 338069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project assert(buffer); 339069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project assert(ref_frame < VL_MAX_REF_FRAMES); 340069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 341069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project return buffer->mv[ref_frame].vertex_stream; 342069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project} 343069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 344069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectvoid 345069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectvl_vb_unmap(struct vl_vertex_buffer *buffer, struct pipe_context *pipe) 346069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project{ 347069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project unsigned i; 348069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 349069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project assert(buffer && pipe); 350069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 351069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project for (i = 0; i < VL_MAX_PLANES; ++i) { 352069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project pipe_buffer_unmap(pipe, buffer->ycbcr[i].transfer); 353069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 354069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 355069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project for (i = 0; i < VL_MAX_REF_FRAMES; ++i) { 356069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project pipe_buffer_unmap(pipe, buffer->mv[i].transfer); 357069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 358069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project} 359069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 360069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectvoid 361069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectvl_vb_cleanup(struct vl_vertex_buffer *buffer) 362069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project{ 363069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project unsigned i; 364069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 365069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project assert(buffer); 366069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 367069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project for (i = 0; i < VL_MAX_PLANES; ++i) { 368069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project pipe_resource_reference(&buffer->ycbcr[i].resource, NULL); 369069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 370069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 371069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project for (i = 0; i < VL_MAX_REF_FRAMES; ++i) { 372069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project pipe_resource_reference(&buffer->mv[i].resource, NULL); 373069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 374069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project} 375069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project