#define PIPE_STATE_H
#include "p_compiler.h"
+#include "p_format.h"
/**
* Implementation limits
#define PIPE_MAX_COLOR_BUFS 8
#define PIPE_MAX_TEXTURE_LEVELS 16
#define PIPE_MAX_FEEDBACK_ATTRIBS 16
+#define PIPE_MAX_SHADER_INPUTS 16
+#define PIPE_MAX_SHADER_OUTPUTS 16
/* fwd decl */
/* opaque type */
struct pipe_buffer_handle;
+struct pipe_winsys;
+
/***
*** State objects
/**
- * Primitive (point/line/tri) setup info
+ * Primitive (point/line/tri) rasterization info
*/
-struct pipe_setup_state
+struct pipe_rasterizer_state
{
unsigned flatshade:1;
unsigned light_twoside:1;
unsigned poly_smooth:1;
unsigned poly_stipple_enable:1;
unsigned point_smooth:1;
+ unsigned point_sprite:1;
+ unsigned point_size_per_vertex:1; /**< size computed in vertex shader */
unsigned multisample:1; /* XXX maybe more ms state in future */
unsigned line_smooth:1;
unsigned line_stipple_enable:1;
unsigned line_stipple_factor:8; /**< [1..256] actually */
unsigned line_stipple_pattern:16;
+ unsigned bypass_clipping:1;
+ unsigned origin_lower_left:1; /**< Is (0,0) the lower-left corner? */
float line_width;
float point_size; /**< used when no per-vertex size */
float offset_units;
float offset_scale;
-};
-
-
-/**
- * Post-transform vertex feeback
- */
-struct pipe_feedback_state {
- uint enabled:1; /**< enable feedback? */
- uint discard:1; /**< discard primitives? */
- uint interleaved:1; /**< interleaved output? */
- uint num_attribs;
- uint attrib[PIPE_MAX_FEEDBACK_ATTRIBS];
- uint size[PIPE_MAX_FEEDBACK_ATTRIBS];
+ ubyte sprite_coord_mode[PIPE_MAX_SHADER_OUTPUTS]; /**< PIPE_SPRITE_COORD_ */
};
struct pipe_shader_state {
- unsigned inputs_read; /**< TGSI_ATTRIB_ bits */
- unsigned outputs_written; /**< TGSI_ATTRIB_ bits */
const struct tgsi_token *tokens;
- void *executable;
+ ubyte num_inputs;
+ ubyte num_outputs;
+ ubyte input_map[PIPE_MAX_SHADER_INPUTS]; /* XXX this may be temporary */
+ ubyte input_semantic_name[PIPE_MAX_SHADER_INPUTS]; /**< TGSI_SEMANTIC_x */
+ ubyte input_semantic_index[PIPE_MAX_SHADER_INPUTS];
+ ubyte output_semantic_name[PIPE_MAX_SHADER_OUTPUTS]; /**< TGSI_SEMANTIC_x */
+ ubyte output_semantic_index[PIPE_MAX_SHADER_OUTPUTS];
};
-struct pipe_depth_state
+struct pipe_depth_stencil_state
{
- unsigned enabled:1; /**< depth test enabled? */
- unsigned writemask:1; /**< allow depth buffer writes? */
- unsigned func:3; /**< depth test func (PIPE_FUNC_x) */
- unsigned occlusion_count:1; /**< XXX move this elsewhere? */
- float clear; /**< Clear value in [0,1] (XXX correct place?) */
+ struct {
+ unsigned enabled:1; /**< depth test enabled? */
+ unsigned writemask:1; /**< allow depth buffer writes? */
+ unsigned func:3; /**< depth test func (PIPE_FUNC_x) */
+ unsigned occlusion_count:1; /**< XXX move this elsewhere? */
+ } depth;
+ struct {
+ unsigned front_enabled:1;
+ unsigned front_func:3; /**< PIPE_FUNC_x */
+ unsigned front_fail_op:3; /**< PIPE_STENCIL_OP_x */
+ unsigned front_zpass_op:3; /**< PIPE_STENCIL_OP_x */
+ unsigned front_zfail_op:3; /**< PIPE_STENCIL_OP_x */
+ unsigned back_enabled:1;
+ unsigned back_func:3; /**< PIPE_FUNC_x */
+ unsigned back_fail_op:3; /**< PIPE_STENCIL_OP_x */
+ unsigned back_zpass_op:3; /**< PIPE_STENCIL_OP_x */
+ unsigned back_zfail_op:3; /**< PIPE_STENCIL_OP_x */
+ ubyte ref_value[2]; /**< [0] = front, [1] = back */
+ ubyte value_mask[2];
+ ubyte write_mask[2];
+ } stencil;
};
struct pipe_alpha_test_state {
float color[4];
};
-struct pipe_clear_color_state
-{
- float color[4];
-};
-
-struct pipe_stencil_state {
- unsigned front_enabled:1;
- unsigned front_func:3; /**< PIPE_FUNC_x */
- unsigned front_fail_op:3; /**< PIPE_STENCIL_OP_x */
- unsigned front_zpass_op:3; /**< PIPE_STENCIL_OP_x */
- unsigned front_zfail_op:3; /**< PIPE_STENCIL_OP_x */
- unsigned back_enabled:1;
- unsigned back_func:3; /**< PIPE_FUNC_x */
- unsigned back_fail_op:3; /**< PIPE_STENCIL_OP_x */
- unsigned back_zpass_op:3; /**< PIPE_STENCIL_OP_x */
- unsigned back_zfail_op:3; /**< PIPE_STENCIL_OP_x */
- ubyte ref_value[2]; /**< [0] = front, [1] = back */
- ubyte value_mask[2];
- ubyte write_mask[2];
- ubyte clear_value;
-};
-
-
struct pipe_framebuffer_state
{
/** multiple colorbuffers for multiple render targets */
unsigned compare:1; /**< shadow/depth compare enabled? */
unsigned compare_mode:1; /**< PIPE_TEX_COMPARE_x */
unsigned compare_func:3; /**< PIPE_FUNC_x */
+ unsigned normalized_coords:1; /**< Are coords normalized to [0,1]? */
float shadow_ambient; /**< shadow test fail color/intensity */
float min_lod;
float max_lod;
};
-/***
- *** Resource Objects
- ***/
-
-struct pipe_region
-{
- struct pipe_buffer_handle *buffer; /**< driver private buffer handle */
-
- unsigned refcount; /**< Reference count for region */
- unsigned cpp; /**< bytes per pixel */
- unsigned pitch; /**< in pixels */
- unsigned height; /**< in pixels */
- ubyte *map; /**< only non-NULL when region is actually mapped */
- unsigned map_refcount; /**< Reference count for mapping */
-};
-
-
/**
- * 2D surface. This is basically a view into a pipe_region (memory buffer).
+ * 2D surface. This is basically a view into a memory buffer.
* May be a renderbuffer, texture mipmap level, etc.
*/
struct pipe_surface
{
- struct pipe_region *region;
- unsigned format:5; /**< PIPE_FORMAT_x */
+ struct pipe_buffer_handle *buffer; /**< driver private buffer handle */
+ ubyte *map; /**< only non-NULL when surface is actually mapped */
+ unsigned map_refcount; /**< Reference count for mapping */
+ enum pipe_format format; /**< PIPE_FORMAT_x */
+ unsigned cpp; /**< bytes per pixel */
unsigned width, height;
- unsigned offset; /**< offset from start of region, in bytes */
+ unsigned pitch; /**< in pixels */
+ unsigned offset; /**< offset from start of buffer, in bytes */
unsigned refcount;
-
- /** get block/tile of pixels from surface */
- void (*get_tile)(struct pipe_surface *ps,
- unsigned x, unsigned y, unsigned w, unsigned h, float *p);
-
- /** put block/tile of pixels into surface */
- void (*put_tile)(struct pipe_surface *ps,
- unsigned x, unsigned y, unsigned w, unsigned h, const float *p);
+ struct pipe_winsys *winsys; /**< winsys which owns/created the surface */
};
/**
- * Describes the location of each texture image within a texture region.
+ * Texture. Represents one or several texture images on one or several mipmap
+ * levels.
*/
-struct pipe_mipmap_level
-{
- unsigned level_offset;
- unsigned width;
- unsigned height;
- unsigned depth;
- unsigned nr_images;
-
- /* Explicitly store the offset of each image for each cube face or
- * depth value. Pretty much have to accept that hardware formats
- * are going to be so diverse that there is no unified way to
- * compute the offsets of depth/cube images within a mipmap level,
- * so have to store them as a lookup table:
- */
- unsigned *image_offset; /**< array [depth] of offsets */
-};
-
-struct pipe_mipmap_tree
-{
+struct pipe_texture
+{
/* Effectively the key:
*/
- unsigned target; /* XXX convert to PIPE_TEXTURE_x */
- unsigned internal_format; /* XXX convert to PIPE_FORMAT_x */
+ unsigned target; /**< PIPE_TEXTURE_x */
+ enum pipe_format format; /**< PIPE_FORMAT_x */
- unsigned format; /**< PIPE_FORMAT_x */
unsigned first_level;
unsigned last_level;
- unsigned width0, height0, depth0; /**< Level zero image dimensions */
+ unsigned width[PIPE_MAX_TEXTURE_LEVELS];
+ unsigned height[PIPE_MAX_TEXTURE_LEVELS];
+ unsigned depth[PIPE_MAX_TEXTURE_LEVELS];
unsigned cpp;
unsigned compressed:1;
- /* Derived from the above:
- */
- unsigned pitch;
- unsigned depth_pitch; /* per-image on i945? */
- unsigned total_height;
-
- /* Includes image offset tables:
- */
- struct pipe_mipmap_level level[PIPE_MAX_TEXTURE_LEVELS];
-
- /* The data is held here:
- */
- struct pipe_region *region;
-
/* These are also refcounted:
*/
unsigned refcount;
unsigned vertex_buffer_index:5;
unsigned dst_offset:8;
- unsigned src_format:8; /**< PIPE_FORMAT_* */
+ enum pipe_format src_format; /**< PIPE_FORMAT_* */
};