renderer.c revision ace4539e88f6ef90d8e9fd2f1543eca0ae854b82
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"
31e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu#include "image.h"
32544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
33544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#include "pipe/p_context.h"
34544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#include "pipe/p_state.h"
3528486880ca3ec39419ccee0cb1a3bedc9ef7117cJosé Fonseca#include "util/u_inlines.h"
36544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#include "pipe/p_screen.h"
37544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#include "pipe/p_shader_tokens.h"
38544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
39544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#include "util/u_draw_quad.h"
40544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#include "util/u_simple_shaders.h"
41544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#include "util/u_memory.h"
42e5f0384ad06359aa1b9dc1b4bc6f475f7a119af2Roland Scheidegger#include "util/u_sampler.h"
43b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu#include "util/u_math.h"
44544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
45544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#include "cso_cache/cso_context.h"
4659309337e40106f734efc1e33f956f6f1f4301acChia-I Wu#include "tgsi/tgsi_ureg.h"
4759309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
4859309337e40106f734efc1e33f956f6f1f4301acChia-I Wutypedef enum {
4959309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   RENDERER_STATE_INIT,
5059309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   RENDERER_STATE_COPY,
51e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu   RENDERER_STATE_DRAWTEX,
5254cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu   RENDERER_STATE_SCISSOR,
536b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu   RENDERER_STATE_CLEAR,
54e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu   RENDERER_STATE_FILTER,
553b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   RENDERER_STATE_POLYGON_STENCIL,
563b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   RENDERER_STATE_POLYGON_FILL,
5759309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   NUM_RENDERER_STATES
5859309337e40106f734efc1e33f956f6f1f4301acChia-I Wu} RendererState;
5959309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
6059309337e40106f734efc1e33f956f6f1f4301acChia-I Wutypedef enum {
6159309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   RENDERER_VS_PLAIN,
6259309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   RENDERER_VS_COLOR,
6359309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   RENDERER_VS_TEXTURE,
6459309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   NUM_RENDERER_VS
6559309337e40106f734efc1e33f956f6f1f4301acChia-I Wu} RendererVs;
6659309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
6759309337e40106f734efc1e33f956f6f1f4301acChia-I Wutypedef enum {
6859309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   RENDERER_FS_COLOR,
6959309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   RENDERER_FS_TEXTURE,
7054cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu   RENDERER_FS_SCISSOR,
7159309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   NUM_RENDERER_FS
7259309337e40106f734efc1e33f956f6f1f4301acChia-I Wu} RendererFs;
73544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
74544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusinstruct renderer {
75544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   struct pipe_context *pipe;
76544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   struct vg_context *owner;
77544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
78544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   struct cso_context *cso;
79544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
80544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   void *fs;
81544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
82b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu   struct {
83b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu      struct pipe_blend_state blend;
84b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu      struct pipe_rasterizer_state rasterizer;
85b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu      struct pipe_shader_state vs_state;
86b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu      struct pipe_depth_stencil_alpha_state dsa;
87b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu      struct pipe_framebuffer_state fb;
88b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu   } g3d;
89b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu
90b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu   struct pipe_resource *vs_const_buffer;
91b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu
92ace4539e88f6ef90d8e9fd2f1543eca0ae854b82Chia-I Wu   struct pipe_vertex_element velems[2];
93544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   VGfloat vertices[4][2][4];
9459309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
9559309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   void *cached_vs[NUM_RENDERER_VS];
9659309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   void *cached_fs[NUM_RENDERER_FS];
9759309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
9859309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   RendererState state;
9959309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
10059309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   /* state data */
10159309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   union {
10259309337e40106f734efc1e33f956f6f1f4301acChia-I Wu      struct {
10359309337e40106f734efc1e33f956f6f1f4301acChia-I Wu         VGint tex_width;
10459309337e40106f734efc1e33f956f6f1f4301acChia-I Wu         VGint tex_height;
10559309337e40106f734efc1e33f956f6f1f4301acChia-I Wu      } copy;
106e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu
107e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu      struct {
108e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu         VGint tex_width;
109e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu         VGint tex_height;
110e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu      } drawtex;
11154cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu
11254cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu      struct {
11354cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu         VGboolean restore_dsa;
11454cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu      } scissor;
115e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu
116e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu      struct {
117e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu         VGboolean use_sampler;
118e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu         VGint tex_width, tex_height;
119e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu      } filter;
1203b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu
1213b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu      struct {
1223b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu         struct pipe_depth_stencil_alpha_state dsa;
1233b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu         VGboolean manual_two_sides;
1243b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu         VGboolean restore_dsa;
1253b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu      } polygon_stencil;
12659309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   } u;
127544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin};
128544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
12959309337e40106f734efc1e33f956f6f1f4301acChia-I Wu/**
13059309337e40106f734efc1e33f956f6f1f4301acChia-I Wu * Return VG_TRUE if the renderer can use the resource as the asked bindings.
13159309337e40106f734efc1e33f956f6f1f4301acChia-I Wu */
13259309337e40106f734efc1e33f956f6f1f4301acChia-I Wustatic VGboolean renderer_can_support(struct renderer *renderer,
13359309337e40106f734efc1e33f956f6f1f4301acChia-I Wu                                      struct pipe_resource *res,
13459309337e40106f734efc1e33f956f6f1f4301acChia-I Wu                                      unsigned bindings)
13559309337e40106f734efc1e33f956f6f1f4301acChia-I Wu{
13659309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   struct pipe_screen *screen = renderer->pipe->screen;
13759309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
13859309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   return screen->is_format_supported(screen,
13959309337e40106f734efc1e33f956f6f1f4301acChia-I Wu         res->format, res->target, 0, bindings, 0);
14059309337e40106f734efc1e33f956f6f1f4301acChia-I Wu}
14159309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
14259309337e40106f734efc1e33f956f6f1f4301acChia-I Wu/**
14359309337e40106f734efc1e33f956f6f1f4301acChia-I Wu * Create a simple vertex shader that passes through position and the given
14459309337e40106f734efc1e33f956f6f1f4301acChia-I Wu * attribute.
14559309337e40106f734efc1e33f956f6f1f4301acChia-I Wu */
14659309337e40106f734efc1e33f956f6f1f4301acChia-I Wustatic void *create_passthrough_vs(struct pipe_context *pipe, int semantic_name)
14759309337e40106f734efc1e33f956f6f1f4301acChia-I Wu{
14859309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   struct ureg_program *ureg;
14959309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   struct ureg_src src[2], constants[2];
15059309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   struct ureg_dst dst[2], tmp;
15159309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   int i;
15259309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
15359309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   ureg = ureg_create(TGSI_PROCESSOR_VERTEX);
15459309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   if (!ureg)
15559309337e40106f734efc1e33f956f6f1f4301acChia-I Wu      return NULL;
15659309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
15759309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   /* position in surface coordinates */
15859309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   src[0] = ureg_DECL_vs_input(ureg, 0);
15959309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   dst[0] = ureg_DECL_output(ureg, TGSI_SEMANTIC_POSITION, 0);
16059309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   tmp = ureg_DECL_temporary(ureg);
16159309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   for (i = 0; i < 2; i++)
16259309337e40106f734efc1e33f956f6f1f4301acChia-I Wu      constants[i] = ureg_DECL_constant(ureg, i);
16359309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
16459309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   /* transform to clipped coordinates */
16559309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   ureg_MUL(ureg, tmp, src[0], constants[0]);
16659309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   ureg_ADD(ureg, tmp, ureg_src(tmp), constants[1]);
16759309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   ureg_MOV(ureg, dst[0], ureg_src(tmp));
16859309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
16959309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   if (semantic_name >= 0) {
17059309337e40106f734efc1e33f956f6f1f4301acChia-I Wu      src[1] = ureg_DECL_vs_input(ureg, 1);
17159309337e40106f734efc1e33f956f6f1f4301acChia-I Wu      dst[1] = ureg_DECL_output(ureg, semantic_name, 0);
17259309337e40106f734efc1e33f956f6f1f4301acChia-I Wu      ureg_MOV(ureg, dst[1], src[1]);
17359309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   }
17459309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
17559309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   ureg_END(ureg);
17659309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
17759309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   return ureg_create_shader_and_destroy(ureg, pipe);
17859309337e40106f734efc1e33f956f6f1f4301acChia-I Wu}
17959309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
18059309337e40106f734efc1e33f956f6f1f4301acChia-I Wu/**
18159309337e40106f734efc1e33f956f6f1f4301acChia-I Wu * Set renderer vertex shader.
18259309337e40106f734efc1e33f956f6f1f4301acChia-I Wu *
18359309337e40106f734efc1e33f956f6f1f4301acChia-I Wu * This function modifies vertex_shader state.
18459309337e40106f734efc1e33f956f6f1f4301acChia-I Wu */
18559309337e40106f734efc1e33f956f6f1f4301acChia-I Wustatic void renderer_set_vs(struct renderer *r, RendererVs id)
18659309337e40106f734efc1e33f956f6f1f4301acChia-I Wu{
18759309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   /* create as needed */
18859309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   if (!r->cached_vs[id]) {
18959309337e40106f734efc1e33f956f6f1f4301acChia-I Wu      int semantic_name = -1;
19059309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
19159309337e40106f734efc1e33f956f6f1f4301acChia-I Wu      switch (id) {
19259309337e40106f734efc1e33f956f6f1f4301acChia-I Wu      case RENDERER_VS_PLAIN:
19359309337e40106f734efc1e33f956f6f1f4301acChia-I Wu         break;
19459309337e40106f734efc1e33f956f6f1f4301acChia-I Wu      case RENDERER_VS_COLOR:
19559309337e40106f734efc1e33f956f6f1f4301acChia-I Wu         semantic_name = TGSI_SEMANTIC_COLOR;
19659309337e40106f734efc1e33f956f6f1f4301acChia-I Wu         break;
19759309337e40106f734efc1e33f956f6f1f4301acChia-I Wu      case RENDERER_VS_TEXTURE:
19859309337e40106f734efc1e33f956f6f1f4301acChia-I Wu         semantic_name = TGSI_SEMANTIC_GENERIC;
19959309337e40106f734efc1e33f956f6f1f4301acChia-I Wu         break;
20059309337e40106f734efc1e33f956f6f1f4301acChia-I Wu      default:
20159309337e40106f734efc1e33f956f6f1f4301acChia-I Wu         assert(!"Unknown renderer vs id");
20259309337e40106f734efc1e33f956f6f1f4301acChia-I Wu         break;
20359309337e40106f734efc1e33f956f6f1f4301acChia-I Wu      }
20459309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
20559309337e40106f734efc1e33f956f6f1f4301acChia-I Wu      r->cached_vs[id] = create_passthrough_vs(r->pipe, semantic_name);
20659309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   }
20759309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
20859309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   cso_set_vertex_shader_handle(r->cso, r->cached_vs[id]);
20959309337e40106f734efc1e33f956f6f1f4301acChia-I Wu}
21059309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
21159309337e40106f734efc1e33f956f6f1f4301acChia-I Wu/**
21254cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu * Create a simple fragment shader that sets the depth to 0.0f.
21354cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu */
21454cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wustatic void *create_scissor_fs(struct pipe_context *pipe)
21554cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu{
21654cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu   struct ureg_program *ureg;
21754cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu   struct ureg_dst out;
21854cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu   struct ureg_src imm;
21954cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu
22054cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu   ureg = ureg_create(TGSI_PROCESSOR_FRAGMENT);
22154cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu   out = ureg_DECL_output(ureg, TGSI_SEMANTIC_POSITION, 0);
22254cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu   imm = ureg_imm4f(ureg, 0.0f, 0.0f, 0.0f, 0.0f);
22354cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu
22454cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu   ureg_MOV(ureg, ureg_writemask(out, TGSI_WRITEMASK_Z), imm);
22554cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu   ureg_END(ureg);
22654cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu
22754cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu   return ureg_create_shader_and_destroy(ureg, pipe);
22854cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu}
22954cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu
23054cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu/**
23159309337e40106f734efc1e33f956f6f1f4301acChia-I Wu * Set renderer fragment shader.
23259309337e40106f734efc1e33f956f6f1f4301acChia-I Wu *
23359309337e40106f734efc1e33f956f6f1f4301acChia-I Wu * This function modifies fragment_shader state.
23459309337e40106f734efc1e33f956f6f1f4301acChia-I Wu */
23559309337e40106f734efc1e33f956f6f1f4301acChia-I Wustatic void renderer_set_fs(struct renderer *r, RendererFs id)
23659309337e40106f734efc1e33f956f6f1f4301acChia-I Wu{
23759309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   /* create as needed */
23859309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   if (!r->cached_fs[id]) {
23959309337e40106f734efc1e33f956f6f1f4301acChia-I Wu      void *fs = NULL;
24059309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
24159309337e40106f734efc1e33f956f6f1f4301acChia-I Wu      switch (id) {
24259309337e40106f734efc1e33f956f6f1f4301acChia-I Wu      case RENDERER_FS_COLOR:
24359309337e40106f734efc1e33f956f6f1f4301acChia-I Wu         fs = util_make_fragment_passthrough_shader(r->pipe);
24459309337e40106f734efc1e33f956f6f1f4301acChia-I Wu         break;
24559309337e40106f734efc1e33f956f6f1f4301acChia-I Wu      case RENDERER_FS_TEXTURE:
24659309337e40106f734efc1e33f956f6f1f4301acChia-I Wu         fs = util_make_fragment_tex_shader(r->pipe,
24759309337e40106f734efc1e33f956f6f1f4301acChia-I Wu               TGSI_TEXTURE_2D, TGSI_INTERPOLATE_LINEAR);
24859309337e40106f734efc1e33f956f6f1f4301acChia-I Wu         break;
24954cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu      case RENDERER_FS_SCISSOR:
25054cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu         fs = create_scissor_fs(r->pipe);
25154cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu         break;
25259309337e40106f734efc1e33f956f6f1f4301acChia-I Wu      default:
25359309337e40106f734efc1e33f956f6f1f4301acChia-I Wu         assert(!"Unknown renderer fs id");
25459309337e40106f734efc1e33f956f6f1f4301acChia-I Wu         break;
25559309337e40106f734efc1e33f956f6f1f4301acChia-I Wu      }
25659309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
25759309337e40106f734efc1e33f956f6f1f4301acChia-I Wu      r->cached_fs[id] = fs;
25859309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   }
25959309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
26059309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   cso_set_fragment_shader_handle(r->cso, r->cached_fs[id]);
26159309337e40106f734efc1e33f956f6f1f4301acChia-I Wu}
26259309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
263b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wutypedef enum {
264b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu   VEGA_Y0_TOP,
265b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu   VEGA_Y0_BOTTOM
266b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu} VegaOrientation;
267b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu
268b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wustatic void vg_set_viewport(struct vg_context *ctx,
269b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu                            VegaOrientation orientation)
270b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu{
271b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu   struct st_framebuffer *stfb = ctx->draw_buffer;
272b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu   struct pipe_viewport_state viewport;
273b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu   VGfloat y_scale = (orientation == VEGA_Y0_BOTTOM) ? -2.f : 2.f;
274b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu
275b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu   viewport.scale[0] =  stfb->width / 2.f;
276b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu   viewport.scale[1] =  stfb->height / y_scale;
277b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu   viewport.scale[2] =  1.0;
278b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu   viewport.scale[3] =  1.0;
279b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu   viewport.translate[0] = stfb->width / 2.f;
280b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu   viewport.translate[1] = stfb->height / 2.f;
281b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu   viewport.translate[2] = 0.0;
282b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu   viewport.translate[3] = 0.0;
283b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu
284b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu   cso_set_viewport(ctx->cso_context, &viewport);
285b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu}
286b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu
28759309337e40106f734efc1e33f956f6f1f4301acChia-I Wu/**
28859309337e40106f734efc1e33f956f6f1f4301acChia-I Wu * Set renderer target.
28959309337e40106f734efc1e33f956f6f1f4301acChia-I Wu *
29059309337e40106f734efc1e33f956f6f1f4301acChia-I Wu * This function modifies framebuffer and viewport states.
29159309337e40106f734efc1e33f956f6f1f4301acChia-I Wu */
29259309337e40106f734efc1e33f956f6f1f4301acChia-I Wustatic void renderer_set_target(struct renderer *r,
29359309337e40106f734efc1e33f956f6f1f4301acChia-I Wu                                struct pipe_surface *cbuf,
29459309337e40106f734efc1e33f956f6f1f4301acChia-I Wu                                struct pipe_surface *zsbuf,
29559309337e40106f734efc1e33f956f6f1f4301acChia-I Wu                                VGboolean y0_top)
29659309337e40106f734efc1e33f956f6f1f4301acChia-I Wu{
29759309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   struct pipe_framebuffer_state fb;
29859309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
29959309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   memset(&fb, 0, sizeof(fb));
30059309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   fb.width = cbuf->width;
30159309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   fb.height = cbuf->height;
30259309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   fb.cbufs[0] = cbuf;
30359309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   fb.nr_cbufs = 1;
30459309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   fb.zsbuf = zsbuf;
30559309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   cso_set_framebuffer(r->cso, &fb);
30659309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
30759309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   vg_set_viewport(r->owner, (y0_top) ? VEGA_Y0_TOP : VEGA_Y0_BOTTOM);
30859309337e40106f734efc1e33f956f6f1f4301acChia-I Wu}
30959309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
31059309337e40106f734efc1e33f956f6f1f4301acChia-I Wu/**
31159309337e40106f734efc1e33f956f6f1f4301acChia-I Wu * Set renderer blend state.  Blending is disabled.
31259309337e40106f734efc1e33f956f6f1f4301acChia-I Wu *
31359309337e40106f734efc1e33f956f6f1f4301acChia-I Wu * This function modifies blend state.
31459309337e40106f734efc1e33f956f6f1f4301acChia-I Wu */
31559309337e40106f734efc1e33f956f6f1f4301acChia-I Wustatic void renderer_set_blend(struct renderer *r,
31659309337e40106f734efc1e33f956f6f1f4301acChia-I Wu                               VGbitfield channel_mask)
31759309337e40106f734efc1e33f956f6f1f4301acChia-I Wu{
31859309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   struct pipe_blend_state blend;
31959309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
32059309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   memset(&blend, 0, sizeof(blend));
32159309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
32259309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   blend.rt[0].rgb_src_factor = PIPE_BLENDFACTOR_ONE;
32359309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   blend.rt[0].alpha_src_factor = PIPE_BLENDFACTOR_ONE;
32459309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   blend.rt[0].rgb_dst_factor = PIPE_BLENDFACTOR_ZERO;
32559309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   blend.rt[0].alpha_dst_factor = PIPE_BLENDFACTOR_ZERO;
32659309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
32759309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   if (channel_mask & VG_RED)
32859309337e40106f734efc1e33f956f6f1f4301acChia-I Wu      blend.rt[0].colormask |= PIPE_MASK_R;
32959309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   if (channel_mask & VG_GREEN)
33059309337e40106f734efc1e33f956f6f1f4301acChia-I Wu      blend.rt[0].colormask |= PIPE_MASK_G;
33159309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   if (channel_mask & VG_BLUE)
33259309337e40106f734efc1e33f956f6f1f4301acChia-I Wu      blend.rt[0].colormask |= PIPE_MASK_B;
33359309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   if (channel_mask & VG_ALPHA)
33459309337e40106f734efc1e33f956f6f1f4301acChia-I Wu      blend.rt[0].colormask |= PIPE_MASK_A;
33559309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
33659309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   cso_set_blend(r->cso, &blend);
33759309337e40106f734efc1e33f956f6f1f4301acChia-I Wu}
33859309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
33959309337e40106f734efc1e33f956f6f1f4301acChia-I Wu/**
34059309337e40106f734efc1e33f956f6f1f4301acChia-I Wu * Set renderer sampler and view states.
34159309337e40106f734efc1e33f956f6f1f4301acChia-I Wu *
34259309337e40106f734efc1e33f956f6f1f4301acChia-I Wu * This function modifies samplers and fragment_sampler_views states.
34359309337e40106f734efc1e33f956f6f1f4301acChia-I Wu */
34459309337e40106f734efc1e33f956f6f1f4301acChia-I Wustatic void renderer_set_samplers(struct renderer *r,
34559309337e40106f734efc1e33f956f6f1f4301acChia-I Wu                                  uint num_views,
34659309337e40106f734efc1e33f956f6f1f4301acChia-I Wu                                  struct pipe_sampler_view **views)
34759309337e40106f734efc1e33f956f6f1f4301acChia-I Wu{
34859309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   struct pipe_sampler_state sampler;
34959309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   unsigned tex_filter = PIPE_TEX_FILTER_NEAREST;
35059309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   unsigned tex_wrap = PIPE_TEX_WRAP_CLAMP_TO_EDGE;
35159309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   uint i;
35259309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
35359309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   memset(&sampler, 0, sizeof(sampler));
35459309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
35559309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   sampler.min_img_filter = tex_filter;
35659309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   sampler.mag_img_filter = tex_filter;
35759309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   sampler.min_mip_filter = PIPE_TEX_MIPFILTER_NONE;
35859309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
35959309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   sampler.wrap_s = tex_wrap;
36059309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   sampler.wrap_t = tex_wrap;
36159309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   sampler.wrap_r = PIPE_TEX_WRAP_CLAMP_TO_EDGE;
36259309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
36359309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   sampler.normalized_coords = 1;
36459309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
36559309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   /* set samplers */
36659309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   for (i = 0; i < num_views; i++)
36759309337e40106f734efc1e33f956f6f1f4301acChia-I Wu      cso_single_sampler(r->cso, i, &sampler);
36859309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   cso_single_sampler_done(r->cso);
36959309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
37059309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   /* set views */
37159309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   cso_set_fragment_sampler_views(r->cso, num_views, views);
37259309337e40106f734efc1e33f956f6f1f4301acChia-I Wu}
37359309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
37459309337e40106f734efc1e33f956f6f1f4301acChia-I Wu/**
375e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu * Set custom renderer fragment shader, and optionally set samplers and views
376e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu * and upload the fragment constant buffer.
377e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu *
378e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu * This function modifies fragment_shader, samplers and fragment_sampler_views
379e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu * states.
380e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu */
381e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wustatic void renderer_set_custom_fs(struct renderer *renderer,
382e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu                                   void *fs,
383e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu                                   const struct pipe_sampler_state **samplers,
384e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu                                   struct pipe_sampler_view **views,
385e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu                                   VGint num_samplers,
386e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu                                   const void *const_buffer,
387e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu                                   VGint const_buffer_len)
388e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu{
389e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu   cso_set_fragment_shader_handle(renderer->cso, fs);
390e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu
391e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu   /* set samplers and views */
392e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu   if (num_samplers) {
393e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu      cso_set_samplers(renderer->cso, num_samplers, samplers);
394e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu      cso_set_fragment_sampler_views(renderer->cso, num_samplers, views);
395e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu   }
396e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu
397e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu   /* upload fs constant buffer */
398e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu   if (const_buffer_len) {
399e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu      struct pipe_resource *cbuf;
400e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu
401e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu      cbuf = pipe_buffer_create(renderer->pipe->screen,
402e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu            PIPE_BIND_CONSTANT_BUFFER, const_buffer_len);
403e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu      pipe_buffer_write(renderer->pipe, cbuf, 0,
404e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu            const_buffer_len, const_buffer);
405e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu      renderer->pipe->set_constant_buffer(renderer->pipe,
406e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu            PIPE_SHADER_FRAGMENT, 0, cbuf);
407e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu
408e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu      /* destroy cbuf automatically */
409e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu      pipe_resource_reference(&cbuf, NULL);
410e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu   }
411e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu}
412e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu
413e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu/**
41459309337e40106f734efc1e33f956f6f1f4301acChia-I Wu * Setup renderer quad position.
41559309337e40106f734efc1e33f956f6f1f4301acChia-I Wu */
41659309337e40106f734efc1e33f956f6f1f4301acChia-I Wustatic void renderer_quad_pos(struct renderer *r,
41759309337e40106f734efc1e33f956f6f1f4301acChia-I Wu                              VGfloat x0, VGfloat y0,
41859309337e40106f734efc1e33f956f6f1f4301acChia-I Wu                              VGfloat x1, VGfloat y1,
41959309337e40106f734efc1e33f956f6f1f4301acChia-I Wu                              VGboolean scissor)
42059309337e40106f734efc1e33f956f6f1f4301acChia-I Wu{
42159309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   VGfloat z;
42259309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
42359309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   /* the depth test is used for scissoring */
42459309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   z = (scissor) ? 0.0f : 1.0f;
42559309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
42659309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   /* positions */
42759309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   r->vertices[0][0][0] = x0;
42859309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   r->vertices[0][0][1] = y0;
42959309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   r->vertices[0][0][2] = z;
43059309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
43159309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   r->vertices[1][0][0] = x1;
43259309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   r->vertices[1][0][1] = y0;
43359309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   r->vertices[1][0][2] = z;
43459309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
43559309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   r->vertices[2][0][0] = x1;
43659309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   r->vertices[2][0][1] = y1;
43759309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   r->vertices[2][0][2] = z;
43859309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
43959309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   r->vertices[3][0][0] = x0;
44059309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   r->vertices[3][0][1] = y1;
44159309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   r->vertices[3][0][2] = z;
44259309337e40106f734efc1e33f956f6f1f4301acChia-I Wu}
44359309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
44459309337e40106f734efc1e33f956f6f1f4301acChia-I Wu/**
44559309337e40106f734efc1e33f956f6f1f4301acChia-I Wu * Setup renderer quad texture coordinates.
44659309337e40106f734efc1e33f956f6f1f4301acChia-I Wu */
44759309337e40106f734efc1e33f956f6f1f4301acChia-I Wustatic void renderer_quad_texcoord(struct renderer *r,
44859309337e40106f734efc1e33f956f6f1f4301acChia-I Wu                                   VGfloat x0, VGfloat y0,
44959309337e40106f734efc1e33f956f6f1f4301acChia-I Wu                                   VGfloat x1, VGfloat y1,
45059309337e40106f734efc1e33f956f6f1f4301acChia-I Wu                                   VGint tex_width, VGint tex_height)
45159309337e40106f734efc1e33f956f6f1f4301acChia-I Wu{
45259309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   VGfloat s0, t0, s1, t1, r0, q0;
45359309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   VGint i;
45459309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
45559309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   s0 = x0 / tex_width;
45659309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   s1 = x1 / tex_width;
45759309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   t0 = y0 / tex_height;
45859309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   t1 = y1 / tex_height;
45959309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   r0 = 0.0f;
46059309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   q0 = 1.0f;
46159309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
46259309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   /* texcoords */
46359309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   r->vertices[0][1][0] = s0;
46459309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   r->vertices[0][1][1] = t0;
46559309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
46659309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   r->vertices[1][1][0] = s1;
46759309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   r->vertices[1][1][1] = t0;
46859309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
46959309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   r->vertices[2][1][0] = s1;
47059309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   r->vertices[2][1][1] = t1;
47159309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
47259309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   r->vertices[3][1][0] = s0;
47359309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   r->vertices[3][1][1] = t1;
47459309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
47559309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   for (i = 0; i < 4; i++) {
47659309337e40106f734efc1e33f956f6f1f4301acChia-I Wu      r->vertices[i][1][2] = r0;
47759309337e40106f734efc1e33f956f6f1f4301acChia-I Wu      r->vertices[i][1][3] = q0;
47859309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   }
47959309337e40106f734efc1e33f956f6f1f4301acChia-I Wu}
48059309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
48159309337e40106f734efc1e33f956f6f1f4301acChia-I Wu/**
48259309337e40106f734efc1e33f956f6f1f4301acChia-I Wu * Draw renderer quad.
48359309337e40106f734efc1e33f956f6f1f4301acChia-I Wu */
48459309337e40106f734efc1e33f956f6f1f4301acChia-I Wustatic void renderer_quad_draw(struct renderer *r)
48559309337e40106f734efc1e33f956f6f1f4301acChia-I Wu{
48659309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   struct pipe_resource *buf;
48759309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
48859309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   buf = pipe_user_buffer_create(r->pipe->screen,
48959309337e40106f734efc1e33f956f6f1f4301acChia-I Wu                                 r->vertices,
49059309337e40106f734efc1e33f956f6f1f4301acChia-I Wu                                 sizeof(r->vertices),
49159309337e40106f734efc1e33f956f6f1f4301acChia-I Wu                                 PIPE_BIND_VERTEX_BUFFER);
49259309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   if (buf) {
493ace4539e88f6ef90d8e9fd2f1543eca0ae854b82Chia-I Wu      cso_set_vertex_elements(r->cso, 2, r->velems);
49459309337e40106f734efc1e33f956f6f1f4301acChia-I Wu      util_draw_vertex_buffer(r->pipe, buf, 0,
49559309337e40106f734efc1e33f956f6f1f4301acChia-I Wu                              PIPE_PRIM_TRIANGLE_FAN,
49659309337e40106f734efc1e33f956f6f1f4301acChia-I Wu                              Elements(r->vertices),     /* verts */
49759309337e40106f734efc1e33f956f6f1f4301acChia-I Wu                              Elements(r->vertices[0])); /* attribs/vert */
49859309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
49959309337e40106f734efc1e33f956f6f1f4301acChia-I Wu      pipe_resource_reference(&buf, NULL);
50059309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   }
50159309337e40106f734efc1e33f956f6f1f4301acChia-I Wu}
50259309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
50359309337e40106f734efc1e33f956f6f1f4301acChia-I Wu/**
50459309337e40106f734efc1e33f956f6f1f4301acChia-I Wu * Prepare the renderer for copying.
50559309337e40106f734efc1e33f956f6f1f4301acChia-I Wu */
50659309337e40106f734efc1e33f956f6f1f4301acChia-I WuVGboolean renderer_copy_begin(struct renderer *renderer,
50759309337e40106f734efc1e33f956f6f1f4301acChia-I Wu                              struct pipe_surface *dst,
50859309337e40106f734efc1e33f956f6f1f4301acChia-I Wu                              VGboolean y0_top,
50959309337e40106f734efc1e33f956f6f1f4301acChia-I Wu                              struct pipe_sampler_view *src)
51059309337e40106f734efc1e33f956f6f1f4301acChia-I Wu{
51159309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   assert(renderer->state == RENDERER_STATE_INIT);
51259309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
51359309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   /* sanity check */
51459309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   if (!renderer_can_support(renderer,
51559309337e40106f734efc1e33f956f6f1f4301acChia-I Wu            dst->texture, PIPE_BIND_RENDER_TARGET) ||
51659309337e40106f734efc1e33f956f6f1f4301acChia-I Wu       !renderer_can_support(renderer,
51759309337e40106f734efc1e33f956f6f1f4301acChia-I Wu          src->texture, PIPE_BIND_SAMPLER_VIEW))
51859309337e40106f734efc1e33f956f6f1f4301acChia-I Wu      return VG_FALSE;
51959309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
52059309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   cso_save_framebuffer(renderer->cso);
52159309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   cso_save_viewport(renderer->cso);
52259309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   cso_save_blend(renderer->cso);
52359309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   cso_save_samplers(renderer->cso);
52459309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   cso_save_fragment_sampler_views(renderer->cso);
52559309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   cso_save_fragment_shader(renderer->cso);
52659309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   cso_save_vertex_shader(renderer->cso);
52759309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
52859309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   renderer_set_target(renderer, dst, NULL, y0_top);
52959309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
53059309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   renderer_set_blend(renderer, ~0);
53159309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   renderer_set_samplers(renderer, 1, &src);
53259309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
53359309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   renderer_set_fs(renderer, RENDERER_FS_TEXTURE);
53459309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   renderer_set_vs(renderer, RENDERER_VS_TEXTURE);
53559309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
53659309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   /* remember the texture size */
53759309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   renderer->u.copy.tex_width = src->texture->width0;
53859309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   renderer->u.copy.tex_height = src->texture->height0;
53959309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   renderer->state = RENDERER_STATE_COPY;
54059309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
54159309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   return VG_TRUE;
54259309337e40106f734efc1e33f956f6f1f4301acChia-I Wu}
54359309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
54459309337e40106f734efc1e33f956f6f1f4301acChia-I Wu/**
54559309337e40106f734efc1e33f956f6f1f4301acChia-I Wu * Draw into the destination rectangle given by (x, y, w, h).  The texture is
54659309337e40106f734efc1e33f956f6f1f4301acChia-I Wu * sampled from within the rectangle given by (sx, sy, sw, sh).
54759309337e40106f734efc1e33f956f6f1f4301acChia-I Wu *
54859309337e40106f734efc1e33f956f6f1f4301acChia-I Wu * The coordinates are in surface coordinates.
54959309337e40106f734efc1e33f956f6f1f4301acChia-I Wu */
55059309337e40106f734efc1e33f956f6f1f4301acChia-I Wuvoid renderer_copy(struct renderer *renderer,
55159309337e40106f734efc1e33f956f6f1f4301acChia-I Wu                   VGint x, VGint y, VGint w, VGint h,
55259309337e40106f734efc1e33f956f6f1f4301acChia-I Wu                   VGint sx, VGint sy, VGint sw, VGint sh)
55359309337e40106f734efc1e33f956f6f1f4301acChia-I Wu{
55459309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   assert(renderer->state == RENDERER_STATE_COPY);
55559309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
55659309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   /* there is no depth buffer for scissoring anyway */
55759309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   renderer_quad_pos(renderer, x, y, x + w, y + h, VG_FALSE);
55859309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   renderer_quad_texcoord(renderer, sx, sy, sx + sw, sy + sh,
55959309337e40106f734efc1e33f956f6f1f4301acChia-I Wu         renderer->u.copy.tex_width,
56059309337e40106f734efc1e33f956f6f1f4301acChia-I Wu         renderer->u.copy.tex_height);
56159309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
56259309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   renderer_quad_draw(renderer);
56359309337e40106f734efc1e33f956f6f1f4301acChia-I Wu}
56459309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
56559309337e40106f734efc1e33f956f6f1f4301acChia-I Wu/**
56659309337e40106f734efc1e33f956f6f1f4301acChia-I Wu * End copying and restore the states.
56759309337e40106f734efc1e33f956f6f1f4301acChia-I Wu */
56859309337e40106f734efc1e33f956f6f1f4301acChia-I Wuvoid renderer_copy_end(struct renderer *renderer)
56959309337e40106f734efc1e33f956f6f1f4301acChia-I Wu{
57059309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   assert(renderer->state == RENDERER_STATE_COPY);
57159309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
57259309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   cso_restore_framebuffer(renderer->cso);
57359309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   cso_restore_viewport(renderer->cso);
57459309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   cso_restore_blend(renderer->cso);
57559309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   cso_restore_samplers(renderer->cso);
57659309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   cso_restore_fragment_sampler_views(renderer->cso);
57759309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   cso_restore_fragment_shader(renderer->cso);
57859309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   cso_restore_vertex_shader(renderer->cso);
57959309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
58059309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   renderer->state = RENDERER_STATE_INIT;
58159309337e40106f734efc1e33f956f6f1f4301acChia-I Wu}
58259309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
583e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu/**
584e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu * Prepare the renderer for textured drawing.
585e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu */
586e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I WuVGboolean renderer_drawtex_begin(struct renderer *renderer,
587e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu                                 struct pipe_sampler_view *src)
588e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu{
589e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu   assert(renderer->state == RENDERER_STATE_INIT);
590e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu
591e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu   if (!renderer_can_support(renderer, src->texture, PIPE_BIND_SAMPLER_VIEW))
592e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu      return VG_FALSE;
593e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu
594e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu   cso_save_blend(renderer->cso);
595e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu   cso_save_samplers(renderer->cso);
596e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu   cso_save_fragment_sampler_views(renderer->cso);
597e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu   cso_save_fragment_shader(renderer->cso);
598e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu   cso_save_vertex_shader(renderer->cso);
599e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu
600e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu   renderer_set_blend(renderer, ~0);
601e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu
602e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu   renderer_set_samplers(renderer, 1, &src);
603e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu
604e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu   renderer_set_fs(renderer, RENDERER_FS_TEXTURE);
605e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu   renderer_set_vs(renderer, RENDERER_VS_TEXTURE);
606e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu
607e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu   /* remember the texture size */
608e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu   renderer->u.drawtex.tex_width = src->texture->width0;
609e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu   renderer->u.drawtex.tex_height = src->texture->height0;
610e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu   renderer->state = RENDERER_STATE_DRAWTEX;
611e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu
612e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu   return VG_TRUE;
613e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu}
614e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu
615e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu/**
616e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu * Draw into the destination rectangle given by (x, y, w, h).  The texture is
617e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu * sampled from within the rectangle given by (sx, sy, sw, sh).
618e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu *
619e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu * The coordinates are in surface coordinates.
620e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu */
621e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wuvoid renderer_drawtex(struct renderer *renderer,
622e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu                      VGint x, VGint y, VGint w, VGint h,
623e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu                      VGint sx, VGint sy, VGint sw, VGint sh)
624e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu{
625e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu   assert(renderer->state == RENDERER_STATE_DRAWTEX);
626e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu
627e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu   /* with scissoring */
628e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu   renderer_quad_pos(renderer, x, y, x + w, y + h, VG_TRUE);
629e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu   renderer_quad_texcoord(renderer, sx, sy, sx + sw, sy + sh,
630e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu         renderer->u.drawtex.tex_width,
631e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu         renderer->u.drawtex.tex_height);
632e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu
633e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu   renderer_quad_draw(renderer);
634e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu}
635e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu
636e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu/**
637e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu * End textured drawing and restore the states.
638e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu */
639e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wuvoid renderer_drawtex_end(struct renderer *renderer)
640e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu{
641e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu   assert(renderer->state == RENDERER_STATE_DRAWTEX);
642e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu
643e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu   cso_restore_blend(renderer->cso);
644e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu   cso_restore_samplers(renderer->cso);
645e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu   cso_restore_fragment_sampler_views(renderer->cso);
646e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu   cso_restore_fragment_shader(renderer->cso);
647e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu   cso_restore_vertex_shader(renderer->cso);
648e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu
649e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu   renderer->state = RENDERER_STATE_INIT;
650e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu}
651e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu
65254cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu/**
65354cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu * Prepare the renderer for scissor update.  This will reset the depth buffer
65454cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu * to 1.0f.
65554cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu */
65654cb382ea55610688c97465ef048a4990b8fd4d7Chia-I WuVGboolean renderer_scissor_begin(struct renderer *renderer,
65754cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu                                 VGboolean restore_dsa)
65854cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu{
65954cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu   struct pipe_depth_stencil_alpha_state dsa;
66054cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu
66154cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu   assert(renderer->state == RENDERER_STATE_INIT);
66254cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu
66354cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu   if (restore_dsa)
66454cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu      cso_save_depth_stencil_alpha(renderer->cso);
66554cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu   cso_save_blend(renderer->cso);
66654cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu   cso_save_fragment_shader(renderer->cso);
66754cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu
66854cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu   /* enable depth writes */
66954cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu   memset(&dsa, 0, sizeof(dsa));
67054cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu   dsa.depth.enabled = 1;
67154cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu   dsa.depth.writemask = 1;
67254cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu   dsa.depth.func = PIPE_FUNC_ALWAYS;
67354cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu   cso_set_depth_stencil_alpha(renderer->cso, &dsa);
67454cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu
67554cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu   /* disable color writes */
67654cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu   renderer_set_blend(renderer, 0);
67754cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu   renderer_set_fs(renderer, RENDERER_FS_SCISSOR);
67854cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu
67954cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu   renderer->u.scissor.restore_dsa = restore_dsa;
68054cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu   renderer->state = RENDERER_STATE_SCISSOR;
68154cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu
68254cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu   /* clear the depth buffer to 1.0f */
68354cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu   renderer->pipe->clear(renderer->pipe,
68454cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu         PIPE_CLEAR_DEPTHSTENCIL, NULL, 1.0f, 0);
68554cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu
68654cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu   return VG_TRUE;
68754cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu}
68854cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu
68954cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu/**
69054cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu * Add a scissor rectangle.  Depth values inside the rectangle will be set to
69154cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu * 0.0f.
69254cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu */
69354cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wuvoid renderer_scissor(struct renderer *renderer,
69454cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu                      VGint x, VGint y, VGint width, VGint height)
69554cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu{
69654cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu   assert(renderer->state == RENDERER_STATE_SCISSOR);
69754cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu
69854cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu   renderer_quad_pos(renderer, x, y, x + width, y + height, VG_FALSE);
69954cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu   renderer_quad_draw(renderer);
70054cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu}
70154cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu
70254cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu/**
70354cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu * End scissor update and restore the states.
70454cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu */
70554cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wuvoid renderer_scissor_end(struct renderer *renderer)
70654cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu{
70754cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu   assert(renderer->state == RENDERER_STATE_SCISSOR);
70854cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu
70954cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu   if (renderer->u.scissor.restore_dsa)
71054cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu      cso_restore_depth_stencil_alpha(renderer->cso);
71154cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu   cso_restore_blend(renderer->cso);
71254cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu   cso_restore_fragment_shader(renderer->cso);
71354cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu
71454cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu   renderer->state = RENDERER_STATE_INIT;
71554cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu}
71654cb382ea55610688c97465ef048a4990b8fd4d7Chia-I Wu
7176b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu/**
7186b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu * Prepare the renderer for clearing.
7196b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu */
7206b241f532a21990a7849c5a786504f7ac4124f76Chia-I WuVGboolean renderer_clear_begin(struct renderer *renderer)
7216b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu{
7226b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu   assert(renderer->state == RENDERER_STATE_INIT);
7236b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu
7246b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu   cso_save_blend(renderer->cso);
7256b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu   cso_save_fragment_shader(renderer->cso);
7266b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu   cso_save_vertex_shader(renderer->cso);
7276b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu
7286b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu   renderer_set_blend(renderer, ~0);
7296b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu   renderer_set_fs(renderer, RENDERER_FS_COLOR);
7306b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu   renderer_set_vs(renderer, RENDERER_VS_COLOR);
7316b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu
7326b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu   renderer->state = RENDERER_STATE_CLEAR;
7336b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu
7346b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu   return VG_TRUE;
7356b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu}
7366b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu
7376b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu/**
7386b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu * Clear the framebuffer with the specified region and color.
7396b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu *
7406b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu * The coordinates are in surface coordinates.
7416b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu */
7426b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wuvoid renderer_clear(struct renderer *renderer,
7436b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu                    VGint x, VGint y, VGint width, VGint height,
7446b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu                    const VGfloat color[4])
7456b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu{
7466b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu   VGuint i;
7476b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu
7486b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu   assert(renderer->state == RENDERER_STATE_CLEAR);
7496b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu
7506b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu   renderer_quad_pos(renderer, x, y, x + width, y + height, VG_TRUE);
7516b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu   for (i = 0; i < 4; i++)
7526b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu      memcpy(renderer->vertices[i][1], color, sizeof(VGfloat) * 4);
7536b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu
7546b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu   renderer_quad_draw(renderer);
7556b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu}
7566b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu
7576b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu/**
7586b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu * End clearing and retore the states.
7596b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu */
7606b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wuvoid renderer_clear_end(struct renderer *renderer)
7616b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu{
7626b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu   assert(renderer->state == RENDERER_STATE_CLEAR);
7636b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu
7646b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu   cso_restore_blend(renderer->cso);
7656b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu   cso_restore_fragment_shader(renderer->cso);
7666b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu   cso_restore_vertex_shader(renderer->cso);
7676b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu
7686b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu   renderer->state = RENDERER_STATE_INIT;
7696b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu}
7706b241f532a21990a7849c5a786504f7ac4124f76Chia-I Wu
771e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu/**
772e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu * Prepare the renderer for image filtering.
773e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu */
774e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I WuVGboolean renderer_filter_begin(struct renderer *renderer,
775e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu                                struct pipe_resource *dst,
776e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu                                VGboolean y0_top,
777e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu                                VGbitfield channel_mask,
778e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu                                const struct pipe_sampler_state **samplers,
779e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu                                struct pipe_sampler_view **views,
780e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu                                VGint num_samplers,
781e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu                                void *fs,
782e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu                                const void *const_buffer,
783e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu                                VGint const_buffer_len)
784e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu{
785e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu   struct pipe_surface *surf;
786e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu
787e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu   assert(renderer->state == RENDERER_STATE_INIT);
788e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu
789e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu   if (!fs)
790e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu      return VG_FALSE;
791e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu   if (!renderer_can_support(renderer, dst, PIPE_BIND_RENDER_TARGET))
792e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu      return VG_FALSE;
793e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu
794e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu   surf = renderer->pipe->screen->get_tex_surface(renderer->pipe->screen,
795e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu         dst, 0, 0, 0, PIPE_BIND_RENDER_TARGET);
796e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu   if (!surf)
797e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu      return VG_FALSE;
798e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu
799e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu   cso_save_framebuffer(renderer->cso);
800e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu   cso_save_viewport(renderer->cso);
801e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu   cso_save_blend(renderer->cso);
802e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu
803e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu   /* set the image as the target */
804e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu   renderer_set_target(renderer, surf, NULL, y0_top);
805e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu   pipe_surface_reference(&surf, NULL);
806e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu
807e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu   renderer_set_blend(renderer, channel_mask);
808e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu
809e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu   if (num_samplers) {
810e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu      struct pipe_resource *tex;
811e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu
812e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu      cso_save_samplers(renderer->cso);
813e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu      cso_save_fragment_sampler_views(renderer->cso);
814e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu      cso_save_fragment_shader(renderer->cso);
815e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu      cso_save_vertex_shader(renderer->cso);
816e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu
817e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu      renderer_set_custom_fs(renderer, fs,
818e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu                             samplers, views, num_samplers,
819e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu                             const_buffer, const_buffer_len);
820e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu      renderer_set_vs(renderer, RENDERER_VS_TEXTURE);
821e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu
822e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu      tex = views[0]->texture;
823e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu      renderer->u.filter.tex_width = tex->width0;
824e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu      renderer->u.filter.tex_height = tex->height0;
825e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu      renderer->u.filter.use_sampler = VG_TRUE;
826e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu   }
827e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu   else {
828e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu      cso_save_fragment_shader(renderer->cso);
829e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu
830e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu      renderer_set_custom_fs(renderer, fs, NULL, NULL, 0,
831e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu                             const_buffer, const_buffer_len);
832e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu
833e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu      renderer->u.filter.use_sampler = VG_FALSE;
834e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu   }
835e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu
836e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu   renderer->state = RENDERER_STATE_FILTER;
837e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu
838e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu   return VG_TRUE;
839e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu}
840e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu
841e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu/**
842e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu * Draw into a rectangle of the destination with the specified region of the
843e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu * texture(s).
844e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu *
845e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu * The coordinates are in surface coordinates.
846e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu */
847e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wuvoid renderer_filter(struct renderer *renderer,
848e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu                    VGint x, VGint y, VGint w, VGint h,
849e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu                    VGint sx, VGint sy, VGint sw, VGint sh)
850e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu{
851e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu   assert(renderer->state == RENDERER_STATE_FILTER);
852e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu
853e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu   renderer_quad_pos(renderer, x, y, x + w, y + h, VG_FALSE);
854e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu   if (renderer->u.filter.use_sampler) {
855e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu      renderer_quad_texcoord(renderer, sx, sy, sx + sw, sy + sh,
856e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu            renderer->u.filter.tex_width,
857e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu            renderer->u.filter.tex_height);
858e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu   }
859e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu
860e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu   renderer_quad_draw(renderer);
861e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu}
862e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu
863e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu/**
864e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu * End image filtering and restore the states.
865e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu */
866e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wuvoid renderer_filter_end(struct renderer *renderer)
867e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu{
868e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu   assert(renderer->state == RENDERER_STATE_FILTER);
869e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu
870e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu   if (renderer->u.filter.use_sampler) {
871e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu      cso_restore_samplers(renderer->cso);
872e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu      cso_restore_fragment_sampler_views(renderer->cso);
873e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu      cso_restore_vertex_shader(renderer->cso);
874e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu   }
875e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu
876e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu   cso_restore_framebuffer(renderer->cso);
877e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu   cso_restore_viewport(renderer->cso);
878e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu   cso_restore_blend(renderer->cso);
879e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu   cso_restore_fragment_shader(renderer->cso);
880e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu
881e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu   renderer->state = RENDERER_STATE_INIT;
882e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu}
883e5968a5355f0165aa7f3f8e71a27df884e5a3efbChia-I Wu
8843b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu/**
8853b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu * Prepare the renderer for polygon silhouette rendering.
8863b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu */
8873b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I WuVGboolean renderer_polygon_stencil_begin(struct renderer *renderer,
8883b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu                                         struct pipe_vertex_element *velem,
8893b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu                                         VGFillRule rule,
8903b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu                                         VGboolean restore_dsa)
8913b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu{
8923b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   struct pipe_depth_stencil_alpha_state *dsa;
8933b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   VGboolean manual_two_sides;
8943b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu
8953b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   assert(renderer->state == RENDERER_STATE_INIT);
8963b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu
8973b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   cso_save_blend(renderer->cso);
8983b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   cso_save_depth_stencil_alpha(renderer->cso);
8993b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu
9003b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   cso_set_vertex_elements(renderer->cso, 1, velem);
9013b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu
9023b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   /* disable color writes */
9033b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   renderer_set_blend(renderer, 0);
9043b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu
9053b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   manual_two_sides = VG_FALSE;
9063b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   dsa = &renderer->u.polygon_stencil.dsa;
9073b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   memset(dsa, 0, sizeof(*dsa));
9083b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   if (rule == VG_EVEN_ODD) {
9093b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu      dsa->stencil[0].enabled = 1;
9103b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu      dsa->stencil[0].writemask = 1;
9113b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu      dsa->stencil[0].fail_op = PIPE_STENCIL_OP_KEEP;
9123b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu      dsa->stencil[0].zfail_op = PIPE_STENCIL_OP_KEEP;
9133b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu      dsa->stencil[0].zpass_op = PIPE_STENCIL_OP_INVERT;
9143b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu      dsa->stencil[0].func = PIPE_FUNC_ALWAYS;
9153b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu      dsa->stencil[0].valuemask = ~0;
9163b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   }
9173b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   else {
9183b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu      assert(rule == VG_NON_ZERO);
9193b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu
9203b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu      /* front face */
9213b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu      dsa->stencil[0].enabled = 1;
9223b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu      dsa->stencil[0].writemask = ~0;
9233b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu      dsa->stencil[0].fail_op = PIPE_STENCIL_OP_KEEP;
9243b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu      dsa->stencil[0].zfail_op = PIPE_STENCIL_OP_KEEP;
9253b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu      dsa->stencil[0].zpass_op = PIPE_STENCIL_OP_INCR_WRAP;
9263b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu      dsa->stencil[0].func = PIPE_FUNC_ALWAYS;
9273b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu      dsa->stencil[0].valuemask = ~0;
9283b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu
9293b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu      if (renderer->pipe->screen->get_param(renderer->pipe->screen,
9303b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu                                            PIPE_CAP_TWO_SIDED_STENCIL)) {
9313b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu         /* back face */
9323b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu         dsa->stencil[1] = dsa->stencil[0];
9333b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu         dsa->stencil[1].zpass_op = PIPE_STENCIL_OP_DECR_WRAP;
9343b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu      }
9353b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu      else {
9363b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu         manual_two_sides = VG_TRUE;
9373b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu      }
9383b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   }
9393b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   cso_set_depth_stencil_alpha(renderer->cso, dsa);
9403b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu
9413b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   if (manual_two_sides)
9423b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu      cso_save_rasterizer(renderer->cso);
9433b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu
9443b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   renderer->u.polygon_stencil.manual_two_sides = manual_two_sides;
9453b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   renderer->u.polygon_stencil.restore_dsa = restore_dsa;
9463b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   renderer->state = RENDERER_STATE_POLYGON_STENCIL;
9473b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu
9483b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   return VG_TRUE;
9493b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu}
9503b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu
9513b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu/**
9523b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu * Render a polygon silhouette to stencil buffer.
9533b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu */
9543b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wuvoid renderer_polygon_stencil(struct renderer *renderer,
9553b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu                              struct pipe_vertex_buffer *vbuf,
9563b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu                              VGuint mode, VGuint start, VGuint count)
9573b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu{
9583b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   assert(renderer->state == RENDERER_STATE_POLYGON_STENCIL);
9593b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu
9603b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   renderer->pipe->set_vertex_buffers(renderer->pipe, 1, vbuf);
9613b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu
9623b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   if (!renderer->u.polygon_stencil.manual_two_sides) {
9633b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu      util_draw_arrays(renderer->pipe, mode, start, count);
9643b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   }
9653b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   else {
9663b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu      struct pipe_rasterizer_state raster;
9673b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu      struct pipe_depth_stencil_alpha_state dsa;
9683b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu
969b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu      raster = renderer->g3d.rasterizer;
9703b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu      dsa = renderer->u.polygon_stencil.dsa;
9713b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu
9723b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu      /* front */
9733b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu      raster.cull_face = PIPE_FACE_BACK;
9743b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu      dsa.stencil[0].zpass_op = PIPE_STENCIL_OP_INCR_WRAP;
9753b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu
9763b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu      cso_set_rasterizer(renderer->cso, &raster);
9773b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu      cso_set_depth_stencil_alpha(renderer->cso, &dsa);
9783b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu      util_draw_arrays(renderer->pipe, mode, start, count);
9793b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu
9803b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu      /* back */
9813b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu      raster.cull_face = PIPE_FACE_FRONT;
9823b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu      dsa.stencil[0].zpass_op = PIPE_STENCIL_OP_DECR_WRAP;
9833b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu
9843b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu      cso_set_rasterizer(renderer->cso, &raster);
9853b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu      cso_set_depth_stencil_alpha(renderer->cso, &dsa);
9863b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu      util_draw_arrays(renderer->pipe, mode, start, count);
9873b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   }
9883b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu}
9893b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu
9903b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu/**
9913b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu * End polygon silhouette rendering.
9923b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu */
9933b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wuvoid renderer_polygon_stencil_end(struct renderer *renderer)
9943b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu{
9953b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   assert(renderer->state == RENDERER_STATE_POLYGON_STENCIL);
9963b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu
9973b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   if (renderer->u.polygon_stencil.manual_two_sides)
9983b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu      cso_restore_rasterizer(renderer->cso);
9993b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu
10003b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   /* restore color writes */
10013b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   cso_restore_blend(renderer->cso);
10023b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu
10033b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   if (renderer->u.polygon_stencil.restore_dsa)
10043b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu      cso_restore_depth_stencil_alpha(renderer->cso);
10053b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu
10063b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   renderer->state = RENDERER_STATE_INIT;
10073b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu}
10083b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu
10093b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu/**
10103b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu * Prepare the renderer for polygon filling.
10113b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu */
10123b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I WuVGboolean renderer_polygon_fill_begin(struct renderer *renderer,
10133b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu                                      VGboolean save_dsa)
10143b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu{
10153b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   struct pipe_depth_stencil_alpha_state dsa;
10163b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   struct pipe_stencil_ref sr;
10173b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu
10183b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   assert(renderer->state == RENDERER_STATE_INIT);
10193b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu
10203b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   if (save_dsa)
10213b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu      cso_save_depth_stencil_alpha(renderer->cso);
10223b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu
10233b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   /* only need a fixed 0. Rely on default or move it out at least? */
10243b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   memset(&sr, 0, sizeof(sr));
10253b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   cso_set_stencil_ref(renderer->cso, &sr);
10263b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu
10273b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   /* setup stencil ops */
10283b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   memset(&dsa, 0, sizeof(dsa));
10293b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   dsa.stencil[0].enabled = 1;
10303b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   dsa.stencil[0].func = PIPE_FUNC_NOTEQUAL;
10313b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   dsa.stencil[0].fail_op = PIPE_STENCIL_OP_REPLACE;
10323b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   dsa.stencil[0].zfail_op = PIPE_STENCIL_OP_REPLACE;
10333b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   dsa.stencil[0].zpass_op = PIPE_STENCIL_OP_REPLACE;
10343b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   dsa.stencil[0].valuemask = ~0;
10353b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   dsa.stencil[0].writemask = ~0;
1036b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu   dsa.depth = renderer->g3d.dsa.depth;
10373b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   cso_set_depth_stencil_alpha(renderer->cso, &dsa);
10383b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu
10393b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   renderer->state = RENDERER_STATE_POLYGON_FILL;
10403b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu
10413b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   return VG_TRUE;
10423b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu}
10433b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu
10443b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu/**
10453b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu * Fill a polygon.
10463b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu */
10473b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wuvoid renderer_polygon_fill(struct renderer *renderer,
10483b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu                           VGfloat min_x, VGfloat min_y,
10493b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu                           VGfloat max_x, VGfloat max_y)
10503b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu{
10513b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   assert(renderer->state == RENDERER_STATE_POLYGON_FILL);
10523b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu
10533b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   renderer_quad_pos(renderer, min_x, min_y, max_x, max_y, VG_TRUE);
10543b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   renderer_quad_draw(renderer);
10553b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu}
10563b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu
10573b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu/**
10583b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu * End polygon filling.
10593b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu */
10603b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wuvoid renderer_polygon_fill_end(struct renderer *renderer)
10613b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu{
10623b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   assert(renderer->state == RENDERER_STATE_POLYGON_FILL);
10633b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu
10643b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   cso_restore_depth_stencil_alpha(renderer->cso);
10653b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu
10663b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu   renderer->state = RENDERER_STATE_INIT;
10673b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu}
10683b71cb6ad6dabfefc9363a35872f4e70e1125603Chia-I Wu
1069544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusinstatic void setup_shaders(struct renderer *ctx)
1070544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin{
1071544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   struct pipe_context *pipe = ctx->pipe;
1072544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   /* fragment shader */
1073d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul   ctx->fs = util_make_fragment_tex_shader(pipe, TGSI_TEXTURE_2D,
1074d18fb4822bc71944867b66e6de966e4e55bbe574Brian Paul                                           TGSI_INTERPOLATE_LINEAR);
1075544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin}
1076544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
1077544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusinstruct renderer * renderer_create(struct vg_context *owner)
1078544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin{
1079544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   VGint i;
1080544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   struct renderer *renderer = CALLOC_STRUCT(renderer);
1081544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
1082544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   if (!renderer)
1083544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      return NULL;
1084544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
1085544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   renderer->owner = owner;
1086544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   renderer->pipe = owner->pipe;
1087544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   renderer->cso = owner->cso_context;
1088544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
1089544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   setup_shaders(renderer);
1090544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
1091544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   /* init vertex data that doesn't change */
109259309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   for (i = 0; i < 4; i++)
1093544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      renderer->vertices[i][0][3] = 1.0f; /* w */
109459309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
1095ace4539e88f6ef90d8e9fd2f1543eca0ae854b82Chia-I Wu   for (i = 0; i < 2; i++) {
1096ace4539e88f6ef90d8e9fd2f1543eca0ae854b82Chia-I Wu      renderer->velems[i].src_offset = i * 4 * sizeof(float);
1097ace4539e88f6ef90d8e9fd2f1543eca0ae854b82Chia-I Wu      renderer->velems[i].instance_divisor = 0;
1098ace4539e88f6ef90d8e9fd2f1543eca0ae854b82Chia-I Wu      renderer->velems[i].vertex_buffer_index = 0;
1099ace4539e88f6ef90d8e9fd2f1543eca0ae854b82Chia-I Wu      renderer->velems[i].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT;
1100ace4539e88f6ef90d8e9fd2f1543eca0ae854b82Chia-I Wu   }
1101ace4539e88f6ef90d8e9fd2f1543eca0ae854b82Chia-I Wu
110259309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   renderer->state = RENDERER_STATE_INIT;
1103544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
1104544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   return renderer;
1105544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin}
1106544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
1107544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusinvoid renderer_destroy(struct renderer *ctx)
1108544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin{
110959309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   int i;
111059309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
111159309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   for (i = 0; i < NUM_RENDERER_VS; i++) {
111259309337e40106f734efc1e33f956f6f1f4301acChia-I Wu      if (ctx->cached_vs[i])
111359309337e40106f734efc1e33f956f6f1f4301acChia-I Wu         cso_delete_vertex_shader(ctx->cso, ctx->cached_vs[i]);
111459309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   }
111559309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   for (i = 0; i < NUM_RENDERER_FS; i++) {
111659309337e40106f734efc1e33f956f6f1f4301acChia-I Wu      if (ctx->cached_fs[i])
111759309337e40106f734efc1e33f956f6f1f4301acChia-I Wu         cso_delete_fragment_shader(ctx->cso, ctx->cached_fs[i]);
111859309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   }
111959309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
1120b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu   pipe_resource_reference(&ctx->vs_const_buffer, NULL);
1121b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu
1122544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#if 0
1123544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   if (ctx->fs) {
1124544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      cso_delete_fragment_shader(ctx->cso, ctx->fs);
1125544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      ctx->fs = NULL;
1126544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   }
1127544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#endif
1128f914cd1796845164109c837a111c39ba64852ad4nobled   FREE(ctx);
1129544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin}
1130544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
1131b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wustatic void update_clip_state(struct renderer *renderer,
1132b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu                              const struct vg_state *state)
1133b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu{
1134b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu   struct pipe_depth_stencil_alpha_state *dsa = &renderer->g3d.dsa;
1135b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu
1136b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu   memset(dsa, 0, sizeof(struct pipe_depth_stencil_alpha_state));
1137b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu
1138b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu   if (state->scissoring) {
1139b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu      struct pipe_framebuffer_state *fb = &renderer->g3d.fb;
1140b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu      int i;
1141b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu
1142b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu      renderer_scissor_begin(renderer, VG_FALSE);
1143b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu
1144b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu      for (i = 0; i < state->scissor_rects_num; ++i) {
1145b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu         const float x      = state->scissor_rects[i * 4 + 0].f;
1146b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu         const float y      = state->scissor_rects[i * 4 + 1].f;
1147b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu         const float width  = state->scissor_rects[i * 4 + 2].f;
1148b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu         const float height = state->scissor_rects[i * 4 + 3].f;
1149b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu         VGint x0, y0, x1, y1, iw, ih;
1150b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu
1151b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu         x0 = (VGint) x;
1152b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu         y0 = (VGint) y;
1153b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu         if (x0 < 0)
1154b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu            x0 = 0;
1155b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu         if (y0 < 0)
1156b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu            y0 = 0;
1157b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu
1158b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu         /* note that x1 and y1 are exclusive */
1159b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu         x1 = (VGint) ceilf(x + width);
1160b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu         y1 = (VGint) ceilf(y + height);
1161b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu         if (x1 > fb->width)
1162b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu            x1 = fb->width;
1163b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu         if (y1 > fb->height)
1164b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu            y1 = fb->height;
1165b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu
1166b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu         iw = x1 - x0;
1167b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu         ih = y1 - y0;
1168b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu         if (iw > 0 && ih> 0 )
1169b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu            renderer_scissor(renderer, x0, y0, iw, ih);
1170b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu      }
1171b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu
1172b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu      renderer_scissor_end(renderer);
1173b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu
1174b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu      dsa->depth.enabled = 1; /* glEnable(GL_DEPTH_TEST); */
1175b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu      dsa->depth.writemask = 0;/*glDepthMask(FALSE);*/
1176b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu      dsa->depth.func = PIPE_FUNC_GEQUAL;
1177b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu   }
1178b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu}
1179b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu
1180b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu/**
1181b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu * Propogate OpenVG state changes to the renderer.  Only framebuffer, blending
1182b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu * and scissoring states are relevant here.
1183b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu */
1184b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wuvoid renderer_validate(struct renderer *renderer,
1185b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu                       VGbitfield dirty,
1186b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu                       const struct st_framebuffer *stfb,
1187b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu                       const struct vg_state *state)
1188b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu{
1189b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu   assert(renderer->state == RENDERER_STATE_INIT);
1190b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu
1191b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu   if (dirty & BLEND_DIRTY) {
1192b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu      struct pipe_blend_state *blend = &renderer->g3d.blend;
1193b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu      memset(blend, 0, sizeof(struct pipe_blend_state));
1194b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu      blend->rt[0].blend_enable = 1;
1195b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu      blend->rt[0].colormask = PIPE_MASK_RGBA;
1196b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu
1197b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu      switch (state->blend_mode) {
1198b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu      case VG_BLEND_SRC:
1199b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu         blend->rt[0].rgb_src_factor   = PIPE_BLENDFACTOR_ONE;
1200b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu         blend->rt[0].alpha_src_factor = PIPE_BLENDFACTOR_ONE;
1201b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu         blend->rt[0].rgb_dst_factor   = PIPE_BLENDFACTOR_ZERO;
1202b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu         blend->rt[0].alpha_dst_factor = PIPE_BLENDFACTOR_ZERO;
1203b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu         blend->rt[0].blend_enable = 0;
1204b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu         break;
1205b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu      case VG_BLEND_SRC_OVER:
1206b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu         blend->rt[0].rgb_src_factor   = PIPE_BLENDFACTOR_SRC_ALPHA;
1207b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu         blend->rt[0].alpha_src_factor = PIPE_BLENDFACTOR_ONE;
1208b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu         blend->rt[0].rgb_dst_factor   = PIPE_BLENDFACTOR_INV_SRC_ALPHA;
1209b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu         blend->rt[0].alpha_dst_factor = PIPE_BLENDFACTOR_INV_SRC_ALPHA;
1210b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu         break;
1211b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu      case VG_BLEND_DST_OVER:
1212b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu         blend->rt[0].rgb_src_factor   = PIPE_BLENDFACTOR_INV_DST_ALPHA;
1213b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu         blend->rt[0].alpha_src_factor = PIPE_BLENDFACTOR_INV_DST_ALPHA;
1214b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu         blend->rt[0].rgb_dst_factor   = PIPE_BLENDFACTOR_DST_ALPHA;
1215b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu         blend->rt[0].alpha_dst_factor = PIPE_BLENDFACTOR_DST_ALPHA;
1216b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu         break;
1217b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu      case VG_BLEND_SRC_IN:
1218b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu         blend->rt[0].rgb_src_factor   = PIPE_BLENDFACTOR_DST_ALPHA;
1219b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu         blend->rt[0].alpha_src_factor = PIPE_BLENDFACTOR_DST_ALPHA;
1220b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu         blend->rt[0].rgb_dst_factor   = PIPE_BLENDFACTOR_ZERO;
1221b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu         blend->rt[0].alpha_dst_factor = PIPE_BLENDFACTOR_ZERO;
1222b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu         break;
1223b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu      case VG_BLEND_DST_IN:
1224b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu         blend->rt[0].rgb_src_factor   = PIPE_BLENDFACTOR_ZERO;
1225b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu         blend->rt[0].alpha_src_factor = PIPE_BLENDFACTOR_ZERO;
1226b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu         blend->rt[0].rgb_dst_factor   = PIPE_BLENDFACTOR_SRC_ALPHA;
1227b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu         blend->rt[0].alpha_dst_factor = PIPE_BLENDFACTOR_SRC_ALPHA;
1228b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu         break;
1229b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu      case VG_BLEND_MULTIPLY:
1230b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu      case VG_BLEND_SCREEN:
1231b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu      case VG_BLEND_DARKEN:
1232b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu      case VG_BLEND_LIGHTEN:
1233b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu         blend->rt[0].rgb_src_factor   = PIPE_BLENDFACTOR_ONE;
1234b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu         blend->rt[0].alpha_src_factor = PIPE_BLENDFACTOR_ONE;
1235b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu         blend->rt[0].rgb_dst_factor   = PIPE_BLENDFACTOR_ZERO;
1236b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu         blend->rt[0].alpha_dst_factor = PIPE_BLENDFACTOR_ZERO;
1237b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu         blend->rt[0].blend_enable = 0;
1238b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu         break;
1239b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu      case VG_BLEND_ADDITIVE:
1240b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu         blend->rt[0].rgb_src_factor   = PIPE_BLENDFACTOR_ONE;
1241b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu         blend->rt[0].alpha_src_factor = PIPE_BLENDFACTOR_ONE;
1242b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu         blend->rt[0].rgb_dst_factor   = PIPE_BLENDFACTOR_ONE;
1243b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu         blend->rt[0].alpha_dst_factor = PIPE_BLENDFACTOR_ONE;
1244b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu         break;
1245b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu      default:
1246b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu         assert(!"not implemented blend mode");
1247b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu      }
1248b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu      cso_set_blend(renderer->cso, blend);
1249b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu   }
1250b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu
1251b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu   if (dirty & RASTERIZER_DIRTY) {
1252b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu      struct pipe_rasterizer_state *raster = &renderer->g3d.rasterizer;
1253b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu      memset(raster, 0, sizeof(struct pipe_rasterizer_state));
1254b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu      raster->gl_rasterization_rules = 1;
1255b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu      cso_set_rasterizer(renderer->cso, raster);
1256b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu   }
1257b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu
1258b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu   if (dirty & FRAMEBUFFER_DIRTY) {
1259b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu      struct pipe_framebuffer_state *fb = &renderer->g3d.fb;
1260b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu      struct pipe_resource **cbuf = &renderer->vs_const_buffer;
1261b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu      VGfloat vs_consts[8];
1262b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu
1263b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu      memset(fb, 0, sizeof(struct pipe_framebuffer_state));
1264b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu      fb->width  = stfb->width;
1265b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu      fb->height = stfb->height;
1266b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu      fb->nr_cbufs = 1;
1267b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu      fb->cbufs[0] = stfb->strb->surface;
1268b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu      fb->zsbuf = stfb->dsrb->surface;
1269b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu
1270b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu      cso_set_framebuffer(renderer->cso, fb);
1271b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu      vg_set_viewport(renderer->owner, VEGA_Y0_BOTTOM);
1272b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu
1273b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu      /* surface coordinates to clipped coordinates */
1274b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu      vs_consts[0] = 2.0f / fb->width;
1275b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu      vs_consts[1] = 2.0f / fb->height;
1276b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu      vs_consts[2] = 1.0f;
1277b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu      vs_consts[3] = 1.0f;
1278b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu      vs_consts[4] = -1.0f;
1279b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu      vs_consts[5] = -1.0f;
1280b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu      vs_consts[6] = 0.0f;
1281b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu      vs_consts[7] = 0.0f;
1282b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu
1283b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu      pipe_resource_reference(cbuf, NULL);
1284b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu      *cbuf = pipe_buffer_create(renderer->pipe->screen,
1285b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu				 PIPE_BIND_CONSTANT_BUFFER,
1286b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu				 sizeof(vs_consts));
1287b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu
1288b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu      if (*cbuf) {
1289b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu         pipe_buffer_write(renderer->pipe,
1290b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu               *cbuf, 0, sizeof(vs_consts), vs_consts);
1291b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu      }
1292b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu      renderer->pipe->set_constant_buffer(renderer->pipe,
1293b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu            PIPE_SHADER_VERTEX, 0, *cbuf);
1294b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu
1295b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu      /* we also got a new depth buffer */
1296b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu      if (dirty & DEPTH_STENCIL_DIRTY) {
1297b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu         renderer->pipe->clear(renderer->pipe,
1298b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu               PIPE_CLEAR_DEPTHSTENCIL, NULL, 0.0, 0);
1299b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu      }
1300b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu   }
1301b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu
1302b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu   if (dirty & VS_DIRTY)
1303b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu      renderer_set_vs(renderer, RENDERER_VS_PLAIN);
1304b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu
1305b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu   /* must be last because it renders to the depth buffer*/
1306b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu   if (dirty & DEPTH_STENCIL_DIRTY) {
1307b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu      update_clip_state(renderer, state);
1308b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu      cso_set_depth_stencil_alpha(renderer->cso, &renderer->g3d.dsa);
1309b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu   }
1310b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu}
1311b730f0fc52a208b5f2a308199724ab02aa391fecChia-I Wu
1312ee0f1ab923cc52b5eeacc47a749561d1c7216207Chia-I Wu/**
1313ee0f1ab923cc52b5eeacc47a749561d1c7216207Chia-I Wu * Prepare the renderer for OpenVG pipeline.
1314ee0f1ab923cc52b5eeacc47a749561d1c7216207Chia-I Wu */
1315ee0f1ab923cc52b5eeacc47a749561d1c7216207Chia-I Wuvoid renderer_validate_for_shader(struct renderer *renderer,
1316ee0f1ab923cc52b5eeacc47a749561d1c7216207Chia-I Wu                                  const struct pipe_sampler_state **samplers,
1317ee0f1ab923cc52b5eeacc47a749561d1c7216207Chia-I Wu                                  struct pipe_sampler_view **views,
1318ee0f1ab923cc52b5eeacc47a749561d1c7216207Chia-I Wu                                  VGint num_samplers,
1319ee0f1ab923cc52b5eeacc47a749561d1c7216207Chia-I Wu                                  void *fs,
1320ee0f1ab923cc52b5eeacc47a749561d1c7216207Chia-I Wu                                  const void *const_buffer,
1321ee0f1ab923cc52b5eeacc47a749561d1c7216207Chia-I Wu                                  VGint const_buffer_len)
1322ee0f1ab923cc52b5eeacc47a749561d1c7216207Chia-I Wu{
1323ee0f1ab923cc52b5eeacc47a749561d1c7216207Chia-I Wu   renderer_set_custom_fs(renderer, fs,
1324ee0f1ab923cc52b5eeacc47a749561d1c7216207Chia-I Wu                          samplers, views, num_samplers,
1325ee0f1ab923cc52b5eeacc47a749561d1c7216207Chia-I Wu                          const_buffer, const_buffer_len);
1326ee0f1ab923cc52b5eeacc47a749561d1c7216207Chia-I Wu}
1327ee0f1ab923cc52b5eeacc47a749561d1c7216207Chia-I Wu
1328544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusinvoid renderer_draw_quad(struct renderer *r,
1329544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                        VGfloat x1, VGfloat y1,
1330544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                        VGfloat x2, VGfloat y2,
1331544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                        VGfloat depth)
1332544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin{
133359309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   assert(r->state == RENDERER_STATE_INIT);
133459309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   assert(floatsEqual(depth, 0.0f));
1335544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
133659309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   renderer_quad_pos(r, x1, y1, x2, y2, VG_TRUE);
133759309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   renderer_quad_draw(r);
1338544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin}
1339544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
1340544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusinvoid renderer_draw_texture(struct renderer *r,
1341287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell                           struct pipe_resource *tex,
1342544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                           VGfloat x1offset, VGfloat y1offset,
1343544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                           VGfloat x2offset, VGfloat y2offset,
1344544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                           VGfloat x1, VGfloat y1,
1345544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                           VGfloat x2, VGfloat y2)
1346544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin{
134759309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   assert(r->state == RENDERER_STATE_INIT);
1348d509f84543d0979e9bb53c20c195f378dd61e728Roland Scheidegger   assert(tex->width0 != 0);
1349d509f84543d0979e9bb53c20c195f378dd61e728Roland Scheidegger   assert(tex->height0 != 0);
1350544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
1351544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   cso_save_vertex_shader(r->cso);
1352544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
135359309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   renderer_set_vs(r, RENDERER_VS_TEXTURE);
1354544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
135559309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   renderer_quad_pos(r, x1, y1, x2, y2, VG_TRUE);
135659309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   renderer_quad_texcoord(r, x1offset, y1offset,
135759309337e40106f734efc1e33f956f6f1f4301acChia-I Wu         x2offset, y2offset, tex->width0, tex->height0);
135859309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   renderer_quad_draw(r);
1359544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
1360544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   cso_restore_vertex_shader(r->cso);
1361544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin}
1362544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
1363544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusinvoid renderer_copy_texture(struct renderer *ctx,
1364e5f0384ad06359aa1b9dc1b4bc6f475f7a119af2Roland Scheidegger                           struct pipe_sampler_view *src,
1365544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                           VGfloat sx1, VGfloat sy1,
1366544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                           VGfloat sx2, VGfloat sy2,
1367287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell                           struct pipe_resource *dst,
1368544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                           VGfloat dx1, VGfloat dy1,
1369544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                           VGfloat dx2, VGfloat dy2)
1370544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin{
137159309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   struct pipe_surface *surf;
137259309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   VGint x, y, w, h, sx, sy, sw, sh;
1373544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
137459309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   /* get the destination surface */
137559309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   surf = ctx->pipe->screen->get_tex_surface(ctx->pipe->screen,
137659309337e40106f734efc1e33f956f6f1f4301acChia-I Wu         dst, 0, 0, 0, PIPE_BIND_RENDER_TARGET);
137759309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   if (!surf)
137859309337e40106f734efc1e33f956f6f1f4301acChia-I Wu      return;
137959309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
138059309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   assert(ctx->state == RENDERER_STATE_INIT);
138159309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   assert(src->texture->width0 != 0);
138259309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   assert(src->texture->height0 != 0);
1383d509f84543d0979e9bb53c20c195f378dd61e728Roland Scheidegger   assert(dst->width0 != 0);
1384d509f84543d0979e9bb53c20c195f378dd61e728Roland Scheidegger   assert(dst->height0 != 0);
1385544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
138659309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   x = (VGint) dx1;
138759309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   y = (VGint) dy1;
138859309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   w = (VGint) (dx2 - dx1);
138959309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   h = (VGint) (dy2 - dy1);
139059309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   assert(floatsEqual(x, dx1) &&
139159309337e40106f734efc1e33f956f6f1f4301acChia-I Wu          floatsEqual(y, dy1) &&
139259309337e40106f734efc1e33f956f6f1f4301acChia-I Wu          floatsEqual(w, (dx2 - dx1)) &&
139359309337e40106f734efc1e33f956f6f1f4301acChia-I Wu          floatsEqual(h, (dy2 - dy1)));
139459309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
139559309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   sx = (VGint) sx1;
139659309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   sy = (VGint) sy1;
139759309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   sw = (VGint) (sx2 - sx1);
139859309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   sh = (VGint) (sy2 - sy1);
139959309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   assert(floatsEqual(sx, sx1) &&
140059309337e40106f734efc1e33f956f6f1f4301acChia-I Wu          floatsEqual(sy, sy1) &&
140159309337e40106f734efc1e33f956f6f1f4301acChia-I Wu          floatsEqual(sw, (sx2 - sx1)) &&
140259309337e40106f734efc1e33f956f6f1f4301acChia-I Wu          floatsEqual(sh, (sy2 - sy1)));
140359309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
140459309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   if (renderer_copy_begin(ctx, surf, VG_TRUE, src)) {
140559309337e40106f734efc1e33f956f6f1f4301acChia-I Wu      renderer_copy(ctx, x, y, w, h, sx, sy, sw, sh);
140659309337e40106f734efc1e33f956f6f1f4301acChia-I Wu      renderer_copy_end(ctx);
1407544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   }
1408544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
140959309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   pipe_surface_reference(&surf, NULL);
1410544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin}
1411544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
1412544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusinvoid renderer_copy_surface(struct renderer *ctx,
1413544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                           struct pipe_surface *src,
1414544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                           int srcX0, int srcY0,
1415544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                           int srcX1, int srcY1,
1416544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                           struct pipe_surface *dst,
1417544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                           int dstX0, int dstY0,
1418544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                           int dstX1, int dstY1,
1419544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                           float z, unsigned filter)
1420544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin{
1421544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   struct pipe_context *pipe = ctx->pipe;
1422544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   struct pipe_screen *screen = pipe->screen;
1423e5f0384ad06359aa1b9dc1b4bc6f475f7a119af2Roland Scheidegger   struct pipe_sampler_view view_templ;
1424e5f0384ad06359aa1b9dc1b4bc6f475f7a119af2Roland Scheidegger   struct pipe_sampler_view *view;
1425287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell   struct pipe_resource texTemp, *tex;
1426c36c3d86b62b525291b1c6527de3ac5de93a2fafRoland Scheidegger   struct pipe_subresource subsrc, subdst;
1427544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   struct st_framebuffer *stfb = ctx->owner->draw_buffer;
1428544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   const int srcW = abs(srcX1 - srcX0);
1429544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   const int srcH = abs(srcY1 - srcY0);
1430544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   const int srcLeft = MIN2(srcX0, srcX1);
1431544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   const int srcTop = MIN2(srcY0, srcY1);
1432544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
1433544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   assert(filter == PIPE_TEX_MIPFILTER_NEAREST ||
1434544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin          filter == PIPE_TEX_MIPFILTER_LINEAR);
1435544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
1436544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   if (srcLeft != srcX0) {
1437544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      /* left-right flip */
1438544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      int tmp = dstX0;
1439544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      dstX0 = dstX1;
1440544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      dstX1 = tmp;
1441544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   }
1442544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
1443544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   if (srcTop != srcY0) {
1444544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      /* up-down flip */
1445544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      int tmp = dstY0;
1446544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      dstY0 = dstY1;
1447544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      dstY1 = tmp;
1448544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   }
1449544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
1450544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   assert(screen->is_format_supported(screen, src->format, PIPE_TEXTURE_2D,
1451c36c3d86b62b525291b1c6527de3ac5de93a2fafRoland Scheidegger                                      0, PIPE_BIND_SAMPLER_VIEW, 0));
1452544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   assert(screen->is_format_supported(screen, dst->format, PIPE_TEXTURE_2D,
1453c36c3d86b62b525291b1c6527de3ac5de93a2fafRoland Scheidegger                                      0, PIPE_BIND_SAMPLER_VIEW, 0));
1454544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   assert(screen->is_format_supported(screen, dst->format, PIPE_TEXTURE_2D,
1455c36c3d86b62b525291b1c6527de3ac5de93a2fafRoland Scheidegger                                      0, PIPE_BIND_RENDER_TARGET, 0));
1456544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
1457544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   /*
1458544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin    * XXX for now we're always creating a temporary texture.
1459544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin    * Strictly speaking that's not always needed.
1460544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin    */
1461544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
1462544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   /* create temp texture */
1463544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   memset(&texTemp, 0, sizeof(texTemp));
1464544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   texTemp.target = PIPE_TEXTURE_2D;
1465544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   texTemp.format = src->format;
1466544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   texTemp.last_level = 0;
1467d509f84543d0979e9bb53c20c195f378dd61e728Roland Scheidegger   texTemp.width0 = srcW;
1468d509f84543d0979e9bb53c20c195f378dd61e728Roland Scheidegger   texTemp.height0 = srcH;
1469d509f84543d0979e9bb53c20c195f378dd61e728Roland Scheidegger   texTemp.depth0 = 1;
1470c36c3d86b62b525291b1c6527de3ac5de93a2fafRoland Scheidegger   texTemp.bind = PIPE_BIND_SAMPLER_VIEW;
1471544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
1472287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell   tex = screen->resource_create(screen, &texTemp);
1473544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   if (!tex)
1474544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin      return;
1475544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
1476e5f0384ad06359aa1b9dc1b4bc6f475f7a119af2Roland Scheidegger   u_sampler_view_default_template(&view_templ, tex, tex->format);
1477e5f0384ad06359aa1b9dc1b4bc6f475f7a119af2Roland Scheidegger   view = pipe->create_sampler_view(pipe, tex, &view_templ);
1478e5f0384ad06359aa1b9dc1b4bc6f475f7a119af2Roland Scheidegger
1479e5f0384ad06359aa1b9dc1b4bc6f475f7a119af2Roland Scheidegger   if (!view)
1480e5f0384ad06359aa1b9dc1b4bc6f475f7a119af2Roland Scheidegger      return;
1481e5f0384ad06359aa1b9dc1b4bc6f475f7a119af2Roland Scheidegger
1482c36c3d86b62b525291b1c6527de3ac5de93a2fafRoland Scheidegger   subdst.face = 0;
1483c36c3d86b62b525291b1c6527de3ac5de93a2fafRoland Scheidegger   subdst.level = 0;
1484c36c3d86b62b525291b1c6527de3ac5de93a2fafRoland Scheidegger   subsrc.face = src->face;
1485c36c3d86b62b525291b1c6527de3ac5de93a2fafRoland Scheidegger   subsrc.level = src->level;
1486544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
1487c36c3d86b62b525291b1c6527de3ac5de93a2fafRoland Scheidegger   pipe->resource_copy_region(pipe,
1488c36c3d86b62b525291b1c6527de3ac5de93a2fafRoland Scheidegger                              tex, subdst, 0, 0, 0,  /* dest */
1489c36c3d86b62b525291b1c6527de3ac5de93a2fafRoland Scheidegger                              src->texture, subsrc, srcLeft, srcTop, src->zslice, /* src */
1490c36c3d86b62b525291b1c6527de3ac5de93a2fafRoland Scheidegger                              srcW, srcH);     /* size */
1491544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
1492e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu   assert(floatsEqual(z, 0.0f));
1493544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
1494e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu   /* draw */
1495e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu   if (stfb->strb->surface == dst) {
1496e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu      /* transform back to surface coordinates */
1497e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu      dstY0 = dst->height - dstY0;
1498e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu      dstY1 = dst->height - dstY1;
1499544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
1500e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu      if (renderer_drawtex_begin(ctx, view)) {
1501e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu         renderer_drawtex(ctx,
1502e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu               dstX0, dstY0, dstX1 - dstX0, dstY1 - dstY0,
1503e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu               0, 0, view->texture->width0, view->texture->height0);
1504e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu         renderer_drawtex_end(ctx);
1505e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu      }
1506544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   }
1507e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu   else {
1508e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu      if (renderer_copy_begin(ctx, dst, VG_TRUE, view)) {
1509e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu         renderer_copy(ctx,
1510e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu               dstX0, dstY0, dstX1 - dstX0, dstY1 - dstY0,
1511e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu               0, 0, view->texture->width0, view->texture->height0);
1512e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu         renderer_copy_end(ctx);
1513e31a04ea3bc957b2a43b910b1f51807b12da18a6Chia-I Wu      }
1514544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   }
1515544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin}
1516544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
1517544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusinvoid renderer_texture_quad(struct renderer *r,
1518287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell                           struct pipe_resource *tex,
1519544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                           VGfloat x1offset, VGfloat y1offset,
1520544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                           VGfloat x2offset, VGfloat y2offset,
1521544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                           VGfloat x1, VGfloat y1,
1522544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                           VGfloat x2, VGfloat y2,
1523544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                           VGfloat x3, VGfloat y3,
1524544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin                           VGfloat x4, VGfloat y4)
1525544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin{
152659309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   const VGfloat z = 0.0f;
1527544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
152859309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   assert(r->state == RENDERER_STATE_INIT);
1529d509f84543d0979e9bb53c20c195f378dd61e728Roland Scheidegger   assert(tex->width0 != 0);
1530d509f84543d0979e9bb53c20c195f378dd61e728Roland Scheidegger   assert(tex->height0 != 0);
1531544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
1532544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   cso_save_vertex_shader(r->cso);
1533544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
153459309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   renderer_set_vs(r, RENDERER_VS_TEXTURE);
1535544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
153659309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   /* manually set up positions */
153759309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   r->vertices[0][0][0] = x1;
153859309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   r->vertices[0][0][1] = y1;
153959309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   r->vertices[0][0][2] = z;
1540544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
154159309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   r->vertices[1][0][0] = x2;
154259309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   r->vertices[1][0][1] = y2;
154359309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   r->vertices[1][0][2] = z;
154459309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
154559309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   r->vertices[2][0][0] = x3;
154659309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   r->vertices[2][0][1] = y3;
154759309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   r->vertices[2][0][2] = z;
154859309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
154959309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   r->vertices[3][0][0] = x4;
155059309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   r->vertices[3][0][1] = y4;
155159309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   r->vertices[3][0][2] = z;
155259309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
155359309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   /* texcoords */
155459309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   renderer_quad_texcoord(r, x1offset, y1offset,
155559309337e40106f734efc1e33f956f6f1f4301acChia-I Wu         x2offset, y2offset, tex->width0, tex->height0);
155659309337e40106f734efc1e33f956f6f1f4301acChia-I Wu
155759309337e40106f734efc1e33f956f6f1f4301acChia-I Wu   renderer_quad_draw(r);
1558544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
1559544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   cso_restore_vertex_shader(r->cso);
1560544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin}
1561