1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/************************************************************************** 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2010 Christian König 4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * All Rights Reserved. 5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a 7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the 8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * "Software"), to deal in the Software without restriction, including 9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * without limitation the rights to use, copy, modify, merge, publish, 10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * distribute, sub license, and/or sell copies of the Software, and to 11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * permit persons to whom the Software is furnished to do so, subject to 12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the following conditions: 13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice (including the 15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * next paragraph) shall be included in all copies or substantial portions 16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * of the Software. 17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org **************************************************************************/ 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <assert.h> 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_format.h" 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "vl_vertex_buffers.h" 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "vl_types.h" 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* vertices for a quad covering a block */ 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const struct vertex2f block_quad[4] = { 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {0.0f, 0.0f}, {1.0f, 0.0f}, {1.0f, 1.0f}, {0.0f, 1.0f} 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct pipe_vertex_buffer 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvl_vb_upload_quads(struct pipe_context *pipe) 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_vertex_buffer quad; 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_transfer *buf_transfer; 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct vertex2f *v; 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i; 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(pipe); 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* create buffer */ 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org quad.stride = sizeof(struct vertex2f); 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org quad.buffer_offset = 0; 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org quad.buffer = pipe_buffer_create 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ( 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->screen, 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PIPE_BIND_VERTEX_BUFFER, 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PIPE_USAGE_STATIC, 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sizeof(struct vertex2f) * 4 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ); 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org quad.user_buffer = NULL; 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(!quad.buffer) 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return quad; 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* and fill it */ 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org v = pipe_buffer_map 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ( 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe, 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org quad.buffer, 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PIPE_TRANSFER_WRITE | PIPE_TRANSFER_DISCARD_RANGE, 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &buf_transfer 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ); 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 4; ++i, ++v) { 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org v->x = block_quad[i].x; 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org v->y = block_quad[i].y; 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_buffer_unmap(pipe, buf_transfer); 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return quad; 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct pipe_vertex_buffer 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvl_vb_upload_pos(struct pipe_context *pipe, unsigned width, unsigned height) 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_vertex_buffer pos; 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_transfer *buf_transfer; 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct vertex2s *v; 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned x, y; 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(pipe); 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* create buffer */ 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pos.stride = sizeof(struct vertex2s); 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pos.buffer_offset = 0; 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pos.buffer = pipe_buffer_create 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ( 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->screen, 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PIPE_BIND_VERTEX_BUFFER, 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PIPE_USAGE_STATIC, 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sizeof(struct vertex2s) * width * height 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ); 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pos.user_buffer = NULL; 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(!pos.buffer) 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return pos; 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* and fill it */ 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org v = pipe_buffer_map 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ( 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe, 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pos.buffer, 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PIPE_TRANSFER_WRITE | PIPE_TRANSFER_DISCARD_RANGE, 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &buf_transfer 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ); 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for ( y = 0; y < height; ++y) { 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for ( x = 0; x < width; ++x, ++v) { 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org v->x = x; 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org v->y = y; 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_buffer_unmap(pipe, buf_transfer); 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return pos; 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct pipe_vertex_element 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvl_vb_get_quad_vertex_element(void) 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_vertex_element element; 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* setup rectangle element */ 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org element.src_offset = 0; 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org element.instance_divisor = 0; 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org element.vertex_buffer_index = 0; 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org element.src_format = PIPE_FORMAT_R32G32_FLOAT; 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return element; 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvl_vb_element_helper(struct pipe_vertex_element* elements, unsigned num_elements, 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned vertex_buffer_index) 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i, offset = 0; 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(elements && num_elements); 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for ( i = 0; i < num_elements; ++i ) { 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org elements[i].src_offset = offset; 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org elements[i].instance_divisor = 1; 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org elements[i].vertex_buffer_index = vertex_buffer_index; 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org offset += util_format_get_blocksize(elements[i].src_format); 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid * 161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvl_vb_get_ves_ycbcr(struct pipe_context *pipe) 162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_vertex_element vertex_elems[NUM_VS_INPUTS]; 164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(pipe); 166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&vertex_elems, 0, sizeof(vertex_elems)); 168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vertex_elems[VS_I_RECT] = vl_vb_get_quad_vertex_element(); 169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Position element */ 171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vertex_elems[VS_I_VPOS].src_format = PIPE_FORMAT_R8G8B8A8_USCALED; 172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* block num element */ 174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vertex_elems[VS_I_BLOCK_NUM].src_format = PIPE_FORMAT_R32_FLOAT; 175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vl_vb_element_helper(&vertex_elems[VS_I_VPOS], 2, 1); 177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return pipe->create_vertex_elements_state(pipe, 3, vertex_elems); 179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid * 182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvl_vb_get_ves_mv(struct pipe_context *pipe) 183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_vertex_element vertex_elems[NUM_VS_INPUTS]; 185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(pipe); 187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&vertex_elems, 0, sizeof(vertex_elems)); 189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vertex_elems[VS_I_RECT] = vl_vb_get_quad_vertex_element(); 190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Position element */ 192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vertex_elems[VS_I_VPOS].src_format = PIPE_FORMAT_R16G16_SSCALED; 193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vl_vb_element_helper(&vertex_elems[VS_I_VPOS], 1, 1); 195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* motion vector TOP element */ 197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vertex_elems[VS_I_MV_TOP].src_format = PIPE_FORMAT_R16G16B16A16_SSCALED; 198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* motion vector BOTTOM element */ 200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vertex_elems[VS_I_MV_BOTTOM].src_format = PIPE_FORMAT_R16G16B16A16_SSCALED; 201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vl_vb_element_helper(&vertex_elems[VS_I_MV_TOP], 2, 2); 203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return pipe->create_vertex_elements_state(pipe, NUM_VS_INPUTS, vertex_elems); 205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbool 208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvl_vb_init(struct vl_vertex_buffer *buffer, struct pipe_context *pipe, 209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned width, unsigned height) 210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i, size; 212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(buffer); 214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org buffer->width = width; 216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org buffer->height = height; 217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org size = width * height; 219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < VL_NUM_COMPONENTS; ++i) { 221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org buffer->ycbcr[i].resource = pipe_buffer_create 222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ( 223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->screen, 224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PIPE_BIND_VERTEX_BUFFER, 225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PIPE_USAGE_STREAM, 226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sizeof(struct vl_ycbcr_block) * size * 4 227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ); 228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!buffer->ycbcr[i].resource) 229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto error_ycbcr; 230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < VL_MAX_REF_FRAMES; ++i) { 233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org buffer->mv[i].resource = pipe_buffer_create 234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ( 235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->screen, 236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PIPE_BIND_VERTEX_BUFFER, 237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PIPE_USAGE_STREAM, 238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sizeof(struct vl_motionvector) * size 239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ); 240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!buffer->mv[i].resource) 241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto error_mv; 242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vl_vb_map(buffer, pipe); 245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return true; 246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgerror_mv: 248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < VL_NUM_COMPONENTS; ++i) 249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_resource_reference(&buffer->mv[i].resource, NULL); 250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgerror_ycbcr: 252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < VL_NUM_COMPONENTS; ++i) 253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_resource_reference(&buffer->ycbcr[i].resource, NULL); 254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return false; 255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgunsigned 258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvl_vb_attributes_per_plock(struct vl_vertex_buffer *buffer) 259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 1; 261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct pipe_vertex_buffer 264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvl_vb_get_ycbcr(struct vl_vertex_buffer *buffer, int component) 265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_vertex_buffer buf; 267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(buffer); 269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org buf.stride = sizeof(struct vl_ycbcr_block); 271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org buf.buffer_offset = 0; 272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org buf.buffer = buffer->ycbcr[component].resource; 273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org buf.user_buffer = NULL; 274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return buf; 276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct pipe_vertex_buffer 279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvl_vb_get_mv(struct vl_vertex_buffer *buffer, int motionvector) 280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_vertex_buffer buf; 282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(buffer); 284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org buf.stride = sizeof(struct vl_motionvector); 286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org buf.buffer_offset = 0; 287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org buf.buffer = buffer->mv[motionvector].resource; 288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org buf.user_buffer = NULL; 289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return buf; 291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvl_vb_map(struct vl_vertex_buffer *buffer, struct pipe_context *pipe) 295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i; 297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(buffer && pipe); 299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < VL_NUM_COMPONENTS; ++i) { 301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org buffer->ycbcr[i].vertex_stream = pipe_buffer_map 302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ( 303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe, 304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org buffer->ycbcr[i].resource, 305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PIPE_TRANSFER_WRITE | PIPE_TRANSFER_DISCARD_RANGE, 306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &buffer->ycbcr[i].transfer 307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ); 308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < VL_MAX_REF_FRAMES; ++i) { 311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org buffer->mv[i].vertex_stream = pipe_buffer_map 312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ( 313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe, 314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org buffer->mv[i].resource, 315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PIPE_TRANSFER_WRITE | PIPE_TRANSFER_DISCARD_RANGE, 316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &buffer->mv[i].transfer 317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ); 318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct vl_ycbcr_block * 323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvl_vb_get_ycbcr_stream(struct vl_vertex_buffer *buffer, int component) 324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(buffer); 326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(component < VL_NUM_COMPONENTS); 327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return buffer->ycbcr[component].vertex_stream; 329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgunsigned 332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvl_vb_get_mv_stream_stride(struct vl_vertex_buffer *buffer) 333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(buffer); 335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return buffer->width; 337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct vl_motionvector * 340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvl_vb_get_mv_stream(struct vl_vertex_buffer *buffer, int ref_frame) 341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(buffer); 343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(ref_frame < VL_MAX_REF_FRAMES); 344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return buffer->mv[ref_frame].vertex_stream; 346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvl_vb_unmap(struct vl_vertex_buffer *buffer, struct pipe_context *pipe) 350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i; 352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(buffer && pipe); 354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < VL_NUM_COMPONENTS; ++i) { 356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_buffer_unmap(pipe, buffer->ycbcr[i].transfer); 357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < VL_MAX_REF_FRAMES; ++i) { 360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_buffer_unmap(pipe, buffer->mv[i].transfer); 361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvl_vb_cleanup(struct vl_vertex_buffer *buffer) 366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i; 368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(buffer); 370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < VL_NUM_COMPONENTS; ++i) { 372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_resource_reference(&buffer->ycbcr[i].resource, NULL); 373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < VL_MAX_REF_FRAMES; ++i) { 376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_resource_reference(&buffer->mv[i].resource, NULL); 377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 379