1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**************************************************************************
2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2009 VMware, Inc.  All Rights Reserved.
4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2010 LunarG, Inc.  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 VMWARE 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 "renderer.h"
29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "vg_context.h"
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_context.h"
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_state.h"
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_inlines.h"
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_screen.h"
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_shader_tokens.h"
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_draw_quad.h"
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_simple_shaders.h"
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_memory.h"
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_sampler.h"
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_surface.h"
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_math.h"
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_format.h"
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "cso_cache/cso_context.h"
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "tgsi/tgsi_ureg.h"
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtypedef enum {
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   RENDERER_STATE_INIT,
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   RENDERER_STATE_COPY,
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   RENDERER_STATE_DRAWTEX,
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   RENDERER_STATE_SCISSOR,
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   RENDERER_STATE_CLEAR,
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   RENDERER_STATE_FILTER,
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   RENDERER_STATE_POLYGON_STENCIL,
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   RENDERER_STATE_POLYGON_FILL,
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   NUM_RENDERER_STATES
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} RendererState;
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtypedef enum {
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   RENDERER_VS_PLAIN,
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   RENDERER_VS_COLOR,
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   RENDERER_VS_TEXTURE,
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   NUM_RENDERER_VS
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} RendererVs;
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtypedef enum {
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   RENDERER_FS_COLOR,
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   RENDERER_FS_TEXTURE,
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   RENDERER_FS_SCISSOR,
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   RENDERER_FS_WHITE,
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   NUM_RENDERER_FS
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} RendererFs;
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct renderer {
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct pipe_context *pipe;
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct cso_context *cso;
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   VGbitfield dirty;
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct {
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct pipe_rasterizer_state rasterizer;
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct pipe_depth_stencil_alpha_state dsa;
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct pipe_framebuffer_state fb;
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } g3d;
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct matrix projection;
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct matrix mvp;
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct pipe_resource *vs_cbuf;
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct pipe_resource *fs_cbuf;
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   VGfloat fs_cbuf_data[32];
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   VGint fs_cbuf_len;
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct pipe_vertex_element velems[2];
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   VGfloat vertices[4][2][4];
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void *cached_vs[NUM_RENDERER_VS];
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void *cached_fs[NUM_RENDERER_FS];
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   RendererState state;
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* state data */
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   union {
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct {
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         VGint tex_width;
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         VGint tex_height;
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      } copy;
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct {
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         VGint tex_width;
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         VGint tex_height;
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      } drawtex;
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct {
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         VGboolean restore_dsa;
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      } scissor;
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct {
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         VGboolean use_sampler;
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         VGint tex_width, tex_height;
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      } filter;
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct {
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         struct pipe_depth_stencil_alpha_state dsa;
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         VGboolean manual_two_sides;
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         VGboolean restore_dsa;
128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      } polygon_stencil;
129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } u;
130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Return VG_TRUE if the renderer can use the resource as the asked bindings.
134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic VGboolean renderer_can_support(struct renderer *renderer,
136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                      struct pipe_resource *res,
137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                      unsigned bindings)
138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct pipe_screen *screen = renderer->pipe->screen;
140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return screen->is_format_supported(screen,
142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         res->format, res->target, 0, bindings);
143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Set the model-view-projection matrix used by vertex shaders.
147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void renderer_set_mvp(struct renderer *renderer,
149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                             const struct matrix *mvp)
150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct matrix *cur = &renderer->mvp;
152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct pipe_resource *cbuf;
153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   VGfloat consts[3][4];
154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   VGint i;
155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* projection only */
157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!mvp)
158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      mvp = &renderer->projection;
159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* re-upload only if necessary */
161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (memcmp(cur, mvp, sizeof(*mvp)) == 0)
162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* 3x3 matrix to 3 constant vectors (no Z) */
165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < 3; i++) {
166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      consts[i][0] = mvp->m[i + 0];
167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      consts[i][1] = mvp->m[i + 3];
168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      consts[i][2] = 0.0f;
169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      consts[i][3] = mvp->m[i + 6];
170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   cbuf = renderer->vs_cbuf;
173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pipe_resource_reference(&cbuf, NULL);
174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   cbuf = pipe_buffer_create(renderer->pipe->screen,
175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                             PIPE_BIND_CONSTANT_BUFFER,
176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                             PIPE_USAGE_STATIC,
177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                             sizeof(consts));
178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (cbuf) {
179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      pipe_buffer_write(renderer->pipe, cbuf,
180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            0, sizeof(consts), consts);
181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pipe_set_constant_buffer(renderer->pipe,
183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         PIPE_SHADER_VERTEX, 0, cbuf);
184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   memcpy(cur, mvp, sizeof(*mvp));
186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   renderer->vs_cbuf = cbuf;
187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Create a simple vertex shader that passes through position and the given
191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * attribute.
192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void *create_passthrough_vs(struct pipe_context *pipe, int semantic_name)
194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct ureg_program *ureg;
196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct ureg_src src[2], constants[3];
197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct ureg_dst dst[2], tmp;
198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int i;
199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ureg = ureg_create(TGSI_PROCESSOR_VERTEX);
201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!ureg)
202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return NULL;
203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* position is in user coordinates */
205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   src[0] = ureg_DECL_vs_input(ureg, 0);
206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dst[0] = ureg_DECL_output(ureg, TGSI_SEMANTIC_POSITION, 0);
207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   tmp = ureg_DECL_temporary(ureg);
208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < Elements(constants); i++)
209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      constants[i] = ureg_DECL_constant(ureg, i);
210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* transform to clipped coordinates */
212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ureg_DP4(ureg, ureg_writemask(tmp, TGSI_WRITEMASK_X), src[0], constants[0]);
213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ureg_DP4(ureg, ureg_writemask(tmp, TGSI_WRITEMASK_Y), src[0], constants[1]);
214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ureg_MOV(ureg, ureg_writemask(tmp, TGSI_WRITEMASK_Z), src[0]);
215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ureg_DP4(ureg, ureg_writemask(tmp, TGSI_WRITEMASK_W), src[0], constants[2]);
216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ureg_MOV(ureg, dst[0], ureg_src(tmp));
217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (semantic_name >= 0) {
219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      src[1] = ureg_DECL_vs_input(ureg, 1);
220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dst[1] = ureg_DECL_output(ureg, semantic_name, 0);
221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ureg_MOV(ureg, dst[1], src[1]);
222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ureg_END(ureg);
225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return ureg_create_shader_and_destroy(ureg, pipe);
227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Set renderer vertex shader.
231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This function modifies vertex_shader state.
233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void renderer_set_vs(struct renderer *r, RendererVs id)
235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* create as needed */
237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!r->cached_vs[id]) {
238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      int semantic_name = -1;
239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (id) {
241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case RENDERER_VS_PLAIN:
242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case RENDERER_VS_COLOR:
244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         semantic_name = TGSI_SEMANTIC_COLOR;
245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case RENDERER_VS_TEXTURE:
247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         semantic_name = TGSI_SEMANTIC_GENERIC;
248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      default:
250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         assert(!"Unknown renderer vs id");
251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      r->cached_vs[id] = create_passthrough_vs(r->pipe, semantic_name);
255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   cso_set_vertex_shader_handle(r->cso, r->cached_vs[id]);
258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Create a simple fragment shader that sets the depth to 0.0f.
262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void *create_scissor_fs(struct pipe_context *pipe)
264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct ureg_program *ureg;
266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct ureg_dst out;
267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct ureg_src imm;
268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ureg = ureg_create(TGSI_PROCESSOR_FRAGMENT);
270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   out = ureg_DECL_output(ureg, TGSI_SEMANTIC_POSITION, 0);
271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   imm = ureg_imm4f(ureg, 0.0f, 0.0f, 0.0f, 0.0f);
272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ureg_MOV(ureg, ureg_writemask(out, TGSI_WRITEMASK_Z), imm);
274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ureg_END(ureg);
275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return ureg_create_shader_and_destroy(ureg, pipe);
277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Create a simple fragment shader that sets the color to white.
281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void *create_white_fs(struct pipe_context *pipe)
283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct ureg_program *ureg;
285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct ureg_dst out;
286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct ureg_src imm;
287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ureg = ureg_create(TGSI_PROCESSOR_FRAGMENT);
289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   out = ureg_DECL_output(ureg, TGSI_SEMANTIC_COLOR, 0);
290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   imm = ureg_imm4f(ureg, 1.0f, 1.0f, 1.0f, 1.0f);
291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ureg_MOV(ureg, out, imm);
293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ureg_END(ureg);
294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return ureg_create_shader_and_destroy(ureg, pipe);
296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Set renderer fragment shader.
300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This function modifies fragment_shader state.
302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void renderer_set_fs(struct renderer *r, RendererFs id)
304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* create as needed */
306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!r->cached_fs[id]) {
307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      void *fs = NULL;
308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (id) {
310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case RENDERER_FS_COLOR:
311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         fs = util_make_fragment_passthrough_shader(r->pipe);
312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case RENDERER_FS_TEXTURE:
314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         fs = util_make_fragment_tex_shader(r->pipe,
315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               TGSI_TEXTURE_2D, TGSI_INTERPOLATE_LINEAR);
316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case RENDERER_FS_SCISSOR:
318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         fs = create_scissor_fs(r->pipe);
319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case RENDERER_FS_WHITE:
321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         fs = create_white_fs(r->pipe);
322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      default:
324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         assert(!"Unknown renderer fs id");
325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      r->cached_fs[id] = fs;
329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   cso_set_fragment_shader_handle(r->cso, r->cached_fs[id]);
332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtypedef enum {
335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   VEGA_Y0_TOP,
336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   VEGA_Y0_BOTTOM
337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} VegaOrientation;
338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void vg_set_viewport(struct renderer *r,
340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                            VegaOrientation orientation)
341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const struct pipe_framebuffer_state *fb = &r->g3d.fb;
343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct pipe_viewport_state viewport;
344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   VGfloat y_scale = (orientation == VEGA_Y0_BOTTOM) ? -2.f : 2.f;
345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   viewport.scale[0] =  fb->width / 2.f;
347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   viewport.scale[1] =  fb->height / y_scale;
348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   viewport.scale[2] =  1.0;
349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   viewport.scale[3] =  1.0;
350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   viewport.translate[0] = fb->width / 2.f;
351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   viewport.translate[1] = fb->height / 2.f;
352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   viewport.translate[2] = 0.0;
353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   viewport.translate[3] = 0.0;
354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   cso_set_viewport(r->cso, &viewport);
356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Set renderer target.
360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This function modifies framebuffer and viewport states.
362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void renderer_set_target(struct renderer *r,
364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                struct pipe_surface *cbuf,
365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                struct pipe_surface *zsbuf,
366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                VGboolean y0_top)
367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct pipe_framebuffer_state fb;
369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   memset(&fb, 0, sizeof(fb));
371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   fb.width = cbuf->width;
372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   fb.height = cbuf->height;
373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   fb.cbufs[0] = cbuf;
374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   fb.nr_cbufs = 1;
375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   fb.zsbuf = zsbuf;
376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   cso_set_framebuffer(r->cso, &fb);
377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vg_set_viewport(r, (y0_top) ? VEGA_Y0_TOP : VEGA_Y0_BOTTOM);
379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Set renderer blend state.  Blending is disabled.
383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This function modifies blend state.
385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void renderer_set_blend(struct renderer *r,
387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                               VGbitfield channel_mask)
388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct pipe_blend_state blend;
390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   memset(&blend, 0, sizeof(blend));
392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   blend.rt[0].rgb_src_factor = PIPE_BLENDFACTOR_ONE;
394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   blend.rt[0].alpha_src_factor = PIPE_BLENDFACTOR_ONE;
395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   blend.rt[0].rgb_dst_factor = PIPE_BLENDFACTOR_ZERO;
396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   blend.rt[0].alpha_dst_factor = PIPE_BLENDFACTOR_ZERO;
397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (channel_mask & VG_RED)
399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      blend.rt[0].colormask |= PIPE_MASK_R;
400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (channel_mask & VG_GREEN)
401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      blend.rt[0].colormask |= PIPE_MASK_G;
402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (channel_mask & VG_BLUE)
403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      blend.rt[0].colormask |= PIPE_MASK_B;
404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (channel_mask & VG_ALPHA)
405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      blend.rt[0].colormask |= PIPE_MASK_A;
406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   cso_set_blend(r->cso, &blend);
408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Set renderer sampler and view states.
412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This function modifies samplers and fragment_sampler_views states.
414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void renderer_set_samplers(struct renderer *r,
416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  uint num_views,
417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  struct pipe_sampler_view **views)
418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct pipe_sampler_state sampler;
420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned tex_filter = PIPE_TEX_FILTER_NEAREST;
421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned tex_wrap = PIPE_TEX_WRAP_CLAMP_TO_EDGE;
422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint i;
423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   memset(&sampler, 0, sizeof(sampler));
425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   sampler.min_img_filter = tex_filter;
427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   sampler.mag_img_filter = tex_filter;
428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   sampler.min_mip_filter = PIPE_TEX_MIPFILTER_NONE;
429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   sampler.wrap_s = tex_wrap;
431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   sampler.wrap_t = tex_wrap;
432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   sampler.wrap_r = PIPE_TEX_WRAP_CLAMP_TO_EDGE;
433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   sampler.normalized_coords = 1;
435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* set samplers */
437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < num_views; i++)
438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      cso_single_sampler(r->cso, PIPE_SHADER_FRAGMENT, i, &sampler);
439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   cso_single_sampler_done(r->cso, PIPE_SHADER_FRAGMENT);
440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* set views */
442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   cso_set_sampler_views(r->cso, PIPE_SHADER_FRAGMENT, num_views, views);
443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Set custom renderer fragment shader, and optionally set samplers and views
447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and upload the fragment constant buffer.
448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This function modifies fragment_shader, samplers and fragment_sampler_views
450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * states.
451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void renderer_set_custom_fs(struct renderer *renderer,
453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                   void *fs,
454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                   const struct pipe_sampler_state **samplers,
455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                   struct pipe_sampler_view **views,
456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                   VGint num_samplers,
457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                   const void *const_buffer,
458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                   VGint const_buffer_len)
459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   cso_set_fragment_shader_handle(renderer->cso, fs);
461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* set samplers and views */
463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (num_samplers) {
464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      cso_set_samplers(renderer->cso, PIPE_SHADER_FRAGMENT, num_samplers, samplers);
465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      cso_set_sampler_views(renderer->cso, PIPE_SHADER_FRAGMENT, num_samplers, views);
466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* upload fs constant buffer */
469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (const_buffer_len) {
470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct pipe_resource *cbuf = renderer->fs_cbuf;
471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!cbuf || renderer->fs_cbuf_len != const_buffer_len ||
473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          memcmp(renderer->fs_cbuf_data, const_buffer, const_buffer_len)) {
474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         pipe_resource_reference(&cbuf, NULL);
475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         cbuf = pipe_buffer_create(renderer->pipe->screen,
477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               PIPE_BIND_CONSTANT_BUFFER, PIPE_USAGE_STATIC,
478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               const_buffer_len);
479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         pipe_buffer_write(renderer->pipe, cbuf, 0,
480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               const_buffer_len, const_buffer);
481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         pipe_set_constant_buffer(renderer->pipe,
482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               PIPE_SHADER_FRAGMENT, 0, cbuf);
483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         renderer->fs_cbuf = cbuf;
485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (const_buffer_len <= sizeof(renderer->fs_cbuf_data)) {
486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            memcpy(renderer->fs_cbuf_data, const_buffer, const_buffer_len);
487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            renderer->fs_cbuf_len = const_buffer_len;
488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         else {
490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            renderer->fs_cbuf_len = 0;
491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Setup renderer quad position.
498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void renderer_quad_pos(struct renderer *r,
500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              VGfloat x0, VGfloat y0,
501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              VGfloat x1, VGfloat y1,
502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              VGboolean scissor)
503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   VGfloat z;
505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* the depth test is used for scissoring */
507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   z = (scissor) ? 0.0f : 1.0f;
508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* positions */
510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r->vertices[0][0][0] = x0;
511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r->vertices[0][0][1] = y0;
512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r->vertices[0][0][2] = z;
513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r->vertices[1][0][0] = x1;
515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r->vertices[1][0][1] = y0;
516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r->vertices[1][0][2] = z;
517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r->vertices[2][0][0] = x1;
519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r->vertices[2][0][1] = y1;
520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r->vertices[2][0][2] = z;
521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r->vertices[3][0][0] = x0;
523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r->vertices[3][0][1] = y1;
524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r->vertices[3][0][2] = z;
525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Setup renderer quad texture coordinates.
529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void renderer_quad_texcoord(struct renderer *r,
531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                   VGfloat x0, VGfloat y0,
532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                   VGfloat x1, VGfloat y1,
533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                   VGint tex_width, VGint tex_height)
534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   VGfloat s0, t0, s1, t1, r0, q0;
536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   VGint i;
537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   s0 = x0 / tex_width;
539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   s1 = x1 / tex_width;
540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   t0 = y0 / tex_height;
541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   t1 = y1 / tex_height;
542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r0 = 0.0f;
543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   q0 = 1.0f;
544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* texcoords */
546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r->vertices[0][1][0] = s0;
547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r->vertices[0][1][1] = t0;
548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r->vertices[1][1][0] = s1;
550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r->vertices[1][1][1] = t0;
551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r->vertices[2][1][0] = s1;
553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r->vertices[2][1][1] = t1;
554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r->vertices[3][1][0] = s0;
556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r->vertices[3][1][1] = t1;
557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < 4; i++) {
559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      r->vertices[i][1][2] = r0;
560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      r->vertices[i][1][3] = q0;
561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Draw renderer quad.
566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void renderer_quad_draw(struct renderer *r)
568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   util_draw_user_vertex_buffer(r->cso, r->vertices, PIPE_PRIM_TRIANGLE_FAN,
570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                Elements(r->vertices),     /* verts */
571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                Elements(r->vertices[0])); /* attribs/vert */
572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Prepare the renderer for copying.
576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgVGboolean renderer_copy_begin(struct renderer *renderer,
578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              struct pipe_surface *dst,
579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              VGboolean y0_top,
580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              struct pipe_sampler_view *src)
581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(renderer->state == RENDERER_STATE_INIT);
583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* sanity check */
585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!renderer_can_support(renderer,
586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            dst->texture, PIPE_BIND_RENDER_TARGET) ||
587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       !renderer_can_support(renderer,
588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          src->texture, PIPE_BIND_SAMPLER_VIEW))
589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return VG_FALSE;
590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   cso_save_framebuffer(renderer->cso);
592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   cso_save_viewport(renderer->cso);
593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   cso_save_blend(renderer->cso);
594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   cso_save_samplers(renderer->cso, PIPE_SHADER_FRAGMENT);
595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   cso_save_sampler_views(renderer->cso, PIPE_SHADER_FRAGMENT);
596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   cso_save_fragment_shader(renderer->cso);
597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   cso_save_vertex_shader(renderer->cso);
598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   renderer_set_target(renderer, dst, NULL, y0_top);
600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   renderer_set_blend(renderer, ~0);
602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   renderer_set_samplers(renderer, 1, &src);
603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   renderer_set_fs(renderer, RENDERER_FS_TEXTURE);
605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   renderer_set_vs(renderer, RENDERER_VS_TEXTURE);
606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   renderer_set_mvp(renderer, NULL);
608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* remember the texture size */
610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   renderer->u.copy.tex_width = src->texture->width0;
611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   renderer->u.copy.tex_height = src->texture->height0;
612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   renderer->state = RENDERER_STATE_COPY;
613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return VG_TRUE;
615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Draw into the destination rectangle given by (x, y, w, h).  The texture is
619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * sampled from within the rectangle given by (sx, sy, sw, sh).
620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The coordinates are in surface coordinates.
622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid renderer_copy(struct renderer *renderer,
624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                   VGint x, VGint y, VGint w, VGint h,
625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                   VGint sx, VGint sy, VGint sw, VGint sh)
626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(renderer->state == RENDERER_STATE_COPY);
628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* there is no depth buffer for scissoring anyway */
630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   renderer_quad_pos(renderer, x, y, x + w, y + h, VG_FALSE);
631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   renderer_quad_texcoord(renderer, sx, sy, sx + sw, sy + sh,
632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         renderer->u.copy.tex_width,
633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         renderer->u.copy.tex_height);
634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   renderer_quad_draw(renderer);
636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * End copying and restore the states.
640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid renderer_copy_end(struct renderer *renderer)
642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(renderer->state == RENDERER_STATE_COPY);
644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   cso_restore_framebuffer(renderer->cso);
646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   cso_restore_viewport(renderer->cso);
647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   cso_restore_blend(renderer->cso);
648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   cso_restore_samplers(renderer->cso, PIPE_SHADER_FRAGMENT);
649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   cso_restore_sampler_views(renderer->cso, PIPE_SHADER_FRAGMENT);
650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   cso_restore_fragment_shader(renderer->cso);
651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   cso_restore_vertex_shader(renderer->cso);
652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   renderer->state = RENDERER_STATE_INIT;
654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Prepare the renderer for textured drawing.
658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgVGboolean renderer_drawtex_begin(struct renderer *renderer,
660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 struct pipe_sampler_view *src)
661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(renderer->state == RENDERER_STATE_INIT);
663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!renderer_can_support(renderer, src->texture, PIPE_BIND_SAMPLER_VIEW))
665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return VG_FALSE;
666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   cso_save_blend(renderer->cso);
668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   cso_save_samplers(renderer->cso, PIPE_SHADER_FRAGMENT);
669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   cso_save_sampler_views(renderer->cso, PIPE_SHADER_FRAGMENT);
670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   cso_save_fragment_shader(renderer->cso);
671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   cso_save_vertex_shader(renderer->cso);
672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   renderer_set_blend(renderer, ~0);
674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   renderer_set_samplers(renderer, 1, &src);
676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   renderer_set_fs(renderer, RENDERER_FS_TEXTURE);
678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   renderer_set_vs(renderer, RENDERER_VS_TEXTURE);
679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   renderer_set_mvp(renderer, NULL);
681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* remember the texture size */
683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   renderer->u.drawtex.tex_width = src->texture->width0;
684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   renderer->u.drawtex.tex_height = src->texture->height0;
685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   renderer->state = RENDERER_STATE_DRAWTEX;
686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return VG_TRUE;
688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Draw into the destination rectangle given by (x, y, w, h).  The texture is
692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * sampled from within the rectangle given by (sx, sy, sw, sh).
693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The coordinates are in surface coordinates.
695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid renderer_drawtex(struct renderer *renderer,
697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                      VGint x, VGint y, VGint w, VGint h,
698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                      VGint sx, VGint sy, VGint sw, VGint sh)
699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(renderer->state == RENDERER_STATE_DRAWTEX);
701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* with scissoring */
703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   renderer_quad_pos(renderer, x, y, x + w, y + h, VG_TRUE);
704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   renderer_quad_texcoord(renderer, sx, sy, sx + sw, sy + sh,
705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         renderer->u.drawtex.tex_width,
706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         renderer->u.drawtex.tex_height);
707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   renderer_quad_draw(renderer);
709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * End textured drawing and restore the states.
713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid renderer_drawtex_end(struct renderer *renderer)
715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(renderer->state == RENDERER_STATE_DRAWTEX);
717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   cso_restore_blend(renderer->cso);
719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   cso_restore_samplers(renderer->cso, PIPE_SHADER_FRAGMENT);
720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   cso_restore_sampler_views(renderer->cso, PIPE_SHADER_FRAGMENT);
721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   cso_restore_fragment_shader(renderer->cso);
722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   cso_restore_vertex_shader(renderer->cso);
723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   renderer->state = RENDERER_STATE_INIT;
725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Prepare the renderer for scissor update.  This will reset the depth buffer
729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to 1.0f.
730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgVGboolean renderer_scissor_begin(struct renderer *renderer,
732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 VGboolean restore_dsa)
733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct pipe_depth_stencil_alpha_state dsa;
735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(renderer->state == RENDERER_STATE_INIT);
737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (restore_dsa)
739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      cso_save_depth_stencil_alpha(renderer->cso);
740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   cso_save_blend(renderer->cso);
741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   cso_save_fragment_shader(renderer->cso);
742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* enable depth writes */
744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   memset(&dsa, 0, sizeof(dsa));
745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dsa.depth.enabled = 1;
746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dsa.depth.writemask = 1;
747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dsa.depth.func = PIPE_FUNC_ALWAYS;
748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   cso_set_depth_stencil_alpha(renderer->cso, &dsa);
749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* disable color writes */
751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   renderer_set_blend(renderer, 0);
752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   renderer_set_fs(renderer, RENDERER_FS_SCISSOR);
753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   renderer_set_mvp(renderer, NULL);
755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   renderer->u.scissor.restore_dsa = restore_dsa;
757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   renderer->state = RENDERER_STATE_SCISSOR;
758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* clear the depth buffer to 1.0f */
760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   renderer->pipe->clear(renderer->pipe,
761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         PIPE_CLEAR_DEPTHSTENCIL, NULL, 1.0f, 0);
762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return VG_TRUE;
764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Add a scissor rectangle.  Depth values inside the rectangle will be set to
768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 0.0f.
769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid renderer_scissor(struct renderer *renderer,
771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                      VGint x, VGint y, VGint width, VGint height)
772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(renderer->state == RENDERER_STATE_SCISSOR);
774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   renderer_quad_pos(renderer, x, y, x + width, y + height, VG_FALSE);
776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   renderer_quad_draw(renderer);
777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * End scissor update and restore the states.
781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid renderer_scissor_end(struct renderer *renderer)
783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(renderer->state == RENDERER_STATE_SCISSOR);
785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (renderer->u.scissor.restore_dsa)
787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      cso_restore_depth_stencil_alpha(renderer->cso);
788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   cso_restore_blend(renderer->cso);
789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   cso_restore_fragment_shader(renderer->cso);
790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   renderer->state = RENDERER_STATE_INIT;
792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Prepare the renderer for clearing.
796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgVGboolean renderer_clear_begin(struct renderer *renderer)
798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(renderer->state == RENDERER_STATE_INIT);
800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   cso_save_blend(renderer->cso);
802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   cso_save_fragment_shader(renderer->cso);
803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   cso_save_vertex_shader(renderer->cso);
804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   renderer_set_blend(renderer, ~0);
806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   renderer_set_fs(renderer, RENDERER_FS_COLOR);
807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   renderer_set_vs(renderer, RENDERER_VS_COLOR);
808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   renderer_set_mvp(renderer, NULL);
810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   renderer->state = RENDERER_STATE_CLEAR;
812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return VG_TRUE;
814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Clear the framebuffer with the specified region and color.
818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The coordinates are in surface coordinates.
820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid renderer_clear(struct renderer *renderer,
822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                    VGint x, VGint y, VGint width, VGint height,
823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                    const VGfloat color[4])
824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   VGuint i;
826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(renderer->state == RENDERER_STATE_CLEAR);
828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   renderer_quad_pos(renderer, x, y, x + width, y + height, VG_TRUE);
830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < 4; i++)
831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      memcpy(renderer->vertices[i][1], color, sizeof(VGfloat) * 4);
832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   renderer_quad_draw(renderer);
834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * End clearing and retore the states.
838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid renderer_clear_end(struct renderer *renderer)
840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(renderer->state == RENDERER_STATE_CLEAR);
842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   cso_restore_blend(renderer->cso);
844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   cso_restore_fragment_shader(renderer->cso);
845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   cso_restore_vertex_shader(renderer->cso);
846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   renderer->state = RENDERER_STATE_INIT;
848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Prepare the renderer for image filtering.
852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgVGboolean renderer_filter_begin(struct renderer *renderer,
854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                struct pipe_resource *dst,
855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                VGboolean y0_top,
856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                VGbitfield channel_mask,
857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                const struct pipe_sampler_state **samplers,
858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                struct pipe_sampler_view **views,
859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                VGint num_samplers,
860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                void *fs,
861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                const void *const_buffer,
862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                VGint const_buffer_len)
863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct pipe_surface *surf, surf_tmpl;
865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(renderer->state == RENDERER_STATE_INIT);
867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!fs)
869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return VG_FALSE;
870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!renderer_can_support(renderer, dst, PIPE_BIND_RENDER_TARGET))
871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return VG_FALSE;
872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   u_surface_default_template(&surf_tmpl, dst,
874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              PIPE_BIND_RENDER_TARGET);
875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   surf = renderer->pipe->create_surface(renderer->pipe, dst, &surf_tmpl);
876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!surf)
877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return VG_FALSE;
878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   cso_save_framebuffer(renderer->cso);
880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   cso_save_viewport(renderer->cso);
881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   cso_save_blend(renderer->cso);
882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* set the image as the target */
884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   renderer_set_target(renderer, surf, NULL, y0_top);
885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pipe_surface_reference(&surf, NULL);
886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   renderer_set_blend(renderer, channel_mask);
888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (num_samplers) {
890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct pipe_resource *tex;
891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      cso_save_samplers(renderer->cso, PIPE_SHADER_FRAGMENT);
893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      cso_save_sampler_views(renderer->cso, PIPE_SHADER_FRAGMENT);
894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      cso_save_fragment_shader(renderer->cso);
895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      cso_save_vertex_shader(renderer->cso);
896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      renderer_set_custom_fs(renderer, fs,
898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                             samplers, views, num_samplers,
899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                             const_buffer, const_buffer_len);
900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      renderer_set_vs(renderer, RENDERER_VS_TEXTURE);
901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      tex = views[0]->texture;
903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      renderer->u.filter.tex_width = tex->width0;
904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      renderer->u.filter.tex_height = tex->height0;
905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      renderer->u.filter.use_sampler = VG_TRUE;
906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      cso_save_fragment_shader(renderer->cso);
909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      renderer_set_custom_fs(renderer, fs, NULL, NULL, 0,
911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                             const_buffer, const_buffer_len);
912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      renderer->u.filter.use_sampler = VG_FALSE;
914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   renderer_set_mvp(renderer, NULL);
917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   renderer->state = RENDERER_STATE_FILTER;
919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return VG_TRUE;
921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Draw into a rectangle of the destination with the specified region of the
925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * texture(s).
926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The coordinates are in surface coordinates.
928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid renderer_filter(struct renderer *renderer,
930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                    VGint x, VGint y, VGint w, VGint h,
931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                    VGint sx, VGint sy, VGint sw, VGint sh)
932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(renderer->state == RENDERER_STATE_FILTER);
934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   renderer_quad_pos(renderer, x, y, x + w, y + h, VG_FALSE);
936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (renderer->u.filter.use_sampler) {
937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      renderer_quad_texcoord(renderer, sx, sy, sx + sw, sy + sh,
938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            renderer->u.filter.tex_width,
939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            renderer->u.filter.tex_height);
940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   renderer_quad_draw(renderer);
943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * End image filtering and restore the states.
947f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
948f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid renderer_filter_end(struct renderer *renderer)
949f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
950f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(renderer->state == RENDERER_STATE_FILTER);
951f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
952f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (renderer->u.filter.use_sampler) {
953f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      cso_restore_samplers(renderer->cso, PIPE_SHADER_FRAGMENT);
954f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      cso_restore_sampler_views(renderer->cso, PIPE_SHADER_FRAGMENT);
955f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      cso_restore_vertex_shader(renderer->cso);
956f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
957f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
958f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   cso_restore_framebuffer(renderer->cso);
959f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   cso_restore_viewport(renderer->cso);
960f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   cso_restore_blend(renderer->cso);
961f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   cso_restore_fragment_shader(renderer->cso);
962f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
963f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   renderer->state = RENDERER_STATE_INIT;
964f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
965f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
966f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
967f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Prepare the renderer for polygon silhouette rendering.
968f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
969f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgVGboolean renderer_polygon_stencil_begin(struct renderer *renderer,
970f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                         struct pipe_vertex_element *velem,
971f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                         VGFillRule rule,
972f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                         VGboolean restore_dsa)
973f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
974f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct pipe_depth_stencil_alpha_state *dsa;
975f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   VGboolean manual_two_sides;
976f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
977f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(renderer->state == RENDERER_STATE_INIT);
978f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
979f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   cso_save_vertex_elements(renderer->cso);
980f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   cso_save_blend(renderer->cso);
981f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   cso_save_depth_stencil_alpha(renderer->cso);
982f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
983f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   cso_set_vertex_elements(renderer->cso, 1, velem);
984f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
985f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* disable color writes */
986f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   renderer_set_blend(renderer, 0);
987f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
988f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   manual_two_sides = VG_FALSE;
989f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dsa = &renderer->u.polygon_stencil.dsa;
990f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   memset(dsa, 0, sizeof(*dsa));
991f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (rule == VG_EVEN_ODD) {
992f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dsa->stencil[0].enabled = 1;
993f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dsa->stencil[0].writemask = 1;
994f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dsa->stencil[0].fail_op = PIPE_STENCIL_OP_KEEP;
995f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dsa->stencil[0].zfail_op = PIPE_STENCIL_OP_KEEP;
996f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dsa->stencil[0].zpass_op = PIPE_STENCIL_OP_INVERT;
997f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dsa->stencil[0].func = PIPE_FUNC_ALWAYS;
998f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dsa->stencil[0].valuemask = ~0;
999f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1000f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
1001f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(rule == VG_NON_ZERO);
1002f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1003f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* front face */
1004f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dsa->stencil[0].enabled = 1;
1005f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dsa->stencil[0].writemask = ~0;
1006f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dsa->stencil[0].fail_op = PIPE_STENCIL_OP_KEEP;
1007f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dsa->stencil[0].zfail_op = PIPE_STENCIL_OP_KEEP;
1008f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dsa->stencil[0].zpass_op = PIPE_STENCIL_OP_INCR_WRAP;
1009f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dsa->stencil[0].func = PIPE_FUNC_ALWAYS;
1010f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dsa->stencil[0].valuemask = ~0;
1011f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1012f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (renderer->pipe->screen->get_param(renderer->pipe->screen,
1013f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                            PIPE_CAP_TWO_SIDED_STENCIL)) {
1014f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         /* back face */
1015f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         dsa->stencil[1] = dsa->stencil[0];
1016f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         dsa->stencil[1].zpass_op = PIPE_STENCIL_OP_DECR_WRAP;
1017f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1018f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else {
1019f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         manual_two_sides = VG_TRUE;
1020f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1021f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1022f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   cso_set_depth_stencil_alpha(renderer->cso, dsa);
1023f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1024f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (manual_two_sides)
1025f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      cso_save_rasterizer(renderer->cso);
1026f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1027f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   renderer->u.polygon_stencil.manual_two_sides = manual_two_sides;
1028f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   renderer->u.polygon_stencil.restore_dsa = restore_dsa;
1029f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   renderer->state = RENDERER_STATE_POLYGON_STENCIL;
1030f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1031f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return VG_TRUE;
1032f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1033f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1034f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
1035f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Render a polygon silhouette to stencil buffer.
1036f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
1037f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid renderer_polygon_stencil(struct renderer *renderer,
1038f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              struct pipe_vertex_buffer *vbuf,
1039f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              VGuint mode, VGuint start, VGuint count)
1040f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1041f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(renderer->state == RENDERER_STATE_POLYGON_STENCIL);
1042f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1043f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   cso_set_vertex_buffers(renderer->cso, 1, vbuf);
1044f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1045f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!renderer->u.polygon_stencil.manual_two_sides) {
1046f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      cso_draw_arrays(renderer->cso, mode, start, count);
1047f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1048f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
1049f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct pipe_rasterizer_state raster;
1050f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct pipe_depth_stencil_alpha_state dsa;
1051f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1052f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      raster = renderer->g3d.rasterizer;
1053f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dsa = renderer->u.polygon_stencil.dsa;
1054f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1055f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* front */
1056f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      raster.cull_face = PIPE_FACE_BACK;
1057f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dsa.stencil[0].zpass_op = PIPE_STENCIL_OP_INCR_WRAP;
1058f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1059f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      cso_set_rasterizer(renderer->cso, &raster);
1060f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      cso_set_depth_stencil_alpha(renderer->cso, &dsa);
1061f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      cso_draw_arrays(renderer->cso, mode, start, count);
1062f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1063f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* back */
1064f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      raster.cull_face = PIPE_FACE_FRONT;
1065f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dsa.stencil[0].zpass_op = PIPE_STENCIL_OP_DECR_WRAP;
1066f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1067f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      cso_set_rasterizer(renderer->cso, &raster);
1068f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      cso_set_depth_stencil_alpha(renderer->cso, &dsa);
1069f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      cso_draw_arrays(renderer->cso, mode, start, count);
1070f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1071f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1072f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1073f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
1074f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * End polygon silhouette rendering.
1075f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
1076f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid renderer_polygon_stencil_end(struct renderer *renderer)
1077f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1078f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(renderer->state == RENDERER_STATE_POLYGON_STENCIL);
1079f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1080f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (renderer->u.polygon_stencil.manual_two_sides)
1081f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      cso_restore_rasterizer(renderer->cso);
1082f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1083f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   cso_restore_vertex_elements(renderer->cso);
1084f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1085f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* restore color writes */
1086f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   cso_restore_blend(renderer->cso);
1087f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1088f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (renderer->u.polygon_stencil.restore_dsa)
1089f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      cso_restore_depth_stencil_alpha(renderer->cso);
1090f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1091f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   renderer->state = RENDERER_STATE_INIT;
1092f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1093f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1094f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
1095f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Prepare the renderer for polygon filling.
1096f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
1097f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgVGboolean renderer_polygon_fill_begin(struct renderer *renderer,
1098f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                      VGboolean save_dsa)
1099f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct pipe_depth_stencil_alpha_state dsa;
1101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(renderer->state == RENDERER_STATE_INIT);
1103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (save_dsa)
1105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      cso_save_depth_stencil_alpha(renderer->cso);
1106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* setup stencil ops */
1108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   memset(&dsa, 0, sizeof(dsa));
1109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dsa.stencil[0].enabled = 1;
1110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dsa.stencil[0].func = PIPE_FUNC_NOTEQUAL;
1111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dsa.stencil[0].fail_op = PIPE_STENCIL_OP_REPLACE;
1112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dsa.stencil[0].zfail_op = PIPE_STENCIL_OP_REPLACE;
1113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dsa.stencil[0].zpass_op = PIPE_STENCIL_OP_REPLACE;
1114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dsa.stencil[0].valuemask = ~0;
1115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dsa.stencil[0].writemask = ~0;
1116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dsa.depth = renderer->g3d.dsa.depth;
1117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   cso_set_depth_stencil_alpha(renderer->cso, &dsa);
1118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   renderer->state = RENDERER_STATE_POLYGON_FILL;
1120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return VG_TRUE;
1122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
1125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Fill a polygon.
1126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
1127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid renderer_polygon_fill(struct renderer *renderer,
1128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                           VGfloat min_x, VGfloat min_y,
1129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                           VGfloat max_x, VGfloat max_y)
1130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(renderer->state == RENDERER_STATE_POLYGON_FILL);
1132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   renderer_quad_pos(renderer, min_x, min_y, max_x, max_y, VG_TRUE);
1134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   renderer_quad_draw(renderer);
1135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
1138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * End polygon filling.
1139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
1140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid renderer_polygon_fill_end(struct renderer *renderer)
1141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(renderer->state == RENDERER_STATE_POLYGON_FILL);
1143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   cso_restore_depth_stencil_alpha(renderer->cso);
1145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   renderer->state = RENDERER_STATE_INIT;
1147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct renderer * renderer_create(struct vg_context *owner)
1150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct renderer *renderer;
1152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct pipe_rasterizer_state *raster;
1153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct pipe_stencil_ref sr;
1154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   VGint i;
1155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   renderer = CALLOC_STRUCT(renderer);
1157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!renderer)
1158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return NULL;
1159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   renderer->pipe = owner->pipe;
1161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   renderer->cso = owner->cso_context;
1162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* init vertex data that doesn't change */
1164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < 4; i++)
1165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      renderer->vertices[i][0][3] = 1.0f; /* w */
1166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < 2; i++) {
1168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      renderer->velems[i].src_offset = i * 4 * sizeof(float);
1169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      renderer->velems[i].instance_divisor = 0;
1170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      renderer->velems[i].vertex_buffer_index = 0;
1171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      renderer->velems[i].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT;
1172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   cso_set_vertex_elements(renderer->cso, 2, renderer->velems);
1174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* GL rasterization rules */
1176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   raster = &renderer->g3d.rasterizer;
1177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   memset(raster, 0, sizeof(*raster));
1178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   raster->gl_rasterization_rules = 1;
1179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   raster->depth_clip = 1;
1180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   cso_set_rasterizer(renderer->cso, raster);
1181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* fixed at 0 */
1183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   memset(&sr, 0, sizeof(sr));
1184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   cso_set_stencil_ref(renderer->cso, &sr);
1185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   renderer_set_vs(renderer, RENDERER_VS_PLAIN);
1187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   renderer->state = RENDERER_STATE_INIT;
1189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return renderer;
1191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid renderer_destroy(struct renderer *ctx)
1194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int i;
1196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < NUM_RENDERER_VS; i++) {
1198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (ctx->cached_vs[i])
1199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         cso_delete_vertex_shader(ctx->cso, ctx->cached_vs[i]);
1200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < NUM_RENDERER_FS; i++) {
1202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (ctx->cached_fs[i])
1203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         cso_delete_fragment_shader(ctx->cso, ctx->cached_fs[i]);
1204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pipe_resource_reference(&ctx->vs_cbuf, NULL);
1207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pipe_resource_reference(&ctx->fs_cbuf, NULL);
1208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   FREE(ctx);
1210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void update_clip_state(struct renderer *renderer,
1213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              const struct vg_state *state)
1214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct pipe_depth_stencil_alpha_state *dsa = &renderer->g3d.dsa;
1216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   memset(dsa, 0, sizeof(struct pipe_depth_stencil_alpha_state));
1218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (state->scissoring) {
1220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct pipe_framebuffer_state *fb = &renderer->g3d.fb;
1221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      int i;
1222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      renderer_scissor_begin(renderer, VG_FALSE);
1224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (i = 0; i < state->scissor_rects_num; ++i) {
1226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         const float x      = state->scissor_rects[i * 4 + 0].f;
1227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         const float y      = state->scissor_rects[i * 4 + 1].f;
1228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         const float width  = state->scissor_rects[i * 4 + 2].f;
1229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         const float height = state->scissor_rects[i * 4 + 3].f;
1230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         VGint x0, y0, x1, y1, iw, ih;
1231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         x0 = (VGint) x;
1233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         y0 = (VGint) y;
1234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (x0 < 0)
1235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            x0 = 0;
1236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (y0 < 0)
1237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            y0 = 0;
1238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         /* note that x1 and y1 are exclusive */
1240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         x1 = (VGint) ceilf(x + width);
1241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         y1 = (VGint) ceilf(y + height);
1242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (x1 > fb->width)
1243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            x1 = fb->width;
1244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (y1 > fb->height)
1245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            y1 = fb->height;
1246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         iw = x1 - x0;
1248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ih = y1 - y0;
1249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (iw > 0 && ih> 0 )
1250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            renderer_scissor(renderer, x0, y0, iw, ih);
1251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      renderer_scissor_end(renderer);
1254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dsa->depth.enabled = 1; /* glEnable(GL_DEPTH_TEST); */
1256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dsa->depth.writemask = 0;/*glDepthMask(FALSE);*/
1257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dsa->depth.func = PIPE_FUNC_GEQUAL;
1258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void renderer_validate_blend(struct renderer *renderer,
1262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                     const struct vg_state *state,
1263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                     enum pipe_format fb_format)
1264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct pipe_blend_state blend;
1266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   memset(&blend, 0, sizeof(blend));
1268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   blend.rt[0].colormask = PIPE_MASK_RGBA;
1269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   blend.rt[0].rgb_src_factor   = PIPE_BLENDFACTOR_ONE;
1270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   blend.rt[0].alpha_src_factor = PIPE_BLENDFACTOR_ONE;
1271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   blend.rt[0].rgb_dst_factor   = PIPE_BLENDFACTOR_ZERO;
1272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   blend.rt[0].alpha_dst_factor = PIPE_BLENDFACTOR_ZERO;
1273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* TODO alpha masking happens after blending? */
1275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (state->blend_mode) {
1277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case VG_BLEND_SRC:
1278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      blend.rt[0].rgb_src_factor   = PIPE_BLENDFACTOR_ONE;
1279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      blend.rt[0].alpha_src_factor = PIPE_BLENDFACTOR_ONE;
1280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      blend.rt[0].rgb_dst_factor   = PIPE_BLENDFACTOR_ZERO;
1281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      blend.rt[0].alpha_dst_factor = PIPE_BLENDFACTOR_ZERO;
1282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case VG_BLEND_SRC_OVER:
1284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* use the blend state only when there is no alpha channel */
1285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!util_format_has_alpha(fb_format)) {
1286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         blend.rt[0].rgb_src_factor   = PIPE_BLENDFACTOR_SRC_ALPHA;
1287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         blend.rt[0].alpha_src_factor = PIPE_BLENDFACTOR_ONE;
1288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         blend.rt[0].rgb_dst_factor   = PIPE_BLENDFACTOR_INV_SRC_ALPHA;
1289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         blend.rt[0].alpha_dst_factor = PIPE_BLENDFACTOR_INV_SRC_ALPHA;
1290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         blend.rt[0].blend_enable = 1;
1291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case VG_BLEND_SRC_IN:
1294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      blend.rt[0].rgb_src_factor   = PIPE_BLENDFACTOR_ONE;
1295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      blend.rt[0].alpha_src_factor = PIPE_BLENDFACTOR_DST_ALPHA;
1296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      blend.rt[0].rgb_dst_factor   = PIPE_BLENDFACTOR_ZERO;
1297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      blend.rt[0].alpha_dst_factor = PIPE_BLENDFACTOR_ZERO;
1298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      blend.rt[0].blend_enable = 1;
1299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case VG_BLEND_DST_IN:
1301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      blend.rt[0].rgb_src_factor   = PIPE_BLENDFACTOR_ZERO;
1302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      blend.rt[0].alpha_src_factor = PIPE_BLENDFACTOR_ZERO;
1303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      blend.rt[0].rgb_dst_factor   = PIPE_BLENDFACTOR_ONE;
1304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      blend.rt[0].alpha_dst_factor = PIPE_BLENDFACTOR_SRC_ALPHA;
1305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      blend.rt[0].blend_enable = 1;
1306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case VG_BLEND_DST_OVER:
1308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case VG_BLEND_MULTIPLY:
1309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case VG_BLEND_SCREEN:
1310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case VG_BLEND_DARKEN:
1311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case VG_BLEND_LIGHTEN:
1312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case VG_BLEND_ADDITIVE:
1313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* need a shader */
1314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
1316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(!"not implemented blend mode");
1317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   cso_set_blend(renderer->cso, &blend);
1321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
1324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Propogate OpenVG state changes to the renderer.  Only framebuffer, blending
1325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and scissoring states are relevant here.
1326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
1327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid renderer_validate(struct renderer *renderer,
1328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                       VGbitfield dirty,
1329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                       const struct st_framebuffer *stfb,
1330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                       const struct vg_state *state)
1331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(renderer->state == RENDERER_STATE_INIT);
1333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dirty |= renderer->dirty;
1335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   renderer->dirty = 0;
1336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (dirty & FRAMEBUFFER_DIRTY) {
1338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct pipe_framebuffer_state *fb = &renderer->g3d.fb;
1339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct matrix *proj = &renderer->projection;
1340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      memset(fb, 0, sizeof(struct pipe_framebuffer_state));
1342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fb->width  = stfb->width;
1343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fb->height = stfb->height;
1344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fb->nr_cbufs = 1;
1345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fb->cbufs[0] = stfb->strb->surface;
1346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fb->zsbuf = stfb->dsrb->surface;
1347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      cso_set_framebuffer(renderer->cso, fb);
1349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      vg_set_viewport(renderer, VEGA_Y0_BOTTOM);
1350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      matrix_load_identity(proj);
1352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      matrix_translate(proj, -1.0f, -1.0f);
1353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      matrix_scale(proj, 2.0f / fb->width, 2.0f / fb->height);
1354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* we also got a new depth buffer */
1356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (dirty & DEPTH_STENCIL_DIRTY) {
1357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         renderer->pipe->clear(renderer->pipe,
1358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               PIPE_CLEAR_DEPTHSTENCIL, NULL, 0.0, 0);
1359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* must be last because it renders to the depth buffer*/
1363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (dirty & DEPTH_STENCIL_DIRTY) {
1364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      update_clip_state(renderer, state);
1365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      cso_set_depth_stencil_alpha(renderer->cso, &renderer->g3d.dsa);
1366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (dirty & BLEND_DIRTY)
1369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      renderer_validate_blend(renderer, state, stfb->strb->format);
1370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
1373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Prepare the renderer for OpenVG pipeline.
1374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
1375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid renderer_validate_for_shader(struct renderer *renderer,
1376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  const struct pipe_sampler_state **samplers,
1377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  struct pipe_sampler_view **views,
1378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  VGint num_samplers,
1379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  const struct matrix *modelview,
1380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  void *fs,
1381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  const void *const_buffer,
1382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  VGint const_buffer_len)
1383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct matrix mvp = renderer->projection;
1385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* will be used in POLYGON_STENCIL and POLYGON_FILL */
1387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   matrix_mult(&mvp, modelview);
1388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   renderer_set_mvp(renderer, &mvp);
1389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   renderer_set_custom_fs(renderer, fs,
1391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                          samplers, views, num_samplers,
1392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                          const_buffer, const_buffer_len);
1393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid renderer_validate_for_mask_rendering(struct renderer *renderer,
1396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                          struct pipe_surface *dst,
1397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                          const struct matrix *modelview)
1398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct matrix mvp = renderer->projection;
1400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* will be used in POLYGON_STENCIL and POLYGON_FILL */
1402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   matrix_mult(&mvp, modelview);
1403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   renderer_set_mvp(renderer, &mvp);
1404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   renderer_set_target(renderer, dst, renderer->g3d.fb.zsbuf, VG_FALSE);
1406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   renderer_set_blend(renderer, ~0);
1407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   renderer_set_fs(renderer, RENDERER_FS_WHITE);
1408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* set internal dirty flags (hacky!) */
1410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   renderer->dirty = FRAMEBUFFER_DIRTY | BLEND_DIRTY;
1411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid renderer_copy_surface(struct renderer *ctx,
1414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                           struct pipe_surface *src,
1415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                           int srcX0, int srcY0,
1416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                           int srcX1, int srcY1,
1417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                           struct pipe_surface *dst,
1418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                           int dstX0, int dstY0,
1419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                           int dstX1, int dstY1,
1420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                           float z, unsigned filter)
1421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct pipe_context *pipe = ctx->pipe;
1423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct pipe_screen *screen = pipe->screen;
1424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct pipe_sampler_view view_templ;
1425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct pipe_sampler_view *view;
1426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct pipe_box src_box;
1427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct pipe_resource texTemp, *tex;
1428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const struct pipe_framebuffer_state *fb = &ctx->g3d.fb;
1429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const int srcW = abs(srcX1 - srcX0);
1430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const int srcH = abs(srcY1 - srcY0);
1431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const int srcLeft = MIN2(srcX0, srcX1);
1432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const int srcTop = MIN2(srcY0, srcY1);
1433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(filter == PIPE_TEX_MIPFILTER_NEAREST ||
1435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          filter == PIPE_TEX_MIPFILTER_LINEAR);
1436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (srcLeft != srcX0) {
1438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* left-right flip */
1439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      int tmp = dstX0;
1440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dstX0 = dstX1;
1441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dstX1 = tmp;
1442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (srcTop != srcY0) {
1445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* up-down flip */
1446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      int tmp = dstY0;
1447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dstY0 = dstY1;
1448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dstY1 = tmp;
1449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(screen->is_format_supported(screen, src->format, PIPE_TEXTURE_2D,
1452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                      0, PIPE_BIND_SAMPLER_VIEW));
1453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(screen->is_format_supported(screen, dst->format, PIPE_TEXTURE_2D,
1454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                      0, PIPE_BIND_SAMPLER_VIEW));
1455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(screen->is_format_supported(screen, dst->format, PIPE_TEXTURE_2D,
1456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                      0, PIPE_BIND_RENDER_TARGET));
1457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /*
1459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * XXX for now we're always creating a temporary texture.
1460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * Strictly speaking that's not always needed.
1461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
1462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* create temp texture */
1464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   memset(&texTemp, 0, sizeof(texTemp));
1465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   texTemp.target = PIPE_TEXTURE_2D;
1466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   texTemp.format = src->format;
1467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   texTemp.last_level = 0;
1468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   texTemp.width0 = srcW;
1469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   texTemp.height0 = srcH;
1470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   texTemp.depth0 = 1;
1471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   texTemp.array_size = 1;
1472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   texTemp.bind = PIPE_BIND_SAMPLER_VIEW;
1473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   tex = screen->resource_create(screen, &texTemp);
1475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!tex)
1476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
1477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   u_sampler_view_default_template(&view_templ, tex, tex->format);
1479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   view = pipe->create_sampler_view(pipe, tex, &view_templ);
1480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!view)
1482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
1483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   u_box_2d_zslice(srcLeft, srcTop, src->u.tex.first_layer, srcW, srcH, &src_box);
1485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pipe->resource_copy_region(pipe,
1487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              tex, 0, 0, 0, 0,  /* dest */
1488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              src->texture, 0, &src_box);
1489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(floatsEqual(z, 0.0f));
1491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* draw */
1493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (fb->cbufs[0] == dst) {
1494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* transform back to surface coordinates */
1495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dstY0 = dst->height - dstY0;
1496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dstY1 = dst->height - dstY1;
1497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (renderer_drawtex_begin(ctx, view)) {
1499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         renderer_drawtex(ctx,
1500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               dstX0, dstY0, dstX1 - dstX0, dstY1 - dstY0,
1501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               0, 0, view->texture->width0, view->texture->height0);
1502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         renderer_drawtex_end(ctx);
1503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
1506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (renderer_copy_begin(ctx, dst, VG_TRUE, view)) {
1507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         renderer_copy(ctx,
1508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               dstX0, dstY0, dstX1 - dstX0, dstY1 - dstY0,
1509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               0, 0, view->texture->width0, view->texture->height0);
1510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         renderer_copy_end(ctx);
1511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid renderer_texture_quad(struct renderer *r,
1516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                           struct pipe_resource *tex,
1517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                           VGfloat x1offset, VGfloat y1offset,
1518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                           VGfloat x2offset, VGfloat y2offset,
1519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                           VGfloat x1, VGfloat y1,
1520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                           VGfloat x2, VGfloat y2,
1521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                           VGfloat x3, VGfloat y3,
1522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                           VGfloat x4, VGfloat y4)
1523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const VGfloat z = 0.0f;
1525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(r->state == RENDERER_STATE_INIT);
1527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(tex->width0 != 0);
1528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(tex->height0 != 0);
1529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   cso_save_vertex_shader(r->cso);
1531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   renderer_set_vs(r, RENDERER_VS_TEXTURE);
1533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* manually set up positions */
1535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r->vertices[0][0][0] = x1;
1536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r->vertices[0][0][1] = y1;
1537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r->vertices[0][0][2] = z;
1538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r->vertices[1][0][0] = x2;
1540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r->vertices[1][0][1] = y2;
1541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r->vertices[1][0][2] = z;
1542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r->vertices[2][0][0] = x3;
1544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r->vertices[2][0][1] = y3;
1545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r->vertices[2][0][2] = z;
1546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r->vertices[3][0][0] = x4;
1548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r->vertices[3][0][1] = y4;
1549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r->vertices[3][0][2] = z;
1550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* texcoords */
1552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   renderer_quad_texcoord(r, x1offset, y1offset,
1553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         x2offset, y2offset, tex->width0, tex->height0);
1554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   renderer_quad_draw(r);
1556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   cso_restore_vertex_shader(r->cso);
1558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1559