1544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin/**************************************************************************
2544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin *
3544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * Copyright 2009 VMware, Inc.  All Rights Reserved.
459309337e40106f734efc1e33f956f6f1f4301acChia-I Wu * Copyright 2010 LunarG, Inc.  All Rights Reserved.
5544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin *
6544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * Permission is hereby granted, free of charge, to any person obtaining a
7544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * copy of this software and associated documentation files (the
8544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * "Software"), to deal in the Software without restriction, including
9544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * without limitation the rights to use, copy, modify, merge, publish,
10544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * distribute, sub license, and/or sell copies of the Software, and to
11544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * permit persons to whom the Software is furnished to do so, subject to
12544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * the following conditions:
13544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin *
14544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * The above copyright notice and this permission notice (including the
15544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * next paragraph) shall be included in all copies or substantial portions
16544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * of the Software.
17544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin *
18544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
22544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin *
26544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin **************************************************************************/
27544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
28544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#include "renderer.h"
29544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
30544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#include "vg_context.h"
31544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
32544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#include "pipe/p_context.h"
33544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#include "pipe/p_state.h"
3428486880ca3ec39419ccee0cb1a3bedc9ef7117cJosé Fonseca#include "util/u_inlines.h"
35544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#include "pipe/p_screen.h"
36544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#include "pipe/p_shader_tokens.h"
37544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
38544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#include "util/u_draw_quad.h"
39544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#include "util/u_simple_shaders.h"
40544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#include "util/u_memory.h"
41e5f0384ad06359aa1b9dc1b4bc6f475f7a119af2Roland Scheidegger#include "util/u_sampler.h"
424c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger#include "util/u_surface.h"
43b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu#include "util/u_math.h"
44859106f196ade77f59f8787b071739901cd1a843Chia-I Wu#include "util/u_format.h"
45544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
46544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#include "cso_cache/cso_context.h"
4759309337e40106f734efc1e33f956f6f1f4301acChia-I Wu#include "tgsi/tgsi_ureg.h"
4859309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
4959309337e40106f734efc1e33f956f6f1f4301acChia-I Wutypedef enum {
5059309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   RENDERER_STATE_INIT,
5159309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   RENDERER_STATE_COPY,
52e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu   RENDERER_STATE_DRAWTEX,
5354cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu   RENDERER_STATE_SCISSOR,
546b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu   RENDERER_STATE_CLEAR,
55e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu   RENDERER_STATE_FILTER,
563b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   RENDERER_STATE_POLYGON_STENCIL,
573b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   RENDERER_STATE_POLYGON_FILL,
5859309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   NUM_RENDERER_STATES
5959309337e40106f734efc1e33f956f6f1f4301acChia-I Wu} RendererState;
6059309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
6159309337e40106f734efc1e33f956f6f1f4301acChia-I Wutypedef enum {
6259309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   RENDERER_VS_PLAIN,
6359309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   RENDERER_VS_COLOR,
6459309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   RENDERER_VS_TEXTURE,
6559309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   NUM_RENDERER_VS
6659309337e40106f734efc1e33f956f6f1f4301acChia-I Wu} RendererVs;
6759309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
6859309337e40106f734efc1e33f956f6f1f4301acChia-I Wutypedef enum {
6959309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   RENDERER_FS_COLOR,
7059309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   RENDERER_FS_TEXTURE,
7154cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu   RENDERER_FS_SCISSOR,
7230cab4b6cbf741e1ae727bfaed10cc3772e4dff9Chia-I Wu   RENDERER_FS_WHITE,
7359309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   NUM_RENDERER_FS
7459309337e40106f734efc1e33f956f6f1f4301acChia-I Wu} RendererFs;
75544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
76544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusinstruct renderer {
77544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   struct pipe_context *pipe;
78544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   struct cso_context *cso;
79544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
8030cab4b6cbf741e1ae727bfaed10cc3772e4dff9Chia-I Wu   VGbitfield dirty;
81b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu   struct {
82b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu      struct pipe_rasterizer_state rasterizer;
83b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu      struct pipe_depth_stencil_alpha_state dsa;
84b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu      struct pipe_framebuffer_state fb;
85b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu   } g3d;
86a84a1e344f544ec4da61809d4f09853a94d93e07Chia-I Wu   struct matrix projection;
87b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu
88a84a1e344f544ec4da61809d4f09853a94d93e07Chia-I Wu   struct matrix mvp;
896f7c8c3cbf68ab9b587235198e19af30c1a60a82José Fonseca   struct pipe_resource *vs_cbuf;
900dadc0b808bb2100f3d2d067b950f3f13081af40Chia-I Wu
910dadc0b808bb2100f3d2d067b950f3f13081af40Chia-I Wu   struct pipe_resource *fs_cbuf;
920dadc0b808bb2100f3d2d067b950f3f13081af40Chia-I Wu   VGfloat fs_cbuf_data[32];
930dadc0b808bb2100f3d2d067b950f3f13081af40Chia-I Wu   VGint fs_cbuf_len;
94b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu
95ace4539e88f6ef90d8e9fd2f1543eca0ae854b82Chia-I Wu   struct pipe_vertex_element velems[2];
96544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   VGfloat vertices[4][2][4];
9759309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
9859309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   void *cached_vs[NUM_RENDERER_VS];
9959309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   void *cached_fs[NUM_RENDERER_FS];
10059309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
10159309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   RendererState state;
10259309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
10359309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   /* state data */
10459309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   union {
10559309337e40106f734efc1e33f956f6f1f4301acChia-I Wu      struct {
10659309337e40106f734efc1e33f956f6f1f4301acChia-I Wu         VGint tex_width;
10759309337e40106f734efc1e33f956f6f1f4301acChia-I Wu         VGint tex_height;
10859309337e40106f734efc1e33f956f6f1f4301acChia-I Wu      } copy;
109e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu
110e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu      struct {
111e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu         VGint tex_width;
112e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu         VGint tex_height;
113e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu      } drawtex;
11454cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu
11554cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu      struct {
11654cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu         VGboolean restore_dsa;
11754cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu      } scissor;
118e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu
119e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu      struct {
120e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu         VGboolean use_sampler;
121e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu         VGint tex_width, tex_height;
122e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu      } filter;
1233b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu
1243b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu      struct {
1253b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu         struct pipe_depth_stencil_alpha_state dsa;
1263b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu         VGboolean manual_two_sides;
1273b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu         VGboolean restore_dsa;
1283b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu      } polygon_stencil;
12959309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   } u;
130544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin};
131544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
13259309337e40106f734efc1e33f956f6f1f4301acChia-I Wu/**
13359309337e40106f734efc1e33f956f6f1f4301acChia-I Wu * Return VG_TRUE if the renderer can use the resource as the asked bindings.
13459309337e40106f734efc1e33f956f6f1f4301acChia-I Wu */
13559309337e40106f734efc1e33f956f6f1f4301acChia-I Wustatic VGboolean renderer_can_support(struct renderer *renderer,
13659309337e40106f734efc1e33f956f6f1f4301acChia-I Wu                                      struct pipe_resource *res,
13759309337e40106f734efc1e33f956f6f1f4301acChia-I Wu                                      unsigned bindings)
13859309337e40106f734efc1e33f956f6f1f4301acChia-I Wu{
13959309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   struct pipe_screen *screen = renderer->pipe->screen;
14059309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
14159309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   return screen->is_format_supported(screen,
142e968975cb57eb854769292f7c6ff773c64a386c3Marek Olšák         res->format, res->target, 0, bindings);
14359309337e40106f734efc1e33f956f6f1f4301acChia-I Wu}
14459309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
14559309337e40106f734efc1e33f956f6f1f4301acChia-I Wu/**
146a84a1e344f544ec4da61809d4f09853a94d93e07Chia-I Wu * Set the model-view-projection matrix used by vertex shaders.
147a84a1e344f544ec4da61809d4f09853a94d93e07Chia-I Wu */
148a84a1e344f544ec4da61809d4f09853a94d93e07Chia-I Wustatic void renderer_set_mvp(struct renderer *renderer,
149a84a1e344f544ec4da61809d4f09853a94d93e07Chia-I Wu                             const struct matrix *mvp)
150a84a1e344f544ec4da61809d4f09853a94d93e07Chia-I Wu{
151a84a1e344f544ec4da61809d4f09853a94d93e07Chia-I Wu   struct matrix *cur = &renderer->mvp;
152a84a1e344f544ec4da61809d4f09853a94d93e07Chia-I Wu   struct pipe_resource *cbuf;
153a84a1e344f544ec4da61809d4f09853a94d93e07Chia-I Wu   VGfloat consts[3][4];
154a84a1e344f544ec4da61809d4f09853a94d93e07Chia-I Wu   VGint i;
155a84a1e344f544ec4da61809d4f09853a94d93e07Chia-I Wu
156a84a1e344f544ec4da61809d4f09853a94d93e07Chia-I Wu   /* projection only */
157a84a1e344f544ec4da61809d4f09853a94d93e07Chia-I Wu   if (!mvp)
158a84a1e344f544ec4da61809d4f09853a94d93e07Chia-I Wu      mvp = &renderer->projection;
159a84a1e344f544ec4da61809d4f09853a94d93e07Chia-I Wu
160a84a1e344f544ec4da61809d4f09853a94d93e07Chia-I Wu   /* re-upload only if necessary */
161a84a1e344f544ec4da61809d4f09853a94d93e07Chia-I Wu   if (memcmp(cur, mvp, sizeof(*mvp)) == 0)
162a84a1e344f544ec4da61809d4f09853a94d93e07Chia-I Wu      return;
163a84a1e344f544ec4da61809d4f09853a94d93e07Chia-I Wu
164a84a1e344f544ec4da61809d4f09853a94d93e07Chia-I Wu   /* 3x3 matrix to 3 constant vectors (no Z) */
165a84a1e344f544ec4da61809d4f09853a94d93e07Chia-I Wu   for (i = 0; i < 3; i++) {
166a84a1e344f544ec4da61809d4f09853a94d93e07Chia-I Wu      consts[i][0] = mvp->m[i + 0];
167a84a1e344f544ec4da61809d4f09853a94d93e07Chia-I Wu      consts[i][1] = mvp->m[i + 3];
168a84a1e344f544ec4da61809d4f09853a94d93e07Chia-I Wu      consts[i][2] = 0.0f;
169a84a1e344f544ec4da61809d4f09853a94d93e07Chia-I Wu      consts[i][3] = mvp->m[i + 6];
170a84a1e344f544ec4da61809d4f09853a94d93e07Chia-I Wu   }
171a84a1e344f544ec4da61809d4f09853a94d93e07Chia-I Wu
172a84a1e344f544ec4da61809d4f09853a94d93e07Chia-I Wu   cbuf = renderer->vs_cbuf;
173a84a1e344f544ec4da61809d4f09853a94d93e07Chia-I Wu   pipe_resource_reference(&cbuf, NULL);
174a84a1e344f544ec4da61809d4f09853a94d93e07Chia-I Wu   cbuf = pipe_buffer_create(renderer->pipe->screen,
175a84a1e344f544ec4da61809d4f09853a94d93e07Chia-I Wu                             PIPE_BIND_CONSTANT_BUFFER,
176eafb7f234d11a290b00dcaf5492b9bdad1cf5148Marek Olšák                             PIPE_USAGE_STATIC,
177a84a1e344f544ec4da61809d4f09853a94d93e07Chia-I Wu                             sizeof(consts));
178a84a1e344f544ec4da61809d4f09853a94d93e07Chia-I Wu   if (cbuf) {
179a84a1e344f544ec4da61809d4f09853a94d93e07Chia-I Wu      pipe_buffer_write(renderer->pipe, cbuf,
180a84a1e344f544ec4da61809d4f09853a94d93e07Chia-I Wu            0, sizeof(consts), consts);
181a84a1e344f544ec4da61809d4f09853a94d93e07Chia-I Wu   }
182507337864fa80caf9f26602324d2c28dd0a75d61Marek Olšák   pipe_set_constant_buffer(renderer->pipe,
183a84a1e344f544ec4da61809d4f09853a94d93e07Chia-I Wu         PIPE_SHADER_VERTEX, 0, cbuf);
184a84a1e344f544ec4da61809d4f09853a94d93e07Chia-I Wu
185a84a1e344f544ec4da61809d4f09853a94d93e07Chia-I Wu   memcpy(cur, mvp, sizeof(*mvp));
186a84a1e344f544ec4da61809d4f09853a94d93e07Chia-I Wu   renderer->vs_cbuf = cbuf;
187a84a1e344f544ec4da61809d4f09853a94d93e07Chia-I Wu}
188a84a1e344f544ec4da61809d4f09853a94d93e07Chia-I Wu
189a84a1e344f544ec4da61809d4f09853a94d93e07Chia-I Wu/**
19059309337e40106f734efc1e33f956f6f1f4301acChia-I Wu * Create a simple vertex shader that passes through position and the given
19159309337e40106f734efc1e33f956f6f1f4301acChia-I Wu * attribute.
19259309337e40106f734efc1e33f956f6f1f4301acChia-I Wu */
19359309337e40106f734efc1e33f956f6f1f4301acChia-I Wustatic void *create_passthrough_vs(struct pipe_context *pipe, int semantic_name)
19459309337e40106f734efc1e33f956f6f1f4301acChia-I Wu{
19559309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   struct ureg_program *ureg;
196a84a1e344f544ec4da61809d4f09853a94d93e07Chia-I Wu   struct ureg_src src[2], constants[3];
19759309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   struct ureg_dst dst[2], tmp;
19859309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   int i;
19959309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
20059309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   ureg = ureg_create(TGSI_PROCESSOR_VERTEX);
20159309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   if (!ureg)
20259309337e40106f734efc1e33f956f6f1f4301acChia-I Wu      return NULL;
20359309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
204a84a1e344f544ec4da61809d4f09853a94d93e07Chia-I Wu   /* position is in user coordinates */
20559309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   src[0] = ureg_DECL_vs_input(ureg, 0);
20659309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   dst[0] = ureg_DECL_output(ureg, TGSI_SEMANTIC_POSITION, 0);
20759309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   tmp = ureg_DECL_temporary(ureg);
208a84a1e344f544ec4da61809d4f09853a94d93e07Chia-I Wu   for (i = 0; i < Elements(constants); i++)
20959309337e40106f734efc1e33f956f6f1f4301acChia-I Wu      constants[i] = ureg_DECL_constant(ureg, i);
21059309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
21159309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   /* transform to clipped coordinates */
212a84a1e344f544ec4da61809d4f09853a94d93e07Chia-I Wu   ureg_DP4(ureg, ureg_writemask(tmp, TGSI_WRITEMASK_X), src[0], constants[0]);
213a84a1e344f544ec4da61809d4f09853a94d93e07Chia-I Wu   ureg_DP4(ureg, ureg_writemask(tmp, TGSI_WRITEMASK_Y), src[0], constants[1]);
214a84a1e344f544ec4da61809d4f09853a94d93e07Chia-I Wu   ureg_MOV(ureg, ureg_writemask(tmp, TGSI_WRITEMASK_Z), src[0]);
215a84a1e344f544ec4da61809d4f09853a94d93e07Chia-I Wu   ureg_DP4(ureg, ureg_writemask(tmp, TGSI_WRITEMASK_W), src[0], constants[2]);
21659309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   ureg_MOV(ureg, dst[0], ureg_src(tmp));
21759309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
21859309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   if (semantic_name >= 0) {
21959309337e40106f734efc1e33f956f6f1f4301acChia-I Wu      src[1] = ureg_DECL_vs_input(ureg, 1);
22059309337e40106f734efc1e33f956f6f1f4301acChia-I Wu      dst[1] = ureg_DECL_output(ureg, semantic_name, 0);
22159309337e40106f734efc1e33f956f6f1f4301acChia-I Wu      ureg_MOV(ureg, dst[1], src[1]);
22259309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   }
22359309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
22459309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   ureg_END(ureg);
22559309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
22659309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   return ureg_create_shader_and_destroy(ureg, pipe);
22759309337e40106f734efc1e33f956f6f1f4301acChia-I Wu}
22859309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
22959309337e40106f734efc1e33f956f6f1f4301acChia-I Wu/**
23059309337e40106f734efc1e33f956f6f1f4301acChia-I Wu * Set renderer vertex shader.
23159309337e40106f734efc1e33f956f6f1f4301acChia-I Wu *
23259309337e40106f734efc1e33f956f6f1f4301acChia-I Wu * This function modifies vertex_shader state.
23359309337e40106f734efc1e33f956f6f1f4301acChia-I Wu */
23459309337e40106f734efc1e33f956f6f1f4301acChia-I Wustatic void renderer_set_vs(struct renderer *r, RendererVs id)
23559309337e40106f734efc1e33f956f6f1f4301acChia-I Wu{
23659309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   /* create as needed */
23759309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   if (!r->cached_vs[id]) {
23859309337e40106f734efc1e33f956f6f1f4301acChia-I Wu      int semantic_name = -1;
23959309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
24059309337e40106f734efc1e33f956f6f1f4301acChia-I Wu      switch (id) {
24159309337e40106f734efc1e33f956f6f1f4301acChia-I Wu      case RENDERER_VS_PLAIN:
24259309337e40106f734efc1e33f956f6f1f4301acChia-I Wu         break;
24359309337e40106f734efc1e33f956f6f1f4301acChia-I Wu      case RENDERER_VS_COLOR:
24459309337e40106f734efc1e33f956f6f1f4301acChia-I Wu         semantic_name = TGSI_SEMANTIC_COLOR;
24559309337e40106f734efc1e33f956f6f1f4301acChia-I Wu         break;
24659309337e40106f734efc1e33f956f6f1f4301acChia-I Wu      case RENDERER_VS_TEXTURE:
24759309337e40106f734efc1e33f956f6f1f4301acChia-I Wu         semantic_name = TGSI_SEMANTIC_GENERIC;
24859309337e40106f734efc1e33f956f6f1f4301acChia-I Wu         break;
24959309337e40106f734efc1e33f956f6f1f4301acChia-I Wu      default:
25059309337e40106f734efc1e33f956f6f1f4301acChia-I Wu         assert(!"Unknown renderer vs id");
25159309337e40106f734efc1e33f956f6f1f4301acChia-I Wu         break;
25259309337e40106f734efc1e33f956f6f1f4301acChia-I Wu      }
25359309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
25459309337e40106f734efc1e33f956f6f1f4301acChia-I Wu      r->cached_vs[id] = create_passthrough_vs(r->pipe, semantic_name);
25559309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   }
25659309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
25759309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   cso_set_vertex_shader_handle(r->cso, r->cached_vs[id]);
25859309337e40106f734efc1e33f956f6f1f4301acChia-I Wu}
25959309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
26059309337e40106f734efc1e33f956f6f1f4301acChia-I Wu/**
26154cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu * Create a simple fragment shader that sets the depth to 0.0f.
26254cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu */
26354cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wustatic void *create_scissor_fs(struct pipe_context *pipe)
26454cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu{
26554cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu   struct ureg_program *ureg;
26654cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu   struct ureg_dst out;
26754cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu   struct ureg_src imm;
26854cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu
26954cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu   ureg = ureg_create(TGSI_PROCESSOR_FRAGMENT);
27054cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu   out = ureg_DECL_output(ureg, TGSI_SEMANTIC_POSITION, 0);
27154cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu   imm = ureg_imm4f(ureg, 0.0f, 0.0f, 0.0f, 0.0f);
27254cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu
27354cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu   ureg_MOV(ureg, ureg_writemask(out, TGSI_WRITEMASK_Z), imm);
27454cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu   ureg_END(ureg);
27554cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu
27654cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu   return ureg_create_shader_and_destroy(ureg, pipe);
27754cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu}
27854cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu
27954cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu/**
28030cab4b6cbf741e1ae727bfaed10cc3772e4dff9Chia-I Wu * Create a simple fragment shader that sets the color to white.
28130cab4b6cbf741e1ae727bfaed10cc3772e4dff9Chia-I Wu */
28230cab4b6cbf741e1ae727bfaed10cc3772e4dff9Chia-I Wustatic void *create_white_fs(struct pipe_context *pipe)
28330cab4b6cbf741e1ae727bfaed10cc3772e4dff9Chia-I Wu{
28430cab4b6cbf741e1ae727bfaed10cc3772e4dff9Chia-I Wu   struct ureg_program *ureg;
28530cab4b6cbf741e1ae727bfaed10cc3772e4dff9Chia-I Wu   struct ureg_dst out;
28630cab4b6cbf741e1ae727bfaed10cc3772e4dff9Chia-I Wu   struct ureg_src imm;
28730cab4b6cbf741e1ae727bfaed10cc3772e4dff9Chia-I Wu
28830cab4b6cbf741e1ae727bfaed10cc3772e4dff9Chia-I Wu   ureg = ureg_create(TGSI_PROCESSOR_FRAGMENT);
28930cab4b6cbf741e1ae727bfaed10cc3772e4dff9Chia-I Wu   out = ureg_DECL_output(ureg, TGSI_SEMANTIC_COLOR, 0);
29030cab4b6cbf741e1ae727bfaed10cc3772e4dff9Chia-I Wu   imm = ureg_imm4f(ureg, 1.0f, 1.0f, 1.0f, 1.0f);
29130cab4b6cbf741e1ae727bfaed10cc3772e4dff9Chia-I Wu
29230cab4b6cbf741e1ae727bfaed10cc3772e4dff9Chia-I Wu   ureg_MOV(ureg, out, imm);
29330cab4b6cbf741e1ae727bfaed10cc3772e4dff9Chia-I Wu   ureg_END(ureg);
29430cab4b6cbf741e1ae727bfaed10cc3772e4dff9Chia-I Wu
29530cab4b6cbf741e1ae727bfaed10cc3772e4dff9Chia-I Wu   return ureg_create_shader_and_destroy(ureg, pipe);
29630cab4b6cbf741e1ae727bfaed10cc3772e4dff9Chia-I Wu}
29730cab4b6cbf741e1ae727bfaed10cc3772e4dff9Chia-I Wu
29830cab4b6cbf741e1ae727bfaed10cc3772e4dff9Chia-I Wu/**
29959309337e40106f734efc1e33f956f6f1f4301acChia-I Wu * Set renderer fragment shader.
30059309337e40106f734efc1e33f956f6f1f4301acChia-I Wu *
30159309337e40106f734efc1e33f956f6f1f4301acChia-I Wu * This function modifies fragment_shader state.
30259309337e40106f734efc1e33f956f6f1f4301acChia-I Wu */
30359309337e40106f734efc1e33f956f6f1f4301acChia-I Wustatic void renderer_set_fs(struct renderer *r, RendererFs id)
30459309337e40106f734efc1e33f956f6f1f4301acChia-I Wu{
30559309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   /* create as needed */
30659309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   if (!r->cached_fs[id]) {
30759309337e40106f734efc1e33f956f6f1f4301acChia-I Wu      void *fs = NULL;
30859309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
30959309337e40106f734efc1e33f956f6f1f4301acChia-I Wu      switch (id) {
31059309337e40106f734efc1e33f956f6f1f4301acChia-I Wu      case RENDERER_FS_COLOR:
31159309337e40106f734efc1e33f956f6f1f4301acChia-I Wu         fs = util_make_fragment_passthrough_shader(r->pipe);
31259309337e40106f734efc1e33f956f6f1f4301acChia-I Wu         break;
31359309337e40106f734efc1e33f956f6f1f4301acChia-I Wu      case RENDERER_FS_TEXTURE:
31459309337e40106f734efc1e33f956f6f1f4301acChia-I Wu         fs = util_make_fragment_tex_shader(r->pipe,
31559309337e40106f734efc1e33f956f6f1f4301acChia-I Wu               TGSI_TEXTURE_2D, TGSI_INTERPOLATE_LINEAR);
31659309337e40106f734efc1e33f956f6f1f4301acChia-I Wu         break;
31754cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu      case RENDERER_FS_SCISSOR:
31854cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu         fs = create_scissor_fs(r->pipe);
31954cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu         break;
32030cab4b6cbf741e1ae727bfaed10cc3772e4dff9Chia-I Wu      case RENDERER_FS_WHITE:
32130cab4b6cbf741e1ae727bfaed10cc3772e4dff9Chia-I Wu         fs = create_white_fs(r->pipe);
32230cab4b6cbf741e1ae727bfaed10cc3772e4dff9Chia-I Wu         break;
32359309337e40106f734efc1e33f956f6f1f4301acChia-I Wu      default:
32459309337e40106f734efc1e33f956f6f1f4301acChia-I Wu         assert(!"Unknown renderer fs id");
32559309337e40106f734efc1e33f956f6f1f4301acChia-I Wu         break;
32659309337e40106f734efc1e33f956f6f1f4301acChia-I Wu      }
32759309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
32859309337e40106f734efc1e33f956f6f1f4301acChia-I Wu      r->cached_fs[id] = fs;
32959309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   }
33059309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
33159309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   cso_set_fragment_shader_handle(r->cso, r->cached_fs[id]);
33259309337e40106f734efc1e33f956f6f1f4301acChia-I Wu}
33359309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
334b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wutypedef enum {
335b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu   VEGA_Y0_TOP,
336b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu   VEGA_Y0_BOTTOM
337b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu} VegaOrientation;
338b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu
3394690cdfe076a03b6e9da1db9f1908a663c49c820Chia-I Wustatic void vg_set_viewport(struct renderer *r,
340b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu                            VegaOrientation orientation)
341b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu{
3424690cdfe076a03b6e9da1db9f1908a663c49c820Chia-I Wu   const struct pipe_framebuffer_state *fb = &r->g3d.fb;
343b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu   struct pipe_viewport_state viewport;
344b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu   VGfloat y_scale = (orientation == VEGA_Y0_BOTTOM) ? -2.f : 2.f;
345b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu
3464690cdfe076a03b6e9da1db9f1908a663c49c820Chia-I Wu   viewport.scale[0] =  fb->width / 2.f;
3474690cdfe076a03b6e9da1db9f1908a663c49c820Chia-I Wu   viewport.scale[1] =  fb->height / y_scale;
348b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu   viewport.scale[2] =  1.0;
349b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu   viewport.scale[3] =  1.0;
3504690cdfe076a03b6e9da1db9f1908a663c49c820Chia-I Wu   viewport.translate[0] = fb->width / 2.f;
3514690cdfe076a03b6e9da1db9f1908a663c49c820Chia-I Wu   viewport.translate[1] = fb->height / 2.f;
352b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu   viewport.translate[2] = 0.0;
353b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu   viewport.translate[3] = 0.0;
354b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu
3554690cdfe076a03b6e9da1db9f1908a663c49c820Chia-I Wu   cso_set_viewport(r->cso, &viewport);
356b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu}
357b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu
35859309337e40106f734efc1e33f956f6f1f4301acChia-I Wu/**
35959309337e40106f734efc1e33f956f6f1f4301acChia-I Wu * Set renderer target.
36059309337e40106f734efc1e33f956f6f1f4301acChia-I Wu *
36159309337e40106f734efc1e33f956f6f1f4301acChia-I Wu * This function modifies framebuffer and viewport states.
36259309337e40106f734efc1e33f956f6f1f4301acChia-I Wu */
36359309337e40106f734efc1e33f956f6f1f4301acChia-I Wustatic void renderer_set_target(struct renderer *r,
36459309337e40106f734efc1e33f956f6f1f4301acChia-I Wu                                struct pipe_surface *cbuf,
36559309337e40106f734efc1e33f956f6f1f4301acChia-I Wu                                struct pipe_surface *zsbuf,
36659309337e40106f734efc1e33f956f6f1f4301acChia-I Wu                                VGboolean y0_top)
36759309337e40106f734efc1e33f956f6f1f4301acChia-I Wu{
36859309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   struct pipe_framebuffer_state fb;
36959309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
37059309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   memset(&fb, 0, sizeof(fb));
37159309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   fb.width = cbuf->width;
37259309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   fb.height = cbuf->height;
37359309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   fb.cbufs[0] = cbuf;
37459309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   fb.nr_cbufs = 1;
37559309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   fb.zsbuf = zsbuf;
37659309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   cso_set_framebuffer(r->cso, &fb);
37759309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
3784690cdfe076a03b6e9da1db9f1908a663c49c820Chia-I Wu   vg_set_viewport(r, (y0_top) ? VEGA_Y0_TOP : VEGA_Y0_BOTTOM);
37959309337e40106f734efc1e33f956f6f1f4301acChia-I Wu}
38059309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
38159309337e40106f734efc1e33f956f6f1f4301acChia-I Wu/**
38259309337e40106f734efc1e33f956f6f1f4301acChia-I Wu * Set renderer blend state.  Blending is disabled.
38359309337e40106f734efc1e33f956f6f1f4301acChia-I Wu *
38459309337e40106f734efc1e33f956f6f1f4301acChia-I Wu * This function modifies blend state.
38559309337e40106f734efc1e33f956f6f1f4301acChia-I Wu */
38659309337e40106f734efc1e33f956f6f1f4301acChia-I Wustatic void renderer_set_blend(struct renderer *r,
38759309337e40106f734efc1e33f956f6f1f4301acChia-I Wu                               VGbitfield channel_mask)
38859309337e40106f734efc1e33f956f6f1f4301acChia-I Wu{
38959309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   struct pipe_blend_state blend;
39059309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
39159309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   memset(&blend, 0, sizeof(blend));
39259309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
39359309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   blend.rt[0].rgb_src_factor = PIPE_BLENDFACTOR_ONE;
39459309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   blend.rt[0].alpha_src_factor = PIPE_BLENDFACTOR_ONE;
39559309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   blend.rt[0].rgb_dst_factor = PIPE_BLENDFACTOR_ZERO;
39659309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   blend.rt[0].alpha_dst_factor = PIPE_BLENDFACTOR_ZERO;
39759309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
39859309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   if (channel_mask & VG_RED)
39959309337e40106f734efc1e33f956f6f1f4301acChia-I Wu      blend.rt[0].colormask |= PIPE_MASK_R;
40059309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   if (channel_mask & VG_GREEN)
40159309337e40106f734efc1e33f956f6f1f4301acChia-I Wu      blend.rt[0].colormask |= PIPE_MASK_G;
40259309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   if (channel_mask & VG_BLUE)
40359309337e40106f734efc1e33f956f6f1f4301acChia-I Wu      blend.rt[0].colormask |= PIPE_MASK_B;
40459309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   if (channel_mask & VG_ALPHA)
40559309337e40106f734efc1e33f956f6f1f4301acChia-I Wu      blend.rt[0].colormask |= PIPE_MASK_A;
40659309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
40759309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   cso_set_blend(r->cso, &blend);
40859309337e40106f734efc1e33f956f6f1f4301acChia-I Wu}
40959309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
41059309337e40106f734efc1e33f956f6f1f4301acChia-I Wu/**
41159309337e40106f734efc1e33f956f6f1f4301acChia-I Wu * Set renderer sampler and view states.
41259309337e40106f734efc1e33f956f6f1f4301acChia-I Wu *
41359309337e40106f734efc1e33f956f6f1f4301acChia-I Wu * This function modifies samplers and fragment_sampler_views states.
41459309337e40106f734efc1e33f956f6f1f4301acChia-I Wu */
41559309337e40106f734efc1e33f956f6f1f4301acChia-I Wustatic void renderer_set_samplers(struct renderer *r,
41659309337e40106f734efc1e33f956f6f1f4301acChia-I Wu                                  uint num_views,
41759309337e40106f734efc1e33f956f6f1f4301acChia-I Wu                                  struct pipe_sampler_view **views)
41859309337e40106f734efc1e33f956f6f1f4301acChia-I Wu{
41959309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   struct pipe_sampler_state sampler;
42059309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   unsigned tex_filter = PIPE_TEX_FILTER_NEAREST;
42159309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   unsigned tex_wrap = PIPE_TEX_WRAP_CLAMP_TO_EDGE;
42259309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   uint i;
42359309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
42459309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   memset(&sampler, 0, sizeof(sampler));
42559309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
42659309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   sampler.min_img_filter = tex_filter;
42759309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   sampler.mag_img_filter = tex_filter;
42859309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   sampler.min_mip_filter = PIPE_TEX_MIPFILTER_NONE;
42959309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
43059309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   sampler.wrap_s = tex_wrap;
43159309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   sampler.wrap_t = tex_wrap;
43259309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   sampler.wrap_r = PIPE_TEX_WRAP_CLAMP_TO_EDGE;
43359309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
43459309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   sampler.normalized_coords = 1;
43559309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
43659309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   /* set samplers */
43759309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   for (i = 0; i < num_views; i++)
4383d1bec5d9a1a365286110000a1a37dc96c8db883Brian Paul      cso_single_sampler(r->cso, PIPE_SHADER_FRAGMENT, i, &sampler);
4393d1bec5d9a1a365286110000a1a37dc96c8db883Brian Paul   cso_single_sampler_done(r->cso, PIPE_SHADER_FRAGMENT);
44059309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
44159309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   /* set views */
4423d1bec5d9a1a365286110000a1a37dc96c8db883Brian Paul   cso_set_sampler_views(r->cso, PIPE_SHADER_FRAGMENT, num_views, views);
44359309337e40106f734efc1e33f956f6f1f4301acChia-I Wu}
44459309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
44559309337e40106f734efc1e33f956f6f1f4301acChia-I Wu/**
446e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu * Set custom renderer fragment shader, and optionally set samplers and views
447e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu * and upload the fragment constant buffer.
448e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu *
449e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu * This function modifies fragment_shader, samplers and fragment_sampler_views
450e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu * states.
451e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu */
452e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wustatic void renderer_set_custom_fs(struct renderer *renderer,
453e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu                                   void *fs,
454e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu                                   const struct pipe_sampler_state **samplers,
455e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu                                   struct pipe_sampler_view **views,
456e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu                                   VGint num_samplers,
457e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu                                   const void *const_buffer,
458e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu                                   VGint const_buffer_len)
459e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu{
460e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu   cso_set_fragment_shader_handle(renderer->cso, fs);
461e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu
462e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu   /* set samplers and views */
463e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu   if (num_samplers) {
4643d1bec5d9a1a365286110000a1a37dc96c8db883Brian Paul      cso_set_samplers(renderer->cso, PIPE_SHADER_FRAGMENT, num_samplers, samplers);
4653d1bec5d9a1a365286110000a1a37dc96c8db883Brian Paul      cso_set_sampler_views(renderer->cso, PIPE_SHADER_FRAGMENT, num_samplers, views);
466e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu   }
467e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu
468e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu   /* upload fs constant buffer */
469e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu   if (const_buffer_len) {
4700dadc0b808bb2100f3d2d067b950f3f13081af40Chia-I Wu      struct pipe_resource *cbuf = renderer->fs_cbuf;
4710dadc0b808bb2100f3d2d067b950f3f13081af40Chia-I Wu
4720dadc0b808bb2100f3d2d067b950f3f13081af40Chia-I Wu      if (!cbuf || renderer->fs_cbuf_len != const_buffer_len ||
4730dadc0b808bb2100f3d2d067b950f3f13081af40Chia-I Wu          memcmp(renderer->fs_cbuf_data, const_buffer, const_buffer_len)) {
4740dadc0b808bb2100f3d2d067b950f3f13081af40Chia-I Wu         pipe_resource_reference(&cbuf, NULL);
4750dadc0b808bb2100f3d2d067b950f3f13081af40Chia-I Wu
4760dadc0b808bb2100f3d2d067b950f3f13081af40Chia-I Wu         cbuf = pipe_buffer_create(renderer->pipe->screen,
477eafb7f234d11a290b00dcaf5492b9bdad1cf5148Marek Olšák               PIPE_BIND_CONSTANT_BUFFER, PIPE_USAGE_STATIC,
478eafb7f234d11a290b00dcaf5492b9bdad1cf5148Marek Olšák               const_buffer_len);
4790dadc0b808bb2100f3d2d067b950f3f13081af40Chia-I Wu         pipe_buffer_write(renderer->pipe, cbuf, 0,
4800dadc0b808bb2100f3d2d067b950f3f13081af40Chia-I Wu               const_buffer_len, const_buffer);
481507337864fa80caf9f26602324d2c28dd0a75d61Marek Olšák         pipe_set_constant_buffer(renderer->pipe,
4820dadc0b808bb2100f3d2d067b950f3f13081af40Chia-I Wu               PIPE_SHADER_FRAGMENT, 0, cbuf);
4830dadc0b808bb2100f3d2d067b950f3f13081af40Chia-I Wu
4840dadc0b808bb2100f3d2d067b950f3f13081af40Chia-I Wu         renderer->fs_cbuf = cbuf;
4850dadc0b808bb2100f3d2d067b950f3f13081af40Chia-I Wu         if (const_buffer_len <= sizeof(renderer->fs_cbuf_data)) {
4860dadc0b808bb2100f3d2d067b950f3f13081af40Chia-I Wu            memcpy(renderer->fs_cbuf_data, const_buffer, const_buffer_len);
4870dadc0b808bb2100f3d2d067b950f3f13081af40Chia-I Wu            renderer->fs_cbuf_len = const_buffer_len;
4880dadc0b808bb2100f3d2d067b950f3f13081af40Chia-I Wu         }
4890dadc0b808bb2100f3d2d067b950f3f13081af40Chia-I Wu         else {
4900dadc0b808bb2100f3d2d067b950f3f13081af40Chia-I Wu            renderer->fs_cbuf_len = 0;
4910dadc0b808bb2100f3d2d067b950f3f13081af40Chia-I Wu         }
4920dadc0b808bb2100f3d2d067b950f3f13081af40Chia-I Wu      }
493e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu   }
494e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu}
495e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu
496e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu/**
49759309337e40106f734efc1e33f956f6f1f4301acChia-I Wu * Setup renderer quad position.
49859309337e40106f734efc1e33f956f6f1f4301acChia-I Wu */
49959309337e40106f734efc1e33f956f6f1f4301acChia-I Wustatic void renderer_quad_pos(struct renderer *r,
50059309337e40106f734efc1e33f956f6f1f4301acChia-I Wu                              VGfloat x0, VGfloat y0,
50159309337e40106f734efc1e33f956f6f1f4301acChia-I Wu                              VGfloat x1, VGfloat y1,
50259309337e40106f734efc1e33f956f6f1f4301acChia-I Wu                              VGboolean scissor)
50359309337e40106f734efc1e33f956f6f1f4301acChia-I Wu{
50459309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   VGfloat z;
50559309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
50659309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   /* the depth test is used for scissoring */
50759309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   z = (scissor) ? 0.0f : 1.0f;
50859309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
50959309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   /* positions */
51059309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   r->vertices[0][0][0] = x0;
51159309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   r->vertices[0][0][1] = y0;
51259309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   r->vertices[0][0][2] = z;
51359309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
51459309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   r->vertices[1][0][0] = x1;
51559309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   r->vertices[1][0][1] = y0;
51659309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   r->vertices[1][0][2] = z;
51759309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
51859309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   r->vertices[2][0][0] = x1;
51959309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   r->vertices[2][0][1] = y1;
52059309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   r->vertices[2][0][2] = z;
52159309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
52259309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   r->vertices[3][0][0] = x0;
52359309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   r->vertices[3][0][1] = y1;
52459309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   r->vertices[3][0][2] = z;
52559309337e40106f734efc1e33f956f6f1f4301acChia-I Wu}
52659309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
52759309337e40106f734efc1e33f956f6f1f4301acChia-I Wu/**
52859309337e40106f734efc1e33f956f6f1f4301acChia-I Wu * Setup renderer quad texture coordinates.
52959309337e40106f734efc1e33f956f6f1f4301acChia-I Wu */
53059309337e40106f734efc1e33f956f6f1f4301acChia-I Wustatic void renderer_quad_texcoord(struct renderer *r,
53159309337e40106f734efc1e33f956f6f1f4301acChia-I Wu                                   VGfloat x0, VGfloat y0,
53259309337e40106f734efc1e33f956f6f1f4301acChia-I Wu                                   VGfloat x1, VGfloat y1,
53359309337e40106f734efc1e33f956f6f1f4301acChia-I Wu                                   VGint tex_width, VGint tex_height)
53459309337e40106f734efc1e33f956f6f1f4301acChia-I Wu{
53559309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   VGfloat s0, t0, s1, t1, r0, q0;
53659309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   VGint i;
53759309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
53859309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   s0 = x0 / tex_width;
53959309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   s1 = x1 / tex_width;
54059309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   t0 = y0 / tex_height;
54159309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   t1 = y1 / tex_height;
54259309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   r0 = 0.0f;
54359309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   q0 = 1.0f;
54459309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
54559309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   /* texcoords */
54659309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   r->vertices[0][1][0] = s0;
54759309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   r->vertices[0][1][1] = t0;
54859309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
54959309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   r->vertices[1][1][0] = s1;
55059309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   r->vertices[1][1][1] = t0;
55159309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
55259309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   r->vertices[2][1][0] = s1;
55359309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   r->vertices[2][1][1] = t1;
55459309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
55559309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   r->vertices[3][1][0] = s0;
55659309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   r->vertices[3][1][1] = t1;
55759309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
55859309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   for (i = 0; i < 4; i++) {
55959309337e40106f734efc1e33f956f6f1f4301acChia-I Wu      r->vertices[i][1][2] = r0;
56059309337e40106f734efc1e33f956f6f1f4301acChia-I Wu      r->vertices[i][1][3] = q0;
56159309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   }
56259309337e40106f734efc1e33f956f6f1f4301acChia-I Wu}
56359309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
56459309337e40106f734efc1e33f956f6f1f4301acChia-I Wu/**
56559309337e40106f734efc1e33f956f6f1f4301acChia-I Wu * Draw renderer quad.
56659309337e40106f734efc1e33f956f6f1f4301acChia-I Wu */
56759309337e40106f734efc1e33f956f6f1f4301acChia-I Wustatic void renderer_quad_draw(struct renderer *r)
56859309337e40106f734efc1e33f956f6f1f4301acChia-I Wu{
569fa20733a622770eaaa941f64d570d7b63d8f37b6Marek Olšák   util_draw_user_vertex_buffer(r->cso, r->vertices, PIPE_PRIM_TRIANGLE_FAN,
570fa20733a622770eaaa941f64d570d7b63d8f37b6Marek Olšák                                Elements(r->vertices),     /* verts */
571fa20733a622770eaaa941f64d570d7b63d8f37b6Marek Olšák                                Elements(r->vertices[0])); /* attribs/vert */
57259309337e40106f734efc1e33f956f6f1f4301acChia-I Wu}
57359309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
57459309337e40106f734efc1e33f956f6f1f4301acChia-I Wu/**
57559309337e40106f734efc1e33f956f6f1f4301acChia-I Wu * Prepare the renderer for copying.
57659309337e40106f734efc1e33f956f6f1f4301acChia-I Wu */
57759309337e40106f734efc1e33f956f6f1f4301acChia-I WuVGboolean renderer_copy_begin(struct renderer *renderer,
57859309337e40106f734efc1e33f956f6f1f4301acChia-I Wu                              struct pipe_surface *dst,
57959309337e40106f734efc1e33f956f6f1f4301acChia-I Wu                              VGboolean y0_top,
58059309337e40106f734efc1e33f956f6f1f4301acChia-I Wu                              struct pipe_sampler_view *src)
58159309337e40106f734efc1e33f956f6f1f4301acChia-I Wu{
58259309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   assert(renderer->state == RENDERER_STATE_INIT);
58359309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
58459309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   /* sanity check */
58559309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   if (!renderer_can_support(renderer,
58659309337e40106f734efc1e33f956f6f1f4301acChia-I Wu            dst->texture, PIPE_BIND_RENDER_TARGET) ||
58759309337e40106f734efc1e33f956f6f1f4301acChia-I Wu       !renderer_can_support(renderer,
58859309337e40106f734efc1e33f956f6f1f4301acChia-I Wu          src->texture, PIPE_BIND_SAMPLER_VIEW))
58959309337e40106f734efc1e33f956f6f1f4301acChia-I Wu      return VG_FALSE;
59059309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
59159309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   cso_save_framebuffer(renderer->cso);
59259309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   cso_save_viewport(renderer->cso);
59359309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   cso_save_blend(renderer->cso);
5943d1bec5d9a1a365286110000a1a37dc96c8db883Brian Paul   cso_save_samplers(renderer->cso, PIPE_SHADER_FRAGMENT);
5953d1bec5d9a1a365286110000a1a37dc96c8db883Brian Paul   cso_save_sampler_views(renderer->cso, PIPE_SHADER_FRAGMENT);
59659309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   cso_save_fragment_shader(renderer->cso);
59759309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   cso_save_vertex_shader(renderer->cso);
59859309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
59959309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   renderer_set_target(renderer, dst, NULL, y0_top);
60059309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
60159309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   renderer_set_blend(renderer, ~0);
60259309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   renderer_set_samplers(renderer, 1, &src);
60359309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
60459309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   renderer_set_fs(renderer, RENDERER_FS_TEXTURE);
60559309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   renderer_set_vs(renderer, RENDERER_VS_TEXTURE);
60659309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
607a84a1e344f544ec4da61809d4f09853a94d93e07Chia-I Wu   renderer_set_mvp(renderer, NULL);
608a84a1e344f544ec4da61809d4f09853a94d93e07Chia-I Wu
60959309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   /* remember the texture size */
61059309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   renderer->u.copy.tex_width = src->texture->width0;
61159309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   renderer->u.copy.tex_height = src->texture->height0;
61259309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   renderer->state = RENDERER_STATE_COPY;
61359309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
61459309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   return VG_TRUE;
61559309337e40106f734efc1e33f956f6f1f4301acChia-I Wu}
61659309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
61759309337e40106f734efc1e33f956f6f1f4301acChia-I Wu/**
61859309337e40106f734efc1e33f956f6f1f4301acChia-I Wu * Draw into the destination rectangle given by (x, y, w, h).  The texture is
61959309337e40106f734efc1e33f956f6f1f4301acChia-I Wu * sampled from within the rectangle given by (sx, sy, sw, sh).
62059309337e40106f734efc1e33f956f6f1f4301acChia-I Wu *
62159309337e40106f734efc1e33f956f6f1f4301acChia-I Wu * The coordinates are in surface coordinates.
62259309337e40106f734efc1e33f956f6f1f4301acChia-I Wu */
62359309337e40106f734efc1e33f956f6f1f4301acChia-I Wuvoid renderer_copy(struct renderer *renderer,
62459309337e40106f734efc1e33f956f6f1f4301acChia-I Wu                   VGint x, VGint y, VGint w, VGint h,
62559309337e40106f734efc1e33f956f6f1f4301acChia-I Wu                   VGint sx, VGint sy, VGint sw, VGint sh)
62659309337e40106f734efc1e33f956f6f1f4301acChia-I Wu{
62759309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   assert(renderer->state == RENDERER_STATE_COPY);
62859309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
62959309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   /* there is no depth buffer for scissoring anyway */
63059309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   renderer_quad_pos(renderer, x, y, x + w, y + h, VG_FALSE);
63159309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   renderer_quad_texcoord(renderer, sx, sy, sx + sw, sy + sh,
63259309337e40106f734efc1e33f956f6f1f4301acChia-I Wu         renderer->u.copy.tex_width,
63359309337e40106f734efc1e33f956f6f1f4301acChia-I Wu         renderer->u.copy.tex_height);
63459309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
63559309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   renderer_quad_draw(renderer);
63659309337e40106f734efc1e33f956f6f1f4301acChia-I Wu}
63759309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
63859309337e40106f734efc1e33f956f6f1f4301acChia-I Wu/**
63959309337e40106f734efc1e33f956f6f1f4301acChia-I Wu * End copying and restore the states.
64059309337e40106f734efc1e33f956f6f1f4301acChia-I Wu */
64159309337e40106f734efc1e33f956f6f1f4301acChia-I Wuvoid renderer_copy_end(struct renderer *renderer)
64259309337e40106f734efc1e33f956f6f1f4301acChia-I Wu{
64359309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   assert(renderer->state == RENDERER_STATE_COPY);
64459309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
64559309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   cso_restore_framebuffer(renderer->cso);
64659309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   cso_restore_viewport(renderer->cso);
64759309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   cso_restore_blend(renderer->cso);
6483d1bec5d9a1a365286110000a1a37dc96c8db883Brian Paul   cso_restore_samplers(renderer->cso, PIPE_SHADER_FRAGMENT);
6493d1bec5d9a1a365286110000a1a37dc96c8db883Brian Paul   cso_restore_sampler_views(renderer->cso, PIPE_SHADER_FRAGMENT);
65059309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   cso_restore_fragment_shader(renderer->cso);
65159309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   cso_restore_vertex_shader(renderer->cso);
65259309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
65359309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   renderer->state = RENDERER_STATE_INIT;
65459309337e40106f734efc1e33f956f6f1f4301acChia-I Wu}
65559309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
656e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu/**
657e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu * Prepare the renderer for textured drawing.
658e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu */
659e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I WuVGboolean renderer_drawtex_begin(struct renderer *renderer,
660e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu                                 struct pipe_sampler_view *src)
661e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu{
662e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu   assert(renderer->state == RENDERER_STATE_INIT);
663e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu
664e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu   if (!renderer_can_support(renderer, src->texture, PIPE_BIND_SAMPLER_VIEW))
665e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu      return VG_FALSE;
666e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu
667e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu   cso_save_blend(renderer->cso);
6683d1bec5d9a1a365286110000a1a37dc96c8db883Brian Paul   cso_save_samplers(renderer->cso, PIPE_SHADER_FRAGMENT);
6693d1bec5d9a1a365286110000a1a37dc96c8db883Brian Paul   cso_save_sampler_views(renderer->cso, PIPE_SHADER_FRAGMENT);
670e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu   cso_save_fragment_shader(renderer->cso);
671e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu   cso_save_vertex_shader(renderer->cso);
672e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu
673e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu   renderer_set_blend(renderer, ~0);
674e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu
675e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu   renderer_set_samplers(renderer, 1, &src);
676e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu
677e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu   renderer_set_fs(renderer, RENDERER_FS_TEXTURE);
678e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu   renderer_set_vs(renderer, RENDERER_VS_TEXTURE);
679e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu
680a84a1e344f544ec4da61809d4f09853a94d93e07Chia-I Wu   renderer_set_mvp(renderer, NULL);
681a84a1e344f544ec4da61809d4f09853a94d93e07Chia-I Wu
682e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu   /* remember the texture size */
683e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu   renderer->u.drawtex.tex_width = src->texture->width0;
684e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu   renderer->u.drawtex.tex_height = src->texture->height0;
685e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu   renderer->state = RENDERER_STATE_DRAWTEX;
686e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu
687e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu   return VG_TRUE;
688e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu}
689e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu
690e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu/**
691e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu * Draw into the destination rectangle given by (x, y, w, h).  The texture is
692e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu * sampled from within the rectangle given by (sx, sy, sw, sh).
693e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu *
694e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu * The coordinates are in surface coordinates.
695e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu */
696e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wuvoid renderer_drawtex(struct renderer *renderer,
697e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu                      VGint x, VGint y, VGint w, VGint h,
698e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu                      VGint sx, VGint sy, VGint sw, VGint sh)
699e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu{
700e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu   assert(renderer->state == RENDERER_STATE_DRAWTEX);
701e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu
702e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu   /* with scissoring */
703e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu   renderer_quad_pos(renderer, x, y, x + w, y + h, VG_TRUE);
704e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu   renderer_quad_texcoord(renderer, sx, sy, sx + sw, sy + sh,
705e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu         renderer->u.drawtex.tex_width,
706e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu         renderer->u.drawtex.tex_height);
707e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu
708e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu   renderer_quad_draw(renderer);
709e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu}
710e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu
711e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu/**
712e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu * End textured drawing and restore the states.
713e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu */
714e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wuvoid renderer_drawtex_end(struct renderer *renderer)
715e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu{
716e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu   assert(renderer->state == RENDERER_STATE_DRAWTEX);
717e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu
718e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu   cso_restore_blend(renderer->cso);
7193d1bec5d9a1a365286110000a1a37dc96c8db883Brian Paul   cso_restore_samplers(renderer->cso, PIPE_SHADER_FRAGMENT);
7203d1bec5d9a1a365286110000a1a37dc96c8db883Brian Paul   cso_restore_sampler_views(renderer->cso, PIPE_SHADER_FRAGMENT);
721e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu   cso_restore_fragment_shader(renderer->cso);
722e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu   cso_restore_vertex_shader(renderer->cso);
723e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu
724e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu   renderer->state = RENDERER_STATE_INIT;
725e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu}
726e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu
72754cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu/**
72854cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu * Prepare the renderer for scissor update.  This will reset the depth buffer
72954cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu * to 1.0f.
73054cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu */
73154cb382ea55610688c97465ef048a4990b8fd4d7Chia-I WuVGboolean renderer_scissor_begin(struct renderer *renderer,
73254cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu                                 VGboolean restore_dsa)
73354cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu{
73454cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu   struct pipe_depth_stencil_alpha_state dsa;
73554cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu
73654cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu   assert(renderer->state == RENDERER_STATE_INIT);
73754cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu
73854cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu   if (restore_dsa)
73954cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu      cso_save_depth_stencil_alpha(renderer->cso);
74054cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu   cso_save_blend(renderer->cso);
74154cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu   cso_save_fragment_shader(renderer->cso);
74254cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu
74354cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu   /* enable depth writes */
74454cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu   memset(&dsa, 0, sizeof(dsa));
74554cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu   dsa.depth.enabled = 1;
74654cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu   dsa.depth.writemask = 1;
74754cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu   dsa.depth.func = PIPE_FUNC_ALWAYS;
74854cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu   cso_set_depth_stencil_alpha(renderer->cso, &dsa);
74954cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu
75054cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu   /* disable color writes */
75154cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu   renderer_set_blend(renderer, 0);
75254cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu   renderer_set_fs(renderer, RENDERER_FS_SCISSOR);
75354cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu
754a84a1e344f544ec4da61809d4f09853a94d93e07Chia-I Wu   renderer_set_mvp(renderer, NULL);
755a84a1e344f544ec4da61809d4f09853a94d93e07Chia-I Wu
75654cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu   renderer->u.scissor.restore_dsa = restore_dsa;
75754cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu   renderer->state = RENDERER_STATE_SCISSOR;
75854cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu
75954cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu   /* clear the depth buffer to 1.0f */
76054cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu   renderer->pipe->clear(renderer->pipe,
76154cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu         PIPE_CLEAR_DEPTHSTENCIL, NULL, 1.0f, 0);
76254cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu
76354cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu   return VG_TRUE;
76454cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu}
76554cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu
76654cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu/**
76754cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu * Add a scissor rectangle.  Depth values inside the rectangle will be set to
76854cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu * 0.0f.
76954cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu */
77054cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wuvoid renderer_scissor(struct renderer *renderer,
77154cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu                      VGint x, VGint y, VGint width, VGint height)
77254cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu{
77354cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu   assert(renderer->state == RENDERER_STATE_SCISSOR);
77454cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu
77554cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu   renderer_quad_pos(renderer, x, y, x + width, y + height, VG_FALSE);
77654cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu   renderer_quad_draw(renderer);
77754cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu}
77854cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu
77954cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu/**
78054cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu * End scissor update and restore the states.
78154cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu */
78254cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wuvoid renderer_scissor_end(struct renderer *renderer)
78354cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu{
78454cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu   assert(renderer->state == RENDERER_STATE_SCISSOR);
78554cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu
78654cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu   if (renderer->u.scissor.restore_dsa)
78754cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu      cso_restore_depth_stencil_alpha(renderer->cso);
78854cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu   cso_restore_blend(renderer->cso);
78954cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu   cso_restore_fragment_shader(renderer->cso);
79054cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu
79154cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu   renderer->state = RENDERER_STATE_INIT;
79254cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu}
79354cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu
7946b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu/**
7956b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu * Prepare the renderer for clearing.
7966b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu */
7976b241f532a21990a7849c5a786504f7ac4124f76Chia-I WuVGboolean renderer_clear_begin(struct renderer *renderer)
7986b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu{
7996b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu   assert(renderer->state == RENDERER_STATE_INIT);
8006b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu
8016b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu   cso_save_blend(renderer->cso);
8026b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu   cso_save_fragment_shader(renderer->cso);
8036b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu   cso_save_vertex_shader(renderer->cso);
8046b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu
8056b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu   renderer_set_blend(renderer, ~0);
8066b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu   renderer_set_fs(renderer, RENDERER_FS_COLOR);
8076b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu   renderer_set_vs(renderer, RENDERER_VS_COLOR);
8086b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu
809a84a1e344f544ec4da61809d4f09853a94d93e07Chia-I Wu   renderer_set_mvp(renderer, NULL);
810a84a1e344f544ec4da61809d4f09853a94d93e07Chia-I Wu
8116b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu   renderer->state = RENDERER_STATE_CLEAR;
8126b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu
8136b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu   return VG_TRUE;
8146b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu}
8156b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu
8166b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu/**
8176b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu * Clear the framebuffer with the specified region and color.
8186b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu *
8196b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu * The coordinates are in surface coordinates.
8206b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu */
8216b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wuvoid renderer_clear(struct renderer *renderer,
8226b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu                    VGint x, VGint y, VGint width, VGint height,
8236b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu                    const VGfloat color[4])
8246b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu{
8256b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu   VGuint i;
8266b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu
8276b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu   assert(renderer->state == RENDERER_STATE_CLEAR);
8286b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu
8296b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu   renderer_quad_pos(renderer, x, y, x + width, y + height, VG_TRUE);
8306b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu   for (i = 0; i < 4; i++)
8316b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu      memcpy(renderer->vertices[i][1], color, sizeof(VGfloat) * 4);
8326b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu
8336b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu   renderer_quad_draw(renderer);
8346b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu}
8356b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu
8366b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu/**
8376b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu * End clearing and retore the states.
8386b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu */
8396b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wuvoid renderer_clear_end(struct renderer *renderer)
8406b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu{
8416b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu   assert(renderer->state == RENDERER_STATE_CLEAR);
8426b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu
8436b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu   cso_restore_blend(renderer->cso);
8446b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu   cso_restore_fragment_shader(renderer->cso);
8456b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu   cso_restore_vertex_shader(renderer->cso);
8466b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu
8476b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu   renderer->state = RENDERER_STATE_INIT;
8486b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu}
8496b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu
850e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu/**
851e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu * Prepare the renderer for image filtering.
852e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu */
853e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I WuVGboolean renderer_filter_begin(struct renderer *renderer,
854e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu                                struct pipe_resource *dst,
855e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu                                VGboolean y0_top,
856e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu                                VGbitfield channel_mask,
857e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu                                const struct pipe_sampler_state **samplers,
858e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu                                struct pipe_sampler_view **views,
859e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu                                VGint num_samplers,
860e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu                                void *fs,
861e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu                                const void *const_buffer,
862e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu                                VGint const_buffer_len)
863e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu{
8644c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger   struct pipe_surface *surf, surf_tmpl;
865e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu
866e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu   assert(renderer->state == RENDERER_STATE_INIT);
867e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu
868e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu   if (!fs)
869e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu      return VG_FALSE;
870e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu   if (!renderer_can_support(renderer, dst, PIPE_BIND_RENDER_TARGET))
871e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu      return VG_FALSE;
872e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu
8734c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger   u_surface_default_template(&surf_tmpl, dst,
8744c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                              PIPE_BIND_RENDER_TARGET);
8754c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger   surf = renderer->pipe->create_surface(renderer->pipe, dst, &surf_tmpl);
876e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu   if (!surf)
877e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu      return VG_FALSE;
878e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu
879e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu   cso_save_framebuffer(renderer->cso);
880e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu   cso_save_viewport(renderer->cso);
881e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu   cso_save_blend(renderer->cso);
882e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu
883e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu   /* set the image as the target */
884e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu   renderer_set_target(renderer, surf, NULL, y0_top);
885e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu   pipe_surface_reference(&surf, NULL);
886e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu
887e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu   renderer_set_blend(renderer, channel_mask);
888e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu
889e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu   if (num_samplers) {
890e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu      struct pipe_resource *tex;
891e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu
8923d1bec5d9a1a365286110000a1a37dc96c8db883Brian Paul      cso_save_samplers(renderer->cso, PIPE_SHADER_FRAGMENT);
8933d1bec5d9a1a365286110000a1a37dc96c8db883Brian Paul      cso_save_sampler_views(renderer->cso, PIPE_SHADER_FRAGMENT);
894e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu      cso_save_fragment_shader(renderer->cso);
895e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu      cso_save_vertex_shader(renderer->cso);
896e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu
897e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu      renderer_set_custom_fs(renderer, fs,
898e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu                             samplers, views, num_samplers,
899e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu                             const_buffer, const_buffer_len);
900e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu      renderer_set_vs(renderer, RENDERER_VS_TEXTURE);
901e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu
902e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu      tex = views[0]->texture;
903e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu      renderer->u.filter.tex_width = tex->width0;
904e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu      renderer->u.filter.tex_height = tex->height0;
905e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu      renderer->u.filter.use_sampler = VG_TRUE;
906e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu   }
907e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu   else {
908e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu      cso_save_fragment_shader(renderer->cso);
909e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu
910e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu      renderer_set_custom_fs(renderer, fs, NULL, NULL, 0,
911e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu                             const_buffer, const_buffer_len);
912e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu
913e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu      renderer->u.filter.use_sampler = VG_FALSE;
914e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu   }
915e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu
916a84a1e344f544ec4da61809d4f09853a94d93e07Chia-I Wu   renderer_set_mvp(renderer, NULL);
917a84a1e344f544ec4da61809d4f09853a94d93e07Chia-I Wu
918e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu   renderer->state = RENDERER_STATE_FILTER;
919e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu
920e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu   return VG_TRUE;
921e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu}
922e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu
923e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu/**
924e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu * Draw into a rectangle of the destination with the specified region of the
925e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu * texture(s).
926e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu *
927e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu * The coordinates are in surface coordinates.
928e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu */
929e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wuvoid renderer_filter(struct renderer *renderer,
930e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu                    VGint x, VGint y, VGint w, VGint h,
931e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu                    VGint sx, VGint sy, VGint sw, VGint sh)
932e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu{
933e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu   assert(renderer->state == RENDERER_STATE_FILTER);
934e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu
935e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu   renderer_quad_pos(renderer, x, y, x + w, y + h, VG_FALSE);
936e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu   if (renderer->u.filter.use_sampler) {
937e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu      renderer_quad_texcoord(renderer, sx, sy, sx + sw, sy + sh,
938e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu            renderer->u.filter.tex_width,
939e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu            renderer->u.filter.tex_height);
940e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu   }
941e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu
942e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu   renderer_quad_draw(renderer);
943e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu}
944e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu
945e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu/**
946e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu * End image filtering and restore the states.
947e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu */
948e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wuvoid renderer_filter_end(struct renderer *renderer)
949e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu{
950e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu   assert(renderer->state == RENDERER_STATE_FILTER);
951e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu
952e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu   if (renderer->u.filter.use_sampler) {
9533d1bec5d9a1a365286110000a1a37dc96c8db883Brian Paul      cso_restore_samplers(renderer->cso, PIPE_SHADER_FRAGMENT);
9543d1bec5d9a1a365286110000a1a37dc96c8db883Brian Paul      cso_restore_sampler_views(renderer->cso, PIPE_SHADER_FRAGMENT);
955e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu      cso_restore_vertex_shader(renderer->cso);
956e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu   }
957e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu
958e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu   cso_restore_framebuffer(renderer->cso);
959e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu   cso_restore_viewport(renderer->cso);
960e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu   cso_restore_blend(renderer->cso);
961e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu   cso_restore_fragment_shader(renderer->cso);
962e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu
963e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu   renderer->state = RENDERER_STATE_INIT;
964e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu}
965e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu
9663b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu/**
9673b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu * Prepare the renderer for polygon silhouette rendering.
9683b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu */
9693b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I WuVGboolean renderer_polygon_stencil_begin(struct renderer *renderer,
9703b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu                                         struct pipe_vertex_element *velem,
9713b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu                                         VGFillRule rule,
9723b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu                                         VGboolean restore_dsa)
9733b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu{
9743b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   struct pipe_depth_stencil_alpha_state *dsa;
9753b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   VGboolean manual_two_sides;
9763b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu
9773b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   assert(renderer->state == RENDERER_STATE_INIT);
9783b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu
979d7a6901cac48cc3c4eea24113e108ef9dce843c4Chia-I Wu   cso_save_vertex_elements(renderer->cso);
9803b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   cso_save_blend(renderer->cso);
9813b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   cso_save_depth_stencil_alpha(renderer->cso);
9823b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu
9833b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   cso_set_vertex_elements(renderer->cso, 1, velem);
9843b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu
9853b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   /* disable color writes */
9863b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   renderer_set_blend(renderer, 0);
9873b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu
9883b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   manual_two_sides = VG_FALSE;
9893b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   dsa = &renderer->u.polygon_stencil.dsa;
9903b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   memset(dsa, 0, sizeof(*dsa));
9913b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   if (rule == VG_EVEN_ODD) {
9923b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu      dsa->stencil[0].enabled = 1;
9933b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu      dsa->stencil[0].writemask = 1;
9943b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu      dsa->stencil[0].fail_op = PIPE_STENCIL_OP_KEEP;
9953b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu      dsa->stencil[0].zfail_op = PIPE_STENCIL_OP_KEEP;
9963b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu      dsa->stencil[0].zpass_op = PIPE_STENCIL_OP_INVERT;
9973b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu      dsa->stencil[0].func = PIPE_FUNC_ALWAYS;
9983b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu      dsa->stencil[0].valuemask = ~0;
9993b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   }
10003b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   else {
10013b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu      assert(rule == VG_NON_ZERO);
10023b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu
10033b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu      /* front face */
10043b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu      dsa->stencil[0].enabled = 1;
10053b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu      dsa->stencil[0].writemask = ~0;
10063b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu      dsa->stencil[0].fail_op = PIPE_STENCIL_OP_KEEP;
10073b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu      dsa->stencil[0].zfail_op = PIPE_STENCIL_OP_KEEP;
10083b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu      dsa->stencil[0].zpass_op = PIPE_STENCIL_OP_INCR_WRAP;
10093b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu      dsa->stencil[0].func = PIPE_FUNC_ALWAYS;
10103b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu      dsa->stencil[0].valuemask = ~0;
10113b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu
10123b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu      if (renderer->pipe->screen->get_param(renderer->pipe->screen,
10133b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu                                            PIPE_CAP_TWO_SIDED_STENCIL)) {
10143b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu         /* back face */
10153b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu         dsa->stencil[1] = dsa->stencil[0];
10163b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu         dsa->stencil[1].zpass_op = PIPE_STENCIL_OP_DECR_WRAP;
10173b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu      }
10183b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu      else {
10193b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu         manual_two_sides = VG_TRUE;
10203b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu      }
10213b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   }
10223b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   cso_set_depth_stencil_alpha(renderer->cso, dsa);
10233b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu
10243b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   if (manual_two_sides)
10253b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu      cso_save_rasterizer(renderer->cso);
10263b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu
10273b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   renderer->u.polygon_stencil.manual_two_sides = manual_two_sides;
10283b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   renderer->u.polygon_stencil.restore_dsa = restore_dsa;
10293b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   renderer->state = RENDERER_STATE_POLYGON_STENCIL;
10303b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu
10313b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   return VG_TRUE;
10323b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu}
10333b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu
10343b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu/**
10353b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu * Render a polygon silhouette to stencil buffer.
10363b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu */
10373b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wuvoid renderer_polygon_stencil(struct renderer *renderer,
10383b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu                              struct pipe_vertex_buffer *vbuf,
10393b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu                              VGuint mode, VGuint start, VGuint count)
10403b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu{
10413b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   assert(renderer->state == RENDERER_STATE_POLYGON_STENCIL);
10423b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu
1043d5062fb3a315c46d77d5c954a3e3c14be1907d33Marek Olšák   cso_set_vertex_buffers(renderer->cso, 1, vbuf);
10443b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu
10453b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   if (!renderer->u.polygon_stencil.manual_two_sides) {
10460279d15c990d831c7cc4e76cbe7caeba1347b689Marek Olšák      cso_draw_arrays(renderer->cso, mode, start, count);
10473b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   }
10483b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   else {
10493b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu      struct pipe_rasterizer_state raster;
10503b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu      struct pipe_depth_stencil_alpha_state dsa;
10513b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu
1052b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu      raster = renderer->g3d.rasterizer;
10533b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu      dsa = renderer->u.polygon_stencil.dsa;
10543b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu
10553b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu      /* front */
10563b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu      raster.cull_face = PIPE_FACE_BACK;
10573b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu      dsa.stencil[0].zpass_op = PIPE_STENCIL_OP_INCR_WRAP;
10583b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu
10593b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu      cso_set_rasterizer(renderer->cso, &raster);
10603b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu      cso_set_depth_stencil_alpha(renderer->cso, &dsa);
10610279d15c990d831c7cc4e76cbe7caeba1347b689Marek Olšák      cso_draw_arrays(renderer->cso, mode, start, count);
10623b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu
10633b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu      /* back */
10643b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu      raster.cull_face = PIPE_FACE_FRONT;
10653b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu      dsa.stencil[0].zpass_op = PIPE_STENCIL_OP_DECR_WRAP;
10663b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu
10673b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu      cso_set_rasterizer(renderer->cso, &raster);
10683b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu      cso_set_depth_stencil_alpha(renderer->cso, &dsa);
10690279d15c990d831c7cc4e76cbe7caeba1347b689Marek Olšák      cso_draw_arrays(renderer->cso, mode, start, count);
10703b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   }
10713b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu}
10723b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu
10733b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu/**
10743b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu * End polygon silhouette rendering.
10753b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu */
10763b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wuvoid renderer_polygon_stencil_end(struct renderer *renderer)
10773b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu{
10783b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   assert(renderer->state == RENDERER_STATE_POLYGON_STENCIL);
10793b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu
10803b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   if (renderer->u.polygon_stencil.manual_two_sides)
10813b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu      cso_restore_rasterizer(renderer->cso);
10823b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu
1083d7a6901cac48cc3c4eea24113e108ef9dce843c4Chia-I Wu   cso_restore_vertex_elements(renderer->cso);
1084d7a6901cac48cc3c4eea24113e108ef9dce843c4Chia-I Wu
10853b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   /* restore color writes */
10863b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   cso_restore_blend(renderer->cso);
10873b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu
10883b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   if (renderer->u.polygon_stencil.restore_dsa)
10893b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu      cso_restore_depth_stencil_alpha(renderer->cso);
10903b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu
10913b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   renderer->state = RENDERER_STATE_INIT;
10923b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu}
10933b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu
10943b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu/**
10953b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu * Prepare the renderer for polygon filling.
10963b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu */
10973b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I WuVGboolean renderer_polygon_fill_begin(struct renderer *renderer,
10983b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu                                      VGboolean save_dsa)
10993b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu{
11003b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   struct pipe_depth_stencil_alpha_state dsa;
11013b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu
11023b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   assert(renderer->state == RENDERER_STATE_INIT);
11033b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu
11043b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   if (save_dsa)
11053b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu      cso_save_depth_stencil_alpha(renderer->cso);
11063b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu
11073b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   /* setup stencil ops */
11083b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   memset(&dsa, 0, sizeof(dsa));
11093b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   dsa.stencil[0].enabled = 1;
11103b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   dsa.stencil[0].func = PIPE_FUNC_NOTEQUAL;
11113b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   dsa.stencil[0].fail_op = PIPE_STENCIL_OP_REPLACE;
11123b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   dsa.stencil[0].zfail_op = PIPE_STENCIL_OP_REPLACE;
11133b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   dsa.stencil[0].zpass_op = PIPE_STENCIL_OP_REPLACE;
11143b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   dsa.stencil[0].valuemask = ~0;
11153b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   dsa.stencil[0].writemask = ~0;
1116b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu   dsa.depth = renderer->g3d.dsa.depth;
11173b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   cso_set_depth_stencil_alpha(renderer->cso, &dsa);
11183b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu
11193b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   renderer->state = RENDERER_STATE_POLYGON_FILL;
11203b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu
11213b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   return VG_TRUE;
11223b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu}
11233b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu
11243b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu/**
11253b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu * Fill a polygon.
11263b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu */
11273b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wuvoid renderer_polygon_fill(struct renderer *renderer,
11283b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu                           VGfloat min_x, VGfloat min_y,
11293b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu                           VGfloat max_x, VGfloat max_y)
11303b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu{
11313b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   assert(renderer->state == RENDERER_STATE_POLYGON_FILL);
11323b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu
11333b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   renderer_quad_pos(renderer, min_x, min_y, max_x, max_y, VG_TRUE);
11343b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   renderer_quad_draw(renderer);
11353b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu}
11363b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu
11373b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu/**
11383b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu * End polygon filling.
11393b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu */
11403b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wuvoid renderer_polygon_fill_end(struct renderer *renderer)
11413b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu{
11423b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   assert(renderer->state == RENDERER_STATE_POLYGON_FILL);
11433b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu
11443b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   cso_restore_depth_stencil_alpha(renderer->cso);
11453b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu
11463b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   renderer->state = RENDERER_STATE_INIT;
11473b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu}
11483b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu
1149544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusinstruct renderer * renderer_create(struct vg_context *owner)
1150544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin{
1151d7a6901cac48cc3c4eea24113e108ef9dce843c4Chia-I Wu   struct renderer *renderer;
1152d7a6901cac48cc3c4eea24113e108ef9dce843c4Chia-I Wu   struct pipe_rasterizer_state *raster;
1153d7a6901cac48cc3c4eea24113e108ef9dce843c4Chia-I Wu   struct pipe_stencil_ref sr;
1154544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   VGint i;
1155544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
1156d7a6901cac48cc3c4eea24113e108ef9dce843c4Chia-I Wu   renderer = CALLOC_STRUCT(renderer);
1157544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   if (!renderer)
1158544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      return NULL;
1159544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
1160544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   renderer->pipe = owner->pipe;
1161544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   renderer->cso = owner->cso_context;
1162544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
1163544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   /* init vertex data that doesn't change */
116459309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   for (i = 0; i < 4; i++)
1165544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      renderer->vertices[i][0][3] = 1.0f; /* w */
116659309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
1167ace4539e88f6ef90d8e9fd2f1543eca0ae854b82Chia-I Wu   for (i = 0; i < 2; i++) {
1168ace4539e88f6ef90d8e9fd2f1543eca0ae854b82Chia-I Wu      renderer->velems[i].src_offset = i * 4 * sizeof(float);
1169ace4539e88f6ef90d8e9fd2f1543eca0ae854b82Chia-I Wu      renderer->velems[i].instance_divisor = 0;
1170ace4539e88f6ef90d8e9fd2f1543eca0ae854b82Chia-I Wu      renderer->velems[i].vertex_buffer_index = 0;
1171ace4539e88f6ef90d8e9fd2f1543eca0ae854b82Chia-I Wu      renderer->velems[i].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT;
1172ace4539e88f6ef90d8e9fd2f1543eca0ae854b82Chia-I Wu   }
1173d7a6901cac48cc3c4eea24113e108ef9dce843c4Chia-I Wu   cso_set_vertex_elements(renderer->cso, 2, renderer->velems);
1174d7a6901cac48cc3c4eea24113e108ef9dce843c4Chia-I Wu
1175d7a6901cac48cc3c4eea24113e108ef9dce843c4Chia-I Wu   /* GL rasterization rules */
1176d7a6901cac48cc3c4eea24113e108ef9dce843c4Chia-I Wu   raster = &renderer->g3d.rasterizer;
1177d7a6901cac48cc3c4eea24113e108ef9dce843c4Chia-I Wu   memset(raster, 0, sizeof(*raster));
1178d7a6901cac48cc3c4eea24113e108ef9dce843c4Chia-I Wu   raster->gl_rasterization_rules = 1;
1179dc4c821f0817a3db716f965692fb701079f66340Marek Olšák   raster->depth_clip = 1;
1180d7a6901cac48cc3c4eea24113e108ef9dce843c4Chia-I Wu   cso_set_rasterizer(renderer->cso, raster);
1181d7a6901cac48cc3c4eea24113e108ef9dce843c4Chia-I Wu
1182d7a6901cac48cc3c4eea24113e108ef9dce843c4Chia-I Wu   /* fixed at 0 */
1183d7a6901cac48cc3c4eea24113e108ef9dce843c4Chia-I Wu   memset(&sr, 0, sizeof(sr));
1184d7a6901cac48cc3c4eea24113e108ef9dce843c4Chia-I Wu   cso_set_stencil_ref(renderer->cso, &sr);
1185d7a6901cac48cc3c4eea24113e108ef9dce843c4Chia-I Wu
1186d7a6901cac48cc3c4eea24113e108ef9dce843c4Chia-I Wu   renderer_set_vs(renderer, RENDERER_VS_PLAIN);
1187ace4539e88f6ef90d8e9fd2f1543eca0ae854b82Chia-I Wu
118859309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   renderer->state = RENDERER_STATE_INIT;
1189544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
1190544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   return renderer;
1191544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin}
1192544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
1193544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusinvoid renderer_destroy(struct renderer *ctx)
1194544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin{
119559309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   int i;
119659309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
119759309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   for (i = 0; i < NUM_RENDERER_VS; i++) {
119859309337e40106f734efc1e33f956f6f1f4301acChia-I Wu      if (ctx->cached_vs[i])
119959309337e40106f734efc1e33f956f6f1f4301acChia-I Wu         cso_delete_vertex_shader(ctx->cso, ctx->cached_vs[i]);
120059309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   }
120159309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   for (i = 0; i < NUM_RENDERER_FS; i++) {
120259309337e40106f734efc1e33f956f6f1f4301acChia-I Wu      if (ctx->cached_fs[i])
120359309337e40106f734efc1e33f956f6f1f4301acChia-I Wu         cso_delete_fragment_shader(ctx->cso, ctx->cached_fs[i]);
120459309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   }
120559309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
12060dadc0b808bb2100f3d2d067b950f3f13081af40Chia-I Wu   pipe_resource_reference(&ctx->vs_cbuf, NULL);
12070dadc0b808bb2100f3d2d067b950f3f13081af40Chia-I Wu   pipe_resource_reference(&ctx->fs_cbuf, NULL);
1208b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu
1209f914cd1796845164109c837a111c39ba64852ad4nobled   FREE(ctx);
1210544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin}
1211544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
1212b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wustatic void update_clip_state(struct renderer *renderer,
1213b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu                              const struct vg_state *state)
1214b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu{
1215b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu   struct pipe_depth_stencil_alpha_state *dsa = &renderer->g3d.dsa;
1216b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu
1217b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu   memset(dsa, 0, sizeof(struct pipe_depth_stencil_alpha_state));
1218b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu
1219b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu   if (state->scissoring) {
1220b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu      struct pipe_framebuffer_state *fb = &renderer->g3d.fb;
1221b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu      int i;
1222b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu
1223b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu      renderer_scissor_begin(renderer, VG_FALSE);
1224b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu
1225b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu      for (i = 0; i < state->scissor_rects_num; ++i) {
1226b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu         const float x      = state->scissor_rects[i * 4 + 0].f;
1227b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu         const float y      = state->scissor_rects[i * 4 + 1].f;
1228b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu         const float width  = state->scissor_rects[i * 4 + 2].f;
1229b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu         const float height = state->scissor_rects[i * 4 + 3].f;
1230b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu         VGint x0, y0, x1, y1, iw, ih;
1231b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu
1232b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu         x0 = (VGint) x;
1233b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu         y0 = (VGint) y;
1234b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu         if (x0 < 0)
1235b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu            x0 = 0;
1236b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu         if (y0 < 0)
1237b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu            y0 = 0;
1238b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu
1239b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu         /* note that x1 and y1 are exclusive */
1240b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu         x1 = (VGint) ceilf(x + width);
1241b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu         y1 = (VGint) ceilf(y + height);
1242b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu         if (x1 > fb->width)
1243b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu            x1 = fb->width;
1244b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu         if (y1 > fb->height)
1245b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu            y1 = fb->height;
1246b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu
1247b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu         iw = x1 - x0;
1248b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu         ih = y1 - y0;
1249b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu         if (iw > 0 && ih> 0 )
1250b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu            renderer_scissor(renderer, x0, y0, iw, ih);
1251b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu      }
1252b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu
1253b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu      renderer_scissor_end(renderer);
1254b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu
1255b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu      dsa->depth.enabled = 1; /* glEnable(GL_DEPTH_TEST); */
1256b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu      dsa->depth.writemask = 0;/*glDepthMask(FALSE);*/
1257b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu      dsa->depth.func = PIPE_FUNC_GEQUAL;
1258b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu   }
1259b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu}
1260b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu
1261859106f196ade77f59f8787b071739901cd1a843Chia-I Wustatic void renderer_validate_blend(struct renderer *renderer,
1262859106f196ade77f59f8787b071739901cd1a843Chia-I Wu                                     const struct vg_state *state,
1263859106f196ade77f59f8787b071739901cd1a843Chia-I Wu                                     enum pipe_format fb_format)
1264859106f196ade77f59f8787b071739901cd1a843Chia-I Wu{
1265859106f196ade77f59f8787b071739901cd1a843Chia-I Wu   struct pipe_blend_state blend;
1266859106f196ade77f59f8787b071739901cd1a843Chia-I Wu
1267859106f196ade77f59f8787b071739901cd1a843Chia-I Wu   memset(&blend, 0, sizeof(blend));
1268859106f196ade77f59f8787b071739901cd1a843Chia-I Wu   blend.rt[0].colormask = PIPE_MASK_RGBA;
1269859106f196ade77f59f8787b071739901cd1a843Chia-I Wu   blend.rt[0].rgb_src_factor   = PIPE_BLENDFACTOR_ONE;
1270859106f196ade77f59f8787b071739901cd1a843Chia-I Wu   blend.rt[0].alpha_src_factor = PIPE_BLENDFACTOR_ONE;
1271859106f196ade77f59f8787b071739901cd1a843Chia-I Wu   blend.rt[0].rgb_dst_factor   = PIPE_BLENDFACTOR_ZERO;
1272859106f196ade77f59f8787b071739901cd1a843Chia-I Wu   blend.rt[0].alpha_dst_factor = PIPE_BLENDFACTOR_ZERO;
1273859106f196ade77f59f8787b071739901cd1a843Chia-I Wu
1274859106f196ade77f59f8787b071739901cd1a843Chia-I Wu   /* TODO alpha masking happens after blending? */
1275859106f196ade77f59f8787b071739901cd1a843Chia-I Wu
1276859106f196ade77f59f8787b071739901cd1a843Chia-I Wu   switch (state->blend_mode) {
1277859106f196ade77f59f8787b071739901cd1a843Chia-I Wu   case VG_BLEND_SRC:
1278859106f196ade77f59f8787b071739901cd1a843Chia-I Wu      blend.rt[0].rgb_src_factor   = PIPE_BLENDFACTOR_ONE;
1279859106f196ade77f59f8787b071739901cd1a843Chia-I Wu      blend.rt[0].alpha_src_factor = PIPE_BLENDFACTOR_ONE;
1280859106f196ade77f59f8787b071739901cd1a843Chia-I Wu      blend.rt[0].rgb_dst_factor   = PIPE_BLENDFACTOR_ZERO;
1281859106f196ade77f59f8787b071739901cd1a843Chia-I Wu      blend.rt[0].alpha_dst_factor = PIPE_BLENDFACTOR_ZERO;
1282859106f196ade77f59f8787b071739901cd1a843Chia-I Wu      break;
1283859106f196ade77f59f8787b071739901cd1a843Chia-I Wu   case VG_BLEND_SRC_OVER:
12844a96a02de7c1b8c136ffc0cd278401c85faab233Chia-I Wu      /* use the blend state only when there is no alpha channel */
12854a96a02de7c1b8c136ffc0cd278401c85faab233Chia-I Wu      if (!util_format_has_alpha(fb_format)) {
1286859106f196ade77f59f8787b071739901cd1a843Chia-I Wu         blend.rt[0].rgb_src_factor   = PIPE_BLENDFACTOR_SRC_ALPHA;
1287859106f196ade77f59f8787b071739901cd1a843Chia-I Wu         blend.rt[0].alpha_src_factor = PIPE_BLENDFACTOR_ONE;
1288859106f196ade77f59f8787b071739901cd1a843Chia-I Wu         blend.rt[0].rgb_dst_factor   = PIPE_BLENDFACTOR_INV_SRC_ALPHA;
1289859106f196ade77f59f8787b071739901cd1a843Chia-I Wu         blend.rt[0].alpha_dst_factor = PIPE_BLENDFACTOR_INV_SRC_ALPHA;
1290859106f196ade77f59f8787b071739901cd1a843Chia-I Wu         blend.rt[0].blend_enable = 1;
1291859106f196ade77f59f8787b071739901cd1a843Chia-I Wu      }
1292859106f196ade77f59f8787b071739901cd1a843Chia-I Wu      break;
1293859106f196ade77f59f8787b071739901cd1a843Chia-I Wu   case VG_BLEND_SRC_IN:
1294859106f196ade77f59f8787b071739901cd1a843Chia-I Wu      blend.rt[0].rgb_src_factor   = PIPE_BLENDFACTOR_ONE;
1295859106f196ade77f59f8787b071739901cd1a843Chia-I Wu      blend.rt[0].alpha_src_factor = PIPE_BLENDFACTOR_DST_ALPHA;
1296859106f196ade77f59f8787b071739901cd1a843Chia-I Wu      blend.rt[0].rgb_dst_factor   = PIPE_BLENDFACTOR_ZERO;
1297859106f196ade77f59f8787b071739901cd1a843Chia-I Wu      blend.rt[0].alpha_dst_factor = PIPE_BLENDFACTOR_ZERO;
1298859106f196ade77f59f8787b071739901cd1a843Chia-I Wu      blend.rt[0].blend_enable = 1;
1299859106f196ade77f59f8787b071739901cd1a843Chia-I Wu      break;
1300859106f196ade77f59f8787b071739901cd1a843Chia-I Wu   case VG_BLEND_DST_IN:
1301859106f196ade77f59f8787b071739901cd1a843Chia-I Wu      blend.rt[0].rgb_src_factor   = PIPE_BLENDFACTOR_ZERO;
1302859106f196ade77f59f8787b071739901cd1a843Chia-I Wu      blend.rt[0].alpha_src_factor = PIPE_BLENDFACTOR_ZERO;
1303859106f196ade77f59f8787b071739901cd1a843Chia-I Wu      blend.rt[0].rgb_dst_factor   = PIPE_BLENDFACTOR_ONE;
1304859106f196ade77f59f8787b071739901cd1a843Chia-I Wu      blend.rt[0].alpha_dst_factor = PIPE_BLENDFACTOR_SRC_ALPHA;
1305859106f196ade77f59f8787b071739901cd1a843Chia-I Wu      blend.rt[0].blend_enable = 1;
1306859106f196ade77f59f8787b071739901cd1a843Chia-I Wu      break;
1307859106f196ade77f59f8787b071739901cd1a843Chia-I Wu   case VG_BLEND_DST_OVER:
1308859106f196ade77f59f8787b071739901cd1a843Chia-I Wu   case VG_BLEND_MULTIPLY:
1309859106f196ade77f59f8787b071739901cd1a843Chia-I Wu   case VG_BLEND_SCREEN:
1310859106f196ade77f59f8787b071739901cd1a843Chia-I Wu   case VG_BLEND_DARKEN:
1311859106f196ade77f59f8787b071739901cd1a843Chia-I Wu   case VG_BLEND_LIGHTEN:
1312859106f196ade77f59f8787b071739901cd1a843Chia-I Wu   case VG_BLEND_ADDITIVE:
1313859106f196ade77f59f8787b071739901cd1a843Chia-I Wu      /* need a shader */
1314859106f196ade77f59f8787b071739901cd1a843Chia-I Wu      break;
1315859106f196ade77f59f8787b071739901cd1a843Chia-I Wu   default:
1316859106f196ade77f59f8787b071739901cd1a843Chia-I Wu      assert(!"not implemented blend mode");
1317859106f196ade77f59f8787b071739901cd1a843Chia-I Wu      break;
1318859106f196ade77f59f8787b071739901cd1a843Chia-I Wu   }
1319859106f196ade77f59f8787b071739901cd1a843Chia-I Wu
1320859106f196ade77f59f8787b071739901cd1a843Chia-I Wu   cso_set_blend(renderer->cso, &blend);
1321859106f196ade77f59f8787b071739901cd1a843Chia-I Wu}
1322859106f196ade77f59f8787b071739901cd1a843Chia-I Wu
1323b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu/**
1324b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu * Propogate OpenVG state changes to the renderer.  Only framebuffer, blending
1325b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu * and scissoring states are relevant here.
1326b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu */
1327b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wuvoid renderer_validate(struct renderer *renderer,
1328b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu                       VGbitfield dirty,
1329b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu                       const struct st_framebuffer *stfb,
1330b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu                       const struct vg_state *state)
1331b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu{
1332b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu   assert(renderer->state == RENDERER_STATE_INIT);
1333b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu
133430cab4b6cbf741e1ae727bfaed10cc3772e4dff9Chia-I Wu   dirty |= renderer->dirty;
133530cab4b6cbf741e1ae727bfaed10cc3772e4dff9Chia-I Wu   renderer->dirty = 0;
133630cab4b6cbf741e1ae727bfaed10cc3772e4dff9Chia-I Wu
1337b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu   if (dirty & FRAMEBUFFER_DIRTY) {
1338b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu      struct pipe_framebuffer_state *fb = &renderer->g3d.fb;
1339a84a1e344f544ec4da61809d4f09853a94d93e07Chia-I Wu      struct matrix *proj = &renderer->projection;
1340b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu
1341b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu      memset(fb, 0, sizeof(struct pipe_framebuffer_state));
1342b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu      fb->width  = stfb->width;
1343b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu      fb->height = stfb->height;
1344b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu      fb->nr_cbufs = 1;
1345b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu      fb->cbufs[0] = stfb->strb->surface;
1346b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu      fb->zsbuf = stfb->dsrb->surface;
1347b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu
1348b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu      cso_set_framebuffer(renderer->cso, fb);
13494690cdfe076a03b6e9da1db9f1908a663c49c820Chia-I Wu      vg_set_viewport(renderer, VEGA_Y0_BOTTOM);
1350b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu
1351a84a1e344f544ec4da61809d4f09853a94d93e07Chia-I Wu      matrix_load_identity(proj);
1352a84a1e344f544ec4da61809d4f09853a94d93e07Chia-I Wu      matrix_translate(proj, -1.0f, -1.0f);
1353a84a1e344f544ec4da61809d4f09853a94d93e07Chia-I Wu      matrix_scale(proj, 2.0f / fb->width, 2.0f / fb->height);
1354b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu
1355b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu      /* we also got a new depth buffer */
1356b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu      if (dirty & DEPTH_STENCIL_DIRTY) {
1357b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu         renderer->pipe->clear(renderer->pipe,
1358b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu               PIPE_CLEAR_DEPTHSTENCIL, NULL, 0.0, 0);
1359b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu      }
1360b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu   }
1361b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu
1362b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu   /* must be last because it renders to the depth buffer*/
1363b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu   if (dirty & DEPTH_STENCIL_DIRTY) {
1364b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu      update_clip_state(renderer, state);
1365b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu      cso_set_depth_stencil_alpha(renderer->cso, &renderer->g3d.dsa);
1366b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu   }
1367859106f196ade77f59f8787b071739901cd1a843Chia-I Wu
1368859106f196ade77f59f8787b071739901cd1a843Chia-I Wu   if (dirty & BLEND_DIRTY)
1369859106f196ade77f59f8787b071739901cd1a843Chia-I Wu      renderer_validate_blend(renderer, state, stfb->strb->format);
1370b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu}
1371b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu
1372ee0f1ab923cc52b5eeacc47a749561d1c7216207Chia-I Wu/**
1373ee0f1ab923cc52b5eeacc47a749561d1c7216207Chia-I Wu * Prepare the renderer for OpenVG pipeline.
1374ee0f1ab923cc52b5eeacc47a749561d1c7216207Chia-I Wu */
1375ee0f1ab923cc52b5eeacc47a749561d1c7216207Chia-I Wuvoid renderer_validate_for_shader(struct renderer *renderer,
1376ee0f1ab923cc52b5eeacc47a749561d1c7216207Chia-I Wu                                  const struct pipe_sampler_state **samplers,
1377ee0f1ab923cc52b5eeacc47a749561d1c7216207Chia-I Wu                                  struct pipe_sampler_view **views,
1378ee0f1ab923cc52b5eeacc47a749561d1c7216207Chia-I Wu                                  VGint num_samplers,
1379a84a1e344f544ec4da61809d4f09853a94d93e07Chia-I Wu                                  const struct matrix *modelview,
1380ee0f1ab923cc52b5eeacc47a749561d1c7216207Chia-I Wu                                  void *fs,
1381ee0f1ab923cc52b5eeacc47a749561d1c7216207Chia-I Wu                                  const void *const_buffer,
1382ee0f1ab923cc52b5eeacc47a749561d1c7216207Chia-I Wu                                  VGint const_buffer_len)
1383ee0f1ab923cc52b5eeacc47a749561d1c7216207Chia-I Wu{
1384a84a1e344f544ec4da61809d4f09853a94d93e07Chia-I Wu   struct matrix mvp = renderer->projection;
1385a84a1e344f544ec4da61809d4f09853a94d93e07Chia-I Wu
1386a84a1e344f544ec4da61809d4f09853a94d93e07Chia-I Wu   /* will be used in POLYGON_STENCIL and POLYGON_FILL */
1387a84a1e344f544ec4da61809d4f09853a94d93e07Chia-I Wu   matrix_mult(&mvp, modelview);
1388a84a1e344f544ec4da61809d4f09853a94d93e07Chia-I Wu   renderer_set_mvp(renderer, &mvp);
1389a84a1e344f544ec4da61809d4f09853a94d93e07Chia-I Wu
1390ee0f1ab923cc52b5eeacc47a749561d1c7216207Chia-I Wu   renderer_set_custom_fs(renderer, fs,
1391ee0f1ab923cc52b5eeacc47a749561d1c7216207Chia-I Wu                          samplers, views, num_samplers,
1392ee0f1ab923cc52b5eeacc47a749561d1c7216207Chia-I Wu                          const_buffer, const_buffer_len);
1393ee0f1ab923cc52b5eeacc47a749561d1c7216207Chia-I Wu}
1394ee0f1ab923cc52b5eeacc47a749561d1c7216207Chia-I Wu
139530cab4b6cbf741e1ae727bfaed10cc3772e4dff9Chia-I Wuvoid renderer_validate_for_mask_rendering(struct renderer *renderer,
1396a84a1e344f544ec4da61809d4f09853a94d93e07Chia-I Wu                                          struct pipe_surface *dst,
1397a84a1e344f544ec4da61809d4f09853a94d93e07Chia-I Wu                                          const struct matrix *modelview)
139830cab4b6cbf741e1ae727bfaed10cc3772e4dff9Chia-I Wu{
1399a84a1e344f544ec4da61809d4f09853a94d93e07Chia-I Wu   struct matrix mvp = renderer->projection;
1400a84a1e344f544ec4da61809d4f09853a94d93e07Chia-I Wu
1401a84a1e344f544ec4da61809d4f09853a94d93e07Chia-I Wu   /* will be used in POLYGON_STENCIL and POLYGON_FILL */
1402a84a1e344f544ec4da61809d4f09853a94d93e07Chia-I Wu   matrix_mult(&mvp, modelview);
1403a84a1e344f544ec4da61809d4f09853a94d93e07Chia-I Wu   renderer_set_mvp(renderer, &mvp);
1404a84a1e344f544ec4da61809d4f09853a94d93e07Chia-I Wu
140530cab4b6cbf741e1ae727bfaed10cc3772e4dff9Chia-I Wu   renderer_set_target(renderer, dst, renderer->g3d.fb.zsbuf, VG_FALSE);
140630cab4b6cbf741e1ae727bfaed10cc3772e4dff9Chia-I Wu   renderer_set_blend(renderer, ~0);
140730cab4b6cbf741e1ae727bfaed10cc3772e4dff9Chia-I Wu   renderer_set_fs(renderer, RENDERER_FS_WHITE);
140830cab4b6cbf741e1ae727bfaed10cc3772e4dff9Chia-I Wu
140930cab4b6cbf741e1ae727bfaed10cc3772e4dff9Chia-I Wu   /* set internal dirty flags (hacky!) */
141030cab4b6cbf741e1ae727bfaed10cc3772e4dff9Chia-I Wu   renderer->dirty = FRAMEBUFFER_DIRTY | BLEND_DIRTY;
141130cab4b6cbf741e1ae727bfaed10cc3772e4dff9Chia-I Wu}
141230cab4b6cbf741e1ae727bfaed10cc3772e4dff9Chia-I Wu
1413544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusinvoid renderer_copy_surface(struct renderer *ctx,
1414544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                           struct pipe_surface *src,
1415544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                           int srcX0, int srcY0,
1416544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                           int srcX1, int srcY1,
1417544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                           struct pipe_surface *dst,
1418544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                           int dstX0, int dstY0,
1419544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                           int dstX1, int dstY1,
1420544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                           float z, unsigned filter)
1421544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin{
1422544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   struct pipe_context *pipe = ctx->pipe;
1423544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   struct pipe_screen *screen = pipe->screen;
1424e5f0384ad06359aa1b9dc1b4bc6f475f7a119af2Roland Scheidegger   struct pipe_sampler_view view_templ;
1425e5f0384ad06359aa1b9dc1b4bc6f475f7a119af2Roland Scheidegger   struct pipe_sampler_view *view;
14264c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger   struct pipe_box src_box;
1427287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell   struct pipe_resource texTemp, *tex;
14284690cdfe076a03b6e9da1db9f1908a663c49c820Chia-I Wu   const struct pipe_framebuffer_state *fb = &ctx->g3d.fb;
1429544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   const int srcW = abs(srcX1 - srcX0);
1430544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   const int srcH = abs(srcY1 - srcY0);
1431544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   const int srcLeft = MIN2(srcX0, srcX1);
1432544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   const int srcTop = MIN2(srcY0, srcY1);
1433544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
1434544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   assert(filter == PIPE_TEX_MIPFILTER_NEAREST ||
1435544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin          filter == PIPE_TEX_MIPFILTER_LINEAR);
1436544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
1437544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   if (srcLeft != srcX0) {
1438544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      /* left-right flip */
1439544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      int tmp = dstX0;
1440544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      dstX0 = dstX1;
1441544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      dstX1 = tmp;
1442544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   }
1443544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
1444544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   if (srcTop != srcY0) {
1445544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      /* up-down flip */
1446544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      int tmp = dstY0;
1447544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      dstY0 = dstY1;
1448544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      dstY1 = tmp;
1449544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   }
1450544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
1451544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   assert(screen->is_format_supported(screen, src->format, PIPE_TEXTURE_2D,
1452e968975cb57eb854769292f7c6ff773c64a386c3Marek Olšák                                      0, PIPE_BIND_SAMPLER_VIEW));
1453544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   assert(screen->is_format_supported(screen, dst->format, PIPE_TEXTURE_2D,
1454e968975cb57eb854769292f7c6ff773c64a386c3Marek Olšák                                      0, PIPE_BIND_SAMPLER_VIEW));
1455544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   assert(screen->is_format_supported(screen, dst->format, PIPE_TEXTURE_2D,
1456e968975cb57eb854769292f7c6ff773c64a386c3Marek Olšák                                      0, PIPE_BIND_RENDER_TARGET));
1457544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
1458544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   /*
1459544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin    * XXX for now we're always creating a temporary texture.
1460544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin    * Strictly speaking that's not always needed.
1461544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin    */
1462544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
1463544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   /* create temp texture */
1464544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   memset(&texTemp, 0, sizeof(texTemp));
1465544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   texTemp.target = PIPE_TEXTURE_2D;
1466544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   texTemp.format = src->format;
1467544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   texTemp.last_level = 0;
1468d509f84543d0979e9bb53c20c195f378dd61e728Roland Scheidegger   texTemp.width0 = srcW;
1469d509f84543d0979e9bb53c20c195f378dd61e728Roland Scheidegger   texTemp.height0 = srcH;
1470d509f84543d0979e9bb53c20c195f378dd61e728Roland Scheidegger   texTemp.depth0 = 1;
14714c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger   texTemp.array_size = 1;
1472c36c3d86b62b525291b1c6527de3ac5de93a2fafRoland Scheidegger   texTemp.bind = PIPE_BIND_SAMPLER_VIEW;
1473544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
1474287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell   tex = screen->resource_create(screen, &texTemp);
1475544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   if (!tex)
1476544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      return;
1477544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
1478e5f0384ad06359aa1b9dc1b4bc6f475f7a119af2Roland Scheidegger   u_sampler_view_default_template(&view_templ, tex, tex->format);
1479e5f0384ad06359aa1b9dc1b4bc6f475f7a119af2Roland Scheidegger   view = pipe->create_sampler_view(pipe, tex, &view_templ);
1480e5f0384ad06359aa1b9dc1b4bc6f475f7a119af2Roland Scheidegger
1481e5f0384ad06359aa1b9dc1b4bc6f475f7a119af2Roland Scheidegger   if (!view)
1482e5f0384ad06359aa1b9dc1b4bc6f475f7a119af2Roland Scheidegger      return;
1483e5f0384ad06359aa1b9dc1b4bc6f475f7a119af2Roland Scheidegger
14844c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger   u_box_2d_zslice(srcLeft, srcTop, src->u.tex.first_layer, srcW, srcH, &src_box);
1485544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
1486c36c3d86b62b525291b1c6527de3ac5de93a2fafRoland Scheidegger   pipe->resource_copy_region(pipe,
14874c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                              tex, 0, 0, 0, 0,  /* dest */
14884c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                              src->texture, 0, &src_box);
1489544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
1490e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu   assert(floatsEqual(z, 0.0f));
1491544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
1492e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu   /* draw */
14934690cdfe076a03b6e9da1db9f1908a663c49c820Chia-I Wu   if (fb->cbufs[0] == dst) {
1494e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu      /* transform back to surface coordinates */
1495e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu      dstY0 = dst->height - dstY0;
1496e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu      dstY1 = dst->height - dstY1;
1497544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
1498e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu      if (renderer_drawtex_begin(ctx, view)) {
1499e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu         renderer_drawtex(ctx,
1500e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu               dstX0, dstY0, dstX1 - dstX0, dstY1 - dstY0,
1501e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu               0, 0, view->texture->width0, view->texture->height0);
1502e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu         renderer_drawtex_end(ctx);
1503e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu      }
1504544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   }
1505e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu   else {
1506e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu      if (renderer_copy_begin(ctx, dst, VG_TRUE, view)) {
1507e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu         renderer_copy(ctx,
1508e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu               dstX0, dstY0, dstX1 - dstX0, dstY1 - dstY0,
1509e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu               0, 0, view->texture->width0, view->texture->height0);
1510e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu         renderer_copy_end(ctx);
1511e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu      }
1512544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   }
1513544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin}
1514544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
1515544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusinvoid renderer_texture_quad(struct renderer *r,
1516287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell                           struct pipe_resource *tex,
1517544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                           VGfloat x1offset, VGfloat y1offset,
1518544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                           VGfloat x2offset, VGfloat y2offset,
1519544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                           VGfloat x1, VGfloat y1,
1520544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                           VGfloat x2, VGfloat y2,
1521544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                           VGfloat x3, VGfloat y3,
1522544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                           VGfloat x4, VGfloat y4)
1523544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin{
152459309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   const VGfloat z = 0.0f;
1525544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
152659309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   assert(r->state == RENDERER_STATE_INIT);
1527d509f84543d0979e9bb53c20c195f378dd61e728Roland Scheidegger   assert(tex->width0 != 0);
1528d509f84543d0979e9bb53c20c195f378dd61e728Roland Scheidegger   assert(tex->height0 != 0);
1529544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
1530544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   cso_save_vertex_shader(r->cso);
1531544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
153259309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   renderer_set_vs(r, RENDERER_VS_TEXTURE);
1533544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
153459309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   /* manually set up positions */
153559309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   r->vertices[0][0][0] = x1;
153659309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   r->vertices[0][0][1] = y1;
153759309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   r->vertices[0][0][2] = z;
1538544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
153959309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   r->vertices[1][0][0] = x2;
154059309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   r->vertices[1][0][1] = y2;
154159309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   r->vertices[1][0][2] = z;
154259309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
154359309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   r->vertices[2][0][0] = x3;
154459309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   r->vertices[2][0][1] = y3;
154559309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   r->vertices[2][0][2] = z;
154659309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
154759309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   r->vertices[3][0][0] = x4;
154859309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   r->vertices[3][0][1] = y4;
154959309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   r->vertices[3][0][2] = z;
155059309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
155159309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   /* texcoords */
155259309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   renderer_quad_texcoord(r, x1offset, y1offset,
155359309337e40106f734efc1e33f956f6f1f4301acChia-I Wu         x2offset, y2offset, tex->width0, tex->height0);
155459309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
155559309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   renderer_quad_draw(r);
1556544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
1557544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   cso_restore_vertex_shader(r->cso);
1558544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin}
1559