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