1946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca/**************************************************************************
2946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca *
3946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
4946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * All Rights Reserved.
5946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca *
6946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * Permission is hereby granted, free of charge, to any person obtaining a
7946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * copy of this software and associated documentation files (the
8946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * "Software"), to deal in the Software without restriction, including
9946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * without limitation the rights to use, copy, modify, merge, publish,
10946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * distribute, sub license, and/or sell copies of the Software, and to
11946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * permit persons to whom the Software is furnished to do so, subject to
12946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * the following conditions:
13946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca *
14946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * The above copyright notice and this permission notice (including the
15946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * next paragraph) shall be included in all copies or substantial portions
16946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * of the Software.
17946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca *
18946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
22946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca *
26946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca **************************************************************************/
27946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
28946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca/* Authors:  Keith Whitwell <keith@tungstengraphics.com>
29946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca */
30946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
31c9a5930fe45a0a0299769bd2b672ca516d1bf39eJosé Fonseca#ifndef LP_CONTEXT_H
32c9a5930fe45a0a0299769bd2b672ca516d1bf39eJosé Fonseca#define LP_CONTEXT_H
33946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
34946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca#include "pipe/p_context.h"
35946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
36946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca#include "draw/draw_vertex.h"
37946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
38946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca#include "lp_tex_sample.h"
39c022e15d1e56ba3a9c6b74eef6556d6063e2e322José Fonseca#include "lp_jit.h"
406ce68ad3ca242076bbb93fdd99bb448f87a31d15José Fonseca#include "lp_setup.h"
4117c9d7eea7b3365c59455a731fcb81e69bb86ce2Roland Scheidegger#include "lp_state_fs.h"
425b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell#include "lp_state_setup.h"
43946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
44946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
45946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonsecastruct llvmpipe_vbuf_render;
46946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonsecastruct draw_context;
47946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonsecastruct draw_stage;
48946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonsecastruct lp_fragment_shader;
49946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonsecastruct lp_vertex_shader;
502d6b39f05edcd575b1e10d53f96a38bec848fa67José Fonsecastruct lp_blend_state;
513160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecastruct lp_setup_context;
525b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwellstruct lp_setup_variant;
53f89730385532056e89e3b9053c244a67f84e323eRoland Scheideggerstruct lp_velems_state;
54946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
55946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonsecastruct llvmpipe_context {
56946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca   struct pipe_context pipe;  /**< base class */
57946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
58946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca   /** Constant state objects */
5997b4681d7e1ccf40d1584436ade7c70fc1893e27José Fonseca   const struct pipe_blend_state *blend;
60b3538d356316b282d6408f710f2df5f06bf315f5Brian Paul   struct pipe_sampler_state *samplers[PIPE_SHADER_TYPES][PIPE_MAX_SAMPLERS];
61b3538d356316b282d6408f710f2df5f06bf315f5Brian Paul
62946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca   const struct pipe_depth_stencil_alpha_state *depth_stencil;
63946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca   const struct pipe_rasterizer_state *rasterizer;
6473af91e938eb27b001404f11195fb06ff9b08903José Fonseca   struct lp_fragment_shader *fs;
65946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca   const struct lp_vertex_shader *vs;
66a6d9d18faecef9963be3e4b64a21b89889b4670dKeith Whitwell   const struct lp_geometry_shader *gs;
67f89730385532056e89e3b9053c244a67f84e323eRoland Scheidegger   const struct lp_velems_state *velems;
68b5e381d9783f17c9a527ac38122444eac6807566Zack Rusin   const struct lp_so_state *so;
69946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
70946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca   /** Other rendering state */
71d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca   struct pipe_blend_color blend_color;
726a509ec6dd16f93758a308a0f0eb1b032f099693Roland Scheidegger   struct pipe_stencil_ref stencil_ref;
73946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca   struct pipe_clip_state clip;
74a6d9d18faecef9963be3e4b64a21b89889b4670dKeith Whitwell   struct pipe_resource *constants[PIPE_SHADER_TYPES][PIPE_MAX_CONSTANT_BUFFERS];
75946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca   struct pipe_framebuffer_state framebuffer;
76946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca   struct pipe_poly_stipple poly_stipple;
77946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca   struct pipe_scissor_state scissor;
78b3538d356316b282d6408f710f2df5f06bf315f5Brian Paul   struct pipe_sampler_view *sampler_views[PIPE_SHADER_TYPES][PIPE_MAX_SAMPLERS];
79b3538d356316b282d6408f710f2df5f06bf315f5Brian Paul
80946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca   struct pipe_viewport_state viewport;
81946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca   struct pipe_vertex_buffer vertex_buffer[PIPE_MAX_ATTRIBS];
826d28bf917fb1d741d90fd3f05c22769376021fcaChia-I Wu   struct pipe_index_buffer index_buffer;
83b5e381d9783f17c9a527ac38122444eac6807566Zack Rusin   struct {
84b5e381d9783f17c9a527ac38122444eac6807566Zack Rusin      struct llvmpipe_resource *buffer[PIPE_MAX_SO_BUFFERS];
85b5e381d9783f17c9a527ac38122444eac6807566Zack Rusin      int offset[PIPE_MAX_SO_BUFFERS];
86b5e381d9783f17c9a527ac38122444eac6807566Zack Rusin      int so_count[PIPE_MAX_SO_BUFFERS];
87b5e381d9783f17c9a527ac38122444eac6807566Zack Rusin      int num_buffers;
88b5e381d9783f17c9a527ac38122444eac6807566Zack Rusin   } so_target;
89cab2fed135bc1edf7b65ddca3236020638427061Brian Paul   struct pipe_resource *mapped_vs_tex[PIPE_MAX_SAMPLERS];
90946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
91b3538d356316b282d6408f710f2df5f06bf315f5Brian Paul   unsigned num_samplers[PIPE_SHADER_TYPES];
92b3538d356316b282d6408f710f2df5f06bf315f5Brian Paul   unsigned num_sampler_views[PIPE_SHADER_TYPES];
93b3538d356316b282d6408f710f2df5f06bf315f5Brian Paul
94946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca   unsigned num_vertex_buffers;
95946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
96c9a5930fe45a0a0299769bd2b672ca516d1bf39eJosé Fonseca   unsigned dirty; /**< Mask of LP_NEW_x flags */
97946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
9886afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li   int active_query_count;
99946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
100946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca   /** Mapped vertex buffers */
101946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca   ubyte *mapped_vbuffer[PIPE_MAX_ATTRIBS];
102946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
103946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca   /** Vertex format */
104946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca   struct vertex_info vertex_info;
10557d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay
1067f0dc5ea1bb330c6589125baf4017c51a14dce8eHui Qi Tay   /** Which vertex shader output slot contains color */
107546c5ffa11d70631348e5776df7a4168f07600f6Keith Whitwell   int color_slot[2];
1087f0dc5ea1bb330c6589125baf4017c51a14dce8eHui Qi Tay
1097f0dc5ea1bb330c6589125baf4017c51a14dce8eHui Qi Tay   /** Which vertex shader output slot contains bcolor */
110546c5ffa11d70631348e5776df7a4168f07600f6Keith Whitwell   int bcolor_slot[2];
1117f0dc5ea1bb330c6589125baf4017c51a14dce8eHui Qi Tay
11257d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay   /** Which vertex shader output slot contains point size */
11357d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay   int psize_slot;
114946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
115315f8daab1598a4de709d469a559b5aa09107404Hui Qi Tay   /**< minimum resolvable depth value, for polygon offset */
116315f8daab1598a4de709d469a559b5aa09107404Hui Qi Tay   double mrd;
117315f8daab1598a4de709d469a559b5aa09107404Hui Qi Tay
1186b65685def525a8023ee936e82e53af2bc4e38b2Keith Whitwell   /** The tiling engine */
1193160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonseca   struct lp_setup_context *setup;
1205b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell   struct lp_setup_variant setup_variant;
1216b65685def525a8023ee936e82e53af2bc4e38b2Keith Whitwell
122946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca   /** The primitive drawing context */
123946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca   struct draw_context *draw;
12489498d01531cd515c769e570bf799c39fbafc8fbKeith Whitwell
1250f55a95b2faa16cc008143c53a8b82b19c5d750aKeith Whitwell   unsigned tex_timestamp;
1266b65685def525a8023ee936e82e53af2bc4e38b2Keith Whitwell   boolean no_rast;
127c022e15d1e56ba3a9c6b74eef6556d6063e2e322José Fonseca
128efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul   /** List of all fragment shader variants */
12917c9d7eea7b3365c59455a731fcb81e69bb86ce2Roland Scheidegger   struct lp_fs_variant_list_item fs_variants_list;
13017c9d7eea7b3365c59455a731fcb81e69bb86ce2Roland Scheidegger   unsigned nr_fs_variants;
1316cf7245f6938e27c9b8a1742f27659aec017bbdcJosé Fonseca   unsigned nr_fs_instrs;
1325b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell
1335b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell   struct lp_setup_variant_list_item setup_variants_list;
1345b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell   unsigned nr_setup_variants;
135ab14915dce41b26faabba878446b0ec0c8734434Dave Airlie
136ab14915dce41b26faabba878446b0ec0c8734434Dave Airlie   /** Conditional query object and mode */
137ab14915dce41b26faabba878446b0ec0c8734434Dave Airlie   struct pipe_query *render_cond_query;
138ab14915dce41b26faabba878446b0ec0c8734434Dave Airlie   uint render_cond_mode;
139946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca};
140946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
141946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
142efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul/**
143efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul * Fragment and setup variant count, used to trigger garbage collection.
144efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul * This is global since all variants in all contexts will be free when
145efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul * we do garbage collection.
146efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul */
147efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paulextern unsigned llvmpipe_variant_count;
148efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul
149efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul
1507f41f5447c8f9113c8956901e1c5fff6081ecd94Keith Whitwellstruct pipe_context *
1517f41f5447c8f9113c8956901e1c5fff6081ecd94Keith Whitwellllvmpipe_create_context( struct pipe_screen *screen, void *priv );
1527f41f5447c8f9113c8956901e1c5fff6081ecd94Keith Whitwell
1530b7d48cbad86eaac21fce3793da41b46db8be3b4Marek Olšákstruct pipe_resource *
1540b7d48cbad86eaac21fce3793da41b46db8be3b4Marek Olšákllvmpipe_user_buffer_create(struct pipe_screen *screen,
1550b7d48cbad86eaac21fce3793da41b46db8be3b4Marek Olšák                            void *ptr,
1560b7d48cbad86eaac21fce3793da41b46db8be3b4Marek Olšák                            unsigned bytes,
1570b7d48cbad86eaac21fce3793da41b46db8be3b4Marek Olšák			    unsigned bind_flags);
1580b7d48cbad86eaac21fce3793da41b46db8be3b4Marek Olšák
1597f41f5447c8f9113c8956901e1c5fff6081ecd94Keith Whitwell
160946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonsecastatic INLINE struct llvmpipe_context *
161946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonsecallvmpipe_context( struct pipe_context *pipe )
162946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{
163946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca   return (struct llvmpipe_context *)pipe;
164946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca}
165946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
166c9a5930fe45a0a0299769bd2b672ca516d1bf39eJosé Fonseca#endif /* LP_CONTEXT_H */
167946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
168