14abe7382882a451a7750ccc451b8568768d122cbChristian König/************************************************************************** 24abe7382882a451a7750ccc451b8568768d122cbChristian König * 34abe7382882a451a7750ccc451b8568768d122cbChristian König * Copyright 2010 Christian König 44abe7382882a451a7750ccc451b8568768d122cbChristian König * All Rights Reserved. 54abe7382882a451a7750ccc451b8568768d122cbChristian König * 64abe7382882a451a7750ccc451b8568768d122cbChristian König * Permission is hereby granted, free of charge, to any person obtaining a 74abe7382882a451a7750ccc451b8568768d122cbChristian König * copy of this software and associated documentation files (the 84abe7382882a451a7750ccc451b8568768d122cbChristian König * "Software"), to deal in the Software without restriction, including 94abe7382882a451a7750ccc451b8568768d122cbChristian König * without limitation the rights to use, copy, modify, merge, publish, 104abe7382882a451a7750ccc451b8568768d122cbChristian König * distribute, sub license, and/or sell copies of the Software, and to 114abe7382882a451a7750ccc451b8568768d122cbChristian König * permit persons to whom the Software is furnished to do so, subject to 124abe7382882a451a7750ccc451b8568768d122cbChristian König * the following conditions: 134abe7382882a451a7750ccc451b8568768d122cbChristian König * 144abe7382882a451a7750ccc451b8568768d122cbChristian König * The above copyright notice and this permission notice (including the 154abe7382882a451a7750ccc451b8568768d122cbChristian König * next paragraph) shall be included in all copies or substantial portions 164abe7382882a451a7750ccc451b8568768d122cbChristian König * of the Software. 174abe7382882a451a7750ccc451b8568768d122cbChristian König * 184abe7382882a451a7750ccc451b8568768d122cbChristian König * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 194abe7382882a451a7750ccc451b8568768d122cbChristian König * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 204abe7382882a451a7750ccc451b8568768d122cbChristian König * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 214abe7382882a451a7750ccc451b8568768d122cbChristian König * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR 224abe7382882a451a7750ccc451b8568768d122cbChristian König * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 234abe7382882a451a7750ccc451b8568768d122cbChristian König * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 244abe7382882a451a7750ccc451b8568768d122cbChristian König * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 254abe7382882a451a7750ccc451b8568768d122cbChristian König * 264abe7382882a451a7750ccc451b8568768d122cbChristian König **************************************************************************/ 274abe7382882a451a7750ccc451b8568768d122cbChristian König 284abe7382882a451a7750ccc451b8568768d122cbChristian König#include <assert.h> 2919bcd21ed151cf1716f2f87dff0f712231aa2ce7Kai Wasserbäch#include "util/u_format.h" 304abe7382882a451a7750ccc451b8568768d122cbChristian König#include "vl_vertex_buffers.h" 314abe7382882a451a7750ccc451b8568768d122cbChristian König#include "vl_types.h" 324abe7382882a451a7750ccc451b8568768d122cbChristian König 334abe7382882a451a7750ccc451b8568768d122cbChristian König/* vertices for a quad covering a block */ 34310eea52ca1e997295c84163066cc5d0fd4f8cf6Christian Königstatic const struct vertex2f block_quad[4] = { 35310eea52ca1e997295c84163066cc5d0fd4f8cf6Christian König {0.0f, 0.0f}, {1.0f, 0.0f}, {1.0f, 1.0f}, {0.0f, 1.0f} 364abe7382882a451a7750ccc451b8568768d122cbChristian König}; 374abe7382882a451a7750ccc451b8568768d122cbChristian König 384abe7382882a451a7750ccc451b8568768d122cbChristian Königstruct pipe_vertex_buffer 393511780a43077d1359bd491eadb4ab9b3b86795aChristian Königvl_vb_upload_quads(struct pipe_context *pipe) 404abe7382882a451a7750ccc451b8568768d122cbChristian König{ 414abe7382882a451a7750ccc451b8568768d122cbChristian König struct pipe_vertex_buffer quad; 424abe7382882a451a7750ccc451b8568768d122cbChristian König struct pipe_transfer *buf_transfer; 433511780a43077d1359bd491eadb4ab9b3b86795aChristian König struct vertex2f *v; 444abe7382882a451a7750ccc451b8568768d122cbChristian König 453511780a43077d1359bd491eadb4ab9b3b86795aChristian König unsigned i; 464abe7382882a451a7750ccc451b8568768d122cbChristian König 474abe7382882a451a7750ccc451b8568768d122cbChristian König assert(pipe); 484abe7382882a451a7750ccc451b8568768d122cbChristian König 494abe7382882a451a7750ccc451b8568768d122cbChristian König /* create buffer */ 503511780a43077d1359bd491eadb4ab9b3b86795aChristian König quad.stride = sizeof(struct vertex2f); 514abe7382882a451a7750ccc451b8568768d122cbChristian König quad.buffer_offset = 0; 524abe7382882a451a7750ccc451b8568768d122cbChristian König quad.buffer = pipe_buffer_create 534abe7382882a451a7750ccc451b8568768d122cbChristian König ( 544abe7382882a451a7750ccc451b8568768d122cbChristian König pipe->screen, 554abe7382882a451a7750ccc451b8568768d122cbChristian König PIPE_BIND_VERTEX_BUFFER, 56b922a0ce12916a91cfc3e56714913fcf63279ff2Christian König PIPE_USAGE_STATIC, 573511780a43077d1359bd491eadb4ab9b3b86795aChristian König sizeof(struct vertex2f) * 4 584abe7382882a451a7750ccc451b8568768d122cbChristian König ); 59599140119ebdef8dcae9e465ee6177dabb44b8b0Vinson Lee quad.user_buffer = NULL; 604abe7382882a451a7750ccc451b8568768d122cbChristian König 614abe7382882a451a7750ccc451b8568768d122cbChristian König if(!quad.buffer) 624abe7382882a451a7750ccc451b8568768d122cbChristian König return quad; 634abe7382882a451a7750ccc451b8568768d122cbChristian König 644abe7382882a451a7750ccc451b8568768d122cbChristian König /* and fill it */ 654abe7382882a451a7750ccc451b8568768d122cbChristian König v = pipe_buffer_map 664abe7382882a451a7750ccc451b8568768d122cbChristian König ( 674abe7382882a451a7750ccc451b8568768d122cbChristian König pipe, 684abe7382882a451a7750ccc451b8568768d122cbChristian König quad.buffer, 697cd1c62b6be88072e3d937b67c499592490927f1Marek Olšák PIPE_TRANSFER_WRITE | PIPE_TRANSFER_DISCARD_RANGE, 704abe7382882a451a7750ccc451b8568768d122cbChristian König &buf_transfer 714abe7382882a451a7750ccc451b8568768d122cbChristian König ); 724abe7382882a451a7750ccc451b8568768d122cbChristian König 733511780a43077d1359bd491eadb4ab9b3b86795aChristian König for (i = 0; i < 4; ++i, ++v) { 743511780a43077d1359bd491eadb4ab9b3b86795aChristian König v->x = block_quad[i].x; 753511780a43077d1359bd491eadb4ab9b3b86795aChristian König v->y = block_quad[i].y; 76310eea52ca1e997295c84163066cc5d0fd4f8cf6Christian König } 774abe7382882a451a7750ccc451b8568768d122cbChristian König 782191d8064e9d177311f0833241d16384ead89e1aChristian König pipe_buffer_unmap(pipe, buf_transfer); 794abe7382882a451a7750ccc451b8568768d122cbChristian König 804abe7382882a451a7750ccc451b8568768d122cbChristian König return quad; 814abe7382882a451a7750ccc451b8568768d122cbChristian König} 824abe7382882a451a7750ccc451b8568768d122cbChristian König 83b8a6e0e6fc451096d684a1e18529ab4879cdba0aChristian Königstruct pipe_vertex_buffer 84b8a6e0e6fc451096d684a1e18529ab4879cdba0aChristian Königvl_vb_upload_pos(struct pipe_context *pipe, unsigned width, unsigned height) 85b8a6e0e6fc451096d684a1e18529ab4879cdba0aChristian König{ 86b8a6e0e6fc451096d684a1e18529ab4879cdba0aChristian König struct pipe_vertex_buffer pos; 87b8a6e0e6fc451096d684a1e18529ab4879cdba0aChristian König struct pipe_transfer *buf_transfer; 88b8a6e0e6fc451096d684a1e18529ab4879cdba0aChristian König struct vertex2s *v; 89b8a6e0e6fc451096d684a1e18529ab4879cdba0aChristian König 90b8a6e0e6fc451096d684a1e18529ab4879cdba0aChristian König unsigned x, y; 91b8a6e0e6fc451096d684a1e18529ab4879cdba0aChristian König 92b8a6e0e6fc451096d684a1e18529ab4879cdba0aChristian König assert(pipe); 93b8a6e0e6fc451096d684a1e18529ab4879cdba0aChristian König 94b8a6e0e6fc451096d684a1e18529ab4879cdba0aChristian König /* create buffer */ 95b8a6e0e6fc451096d684a1e18529ab4879cdba0aChristian König pos.stride = sizeof(struct vertex2s); 96b8a6e0e6fc451096d684a1e18529ab4879cdba0aChristian König pos.buffer_offset = 0; 97b8a6e0e6fc451096d684a1e18529ab4879cdba0aChristian König pos.buffer = pipe_buffer_create 98b8a6e0e6fc451096d684a1e18529ab4879cdba0aChristian König ( 99b8a6e0e6fc451096d684a1e18529ab4879cdba0aChristian König pipe->screen, 100b8a6e0e6fc451096d684a1e18529ab4879cdba0aChristian König PIPE_BIND_VERTEX_BUFFER, 101b8a6e0e6fc451096d684a1e18529ab4879cdba0aChristian König PIPE_USAGE_STATIC, 102b8a6e0e6fc451096d684a1e18529ab4879cdba0aChristian König sizeof(struct vertex2s) * width * height 103b8a6e0e6fc451096d684a1e18529ab4879cdba0aChristian König ); 104599140119ebdef8dcae9e465ee6177dabb44b8b0Vinson Lee pos.user_buffer = NULL; 105b8a6e0e6fc451096d684a1e18529ab4879cdba0aChristian König 106b8a6e0e6fc451096d684a1e18529ab4879cdba0aChristian König if(!pos.buffer) 107b8a6e0e6fc451096d684a1e18529ab4879cdba0aChristian König return pos; 108b8a6e0e6fc451096d684a1e18529ab4879cdba0aChristian König 109b8a6e0e6fc451096d684a1e18529ab4879cdba0aChristian König /* and fill it */ 110b8a6e0e6fc451096d684a1e18529ab4879cdba0aChristian König v = pipe_buffer_map 111b8a6e0e6fc451096d684a1e18529ab4879cdba0aChristian König ( 112b8a6e0e6fc451096d684a1e18529ab4879cdba0aChristian König pipe, 113b8a6e0e6fc451096d684a1e18529ab4879cdba0aChristian König pos.buffer, 1147cd1c62b6be88072e3d937b67c499592490927f1Marek Olšák PIPE_TRANSFER_WRITE | PIPE_TRANSFER_DISCARD_RANGE, 115b8a6e0e6fc451096d684a1e18529ab4879cdba0aChristian König &buf_transfer 116b8a6e0e6fc451096d684a1e18529ab4879cdba0aChristian König ); 117b8a6e0e6fc451096d684a1e18529ab4879cdba0aChristian König 118b8a6e0e6fc451096d684a1e18529ab4879cdba0aChristian König for ( y = 0; y < height; ++y) { 119b8a6e0e6fc451096d684a1e18529ab4879cdba0aChristian König for ( x = 0; x < width; ++x, ++v) { 120b8a6e0e6fc451096d684a1e18529ab4879cdba0aChristian König v->x = x; 121b8a6e0e6fc451096d684a1e18529ab4879cdba0aChristian König v->y = y; 122b8a6e0e6fc451096d684a1e18529ab4879cdba0aChristian König } 123b8a6e0e6fc451096d684a1e18529ab4879cdba0aChristian König } 124b8a6e0e6fc451096d684a1e18529ab4879cdba0aChristian König 125b8a6e0e6fc451096d684a1e18529ab4879cdba0aChristian König pipe_buffer_unmap(pipe, buf_transfer); 126b8a6e0e6fc451096d684a1e18529ab4879cdba0aChristian König 127b8a6e0e6fc451096d684a1e18529ab4879cdba0aChristian König return pos; 128b8a6e0e6fc451096d684a1e18529ab4879cdba0aChristian König} 129b8a6e0e6fc451096d684a1e18529ab4879cdba0aChristian König 130310eea52ca1e997295c84163066cc5d0fd4f8cf6Christian Königstatic struct pipe_vertex_element 131c8236aaf7056bd8645804e71596d2d6460e62d15Christian Königvl_vb_get_quad_vertex_element(void) 1320b749d6dcb537472771d6fe6e454aafc916ab3feChristian König{ 1330b749d6dcb537472771d6fe6e454aafc916ab3feChristian König struct pipe_vertex_element element; 1340b749d6dcb537472771d6fe6e454aafc916ab3feChristian König 1350b749d6dcb537472771d6fe6e454aafc916ab3feChristian König /* setup rectangle element */ 1360b749d6dcb537472771d6fe6e454aafc916ab3feChristian König element.src_offset = 0; 1370b749d6dcb537472771d6fe6e454aafc916ab3feChristian König element.instance_divisor = 0; 1380b749d6dcb537472771d6fe6e454aafc916ab3feChristian König element.vertex_buffer_index = 0; 1393511780a43077d1359bd491eadb4ab9b3b86795aChristian König element.src_format = PIPE_FORMAT_R32G32_FLOAT; 1400b749d6dcb537472771d6fe6e454aafc916ab3feChristian König 1410b749d6dcb537472771d6fe6e454aafc916ab3feChristian König return element; 1420b749d6dcb537472771d6fe6e454aafc916ab3feChristian König} 1430b749d6dcb537472771d6fe6e454aafc916ab3feChristian König 144310eea52ca1e997295c84163066cc5d0fd4f8cf6Christian Königstatic void 1450b749d6dcb537472771d6fe6e454aafc916ab3feChristian Königvl_vb_element_helper(struct pipe_vertex_element* elements, unsigned num_elements, 1463511780a43077d1359bd491eadb4ab9b3b86795aChristian König unsigned vertex_buffer_index) 1470b749d6dcb537472771d6fe6e454aafc916ab3feChristian König{ 148b922a0ce12916a91cfc3e56714913fcf63279ff2Christian König unsigned i, offset = 0; 1490b749d6dcb537472771d6fe6e454aafc916ab3feChristian König 1500b749d6dcb537472771d6fe6e454aafc916ab3feChristian König assert(elements && num_elements); 1510b749d6dcb537472771d6fe6e454aafc916ab3feChristian König 1520b749d6dcb537472771d6fe6e454aafc916ab3feChristian König for ( i = 0; i < num_elements; ++i ) { 153849bc838e81f930e6f090e6c6597bb92e822b4c9Christian König elements[i].src_offset = offset; 1544ea38176028a6ecfc6ed195f64429b6b34279359Christian König elements[i].instance_divisor = 1; 1550b749d6dcb537472771d6fe6e454aafc916ab3feChristian König elements[i].vertex_buffer_index = vertex_buffer_index; 1560b749d6dcb537472771d6fe6e454aafc916ab3feChristian König offset += util_format_get_blocksize(elements[i].src_format); 1570b749d6dcb537472771d6fe6e454aafc916ab3feChristian König } 158310eea52ca1e997295c84163066cc5d0fd4f8cf6Christian König} 159310eea52ca1e997295c84163066cc5d0fd4f8cf6Christian König 160310eea52ca1e997295c84163066cc5d0fd4f8cf6Christian Königvoid * 161849bc838e81f930e6f090e6c6597bb92e822b4c9Christian Königvl_vb_get_ves_ycbcr(struct pipe_context *pipe) 162310eea52ca1e997295c84163066cc5d0fd4f8cf6Christian König{ 163310eea52ca1e997295c84163066cc5d0fd4f8cf6Christian König struct pipe_vertex_element vertex_elems[NUM_VS_INPUTS]; 164310eea52ca1e997295c84163066cc5d0fd4f8cf6Christian König 165c87b83d4b2b860bb4c9f90897232e661a2b94c07Christian König assert(pipe); 166c87b83d4b2b860bb4c9f90897232e661a2b94c07Christian König 167310eea52ca1e997295c84163066cc5d0fd4f8cf6Christian König memset(&vertex_elems, 0, sizeof(vertex_elems)); 168310eea52ca1e997295c84163066cc5d0fd4f8cf6Christian König vertex_elems[VS_I_RECT] = vl_vb_get_quad_vertex_element(); 169310eea52ca1e997295c84163066cc5d0fd4f8cf6Christian König 170310eea52ca1e997295c84163066cc5d0fd4f8cf6Christian König /* Position element */ 1713511780a43077d1359bd491eadb4ab9b3b86795aChristian König vertex_elems[VS_I_VPOS].src_format = PIPE_FORMAT_R8G8B8A8_USCALED; 172310eea52ca1e997295c84163066cc5d0fd4f8cf6Christian König 173a6c76c8a90dc8995feed3c61b02dbd8408149036Christian König /* block num element */ 17431096e13f858daf896c0c53077fb25e92da089a6Christian König vertex_elems[VS_I_BLOCK_NUM].src_format = PIPE_FORMAT_R32_FLOAT; 175a6c76c8a90dc8995feed3c61b02dbd8408149036Christian König 17631096e13f858daf896c0c53077fb25e92da089a6Christian König vl_vb_element_helper(&vertex_elems[VS_I_VPOS], 2, 1); 177a6c76c8a90dc8995feed3c61b02dbd8408149036Christian König 178a6c76c8a90dc8995feed3c61b02dbd8408149036Christian König return pipe->create_vertex_elements_state(pipe, 3, vertex_elems); 179c87b83d4b2b860bb4c9f90897232e661a2b94c07Christian König} 180c87b83d4b2b860bb4c9f90897232e661a2b94c07Christian König 181c87b83d4b2b860bb4c9f90897232e661a2b94c07Christian Königvoid * 18238a315b7049946d124409b377e622994feccdcb7Christian Königvl_vb_get_ves_mv(struct pipe_context *pipe) 183c87b83d4b2b860bb4c9f90897232e661a2b94c07Christian König{ 184c87b83d4b2b860bb4c9f90897232e661a2b94c07Christian König struct pipe_vertex_element vertex_elems[NUM_VS_INPUTS]; 185c87b83d4b2b860bb4c9f90897232e661a2b94c07Christian König 186b8a6e0e6fc451096d684a1e18529ab4879cdba0aChristian König assert(pipe); 187b8a6e0e6fc451096d684a1e18529ab4879cdba0aChristian König 188c87b83d4b2b860bb4c9f90897232e661a2b94c07Christian König memset(&vertex_elems, 0, sizeof(vertex_elems)); 189c87b83d4b2b860bb4c9f90897232e661a2b94c07Christian König vertex_elems[VS_I_RECT] = vl_vb_get_quad_vertex_element(); 190c87b83d4b2b860bb4c9f90897232e661a2b94c07Christian König 191c87b83d4b2b860bb4c9f90897232e661a2b94c07Christian König /* Position element */ 192c87b83d4b2b860bb4c9f90897232e661a2b94c07Christian König vertex_elems[VS_I_VPOS].src_format = PIPE_FORMAT_R16G16_SSCALED; 193c87b83d4b2b860bb4c9f90897232e661a2b94c07Christian König 194b8a6e0e6fc451096d684a1e18529ab4879cdba0aChristian König vl_vb_element_helper(&vertex_elems[VS_I_VPOS], 1, 1); 195b8a6e0e6fc451096d684a1e18529ab4879cdba0aChristian König 19610c49b28752f5f2d822dfb1e2e6a1ec213cc44daChristian König /* motion vector TOP element */ 19710c49b28752f5f2d822dfb1e2e6a1ec213cc44daChristian König vertex_elems[VS_I_MV_TOP].src_format = PIPE_FORMAT_R16G16B16A16_SSCALED; 1980b749d6dcb537472771d6fe6e454aafc916ab3feChristian König 19910c49b28752f5f2d822dfb1e2e6a1ec213cc44daChristian König /* motion vector BOTTOM element */ 20010c49b28752f5f2d822dfb1e2e6a1ec213cc44daChristian König vertex_elems[VS_I_MV_BOTTOM].src_format = PIPE_FORMAT_R16G16B16A16_SSCALED; 201310eea52ca1e997295c84163066cc5d0fd4f8cf6Christian König 202b8a6e0e6fc451096d684a1e18529ab4879cdba0aChristian König vl_vb_element_helper(&vertex_elems[VS_I_MV_TOP], 2, 2); 203310eea52ca1e997295c84163066cc5d0fd4f8cf6Christian König 204794cde3f5ef59cf603be284fbc8de33d2cda7d2cChristian König return pipe->create_vertex_elements_state(pipe, NUM_VS_INPUTS, vertex_elems); 2050b749d6dcb537472771d6fe6e454aafc916ab3feChristian König} 2060b749d6dcb537472771d6fe6e454aafc916ab3feChristian König 20724d76d2966a5c666c9627034e6751621b17024c8Christian Königbool 2083511780a43077d1359bd491eadb4ab9b3b86795aChristian Königvl_vb_init(struct vl_vertex_buffer *buffer, struct pipe_context *pipe, 2093511780a43077d1359bd491eadb4ab9b3b86795aChristian König unsigned width, unsigned height) 2104abe7382882a451a7750ccc451b8568768d122cbChristian König{ 211849bc838e81f930e6f090e6c6597bb92e822b4c9Christian König unsigned i, size; 2121482b9a7f39ec8875fcd4137c35b3cb9ac0c0934Christian König 2134abe7382882a451a7750ccc451b8568768d122cbChristian König assert(buffer); 2144abe7382882a451a7750ccc451b8568768d122cbChristian König 215b8a6e0e6fc451096d684a1e18529ab4879cdba0aChristian König buffer->width = width; 216b8a6e0e6fc451096d684a1e18529ab4879cdba0aChristian König buffer->height = height; 2171482b9a7f39ec8875fcd4137c35b3cb9ac0c0934Christian König 218849bc838e81f930e6f090e6c6597bb92e822b4c9Christian König size = width * height; 219849bc838e81f930e6f090e6c6597bb92e822b4c9Christian König 2208abbdb8865890e1a39ebbbfae38422014f80072aChristian König for (i = 0; i < VL_NUM_COMPONENTS; ++i) { 221849bc838e81f930e6f090e6c6597bb92e822b4c9Christian König buffer->ycbcr[i].resource = pipe_buffer_create 222849bc838e81f930e6f090e6c6597bb92e822b4c9Christian König ( 223849bc838e81f930e6f090e6c6597bb92e822b4c9Christian König pipe->screen, 224849bc838e81f930e6f090e6c6597bb92e822b4c9Christian König PIPE_BIND_VERTEX_BUFFER, 225849bc838e81f930e6f090e6c6597bb92e822b4c9Christian König PIPE_USAGE_STREAM, 226d3770d6229d95e9beb67358ae2b2c8824ed3ae58Christian König sizeof(struct vl_ycbcr_block) * size * 4 227849bc838e81f930e6f090e6c6597bb92e822b4c9Christian König ); 22824d76d2966a5c666c9627034e6751621b17024c8Christian König if (!buffer->ycbcr[i].resource) 22924d76d2966a5c666c9627034e6751621b17024c8Christian König goto error_ycbcr; 230849bc838e81f930e6f090e6c6597bb92e822b4c9Christian König } 2311482b9a7f39ec8875fcd4137c35b3cb9ac0c0934Christian König 232b8a6e0e6fc451096d684a1e18529ab4879cdba0aChristian König for (i = 0; i < VL_MAX_REF_FRAMES; ++i) { 233b8a6e0e6fc451096d684a1e18529ab4879cdba0aChristian König buffer->mv[i].resource = pipe_buffer_create 234b8a6e0e6fc451096d684a1e18529ab4879cdba0aChristian König ( 235b8a6e0e6fc451096d684a1e18529ab4879cdba0aChristian König pipe->screen, 236b8a6e0e6fc451096d684a1e18529ab4879cdba0aChristian König PIPE_BIND_VERTEX_BUFFER, 237b8a6e0e6fc451096d684a1e18529ab4879cdba0aChristian König PIPE_USAGE_STREAM, 238d3770d6229d95e9beb67358ae2b2c8824ed3ae58Christian König sizeof(struct vl_motionvector) * size 239b8a6e0e6fc451096d684a1e18529ab4879cdba0aChristian König ); 24024d76d2966a5c666c9627034e6751621b17024c8Christian König if (!buffer->mv[i].resource) 24124d76d2966a5c666c9627034e6751621b17024c8Christian König goto error_mv; 242b8a6e0e6fc451096d684a1e18529ab4879cdba0aChristian König } 2431482b9a7f39ec8875fcd4137c35b3cb9ac0c0934Christian König 2441482b9a7f39ec8875fcd4137c35b3cb9ac0c0934Christian König vl_vb_map(buffer, pipe); 24524d76d2966a5c666c9627034e6751621b17024c8Christian König return true; 24624d76d2966a5c666c9627034e6751621b17024c8Christian König 24724d76d2966a5c666c9627034e6751621b17024c8Christian Königerror_mv: 2488abbdb8865890e1a39ebbbfae38422014f80072aChristian König for (i = 0; i < VL_NUM_COMPONENTS; ++i) 24924d76d2966a5c666c9627034e6751621b17024c8Christian König pipe_resource_reference(&buffer->mv[i].resource, NULL); 25024d76d2966a5c666c9627034e6751621b17024c8Christian König 25124d76d2966a5c666c9627034e6751621b17024c8Christian Königerror_ycbcr: 2528abbdb8865890e1a39ebbbfae38422014f80072aChristian König for (i = 0; i < VL_NUM_COMPONENTS; ++i) 25324d76d2966a5c666c9627034e6751621b17024c8Christian König pipe_resource_reference(&buffer->ycbcr[i].resource, NULL); 25424d76d2966a5c666c9627034e6751621b17024c8Christian König return false; 255b8a6e0e6fc451096d684a1e18529ab4879cdba0aChristian König} 256b8a6e0e6fc451096d684a1e18529ab4879cdba0aChristian König 257a6c76c8a90dc8995feed3c61b02dbd8408149036Christian Königunsigned 258a6c76c8a90dc8995feed3c61b02dbd8408149036Christian Königvl_vb_attributes_per_plock(struct vl_vertex_buffer *buffer) 259a6c76c8a90dc8995feed3c61b02dbd8408149036Christian König{ 260a6c76c8a90dc8995feed3c61b02dbd8408149036Christian König return 1; 261a6c76c8a90dc8995feed3c61b02dbd8408149036Christian König} 262a6c76c8a90dc8995feed3c61b02dbd8408149036Christian König 263b8a6e0e6fc451096d684a1e18529ab4879cdba0aChristian Königstruct pipe_vertex_buffer 264849bc838e81f930e6f090e6c6597bb92e822b4c9Christian Königvl_vb_get_ycbcr(struct vl_vertex_buffer *buffer, int component) 265b8a6e0e6fc451096d684a1e18529ab4879cdba0aChristian König{ 266b8a6e0e6fc451096d684a1e18529ab4879cdba0aChristian König struct pipe_vertex_buffer buf; 267b8a6e0e6fc451096d684a1e18529ab4879cdba0aChristian König 268b8a6e0e6fc451096d684a1e18529ab4879cdba0aChristian König assert(buffer); 269b8a6e0e6fc451096d684a1e18529ab4879cdba0aChristian König 270d3770d6229d95e9beb67358ae2b2c8824ed3ae58Christian König buf.stride = sizeof(struct vl_ycbcr_block); 271b8a6e0e6fc451096d684a1e18529ab4879cdba0aChristian König buf.buffer_offset = 0; 272849bc838e81f930e6f090e6c6597bb92e822b4c9Christian König buf.buffer = buffer->ycbcr[component].resource; 273599140119ebdef8dcae9e465ee6177dabb44b8b0Vinson Lee buf.user_buffer = NULL; 274b8a6e0e6fc451096d684a1e18529ab4879cdba0aChristian König 275b8a6e0e6fc451096d684a1e18529ab4879cdba0aChristian König return buf; 276b8a6e0e6fc451096d684a1e18529ab4879cdba0aChristian König} 277b8a6e0e6fc451096d684a1e18529ab4879cdba0aChristian König 278b8a6e0e6fc451096d684a1e18529ab4879cdba0aChristian Königstruct pipe_vertex_buffer 279b8a6e0e6fc451096d684a1e18529ab4879cdba0aChristian Königvl_vb_get_mv(struct vl_vertex_buffer *buffer, int motionvector) 280b8a6e0e6fc451096d684a1e18529ab4879cdba0aChristian König{ 281b8a6e0e6fc451096d684a1e18529ab4879cdba0aChristian König struct pipe_vertex_buffer buf; 282b8a6e0e6fc451096d684a1e18529ab4879cdba0aChristian König 283b8a6e0e6fc451096d684a1e18529ab4879cdba0aChristian König assert(buffer); 284b8a6e0e6fc451096d684a1e18529ab4879cdba0aChristian König 285d3770d6229d95e9beb67358ae2b2c8824ed3ae58Christian König buf.stride = sizeof(struct vl_motionvector); 286b8a6e0e6fc451096d684a1e18529ab4879cdba0aChristian König buf.buffer_offset = 0; 287b8a6e0e6fc451096d684a1e18529ab4879cdba0aChristian König buf.buffer = buffer->mv[motionvector].resource; 288599140119ebdef8dcae9e465ee6177dabb44b8b0Vinson Lee buf.user_buffer = NULL; 2891482b9a7f39ec8875fcd4137c35b3cb9ac0c0934Christian König 2901482b9a7f39ec8875fcd4137c35b3cb9ac0c0934Christian König return buf; 2914abe7382882a451a7750ccc451b8568768d122cbChristian König} 2924abe7382882a451a7750ccc451b8568768d122cbChristian König 2931482b9a7f39ec8875fcd4137c35b3cb9ac0c0934Christian Königvoid 2941482b9a7f39ec8875fcd4137c35b3cb9ac0c0934Christian Königvl_vb_map(struct vl_vertex_buffer *buffer, struct pipe_context *pipe) 2954abe7382882a451a7750ccc451b8568768d122cbChristian König{ 296b8a6e0e6fc451096d684a1e18529ab4879cdba0aChristian König unsigned i; 297b8a6e0e6fc451096d684a1e18529ab4879cdba0aChristian König 2981482b9a7f39ec8875fcd4137c35b3cb9ac0c0934Christian König assert(buffer && pipe); 2994abe7382882a451a7750ccc451b8568768d122cbChristian König 3008abbdb8865890e1a39ebbbfae38422014f80072aChristian König for (i = 0; i < VL_NUM_COMPONENTS; ++i) { 301849bc838e81f930e6f090e6c6597bb92e822b4c9Christian König buffer->ycbcr[i].vertex_stream = pipe_buffer_map 302849bc838e81f930e6f090e6c6597bb92e822b4c9Christian König ( 303849bc838e81f930e6f090e6c6597bb92e822b4c9Christian König pipe, 304849bc838e81f930e6f090e6c6597bb92e822b4c9Christian König buffer->ycbcr[i].resource, 3057cd1c62b6be88072e3d937b67c499592490927f1Marek Olšák PIPE_TRANSFER_WRITE | PIPE_TRANSFER_DISCARD_RANGE, 306849bc838e81f930e6f090e6c6597bb92e822b4c9Christian König &buffer->ycbcr[i].transfer 307849bc838e81f930e6f090e6c6597bb92e822b4c9Christian König ); 308849bc838e81f930e6f090e6c6597bb92e822b4c9Christian König } 309b8a6e0e6fc451096d684a1e18529ab4879cdba0aChristian König 310b8a6e0e6fc451096d684a1e18529ab4879cdba0aChristian König for (i = 0; i < VL_MAX_REF_FRAMES; ++i) { 311b8a6e0e6fc451096d684a1e18529ab4879cdba0aChristian König buffer->mv[i].vertex_stream = pipe_buffer_map 312b8a6e0e6fc451096d684a1e18529ab4879cdba0aChristian König ( 313b8a6e0e6fc451096d684a1e18529ab4879cdba0aChristian König pipe, 314b8a6e0e6fc451096d684a1e18529ab4879cdba0aChristian König buffer->mv[i].resource, 3157cd1c62b6be88072e3d937b67c499592490927f1Marek Olšák PIPE_TRANSFER_WRITE | PIPE_TRANSFER_DISCARD_RANGE, 316b8a6e0e6fc451096d684a1e18529ab4879cdba0aChristian König &buffer->mv[i].transfer 317b8a6e0e6fc451096d684a1e18529ab4879cdba0aChristian König ); 318b8a6e0e6fc451096d684a1e18529ab4879cdba0aChristian König } 319b8a6e0e6fc451096d684a1e18529ab4879cdba0aChristian König 320310eea52ca1e997295c84163066cc5d0fd4f8cf6Christian König} 321310eea52ca1e997295c84163066cc5d0fd4f8cf6Christian König 322d3770d6229d95e9beb67358ae2b2c8824ed3ae58Christian Königstruct vl_ycbcr_block * 3232e6274fc3b123e7de695038054b5cbd20b11559aChristian Königvl_vb_get_ycbcr_stream(struct vl_vertex_buffer *buffer, int component) 3243511780a43077d1359bd491eadb4ab9b3b86795aChristian König{ 3253511780a43077d1359bd491eadb4ab9b3b86795aChristian König assert(buffer); 3268abbdb8865890e1a39ebbbfae38422014f80072aChristian König assert(component < VL_NUM_COMPONENTS); 3273511780a43077d1359bd491eadb4ab9b3b86795aChristian König 3282e6274fc3b123e7de695038054b5cbd20b11559aChristian König return buffer->ycbcr[component].vertex_stream; 3293511780a43077d1359bd491eadb4ab9b3b86795aChristian König} 3303511780a43077d1359bd491eadb4ab9b3b86795aChristian König 331b7acf83d523563cde613fe805bd8edaa02f64b53Christian Königunsigned 332b7acf83d523563cde613fe805bd8edaa02f64b53Christian Königvl_vb_get_mv_stream_stride(struct vl_vertex_buffer *buffer) 333310eea52ca1e997295c84163066cc5d0fd4f8cf6Christian König{ 334b7acf83d523563cde613fe805bd8edaa02f64b53Christian König assert(buffer); 33510c49b28752f5f2d822dfb1e2e6a1ec213cc44daChristian König 336b7acf83d523563cde613fe805bd8edaa02f64b53Christian König return buffer->width; 337310eea52ca1e997295c84163066cc5d0fd4f8cf6Christian König} 338310eea52ca1e997295c84163066cc5d0fd4f8cf6Christian König 339d3770d6229d95e9beb67358ae2b2c8824ed3ae58Christian Königstruct vl_motionvector * 340b7acf83d523563cde613fe805bd8edaa02f64b53Christian Königvl_vb_get_mv_stream(struct vl_vertex_buffer *buffer, int ref_frame) 341310eea52ca1e997295c84163066cc5d0fd4f8cf6Christian König{ 342310eea52ca1e997295c84163066cc5d0fd4f8cf6Christian König assert(buffer); 343b7acf83d523563cde613fe805bd8edaa02f64b53Christian König assert(ref_frame < VL_MAX_REF_FRAMES); 344310eea52ca1e997295c84163066cc5d0fd4f8cf6Christian König 345b7acf83d523563cde613fe805bd8edaa02f64b53Christian König return buffer->mv[ref_frame].vertex_stream; 3461482b9a7f39ec8875fcd4137c35b3cb9ac0c0934Christian König} 3474abe7382882a451a7750ccc451b8568768d122cbChristian König 3481482b9a7f39ec8875fcd4137c35b3cb9ac0c0934Christian Königvoid 3491482b9a7f39ec8875fcd4137c35b3cb9ac0c0934Christian Königvl_vb_unmap(struct vl_vertex_buffer *buffer, struct pipe_context *pipe) 3501482b9a7f39ec8875fcd4137c35b3cb9ac0c0934Christian König{ 351b8a6e0e6fc451096d684a1e18529ab4879cdba0aChristian König unsigned i; 352b8a6e0e6fc451096d684a1e18529ab4879cdba0aChristian König 3531482b9a7f39ec8875fcd4137c35b3cb9ac0c0934Christian König assert(buffer && pipe); 3544abe7382882a451a7750ccc451b8568768d122cbChristian König 3558abbdb8865890e1a39ebbbfae38422014f80072aChristian König for (i = 0; i < VL_NUM_COMPONENTS; ++i) { 356849bc838e81f930e6f090e6c6597bb92e822b4c9Christian König pipe_buffer_unmap(pipe, buffer->ycbcr[i].transfer); 357849bc838e81f930e6f090e6c6597bb92e822b4c9Christian König } 358849bc838e81f930e6f090e6c6597bb92e822b4c9Christian König 359b8a6e0e6fc451096d684a1e18529ab4879cdba0aChristian König for (i = 0; i < VL_MAX_REF_FRAMES; ++i) { 360b8a6e0e6fc451096d684a1e18529ab4879cdba0aChristian König pipe_buffer_unmap(pipe, buffer->mv[i].transfer); 361b8a6e0e6fc451096d684a1e18529ab4879cdba0aChristian König } 3621482b9a7f39ec8875fcd4137c35b3cb9ac0c0934Christian König} 3631482b9a7f39ec8875fcd4137c35b3cb9ac0c0934Christian König 3644abe7382882a451a7750ccc451b8568768d122cbChristian Königvoid 3654abe7382882a451a7750ccc451b8568768d122cbChristian Königvl_vb_cleanup(struct vl_vertex_buffer *buffer) 3664abe7382882a451a7750ccc451b8568768d122cbChristian König{ 367b8a6e0e6fc451096d684a1e18529ab4879cdba0aChristian König unsigned i; 368b8a6e0e6fc451096d684a1e18529ab4879cdba0aChristian König 3694abe7382882a451a7750ccc451b8568768d122cbChristian König assert(buffer); 3704abe7382882a451a7750ccc451b8568768d122cbChristian König 3718abbdb8865890e1a39ebbbfae38422014f80072aChristian König for (i = 0; i < VL_NUM_COMPONENTS; ++i) { 372849bc838e81f930e6f090e6c6597bb92e822b4c9Christian König pipe_resource_reference(&buffer->ycbcr[i].resource, NULL); 373849bc838e81f930e6f090e6c6597bb92e822b4c9Christian König } 374b8a6e0e6fc451096d684a1e18529ab4879cdba0aChristian König 375b8a6e0e6fc451096d684a1e18529ab4879cdba0aChristian König for (i = 0; i < VL_MAX_REF_FRAMES; ++i) { 376b8a6e0e6fc451096d684a1e18529ab4879cdba0aChristian König pipe_resource_reference(&buffer->mv[i].resource, NULL); 377b8a6e0e6fc451096d684a1e18529ab4879cdba0aChristian König } 3784abe7382882a451a7750ccc451b8568768d122cbChristian König} 379