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