1 /**********************************************************
2 * Copyright 2009-2011 VMware, Inc. All rights reserved.
4 * Permission is hereby granted, free of charge, to any person
5 * obtaining a copy of this software and associated documentation
6 * files (the "Software"), to deal in the Software without
7 * restriction, including without limitation the rights to use, copy,
8 * modify, merge, publish, distribute, sublicense, and/or sell copies
9 * of the Software, and to permit persons to whom the Software is
10 * furnished to do so, subject to the following conditions:
12 * The above copyright notice and this permission notice shall be
13 * included in all copies or substantial portions of the Software.
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
19 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
20 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
21 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
24 *********************************************************
26 * Zack Rusin <zackr-at-vmware-dot-com>
27 * Thomas Hellstrom <thellstrom-at-vmware-dot-com>
33 #include "xa_tracker.h"
34 #include "xa_context.h"
36 #include "pipe/p_screen.h"
37 #include "pipe/p_context.h"
38 #include "pipe/p_state.h"
40 #define XA_VB_SIZE (100 * 4 * 3 * 4)
41 #define XA_LAST_SURFACE_TYPE (xa_type_yuv_component + 1)
44 struct pipe_fence_handle
*pipe_fence
;
45 struct xa_tracker
*xa
;
48 struct xa_format_descriptor
{
49 enum pipe_format format
;
50 enum xa_formats xa_format
;
54 struct pipe_resource
template;
55 struct xa_tracker
*xa
;
56 struct pipe_resource
*tex
;
57 struct pipe_surface
*srf
;
58 struct pipe_sampler_view
*view
;
60 struct xa_format_descriptor fdesc
;
61 struct pipe_transfer
*transfer
;
62 struct pipe_context
*mapping_pipe
;
66 enum xa_formats
*supported_formats
;
67 unsigned int format_map
[XA_LAST_SURFACE_TYPE
][2];
68 int d_depth_bits_last
;
69 int ds_depth_bits_last
;
70 struct pipe_screen
*screen
;
71 struct xa_context
*default_ctx
;
75 struct xa_tracker
*xa
;
76 struct pipe_context
*pipe
;
78 struct cso_context
*cso
;
79 struct xa_shaders
*shaders
;
81 struct pipe_resource
*vs_const_buffer
;
82 struct pipe_resource
*fs_const_buffer
;
84 float buffer
[XA_VB_SIZE
];
85 unsigned int buffer_size
;
86 struct pipe_vertex_element velems
[3];
88 /* number of attributes per vertex for the current
90 unsigned int attrs_per_vertex
;
92 unsigned int fb_width
;
93 unsigned int fb_height
;
95 struct pipe_fence_handle
*last_fence
;
96 struct xa_surface
*src
;
97 struct xa_surface
*dst
;
101 VS_COMPOSITE
= 1 << 0,
103 VS_SOLID_FILL
= 1 << 2,
104 VS_LINGRAD_FILL
= 1 << 3,
105 VS_RADGRAD_FILL
= 1 << 4,
108 VS_FILL
= (VS_SOLID_FILL
| VS_LINGRAD_FILL
| VS_RADGRAD_FILL
)
112 FS_COMPOSITE
= 1 << 0,
114 FS_SOLID_FILL
= 1 << 2,
115 FS_LINGRAD_FILL
= 1 << 3,
116 FS_RADGRAD_FILL
= 1 << 4,
117 FS_CA_FULL
= 1 << 5, /* src.rgba * mask.rgba */
118 FS_CA_SRCALPHA
= 1 << 6, /* src.aaaa * mask.rgba */
120 FS_SRC_REPEAT_NONE
= 1 << 8,
121 FS_MASK_REPEAT_NONE
= 1 << 9,
122 FS_SRC_SWIZZLE_RGB
= 1 << 10,
123 FS_MASK_SWIZZLE_RGB
= 1 << 11,
124 FS_SRC_SET_ALPHA
= 1 << 12,
125 FS_MASK_SET_ALPHA
= 1 << 13,
126 FS_SRC_LUMINANCE
= 1 << 14,
127 FS_MASK_LUMINANCE
= 1 << 15,
129 FS_FILL
= (FS_SOLID_FILL
| FS_LINGRAD_FILL
| FS_RADGRAD_FILL
),
130 FS_COMPONENT_ALPHA
= (FS_CA_FULL
| FS_CA_SRCALPHA
)
141 return ((a
<= b
) ? a
: b
);
150 extern struct xa_shaders
*xa_shaders_create(struct xa_context
*);
152 void xa_shaders_destroy(struct xa_shaders
*shaders
);
154 struct xa_shader
xa_shaders_get(struct xa_shaders
*shaders
,
155 unsigned vs_traits
, unsigned fs_traits
);
160 void renderer_set_constants(struct xa_context
*r
,
161 int shader_type
, const float *params
,
164 void renderer_draw_yuv(struct xa_context
*r
,
170 int dst_y
, int dst_w
, int dst_h
,
171 struct xa_surface
*srf
[]);
173 void renderer_bind_destination(struct xa_context
*r
,
174 struct pipe_surface
*surface
, int width
,
177 void renderer_init_state(struct xa_context
*r
);