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"
35
#include "xa_composite.h"
37
#include "pipe/p_screen.h"
38
#include "pipe/p_context.h"
39
#include "pipe/p_state.h"
41
#if defined(__GNUC__) && __GNUC__ >= 4
42
#define XA_EXPORT __attribute__ ((visibility("default")))
47
#define XA_VB_SIZE (100 * 4 * 3 * 4)
48
#define XA_LAST_SURFACE_TYPE (xa_type_yuv_component + 1)
49
#define XA_MAX_SAMPLERS 3
52
struct pipe_fence_handle *pipe_fence;
53
struct xa_tracker *xa;
56
struct xa_format_descriptor {
57
enum pipe_format format;
58
enum xa_formats xa_format;
62
struct pipe_resource template;
63
struct xa_tracker *xa;
64
struct pipe_resource *tex;
65
struct pipe_transfer *transfer;
67
struct xa_format_descriptor fdesc;
68
struct pipe_context *mapping_pipe;
72
enum xa_formats *supported_formats;
73
unsigned int format_map[XA_LAST_SURFACE_TYPE][2];
74
int d_depth_bits_last;
75
int ds_depth_bits_last;
76
struct pipe_screen *screen;
77
struct xa_context *default_ctx;
81
struct xa_tracker *xa;
82
struct pipe_context *pipe;
84
struct cso_context *cso;
85
struct xa_shaders *shaders;
87
struct pipe_resource *vs_const_buffer;
88
struct pipe_resource *fs_const_buffer;
90
float buffer[XA_VB_SIZE];
91
unsigned int buffer_size;
92
struct pipe_vertex_element velems[3];
94
/* number of attributes per vertex for the current
96
unsigned int attrs_per_vertex;
98
unsigned int fb_width;
99
unsigned int fb_height;
101
struct pipe_fence_handle *last_fence;
102
struct xa_surface *src;
103
struct xa_surface *dst;
104
struct pipe_surface *srf;
109
float solid_color[4];
111
unsigned int num_bound_samplers;
112
struct pipe_sampler_view *bound_sampler_views[XA_MAX_SAMPLERS];
113
const struct xa_composite *comp;
117
VS_COMPOSITE = 1 << 0,
119
VS_SOLID_FILL = 1 << 2,
120
VS_LINGRAD_FILL = 1 << 3,
121
VS_RADGRAD_FILL = 1 << 4,
124
VS_FILL = (VS_SOLID_FILL | VS_LINGRAD_FILL | VS_RADGRAD_FILL)
128
FS_COMPOSITE = 1 << 0,
130
FS_SOLID_FILL = 1 << 2,
131
FS_LINGRAD_FILL = 1 << 3,
132
FS_RADGRAD_FILL = 1 << 4,
133
FS_CA_FULL = 1 << 5, /* src.rgba * mask.rgba */
134
FS_CA_SRCALPHA = 1 << 6, /* src.aaaa * mask.rgba */
136
FS_SRC_REPEAT_NONE = 1 << 8,
137
FS_MASK_REPEAT_NONE = 1 << 9,
138
FS_SRC_SWIZZLE_RGB = 1 << 10,
139
FS_MASK_SWIZZLE_RGB = 1 << 11,
140
FS_SRC_SET_ALPHA = 1 << 12,
141
FS_MASK_SET_ALPHA = 1 << 13,
142
FS_SRC_LUMINANCE = 1 << 14,
143
FS_MASK_LUMINANCE = 1 << 15,
144
FS_DST_LUMINANCE = 1 << 16,
146
FS_FILL = (FS_SOLID_FILL | FS_LINGRAD_FILL | FS_RADGRAD_FILL),
147
FS_COMPONENT_ALPHA = (FS_CA_FULL | FS_CA_SRCALPHA)
164
return ((a <= b) ? a : b);
168
xa_pixel_to_float4(uint32_t pixel, float *color)
172
a = (pixel >> 24) & 0xff;
173
r = (pixel >> 16) & 0xff;
174
g = (pixel >> 8) & 0xff;
175
b = (pixel >> 0) & 0xff;
176
color[0] = ((float)r) / 255.;
177
color[1] = ((float)g) / 255.;
178
color[2] = ((float)b) / 255.;
179
color[3] = ((float)a) / 255.;
183
xa_pixel_to_float4_a8(uint32_t pixel, float *color)
187
a = (pixel >> 24) & 0xff;
188
color[0] = ((float)a) / 255.;
189
color[1] = ((float)a) / 255.;
190
color[2] = ((float)a) / 255.;
191
color[3] = ((float)a) / 255.;
198
extern struct xa_shaders *xa_shaders_create(struct xa_context *);
200
void xa_shaders_destroy(struct xa_shaders *shaders);
202
struct xa_shader xa_shaders_get(struct xa_shaders *shaders,
203
unsigned vs_traits, unsigned fs_traits);
209
xa_ctx_srf_create(struct xa_context *ctx, struct xa_surface *dst);
212
xa_ctx_srf_destroy(struct xa_context *ctx);
215
xa_ctx_sampler_views_destroy(struct xa_context *ctx);
220
void renderer_set_constants(struct xa_context *r,
221
int shader_type, const float *params,
224
void renderer_draw_yuv(struct xa_context *r,
230
int dst_y, int dst_w, int dst_h,
231
struct xa_surface *srf[]);
233
void renderer_bind_destination(struct xa_context *r,
234
struct pipe_surface *surface, int width,
237
void renderer_init_state(struct xa_context *r);
238
void renderer_copy_prepare(struct xa_context *r,
239
struct pipe_surface *dst_surface,
240
struct pipe_resource *src_texture,
241
const enum xa_formats src_xa_format,
242
const enum xa_formats dst_xa_format);
244
void renderer_copy(struct xa_context *r, int dx,
248
int width, int height, float src_width, float src_height);
250
void renderer_draw_flush(struct xa_context *r);
252
void renderer_begin_solid(struct xa_context *r);
253
void renderer_solid(struct xa_context *r,
254
int x0, int y0, int x1, int y1, float *color);
256
renderer_begin_textures(struct xa_context *r);
259
renderer_texture(struct xa_context *r,
261
int width, int height,
262
const float *src_matrix,
263
const float *mask_matrix);