1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**************************************************************************
2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2007-2009 VMware, Inc.
4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * All Rights Reserved.
5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a
7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the
8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * "Software"), to deal in the Software without restriction, including
9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * without limitation the rights to use, copy, modify, merge, publish,
10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * distribute, sub license, and/or sell copies of the Software, and to
11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * permit persons to whom the Software is furnished to do so, subject to
12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the following conditions:
13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice (including the
15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * next paragraph) shall be included in all copies or substantial portions
16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * of the Software.
17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org **************************************************************************/
27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The setup code is concerned with point/line/triangle setup and
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * putting commands/data into the bins.
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifndef LP_SETUP_CONTEXT_H
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define LP_SETUP_CONTEXT_H
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "lp_setup.h"
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "lp_rast.h"
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "lp_tile_soa.h"        /* for TILE_SIZE */
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "lp_scene.h"
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "lp_bld_interp.h"	/* for struct lp_shader_input */
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "draw/draw_vbuf.h"
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_rect.h"
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define LP_SETUP_NEW_FS          0x01
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define LP_SETUP_NEW_CONSTANTS   0x02
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define LP_SETUP_NEW_BLEND_COLOR 0x04
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define LP_SETUP_NEW_SCISSOR     0x08
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct lp_setup_variant;
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** Max number of scenes */
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define MAX_SCENES 2
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Point/line/triangle setup context.
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Note: "stored" below indicates data which is stored in the bins,
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * not arbitrary malloc'd memory.
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Subclass of vbuf_render, plugged directly into the draw module as
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the rendering backend.
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct lp_setup_context
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct vbuf_render base;
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct pipe_context *pipe;
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct vertex_info *vertex_info;
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint prim;
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint vertex_size;
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint nr_vertices;
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint sprite_coord_enable, sprite_coord_origin;
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint vertex_buffer_size;
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void *vertex_buffer;
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Final pipeline stage for draw module.  Draw module should
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * create/install this itself now.
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct draw_stage *vbuf;
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned num_threads;
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned scene_idx;
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct lp_scene *scenes[MAX_SCENES];  /**< all the scenes */
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct lp_scene *scene;               /**< current scene being built */
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct lp_fence *last_fence;
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct llvmpipe_query *active_query;
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   boolean flatshade_first;
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   boolean ccw_is_frontface;
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   boolean scissor_test;
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   boolean point_size_per_vertex;
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned cullmode;
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   float pixel_offset;
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   float line_width;
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   float point_size;
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   float psize;
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct pipe_framebuffer_state fb;
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct u_rect framebuffer;
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct u_rect scissor;
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct u_rect draw_region;   /* intersection of fb & scissor */
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct {
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      unsigned flags;
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      union lp_rast_cmd_arg color;    /**< lp_rast_clear_color() cmd */
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      unsigned zsmask;
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      unsigned zsvalue;               /**< lp_rast_clear_zstencil() cmd */
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } clear;
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   enum setup_state {
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      SETUP_FLUSHED,    /**< scene is null */
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      SETUP_CLEARED,    /**< scene exists but has only clears */
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      SETUP_ACTIVE      /**< scene exists and has at least one draw/query */
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } state;
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct {
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const struct lp_rast_state *stored; /**< what's in the scene */
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct lp_rast_state current;  /**< currently set state */
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct pipe_resource *current_tex[PIPE_MAX_SAMPLERS];
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } fs;
128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /** fragment shader constants */
130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct {
131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct pipe_resource *current;
132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      unsigned stored_size;
133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const void *stored_data;
134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } constants;
135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct {
137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct pipe_blend_color current;
138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      uint8_t *stored;
139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } blend_color;
140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct {
143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const struct lp_setup_variant *variant;
144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } setup;
145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned dirty;   /**< bitmask of LP_SETUP_NEW_x bits */
147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void (*point)( struct lp_setup_context *,
149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  const float (*v0)[4]);
150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void (*line)( struct lp_setup_context *,
152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                 const float (*v0)[4],
153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                 const float (*v1)[4]);
154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void (*triangle)( struct lp_setup_context *,
156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     const float (*v0)[4],
157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     const float (*v1)[4],
158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     const float (*v2)[4]);
159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid lp_setup_choose_triangle( struct lp_setup_context *setup );
162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid lp_setup_choose_line( struct lp_setup_context *setup );
163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid lp_setup_choose_point( struct lp_setup_context *setup );
164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid lp_setup_init_vbuf(struct lp_setup_context *setup);
166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgboolean lp_setup_update_state( struct lp_setup_context *setup,
168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                            boolean update_scene);
169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid lp_setup_destroy( struct lp_setup_context *setup );
171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgboolean lp_setup_flush_and_restart(struct lp_setup_context *setup);
173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orglp_setup_print_triangle(struct lp_setup_context *setup,
176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                        const float (*v0)[4],
177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                        const float (*v1)[4],
178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                        const float (*v2)[4]);
179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orglp_setup_print_vertex(struct lp_setup_context *setup,
182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                      const char *name,
183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                      const float (*v)[4]);
184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct lp_rast_triangle *
187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orglp_setup_alloc_triangle(struct lp_scene *scene,
188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                        unsigned num_inputs,
189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                        unsigned nr_planes,
190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                        unsigned *tri_size);
191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgboolean
193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orglp_setup_bin_triangle( struct lp_setup_context *setup,
194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                       struct lp_rast_triangle *tri,
195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                       const struct u_rect *bbox,
196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                       int nr_planes );
197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
199