1946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca/**************************************************************************
2946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca *
3877128505431adaf817dc8069172ebe4a1cdf5d8José Fonseca * Copyright 2007 VMware, Inc.
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.
21877128505431adaf817dc8069172ebe4a1cdf5d8José Fonseca * IN NO EVENT SHALL VMWARE 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
28877128505431adaf817dc8069172ebe4a1cdf5d8José Fonseca/* Authors:  Keith Whitwell <keithw@vmware.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"
37ff2d192ec50e6a8cbaa8f14bca989fe5b61a3c46Marek Olšák#include "util/u_blitter.h"
38946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
39946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca#include "lp_tex_sample.h"
40c022e15d1e56ba3a9c6b74eef6556d6063e2e322José Fonseca#include "lp_jit.h"
416ce68ad3ca242076bbb93fdd99bb448f87a31d15José Fonseca#include "lp_setup.h"
4217c9d7eea7b3365c59455a731fcb81e69bb86ce2Roland Scheidegger#include "lp_state_fs.h"
435b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell#include "lp_state_setup.h"
44946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
45946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
46946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonsecastruct llvmpipe_vbuf_render;
47946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonsecastruct draw_context;
48946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonsecastruct draw_stage;
49b995a010e688bc4d4557e973e5e28091c378e881José Fonsecastruct draw_vertex_shader;
50946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonsecastruct lp_fragment_shader;
512d6b39f05edcd575b1e10d53f96a38bec848fa67José Fonsecastruct lp_blend_state;
523160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecastruct lp_setup_context;
535b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwellstruct lp_setup_variant;
54f89730385532056e89e3b9053c244a67f84e323eRoland Scheideggerstruct lp_velems_state;
55946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
56946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonsecastruct llvmpipe_context {
57946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca   struct pipe_context pipe;  /**< base class */
58946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
59946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca   /** Constant state objects */
6097b4681d7e1ccf40d1584436ade7c70fc1893e27José Fonseca   const struct pipe_blend_state *blend;
61b3538d356316b282d6408f710f2df5f06bf315f5Brian Paul   struct pipe_sampler_state *samplers[PIPE_SHADER_TYPES][PIPE_MAX_SAMPLERS];
62b3538d356316b282d6408f710f2df5f06bf315f5Brian Paul
63946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca   const struct pipe_depth_stencil_alpha_state *depth_stencil;
64946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca   const struct pipe_rasterizer_state *rasterizer;
6573af91e938eb27b001404f11195fb06ff9b08903José Fonseca   struct lp_fragment_shader *fs;
66b995a010e688bc4d4557e973e5e28091c378e881José Fonseca   struct draw_vertex_shader *vs;
67a6d9d18faecef9963be3e4b64a21b89889b4670dKeith Whitwell   const struct lp_geometry_shader *gs;
68f89730385532056e89e3b9053c244a67f84e323eRoland Scheidegger   const struct lp_velems_state *velems;
69b5e381d9783f17c9a527ac38122444eac6807566Zack Rusin   const struct lp_so_state *so;
70946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
71946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca   /** Other rendering state */
722d368b982af5e6566c7da7fd2bc8b190af28188bJosé Fonseca   unsigned sample_mask;
73d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca   struct pipe_blend_color blend_color;
746a509ec6dd16f93758a308a0f0eb1b032f099693Roland Scheidegger   struct pipe_stencil_ref stencil_ref;
75946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca   struct pipe_clip_state clip;
763427466e6dbbb8db7c1ecda6b3859ca1cc5827a3Brian Paul   struct pipe_constant_buffer constants[PIPE_SHADER_TYPES][LP_MAX_TGSI_CONST_BUFFERS];
77946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca   struct pipe_framebuffer_state framebuffer;
78946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca   struct pipe_poly_stipple poly_stipple;
7997b8ae429ec64003e258764db12ea69d4e978f6dZack Rusin   struct pipe_scissor_state scissors[PIPE_MAX_VIEWPORTS];
80c789b981b244333cfc903bcd1e2fefc010500013Roland Scheidegger   struct pipe_sampler_view *sampler_views[PIPE_SHADER_TYPES][PIPE_MAX_SHADER_SAMPLER_VIEWS];
81b3538d356316b282d6408f710f2df5f06bf315f5Brian Paul
8297b8ae429ec64003e258764db12ea69d4e978f6dZack Rusin   struct pipe_viewport_state viewports[PIPE_MAX_VIEWPORTS];
83946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca   struct pipe_vertex_buffer vertex_buffer[PIPE_MAX_ATTRIBS];
846d28bf917fb1d741d90fd3f05c22769376021fcaChia-I Wu   struct pipe_index_buffer index_buffer;
85946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
86b3538d356316b282d6408f710f2df5f06bf315f5Brian Paul   unsigned num_samplers[PIPE_SHADER_TYPES];
87b3538d356316b282d6408f710f2df5f06bf315f5Brian Paul   unsigned num_sampler_views[PIPE_SHADER_TYPES];
88b3538d356316b282d6408f710f2df5f06bf315f5Brian Paul
89946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca   unsigned num_vertex_buffers;
90946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
9177b26564c3f0395bf3e744abbf6d0e7aa9d2c8daDave Airlie   struct draw_so_target *so_targets[PIPE_MAX_SO_BUFFERS];
9277b26564c3f0395bf3e744abbf6d0e7aa9d2c8daDave Airlie   int num_so_targets;
9377b26564c3f0395bf3e744abbf6d0e7aa9d2c8daDave Airlie   struct pipe_query_data_so_statistics so_stats;
9477b26564c3f0395bf3e744abbf6d0e7aa9d2c8daDave Airlie
9580ee4a407a2668f6a6a410c3e56ae9910510f773Zack Rusin   struct pipe_query_data_pipeline_statistics pipeline_statistics;
9680ee4a407a2668f6a6a410c3e56ae9910510f773Zack Rusin   unsigned active_statistics_queries;
9780ee4a407a2668f6a6a410c3e56ae9910510f773Zack Rusin
982e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger   unsigned active_occlusion_queries;
99946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
1002e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger   unsigned dirty; /**< Mask of LP_NEW_x flags */
101946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
102946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca   /** Mapped vertex buffers */
103946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca   ubyte *mapped_vbuffer[PIPE_MAX_ATTRIBS];
104946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
105946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca   /** Vertex format */
106946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca   struct vertex_info vertex_info;
10757d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay
1087f0dc5ea1bb330c6589125baf4017c51a14dce8eHui Qi Tay   /** Which vertex shader output slot contains color */
1098e3a76791f208e67392b7b7a2e63eca32945ac7bRoland Scheidegger   int8_t color_slot[2];
1107f0dc5ea1bb330c6589125baf4017c51a14dce8eHui Qi Tay
1117f0dc5ea1bb330c6589125baf4017c51a14dce8eHui Qi Tay   /** Which vertex shader output slot contains bcolor */
1128e3a76791f208e67392b7b7a2e63eca32945ac7bRoland Scheidegger   int8_t bcolor_slot[2];
1137f0dc5ea1bb330c6589125baf4017c51a14dce8eHui Qi Tay
11457d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay   /** Which vertex shader output slot contains point size */
1158e3a76791f208e67392b7b7a2e63eca32945ac7bRoland Scheidegger   int8_t psize_slot;
116946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
11797b8ae429ec64003e258764db12ea69d4e978f6dZack Rusin   /** Which vertex shader output slot contains viewport index */
1188e3a76791f208e67392b7b7a2e63eca32945ac7bRoland Scheidegger   int8_t viewport_index_slot;
11997b8ae429ec64003e258764db12ea69d4e978f6dZack Rusin
120d8146f240e628e70d4c07f7e805a179f70c36e23Roland Scheidegger   /** Which geometry shader output slot contains layer */
1218e3a76791f208e67392b7b7a2e63eca32945ac7bRoland Scheidegger   int8_t layer_slot;
122d8146f240e628e70d4c07f7e805a179f70c36e23Roland Scheidegger
123d6b3a193d4d525c5048ebf793e6a63fd98f92d64Zack Rusin   /** A fake frontface output for unfilled primitives */
1248e3a76791f208e67392b7b7a2e63eca32945ac7bRoland Scheidegger   int8_t face_slot;
125af7ba989fb5a39925a0a1261ed281fe7f48a16cfRoland Scheidegger
126f9e2c24326869542c9b43220f63dd9841c6de38fMatthew McClure   /** Depth format and bias settings. */
127f9e2c24326869542c9b43220f63dd9841c6de38fMatthew McClure   boolean floating_point_depth;
128f9e2c24326869542c9b43220f63dd9841c6de38fMatthew McClure   double mrd;   /**< minimum resolvable depth value, for polygon offset */
129f9e2c24326869542c9b43220f63dd9841c6de38fMatthew McClure
1306b65685def525a8023ee936e82e53af2bc4e38b2Keith Whitwell   /** The tiling engine */
1313160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonseca   struct lp_setup_context *setup;
1325b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell   struct lp_setup_variant setup_variant;
1336b65685def525a8023ee936e82e53af2bc4e38b2Keith Whitwell
134946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca   /** The primitive drawing context */
135946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca   struct draw_context *draw;
13689498d01531cd515c769e570bf799c39fbafc8fbKeith Whitwell
137ff2d192ec50e6a8cbaa8f14bca989fe5b61a3c46Marek Olšák   struct blitter_context *blitter;
138ff2d192ec50e6a8cbaa8f14bca989fe5b61a3c46Marek Olšák
1390f55a95b2faa16cc008143c53a8b82b19c5d750aKeith Whitwell   unsigned tex_timestamp;
1406b65685def525a8023ee936e82e53af2bc4e38b2Keith Whitwell   boolean no_rast;
141c022e15d1e56ba3a9c6b74eef6556d6063e2e322José Fonseca
142efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul   /** List of all fragment shader variants */
14317c9d7eea7b3365c59455a731fcb81e69bb86ce2Roland Scheidegger   struct lp_fs_variant_list_item fs_variants_list;
14417c9d7eea7b3365c59455a731fcb81e69bb86ce2Roland Scheidegger   unsigned nr_fs_variants;
1456cf7245f6938e27c9b8a1742f27659aec017bbdcJosé Fonseca   unsigned nr_fs_instrs;
1465b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell
1475b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell   struct lp_setup_variant_list_item setup_variants_list;
1485b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell   unsigned nr_setup_variants;
149ab14915dce41b26faabba878446b0ec0c8734434Dave Airlie
150ab14915dce41b26faabba878446b0ec0c8734434Dave Airlie   /** Conditional query object and mode */
151ab14915dce41b26faabba878446b0ec0c8734434Dave Airlie   struct pipe_query *render_cond_query;
152ab14915dce41b26faabba878446b0ec0c8734434Dave Airlie   uint render_cond_mode;
153793e8e3d7ed816cc9a066245dde798afdcf8b581Roland Scheidegger   boolean render_cond_cond;
15483c62597fc8eb38bf274fa1a3ca03c6adafb4bf9Mathias Fröhlich
15583c62597fc8eb38bf274fa1a3ca03c6adafb4bf9Mathias Fröhlich   /** The LLVMContext to use for LLVM related work */
15683c62597fc8eb38bf274fa1a3ca03c6adafb4bf9Mathias Fröhlich   LLVMContextRef context;
157946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca};
158946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
159946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
1607f41f5447c8f9113c8956901e1c5fff6081ecd94Keith Whitwellstruct pipe_context *
1610fc21ecfc0891d239f20bf7724e51bc75503570cMarek Olšákllvmpipe_create_context(struct pipe_screen *screen, void *priv,
1620fc21ecfc0891d239f20bf7724e51bc75503570cMarek Olšák                        unsigned flags);
1637f41f5447c8f9113c8956901e1c5fff6081ecd94Keith Whitwell
1640b7d48cbad86eaac21fce3793da41b46db8be3b4Marek Olšákstruct pipe_resource *
1650b7d48cbad86eaac21fce3793da41b46db8be3b4Marek Olšákllvmpipe_user_buffer_create(struct pipe_screen *screen,
1660b7d48cbad86eaac21fce3793da41b46db8be3b4Marek Olšák                            void *ptr,
1670b7d48cbad86eaac21fce3793da41b46db8be3b4Marek Olšák                            unsigned bytes,
1681d28650b551bb516fdff99d0a196c1fa133f6d05Roland Scheidegger                            unsigned bind_flags);
1690b7d48cbad86eaac21fce3793da41b46db8be3b4Marek Olšák
1707f41f5447c8f9113c8956901e1c5fff6081ecd94Keith Whitwell
171a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline struct llvmpipe_context *
172946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonsecallvmpipe_context( struct pipe_context *pipe )
173946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{
174946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca   return (struct llvmpipe_context *)pipe;
175946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca}
176946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
177c9a5930fe45a0a0299769bd2b672ca516d1bf39eJosé Fonseca#endif /* LP_CONTEXT_H */
178946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
179