Revert DOS line endings.
This commit is contained in:
parent
77ce568ff7
commit
253066d716
|
@ -1,341 +1,341 @@
|
|||
/**************************************************************************
|
||||
*
|
||||
* Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas.
|
||||
* All Rights Reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the
|
||||
* "Software"), to deal in the Software without restriction, including
|
||||
* without limitation the rights to use, copy, modify, merge, publish,
|
||||
* distribute, sub license, and/or sell copies of the Software, and to
|
||||
* permit persons to whom the Software is furnished to do so, subject to
|
||||
* the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice (including the
|
||||
* next paragraph) shall be included in all copies or substantial portions
|
||||
* of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
|
||||
* IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
|
||||
* ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
**************************************************************************/
|
||||
|
||||
#ifndef I915_CONTEXT_H
|
||||
#define I915_CONTEXT_H
|
||||
|
||||
|
||||
#include "pipe/p_context.h"
|
||||
#include "pipe/p_defines.h"
|
||||
#include "pipe/p_state.h"
|
||||
|
||||
#include "draw/draw_vertex.h"
|
||||
|
||||
#include "tgsi/util/tgsi_scan.h"
|
||||
|
||||
|
||||
#define I915_TEX_UNITS 8
|
||||
|
||||
#define I915_DYNAMIC_MODES4 0
|
||||
#define I915_DYNAMIC_DEPTHSCALE_0 1 /* just the header */
|
||||
#define I915_DYNAMIC_DEPTHSCALE_1 2
|
||||
#define I915_DYNAMIC_IAB 3
|
||||
#define I915_DYNAMIC_BC_0 4 /* just the header */
|
||||
#define I915_DYNAMIC_BC_1 5
|
||||
#define I915_DYNAMIC_BFO_0 6
|
||||
#define I915_DYNAMIC_BFO_1 7
|
||||
#define I915_DYNAMIC_STP_0 8
|
||||
#define I915_DYNAMIC_STP_1 9
|
||||
#define I915_DYNAMIC_SC_ENA_0 10
|
||||
#define I915_DYNAMIC_SC_RECT_0 11
|
||||
#define I915_DYNAMIC_SC_RECT_1 12
|
||||
#define I915_DYNAMIC_SC_RECT_2 13
|
||||
#define I915_MAX_DYNAMIC 14
|
||||
|
||||
|
||||
#define I915_IMMEDIATE_S0 0
|
||||
#define I915_IMMEDIATE_S1 1
|
||||
#define I915_IMMEDIATE_S2 2
|
||||
#define I915_IMMEDIATE_S3 3
|
||||
#define I915_IMMEDIATE_S4 4
|
||||
#define I915_IMMEDIATE_S5 5
|
||||
#define I915_IMMEDIATE_S6 6
|
||||
#define I915_IMMEDIATE_S7 7
|
||||
#define I915_MAX_IMMEDIATE 8
|
||||
|
||||
/* These must mach the order of LI0_STATE_* bits, as they will be used
|
||||
* to generate hardware packets:
|
||||
*/
|
||||
#define I915_CACHE_STATIC 0
|
||||
#define I915_CACHE_DYNAMIC 1 /* handled specially */
|
||||
#define I915_CACHE_SAMPLER 2
|
||||
#define I915_CACHE_MAP 3
|
||||
#define I915_CACHE_PROGRAM 4
|
||||
#define I915_CACHE_CONSTANTS 5
|
||||
#define I915_MAX_CACHE 6
|
||||
|
||||
#define I915_MAX_CONSTANT 32
|
||||
|
||||
|
||||
/** See constant_flags[] below */
|
||||
#define I915_CONSTFLAG_USER 0x1f
|
||||
|
||||
|
||||
/**
|
||||
* Subclass of pipe_shader_state
|
||||
*/
|
||||
struct i915_fragment_shader
|
||||
{
|
||||
struct pipe_shader_state state;
|
||||
|
||||
struct tgsi_shader_info info;
|
||||
|
||||
uint *program;
|
||||
uint program_len;
|
||||
|
||||
/**
|
||||
* constants introduced during translation.
|
||||
* These are placed at the end of the constant buffer and grow toward
|
||||
* the beginning (eg: slot 31, 30 29, ...)
|
||||
* User-provided constants start at 0.
|
||||
* This allows both types of constants to co-exist (until there's too many)
|
||||
* and doesn't require regenerating/changing the fragment program to
|
||||
* shuffle constants around.
|
||||
*/
|
||||
uint num_constants;
|
||||
float constants[I915_MAX_CONSTANT][4];
|
||||
|
||||
/**
|
||||
* Status of each constant
|
||||
* if I915_CONSTFLAG_PARAM, the value must be taken from the corresponding
|
||||
* slot of the user's constant buffer. (set by pipe->set_constant_buffer())
|
||||
* Else, the bitmask indicates which components are occupied by immediates.
|
||||
*/
|
||||
ubyte constant_flags[I915_MAX_CONSTANT];
|
||||
};
|
||||
|
||||
|
||||
struct i915_cache_context;
|
||||
|
||||
/* Use to calculate differences between state emitted to hardware and
|
||||
* current driver-calculated state.
|
||||
*/
|
||||
struct i915_state
|
||||
{
|
||||
unsigned immediate[I915_MAX_IMMEDIATE];
|
||||
unsigned dynamic[I915_MAX_DYNAMIC];
|
||||
|
||||
float constants[PIPE_SHADER_TYPES][I915_MAX_CONSTANT][4];
|
||||
/** number of constants passed in through a constant buffer */
|
||||
uint num_user_constants[PIPE_SHADER_TYPES];
|
||||
|
||||
/* texture sampler state */
|
||||
unsigned sampler[I915_TEX_UNITS][3];
|
||||
unsigned sampler_enable_flags;
|
||||
unsigned sampler_enable_nr;
|
||||
|
||||
/* texture image buffers */
|
||||
unsigned texbuffer[I915_TEX_UNITS][2];
|
||||
|
||||
/** Describes the current hardware vertex layout */
|
||||
struct vertex_info vertex_info;
|
||||
|
||||
unsigned id; /* track lost context events */
|
||||
};
|
||||
|
||||
struct i915_blend_state {
|
||||
unsigned iab;
|
||||
unsigned modes4;
|
||||
unsigned LIS5;
|
||||
unsigned LIS6;
|
||||
};
|
||||
|
||||
struct i915_depth_stencil_state {
|
||||
unsigned stencil_modes4;
|
||||
unsigned bfo[2];
|
||||
unsigned stencil_LIS5;
|
||||
unsigned depth_LIS6;
|
||||
};
|
||||
|
||||
struct i915_rasterizer_state {
|
||||
int light_twoside : 1;
|
||||
unsigned st;
|
||||
enum interp_mode color_interp;
|
||||
|
||||
unsigned LIS4;
|
||||
unsigned LIS7;
|
||||
unsigned sc[1];
|
||||
|
||||
const struct pipe_rasterizer_state *templ;
|
||||
|
||||
union { float f; unsigned u; } ds[2];
|
||||
};
|
||||
|
||||
struct i915_sampler_state {
|
||||
unsigned state[3];
|
||||
const struct pipe_sampler_state *templ;
|
||||
};
|
||||
|
||||
|
||||
struct i915_texture {
|
||||
struct pipe_texture base;
|
||||
|
||||
/* Derived from the above:
|
||||
*/
|
||||
unsigned pitch;
|
||||
unsigned depth_pitch; /* per-image on i945? */
|
||||
unsigned total_height;
|
||||
|
||||
unsigned nr_images[PIPE_MAX_TEXTURE_LEVELS];
|
||||
|
||||
/* 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[PIPE_MAX_TEXTURE_LEVELS]; /**< array [depth] of offsets */
|
||||
|
||||
/* Includes image offset tables:
|
||||
*/
|
||||
unsigned level_offset[PIPE_MAX_TEXTURE_LEVELS];
|
||||
|
||||
/* The data is held here:
|
||||
*/
|
||||
struct pipe_buffer *buffer;
|
||||
};
|
||||
|
||||
struct i915_context
|
||||
{
|
||||
struct pipe_context pipe;
|
||||
struct i915_winsys *winsys;
|
||||
struct draw_context *draw;
|
||||
|
||||
/* The most recent drawing state as set by the driver:
|
||||
*/
|
||||
const struct i915_blend_state *blend;
|
||||
const struct i915_sampler_state *sampler[PIPE_MAX_SAMPLERS];
|
||||
const struct i915_depth_stencil_state *depth_stencil;
|
||||
const struct i915_rasterizer_state *rasterizer;
|
||||
|
||||
struct i915_fragment_shader *fs;
|
||||
|
||||
struct pipe_blend_color blend_color;
|
||||
struct pipe_clip_state clip;
|
||||
struct pipe_constant_buffer constants[PIPE_SHADER_TYPES];
|
||||
struct pipe_framebuffer_state framebuffer;
|
||||
struct pipe_poly_stipple poly_stipple;
|
||||
struct pipe_scissor_state scissor;
|
||||
struct i915_texture *texture[PIPE_MAX_SAMPLERS];
|
||||
struct pipe_viewport_state viewport;
|
||||
struct pipe_vertex_buffer vertex_buffer[PIPE_MAX_ATTRIBS];
|
||||
|
||||
unsigned dirty;
|
||||
|
||||
unsigned num_samplers;
|
||||
unsigned num_textures;
|
||||
unsigned num_vertex_elements;
|
||||
unsigned num_vertex_buffers;
|
||||
|
||||
unsigned *batch_start;
|
||||
|
||||
/** Vertex buffer */
|
||||
struct pipe_buffer *vbo;
|
||||
|
||||
struct i915_state current;
|
||||
unsigned hardware_dirty;
|
||||
|
||||
unsigned debug;
|
||||
};
|
||||
|
||||
/* A flag for each state_tracker state object:
|
||||
*/
|
||||
#define I915_NEW_VIEWPORT 0x1
|
||||
#define I915_NEW_RASTERIZER 0x2
|
||||
#define I915_NEW_FS 0x4
|
||||
#define I915_NEW_BLEND 0x8
|
||||
#define I915_NEW_CLIP 0x10
|
||||
#define I915_NEW_SCISSOR 0x20
|
||||
#define I915_NEW_STIPPLE 0x40
|
||||
#define I915_NEW_FRAMEBUFFER 0x80
|
||||
#define I915_NEW_ALPHA_TEST 0x100
|
||||
#define I915_NEW_DEPTH_STENCIL 0x200
|
||||
#define I915_NEW_SAMPLER 0x400
|
||||
#define I915_NEW_TEXTURE 0x800
|
||||
#define I915_NEW_CONSTANTS 0x1000
|
||||
#define I915_NEW_VBO 0x2000
|
||||
#define I915_NEW_VS 0x4000
|
||||
|
||||
|
||||
/* Driver's internally generated state flags:
|
||||
*/
|
||||
#define I915_NEW_VERTEX_FORMAT 0x10000
|
||||
|
||||
|
||||
/* Dirty flags for hardware emit
|
||||
*/
|
||||
#define I915_HW_STATIC (1<<I915_CACHE_STATIC)
|
||||
#define I915_HW_DYNAMIC (1<<I915_CACHE_DYNAMIC)
|
||||
#define I915_HW_SAMPLER (1<<I915_CACHE_SAMPLER)
|
||||
#define I915_HW_MAP (1<<I915_CACHE_MAP)
|
||||
#define I915_HW_PROGRAM (1<<I915_CACHE_PROGRAM)
|
||||
#define I915_HW_CONSTANTS (1<<I915_CACHE_CONSTANTS)
|
||||
#define I915_HW_IMMEDIATE (1<<(I915_MAX_CACHE+0))
|
||||
#define I915_HW_INVARIENT (1<<(I915_MAX_CACHE+1))
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
* i915_prim_emit.c:
|
||||
*/
|
||||
struct draw_stage *i915_draw_render_stage( struct i915_context *i915 );
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
* i915_prim_vbuf.c:
|
||||
*/
|
||||
struct draw_stage *i915_draw_vbuf_stage( struct i915_context *i915 );
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
* i915_state_emit.c:
|
||||
*/
|
||||
void i915_emit_hardware_state(struct i915_context *i915 );
|
||||
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
* i915_clear.c:
|
||||
*/
|
||||
void i915_clear(struct pipe_context *pipe, struct pipe_surface *ps,
|
||||
unsigned clearValue);
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
* i915_surface.c:
|
||||
*/
|
||||
void i915_init_surface_functions( struct i915_context *i915 );
|
||||
|
||||
void i915_init_state_functions( struct i915_context *i915 );
|
||||
void i915_init_flush_functions( struct i915_context *i915 );
|
||||
void i915_init_string_functions( struct i915_context *i915 );
|
||||
|
||||
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
* Inline conversion functions. These are better-typed than the
|
||||
* macros used previously:
|
||||
*/
|
||||
static INLINE struct i915_context *
|
||||
i915_context( struct pipe_context *pipe )
|
||||
{
|
||||
return (struct i915_context *)pipe;
|
||||
}
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
/**************************************************************************
|
||||
*
|
||||
* Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas.
|
||||
* All Rights Reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the
|
||||
* "Software"), to deal in the Software without restriction, including
|
||||
* without limitation the rights to use, copy, modify, merge, publish,
|
||||
* distribute, sub license, and/or sell copies of the Software, and to
|
||||
* permit persons to whom the Software is furnished to do so, subject to
|
||||
* the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice (including the
|
||||
* next paragraph) shall be included in all copies or substantial portions
|
||||
* of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
|
||||
* IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
|
||||
* ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
**************************************************************************/
|
||||
|
||||
#ifndef I915_CONTEXT_H
|
||||
#define I915_CONTEXT_H
|
||||
|
||||
|
||||
#include "pipe/p_context.h"
|
||||
#include "pipe/p_defines.h"
|
||||
#include "pipe/p_state.h"
|
||||
|
||||
#include "draw/draw_vertex.h"
|
||||
|
||||
#include "tgsi/util/tgsi_scan.h"
|
||||
|
||||
|
||||
#define I915_TEX_UNITS 8
|
||||
|
||||
#define I915_DYNAMIC_MODES4 0
|
||||
#define I915_DYNAMIC_DEPTHSCALE_0 1 /* just the header */
|
||||
#define I915_DYNAMIC_DEPTHSCALE_1 2
|
||||
#define I915_DYNAMIC_IAB 3
|
||||
#define I915_DYNAMIC_BC_0 4 /* just the header */
|
||||
#define I915_DYNAMIC_BC_1 5
|
||||
#define I915_DYNAMIC_BFO_0 6
|
||||
#define I915_DYNAMIC_BFO_1 7
|
||||
#define I915_DYNAMIC_STP_0 8
|
||||
#define I915_DYNAMIC_STP_1 9
|
||||
#define I915_DYNAMIC_SC_ENA_0 10
|
||||
#define I915_DYNAMIC_SC_RECT_0 11
|
||||
#define I915_DYNAMIC_SC_RECT_1 12
|
||||
#define I915_DYNAMIC_SC_RECT_2 13
|
||||
#define I915_MAX_DYNAMIC 14
|
||||
|
||||
|
||||
#define I915_IMMEDIATE_S0 0
|
||||
#define I915_IMMEDIATE_S1 1
|
||||
#define I915_IMMEDIATE_S2 2
|
||||
#define I915_IMMEDIATE_S3 3
|
||||
#define I915_IMMEDIATE_S4 4
|
||||
#define I915_IMMEDIATE_S5 5
|
||||
#define I915_IMMEDIATE_S6 6
|
||||
#define I915_IMMEDIATE_S7 7
|
||||
#define I915_MAX_IMMEDIATE 8
|
||||
|
||||
/* These must mach the order of LI0_STATE_* bits, as they will be used
|
||||
* to generate hardware packets:
|
||||
*/
|
||||
#define I915_CACHE_STATIC 0
|
||||
#define I915_CACHE_DYNAMIC 1 /* handled specially */
|
||||
#define I915_CACHE_SAMPLER 2
|
||||
#define I915_CACHE_MAP 3
|
||||
#define I915_CACHE_PROGRAM 4
|
||||
#define I915_CACHE_CONSTANTS 5
|
||||
#define I915_MAX_CACHE 6
|
||||
|
||||
#define I915_MAX_CONSTANT 32
|
||||
|
||||
|
||||
/** See constant_flags[] below */
|
||||
#define I915_CONSTFLAG_USER 0x1f
|
||||
|
||||
|
||||
/**
|
||||
* Subclass of pipe_shader_state
|
||||
*/
|
||||
struct i915_fragment_shader
|
||||
{
|
||||
struct pipe_shader_state state;
|
||||
|
||||
struct tgsi_shader_info info;
|
||||
|
||||
uint *program;
|
||||
uint program_len;
|
||||
|
||||
/**
|
||||
* constants introduced during translation.
|
||||
* These are placed at the end of the constant buffer and grow toward
|
||||
* the beginning (eg: slot 31, 30 29, ...)
|
||||
* User-provided constants start at 0.
|
||||
* This allows both types of constants to co-exist (until there's too many)
|
||||
* and doesn't require regenerating/changing the fragment program to
|
||||
* shuffle constants around.
|
||||
*/
|
||||
uint num_constants;
|
||||
float constants[I915_MAX_CONSTANT][4];
|
||||
|
||||
/**
|
||||
* Status of each constant
|
||||
* if I915_CONSTFLAG_PARAM, the value must be taken from the corresponding
|
||||
* slot of the user's constant buffer. (set by pipe->set_constant_buffer())
|
||||
* Else, the bitmask indicates which components are occupied by immediates.
|
||||
*/
|
||||
ubyte constant_flags[I915_MAX_CONSTANT];
|
||||
};
|
||||
|
||||
|
||||
struct i915_cache_context;
|
||||
|
||||
/* Use to calculate differences between state emitted to hardware and
|
||||
* current driver-calculated state.
|
||||
*/
|
||||
struct i915_state
|
||||
{
|
||||
unsigned immediate[I915_MAX_IMMEDIATE];
|
||||
unsigned dynamic[I915_MAX_DYNAMIC];
|
||||
|
||||
float constants[PIPE_SHADER_TYPES][I915_MAX_CONSTANT][4];
|
||||
/** number of constants passed in through a constant buffer */
|
||||
uint num_user_constants[PIPE_SHADER_TYPES];
|
||||
|
||||
/* texture sampler state */
|
||||
unsigned sampler[I915_TEX_UNITS][3];
|
||||
unsigned sampler_enable_flags;
|
||||
unsigned sampler_enable_nr;
|
||||
|
||||
/* texture image buffers */
|
||||
unsigned texbuffer[I915_TEX_UNITS][2];
|
||||
|
||||
/** Describes the current hardware vertex layout */
|
||||
struct vertex_info vertex_info;
|
||||
|
||||
unsigned id; /* track lost context events */
|
||||
};
|
||||
|
||||
struct i915_blend_state {
|
||||
unsigned iab;
|
||||
unsigned modes4;
|
||||
unsigned LIS5;
|
||||
unsigned LIS6;
|
||||
};
|
||||
|
||||
struct i915_depth_stencil_state {
|
||||
unsigned stencil_modes4;
|
||||
unsigned bfo[2];
|
||||
unsigned stencil_LIS5;
|
||||
unsigned depth_LIS6;
|
||||
};
|
||||
|
||||
struct i915_rasterizer_state {
|
||||
int light_twoside : 1;
|
||||
unsigned st;
|
||||
enum interp_mode color_interp;
|
||||
|
||||
unsigned LIS4;
|
||||
unsigned LIS7;
|
||||
unsigned sc[1];
|
||||
|
||||
const struct pipe_rasterizer_state *templ;
|
||||
|
||||
union { float f; unsigned u; } ds[2];
|
||||
};
|
||||
|
||||
struct i915_sampler_state {
|
||||
unsigned state[3];
|
||||
const struct pipe_sampler_state *templ;
|
||||
};
|
||||
|
||||
|
||||
struct i915_texture {
|
||||
struct pipe_texture base;
|
||||
|
||||
/* Derived from the above:
|
||||
*/
|
||||
unsigned pitch;
|
||||
unsigned depth_pitch; /* per-image on i945? */
|
||||
unsigned total_height;
|
||||
|
||||
unsigned nr_images[PIPE_MAX_TEXTURE_LEVELS];
|
||||
|
||||
/* 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[PIPE_MAX_TEXTURE_LEVELS]; /**< array [depth] of offsets */
|
||||
|
||||
/* Includes image offset tables:
|
||||
*/
|
||||
unsigned level_offset[PIPE_MAX_TEXTURE_LEVELS];
|
||||
|
||||
/* The data is held here:
|
||||
*/
|
||||
struct pipe_buffer *buffer;
|
||||
};
|
||||
|
||||
struct i915_context
|
||||
{
|
||||
struct pipe_context pipe;
|
||||
struct i915_winsys *winsys;
|
||||
struct draw_context *draw;
|
||||
|
||||
/* The most recent drawing state as set by the driver:
|
||||
*/
|
||||
const struct i915_blend_state *blend;
|
||||
const struct i915_sampler_state *sampler[PIPE_MAX_SAMPLERS];
|
||||
const struct i915_depth_stencil_state *depth_stencil;
|
||||
const struct i915_rasterizer_state *rasterizer;
|
||||
|
||||
struct i915_fragment_shader *fs;
|
||||
|
||||
struct pipe_blend_color blend_color;
|
||||
struct pipe_clip_state clip;
|
||||
struct pipe_constant_buffer constants[PIPE_SHADER_TYPES];
|
||||
struct pipe_framebuffer_state framebuffer;
|
||||
struct pipe_poly_stipple poly_stipple;
|
||||
struct pipe_scissor_state scissor;
|
||||
struct i915_texture *texture[PIPE_MAX_SAMPLERS];
|
||||
struct pipe_viewport_state viewport;
|
||||
struct pipe_vertex_buffer vertex_buffer[PIPE_MAX_ATTRIBS];
|
||||
|
||||
unsigned dirty;
|
||||
|
||||
unsigned num_samplers;
|
||||
unsigned num_textures;
|
||||
unsigned num_vertex_elements;
|
||||
unsigned num_vertex_buffers;
|
||||
|
||||
unsigned *batch_start;
|
||||
|
||||
/** Vertex buffer */
|
||||
struct pipe_buffer *vbo;
|
||||
|
||||
struct i915_state current;
|
||||
unsigned hardware_dirty;
|
||||
|
||||
unsigned debug;
|
||||
};
|
||||
|
||||
/* A flag for each state_tracker state object:
|
||||
*/
|
||||
#define I915_NEW_VIEWPORT 0x1
|
||||
#define I915_NEW_RASTERIZER 0x2
|
||||
#define I915_NEW_FS 0x4
|
||||
#define I915_NEW_BLEND 0x8
|
||||
#define I915_NEW_CLIP 0x10
|
||||
#define I915_NEW_SCISSOR 0x20
|
||||
#define I915_NEW_STIPPLE 0x40
|
||||
#define I915_NEW_FRAMEBUFFER 0x80
|
||||
#define I915_NEW_ALPHA_TEST 0x100
|
||||
#define I915_NEW_DEPTH_STENCIL 0x200
|
||||
#define I915_NEW_SAMPLER 0x400
|
||||
#define I915_NEW_TEXTURE 0x800
|
||||
#define I915_NEW_CONSTANTS 0x1000
|
||||
#define I915_NEW_VBO 0x2000
|
||||
#define I915_NEW_VS 0x4000
|
||||
|
||||
|
||||
/* Driver's internally generated state flags:
|
||||
*/
|
||||
#define I915_NEW_VERTEX_FORMAT 0x10000
|
||||
|
||||
|
||||
/* Dirty flags for hardware emit
|
||||
*/
|
||||
#define I915_HW_STATIC (1<<I915_CACHE_STATIC)
|
||||
#define I915_HW_DYNAMIC (1<<I915_CACHE_DYNAMIC)
|
||||
#define I915_HW_SAMPLER (1<<I915_CACHE_SAMPLER)
|
||||
#define I915_HW_MAP (1<<I915_CACHE_MAP)
|
||||
#define I915_HW_PROGRAM (1<<I915_CACHE_PROGRAM)
|
||||
#define I915_HW_CONSTANTS (1<<I915_CACHE_CONSTANTS)
|
||||
#define I915_HW_IMMEDIATE (1<<(I915_MAX_CACHE+0))
|
||||
#define I915_HW_INVARIENT (1<<(I915_MAX_CACHE+1))
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
* i915_prim_emit.c:
|
||||
*/
|
||||
struct draw_stage *i915_draw_render_stage( struct i915_context *i915 );
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
* i915_prim_vbuf.c:
|
||||
*/
|
||||
struct draw_stage *i915_draw_vbuf_stage( struct i915_context *i915 );
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
* i915_state_emit.c:
|
||||
*/
|
||||
void i915_emit_hardware_state(struct i915_context *i915 );
|
||||
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
* i915_clear.c:
|
||||
*/
|
||||
void i915_clear(struct pipe_context *pipe, struct pipe_surface *ps,
|
||||
unsigned clearValue);
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
* i915_surface.c:
|
||||
*/
|
||||
void i915_init_surface_functions( struct i915_context *i915 );
|
||||
|
||||
void i915_init_state_functions( struct i915_context *i915 );
|
||||
void i915_init_flush_functions( struct i915_context *i915 );
|
||||
void i915_init_string_functions( struct i915_context *i915 );
|
||||
|
||||
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
* Inline conversion functions. These are better-typed than the
|
||||
* macros used previously:
|
||||
*/
|
||||
static INLINE struct i915_context *
|
||||
i915_context( struct pipe_context *pipe )
|
||||
{
|
||||
return (struct i915_context *)pipe;
|
||||
}
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,469 +1,469 @@
|
|||
/**************************************************************************
|
||||
*
|
||||
* Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
|
||||
* All Rights Reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the
|
||||
* "Software"), to deal in the Software without restriction, including
|
||||
* without limitation the rights to use, copy, modify, merge, publish,
|
||||
* distribute, sub license, and/or sell copies of the Software, and to
|
||||
* permit persons to whom the Software is furnished to do so, subject to
|
||||
* the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice (including the
|
||||
* next paragraph) shall be included in all copies or substantial portions
|
||||
* of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
|
||||
* IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
|
||||
* ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
**************************************************************************/
|
||||
|
||||
/* Authors: Zack Rusin <zack@tungstengraphics.com>
|
||||
* Keith Whitwell <keith@tungstengraphics.com>
|
||||
*/
|
||||
|
||||
|
||||
#include "pipe/p_winsys.h"
|
||||
#include "pipe/p_util.h"
|
||||
#include "pipe/p_inlines.h"
|
||||
#include "pipe/p_shader_tokens.h"
|
||||
#include "tgsi/util/tgsi_dump.h"
|
||||
#include "tgsi/util/tgsi_parse.h"
|
||||
|
||||
#include "brw_context.h"
|
||||
#include "brw_defines.h"
|
||||
#include "brw_state.h"
|
||||
#include "brw_draw.h"
|
||||
|
||||
|
||||
#define DUP( TYPE, VAL ) \
|
||||
do { \
|
||||
struct TYPE *x = malloc(sizeof(*x)); \
|
||||
memcpy(x, VAL, sizeof(*x) ); \
|
||||
return x; \
|
||||
} while (0)
|
||||
|
||||
/************************************************************************
|
||||
* Blend
|
||||
*/
|
||||
static void *
|
||||
brw_create_blend_state(struct pipe_context *pipe,
|
||||
const struct pipe_blend_state *blend)
|
||||
{
|
||||
DUP( pipe_blend_state, blend );
|
||||
}
|
||||
|
||||
static void brw_bind_blend_state(struct pipe_context *pipe,
|
||||
void *blend)
|
||||
{
|
||||
struct brw_context *brw = brw_context(pipe);
|
||||
|
||||
brw->attribs.Blend = (struct pipe_blend_state*)blend;
|
||||
brw->state.dirty.brw |= BRW_NEW_BLEND;
|
||||
}
|
||||
|
||||
|
||||
static void brw_delete_blend_state(struct pipe_context *pipe, void *blend)
|
||||
{
|
||||
free(blend);
|
||||
}
|
||||
|
||||
static void brw_set_blend_color( struct pipe_context *pipe,
|
||||
const struct pipe_blend_color *blend_color )
|
||||
{
|
||||
struct brw_context *brw = brw_context(pipe);
|
||||
|
||||
brw->attribs.BlendColor = *blend_color;
|
||||
|
||||
brw->state.dirty.brw |= BRW_NEW_BLEND;
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
* Sampler
|
||||
*/
|
||||
|
||||
static void *
|
||||
brw_create_sampler_state(struct pipe_context *pipe,
|
||||
const struct pipe_sampler_state *sampler)
|
||||
{
|
||||
DUP( pipe_sampler_state, sampler );
|
||||
}
|
||||
|
||||
static void brw_bind_sampler_states(struct pipe_context *pipe,
|
||||
unsigned num, void **sampler)
|
||||
{
|
||||
struct brw_context *brw = brw_context(pipe);
|
||||
|
||||
assert(num <= PIPE_MAX_SAMPLERS);
|
||||
|
||||
/* Check for no-op */
|
||||
if (num == brw->num_samplers &&
|
||||
!memcmp(brw->attribs.Samplers, sampler, num * sizeof(void *)))
|
||||
return;
|
||||
|
||||
memcpy(brw->attribs.Samplers, sampler, num * sizeof(void *));
|
||||
memset(&brw->attribs.Samplers[num], 0, (PIPE_MAX_SAMPLERS - num) *
|
||||
sizeof(void *));
|
||||
|
||||
brw->num_samplers = num;
|
||||
|
||||
brw->state.dirty.brw |= BRW_NEW_SAMPLER;
|
||||
}
|
||||
|
||||
static void brw_delete_sampler_state(struct pipe_context *pipe,
|
||||
void *sampler)
|
||||
{
|
||||
free(sampler);
|
||||
}
|
||||
|
||||
|
||||
/************************************************************************
|
||||
* Depth stencil
|
||||
*/
|
||||
|
||||
static void *
|
||||
brw_create_depth_stencil_state(struct pipe_context *pipe,
|
||||
const struct pipe_depth_stencil_alpha_state *depth_stencil)
|
||||
{
|
||||
DUP( pipe_depth_stencil_alpha_state, depth_stencil );
|
||||
}
|
||||
|
||||
static void brw_bind_depth_stencil_state(struct pipe_context *pipe,
|
||||
void *depth_stencil)
|
||||
{
|
||||
struct brw_context *brw = brw_context(pipe);
|
||||
|
||||
brw->attribs.DepthStencil = (const struct pipe_depth_stencil_alpha_state *)depth_stencil;
|
||||
|
||||
brw->state.dirty.brw |= BRW_NEW_DEPTH_STENCIL;
|
||||
}
|
||||
|
||||
static void brw_delete_depth_stencil_state(struct pipe_context *pipe,
|
||||
void *depth_stencil)
|
||||
{
|
||||
free(depth_stencil);
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
* Scissor
|
||||
*/
|
||||
static void brw_set_scissor_state( struct pipe_context *pipe,
|
||||
const struct pipe_scissor_state *scissor )
|
||||
{
|
||||
struct brw_context *brw = brw_context(pipe);
|
||||
|
||||
memcpy( &brw->attribs.Scissor, scissor, sizeof(*scissor) );
|
||||
brw->state.dirty.brw |= BRW_NEW_SCISSOR;
|
||||
}
|
||||
|
||||
|
||||
/************************************************************************
|
||||
* Stipple
|
||||
*/
|
||||
|
||||
static void brw_set_polygon_stipple( struct pipe_context *pipe,
|
||||
const struct pipe_poly_stipple *stipple )
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
/************************************************************************
|
||||
* Fragment shader
|
||||
*/
|
||||
|
||||
static void * brw_create_fs_state(struct pipe_context *pipe,
|
||||
const struct pipe_shader_state *shader)
|
||||
{
|
||||
struct brw_fragment_program *brw_fp = CALLOC_STRUCT(brw_fragment_program);
|
||||
|
||||
brw_fp->program.tokens = tgsi_dup_tokens(shader->tokens);
|
||||
brw_fp->id = brw_context(pipe)->program_id++;
|
||||
|
||||
tgsi_scan_shader(shader->tokens, &brw_fp->info);
|
||||
|
||||
#if 0
|
||||
brw_shader_info(shader->tokens,
|
||||
&brw_fp->info2);
|
||||
#endif
|
||||
|
||||
tgsi_dump(shader->tokens, 0);
|
||||
|
||||
|
||||
return (void *)brw_fp;
|
||||
}
|
||||
|
||||
static void brw_bind_fs_state(struct pipe_context *pipe, void *shader)
|
||||
{
|
||||
struct brw_context *brw = brw_context(pipe);
|
||||
|
||||
brw->attribs.FragmentProgram = (struct brw_fragment_program *)shader;
|
||||
brw->state.dirty.brw |= BRW_NEW_FS;
|
||||
}
|
||||
|
||||
static void brw_delete_fs_state(struct pipe_context *pipe, void *shader)
|
||||
{
|
||||
struct brw_fragment_program *brw_fp = (struct brw_fragment_program *) shader;
|
||||
|
||||
FREE((void *) brw_fp->program.tokens);
|
||||
FREE(brw_fp);
|
||||
}
|
||||
|
||||
|
||||
/************************************************************************
|
||||
* Vertex shader and other TNL state
|
||||
*/
|
||||
|
||||
static void *brw_create_vs_state(struct pipe_context *pipe,
|
||||
const struct pipe_shader_state *shader)
|
||||
{
|
||||
struct brw_vertex_program *brw_vp = CALLOC_STRUCT(brw_vertex_program);
|
||||
|
||||
brw_vp->program.tokens = tgsi_dup_tokens(shader->tokens);
|
||||
brw_vp->id = brw_context(pipe)->program_id++;
|
||||
|
||||
tgsi_scan_shader(shader->tokens, &brw_vp->info);
|
||||
|
||||
#if 0
|
||||
brw_shader_info(shader->tokens,
|
||||
&brw_vp->info2);
|
||||
#endif
|
||||
tgsi_dump(shader->tokens, 0);
|
||||
|
||||
return (void *)brw_vp;
|
||||
}
|
||||
|
||||
static void brw_bind_vs_state(struct pipe_context *pipe, void *vs)
|
||||
{
|
||||
struct brw_context *brw = brw_context(pipe);
|
||||
|
||||
brw->attribs.VertexProgram = (struct brw_vertex_program *)vs;
|
||||
brw->state.dirty.brw |= BRW_NEW_VS;
|
||||
|
||||
debug_printf("YYYYYYYYYYYYY BINDING VERTEX SHADER\n");
|
||||
}
|
||||
|
||||
static void brw_delete_vs_state(struct pipe_context *pipe, void *shader)
|
||||
{
|
||||
struct brw_vertex_program *brw_vp = (struct brw_vertex_program *) shader;
|
||||
|
||||
FREE((void *) brw_vp->program.tokens);
|
||||
FREE(brw_vp);
|
||||
}
|
||||
|
||||
|
||||
static void brw_set_clip_state( struct pipe_context *pipe,
|
||||
const struct pipe_clip_state *clip )
|
||||
{
|
||||
struct brw_context *brw = brw_context(pipe);
|
||||
|
||||
brw->attribs.Clip = *clip;
|
||||
}
|
||||
|
||||
|
||||
static void brw_set_viewport_state( struct pipe_context *pipe,
|
||||
const struct pipe_viewport_state *viewport )
|
||||
{
|
||||
struct brw_context *brw = brw_context(pipe);
|
||||
|
||||
brw->attribs.Viewport = *viewport; /* struct copy */
|
||||
brw->state.dirty.brw |= BRW_NEW_VIEWPORT;
|
||||
|
||||
/* pass the viewport info to the draw module */
|
||||
//draw_set_viewport_state(brw->draw, viewport);
|
||||
}
|
||||
|
||||
|
||||
static void brw_set_vertex_buffers(struct pipe_context *pipe,
|
||||
unsigned count,
|
||||
const struct pipe_vertex_buffer *buffers)
|
||||
{
|
||||
struct brw_context *brw = brw_context(pipe);
|
||||
memcpy(brw->vb.vbo_array, buffers, count * sizeof(buffers[0]));
|
||||
}
|
||||
|
||||
static void brw_set_vertex_elements(struct pipe_context *pipe,
|
||||
unsigned count,
|
||||
const struct pipe_vertex_element *elements)
|
||||
{
|
||||
/* flush ? */
|
||||
struct brw_context *brw = brw_context(pipe);
|
||||
uint i;
|
||||
|
||||
assert(count <= PIPE_MAX_ATTRIBS);
|
||||
|
||||
for (i = 0; i < count; i++) {
|
||||
struct brw_vertex_element_state el;
|
||||
memset(&el, 0, sizeof(el));
|
||||
|
||||
el.ve0.src_offset = elements[i].src_offset;
|
||||
el.ve0.src_format = brw_translate_surface_format(elements[i].src_format);
|
||||
el.ve0.valid = 1;
|
||||
el.ve0.vertex_buffer_index = elements[i].vertex_buffer_index;
|
||||
|
||||
el.ve1.dst_offset = i * 4;
|
||||
|
||||
el.ve1.vfcomponent3 = BRW_VFCOMPONENT_STORE_SRC;
|
||||
el.ve1.vfcomponent2 = BRW_VFCOMPONENT_STORE_SRC;
|
||||
el.ve1.vfcomponent1 = BRW_VFCOMPONENT_STORE_SRC;
|
||||
el.ve1.vfcomponent0 = BRW_VFCOMPONENT_STORE_SRC;
|
||||
|
||||
switch (elements[i].nr_components) {
|
||||
case 1: el.ve1.vfcomponent1 = BRW_VFCOMPONENT_STORE_0;
|
||||
case 2: el.ve1.vfcomponent2 = BRW_VFCOMPONENT_STORE_0;
|
||||
case 3: el.ve1.vfcomponent3 = BRW_VFCOMPONENT_STORE_1_FLT;
|
||||
break;
|
||||
}
|
||||
|
||||
brw->vb.inputs[i] = el;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/************************************************************************
|
||||
* Constant buffers
|
||||
*/
|
||||
|
||||
static void brw_set_constant_buffer(struct pipe_context *pipe,
|
||||
uint shader, uint index,
|
||||
const struct pipe_constant_buffer *buf)
|
||||
{
|
||||
struct brw_context *brw = brw_context(pipe);
|
||||
|
||||
assert(buf == 0 || index == 0);
|
||||
|
||||
brw->attribs.Constants[shader] = buf;
|
||||
brw->state.dirty.brw |= BRW_NEW_CONSTANTS;
|
||||
}
|
||||
|
||||
|
||||
/************************************************************************
|
||||
* Texture surfaces
|
||||
*/
|
||||
|
||||
|
||||
static void brw_set_sampler_textures(struct pipe_context *pipe,
|
||||
unsigned num,
|
||||
struct pipe_texture **texture)
|
||||
{
|
||||
struct brw_context *brw = brw_context(pipe);
|
||||
uint i;
|
||||
|
||||
assert(num <= PIPE_MAX_SAMPLERS);
|
||||
|
||||
/* Check for no-op */
|
||||
if (num == brw->num_textures &&
|
||||
!memcmp(brw->attribs.Texture, texture, num *
|
||||
sizeof(struct pipe_texture *)))
|
||||
return;
|
||||
|
||||
for (i = 0; i < num; i++)
|
||||
pipe_texture_reference((struct pipe_texture **) &brw->attribs.Texture[i],
|
||||
texture[i]);
|
||||
|
||||
for (i = num; i < brw->num_textures; i++)
|
||||
pipe_texture_reference((struct pipe_texture **) &brw->attribs.Texture[i],
|
||||
NULL);
|
||||
|
||||
brw->num_textures = num;
|
||||
|
||||
brw->state.dirty.brw |= BRW_NEW_TEXTURE;
|
||||
}
|
||||
|
||||
|
||||
/************************************************************************
|
||||
* Render targets, etc
|
||||
*/
|
||||
|
||||
static void brw_set_framebuffer_state(struct pipe_context *pipe,
|
||||
const struct pipe_framebuffer_state *fb)
|
||||
{
|
||||
struct brw_context *brw = brw_context(pipe);
|
||||
|
||||
brw->attribs.FrameBuffer = *fb; /* struct copy */
|
||||
|
||||
brw->state.dirty.brw |= BRW_NEW_FRAMEBUFFER;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/************************************************************************
|
||||
* Rasterizer state
|
||||
*/
|
||||
|
||||
static void *
|
||||
brw_create_rasterizer_state(struct pipe_context *pipe,
|
||||
const struct pipe_rasterizer_state *rasterizer)
|
||||
{
|
||||
DUP(pipe_rasterizer_state, rasterizer);
|
||||
}
|
||||
|
||||
static void brw_bind_rasterizer_state( struct pipe_context *pipe,
|
||||
void *setup )
|
||||
{
|
||||
struct brw_context *brw = brw_context(pipe);
|
||||
|
||||
brw->attribs.Raster = (struct pipe_rasterizer_state *)setup;
|
||||
|
||||
/* Also pass-through to draw module:
|
||||
*/
|
||||
//draw_set_rasterizer_state(brw->draw, setup);
|
||||
|
||||
brw->state.dirty.brw |= BRW_NEW_RASTERIZER;
|
||||
}
|
||||
|
||||
static void brw_delete_rasterizer_state(struct pipe_context *pipe,
|
||||
void *setup)
|
||||
{
|
||||
free(setup);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void
|
||||
brw_init_state_functions( struct brw_context *brw )
|
||||
{
|
||||
brw->pipe.create_blend_state = brw_create_blend_state;
|
||||
brw->pipe.bind_blend_state = brw_bind_blend_state;
|
||||
brw->pipe.delete_blend_state = brw_delete_blend_state;
|
||||
|
||||
brw->pipe.create_sampler_state = brw_create_sampler_state;
|
||||
brw->pipe.bind_sampler_states = brw_bind_sampler_states;
|
||||
brw->pipe.delete_sampler_state = brw_delete_sampler_state;
|
||||
|
||||
brw->pipe.create_depth_stencil_alpha_state = brw_create_depth_stencil_state;
|
||||
brw->pipe.bind_depth_stencil_alpha_state = brw_bind_depth_stencil_state;
|
||||
brw->pipe.delete_depth_stencil_alpha_state = brw_delete_depth_stencil_state;
|
||||
|
||||
brw->pipe.create_rasterizer_state = brw_create_rasterizer_state;
|
||||
brw->pipe.bind_rasterizer_state = brw_bind_rasterizer_state;
|
||||
brw->pipe.delete_rasterizer_state = brw_delete_rasterizer_state;
|
||||
brw->pipe.create_fs_state = brw_create_fs_state;
|
||||
brw->pipe.bind_fs_state = brw_bind_fs_state;
|
||||
brw->pipe.delete_fs_state = brw_delete_fs_state;
|
||||
brw->pipe.create_vs_state = brw_create_vs_state;
|
||||
brw->pipe.bind_vs_state = brw_bind_vs_state;
|
||||
brw->pipe.delete_vs_state = brw_delete_vs_state;
|
||||
|
||||
brw->pipe.set_blend_color = brw_set_blend_color;
|
||||
brw->pipe.set_clip_state = brw_set_clip_state;
|
||||
brw->pipe.set_constant_buffer = brw_set_constant_buffer;
|
||||
brw->pipe.set_framebuffer_state = brw_set_framebuffer_state;
|
||||
|
||||
// brw->pipe.set_feedback_state = brw_set_feedback_state;
|
||||
// brw->pipe.set_feedback_buffer = brw_set_feedback_buffer;
|
||||
|
||||
brw->pipe.set_polygon_stipple = brw_set_polygon_stipple;
|
||||
brw->pipe.set_scissor_state = brw_set_scissor_state;
|
||||
brw->pipe.set_sampler_textures = brw_set_sampler_textures;
|
||||
brw->pipe.set_viewport_state = brw_set_viewport_state;
|
||||
brw->pipe.set_vertex_buffers = brw_set_vertex_buffers;
|
||||
brw->pipe.set_vertex_elements = brw_set_vertex_elements;
|
||||
}
|
||||
/**************************************************************************
|
||||
*
|
||||
* Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
|
||||
* All Rights Reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the
|
||||
* "Software"), to deal in the Software without restriction, including
|
||||
* without limitation the rights to use, copy, modify, merge, publish,
|
||||
* distribute, sub license, and/or sell copies of the Software, and to
|
||||
* permit persons to whom the Software is furnished to do so, subject to
|
||||
* the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice (including the
|
||||
* next paragraph) shall be included in all copies or substantial portions
|
||||
* of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
|
||||
* IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
|
||||
* ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
**************************************************************************/
|
||||
|
||||
/* Authors: Zack Rusin <zack@tungstengraphics.com>
|
||||
* Keith Whitwell <keith@tungstengraphics.com>
|
||||
*/
|
||||
|
||||
|
||||
#include "pipe/p_winsys.h"
|
||||
#include "pipe/p_util.h"
|
||||
#include "pipe/p_inlines.h"
|
||||
#include "pipe/p_shader_tokens.h"
|
||||
#include "tgsi/util/tgsi_dump.h"
|
||||
#include "tgsi/util/tgsi_parse.h"
|
||||
|
||||
#include "brw_context.h"
|
||||
#include "brw_defines.h"
|
||||
#include "brw_state.h"
|
||||
#include "brw_draw.h"
|
||||
|
||||
|
||||
#define DUP( TYPE, VAL ) \
|
||||
do { \
|
||||
struct TYPE *x = malloc(sizeof(*x)); \
|
||||
memcpy(x, VAL, sizeof(*x) ); \
|
||||
return x; \
|
||||
} while (0)
|
||||
|
||||
/************************************************************************
|
||||
* Blend
|
||||
*/
|
||||
static void *
|
||||
brw_create_blend_state(struct pipe_context *pipe,
|
||||
const struct pipe_blend_state *blend)
|
||||
{
|
||||
DUP( pipe_blend_state, blend );
|
||||
}
|
||||
|
||||
static void brw_bind_blend_state(struct pipe_context *pipe,
|
||||
void *blend)
|
||||
{
|
||||
struct brw_context *brw = brw_context(pipe);
|
||||
|
||||
brw->attribs.Blend = (struct pipe_blend_state*)blend;
|
||||
brw->state.dirty.brw |= BRW_NEW_BLEND;
|
||||
}
|
||||
|
||||
|
||||
static void brw_delete_blend_state(struct pipe_context *pipe, void *blend)
|
||||
{
|
||||
free(blend);
|
||||
}
|
||||
|
||||
static void brw_set_blend_color( struct pipe_context *pipe,
|
||||
const struct pipe_blend_color *blend_color )
|
||||
{
|
||||
struct brw_context *brw = brw_context(pipe);
|
||||
|
||||
brw->attribs.BlendColor = *blend_color;
|
||||
|
||||
brw->state.dirty.brw |= BRW_NEW_BLEND;
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
* Sampler
|
||||
*/
|
||||
|
||||
static void *
|
||||
brw_create_sampler_state(struct pipe_context *pipe,
|
||||
const struct pipe_sampler_state *sampler)
|
||||
{
|
||||
DUP( pipe_sampler_state, sampler );
|
||||
}
|
||||
|
||||
static void brw_bind_sampler_states(struct pipe_context *pipe,
|
||||
unsigned num, void **sampler)
|
||||
{
|
||||
struct brw_context *brw = brw_context(pipe);
|
||||
|
||||
assert(num <= PIPE_MAX_SAMPLERS);
|
||||
|
||||
/* Check for no-op */
|
||||
if (num == brw->num_samplers &&
|
||||
!memcmp(brw->attribs.Samplers, sampler, num * sizeof(void *)))
|
||||
return;
|
||||
|
||||
memcpy(brw->attribs.Samplers, sampler, num * sizeof(void *));
|
||||
memset(&brw->attribs.Samplers[num], 0, (PIPE_MAX_SAMPLERS - num) *
|
||||
sizeof(void *));
|
||||
|
||||
brw->num_samplers = num;
|
||||
|
||||
brw->state.dirty.brw |= BRW_NEW_SAMPLER;
|
||||
}
|
||||
|
||||
static void brw_delete_sampler_state(struct pipe_context *pipe,
|
||||
void *sampler)
|
||||
{
|
||||
free(sampler);
|
||||
}
|
||||
|
||||
|
||||
/************************************************************************
|
||||
* Depth stencil
|
||||
*/
|
||||
|
||||
static void *
|
||||
brw_create_depth_stencil_state(struct pipe_context *pipe,
|
||||
const struct pipe_depth_stencil_alpha_state *depth_stencil)
|
||||
{
|
||||
DUP( pipe_depth_stencil_alpha_state, depth_stencil );
|
||||
}
|
||||
|
||||
static void brw_bind_depth_stencil_state(struct pipe_context *pipe,
|
||||
void *depth_stencil)
|
||||
{
|
||||
struct brw_context *brw = brw_context(pipe);
|
||||
|
||||
brw->attribs.DepthStencil = (const struct pipe_depth_stencil_alpha_state *)depth_stencil;
|
||||
|
||||
brw->state.dirty.brw |= BRW_NEW_DEPTH_STENCIL;
|
||||
}
|
||||
|
||||
static void brw_delete_depth_stencil_state(struct pipe_context *pipe,
|
||||
void *depth_stencil)
|
||||
{
|
||||
free(depth_stencil);
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
* Scissor
|
||||
*/
|
||||
static void brw_set_scissor_state( struct pipe_context *pipe,
|
||||
const struct pipe_scissor_state *scissor )
|
||||
{
|
||||
struct brw_context *brw = brw_context(pipe);
|
||||
|
||||
memcpy( &brw->attribs.Scissor, scissor, sizeof(*scissor) );
|
||||
brw->state.dirty.brw |= BRW_NEW_SCISSOR;
|
||||
}
|
||||
|
||||
|
||||
/************************************************************************
|
||||
* Stipple
|
||||
*/
|
||||
|
||||
static void brw_set_polygon_stipple( struct pipe_context *pipe,
|
||||
const struct pipe_poly_stipple *stipple )
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
/************************************************************************
|
||||
* Fragment shader
|
||||
*/
|
||||
|
||||
static void * brw_create_fs_state(struct pipe_context *pipe,
|
||||
const struct pipe_shader_state *shader)
|
||||
{
|
||||
struct brw_fragment_program *brw_fp = CALLOC_STRUCT(brw_fragment_program);
|
||||
|
||||
brw_fp->program.tokens = tgsi_dup_tokens(shader->tokens);
|
||||
brw_fp->id = brw_context(pipe)->program_id++;
|
||||
|
||||
tgsi_scan_shader(shader->tokens, &brw_fp->info);
|
||||
|
||||
#if 0
|
||||
brw_shader_info(shader->tokens,
|
||||
&brw_fp->info2);
|
||||
#endif
|
||||
|
||||
tgsi_dump(shader->tokens, 0);
|
||||
|
||||
|
||||
return (void *)brw_fp;
|
||||
}
|
||||
|
||||
static void brw_bind_fs_state(struct pipe_context *pipe, void *shader)
|
||||
{
|
||||
struct brw_context *brw = brw_context(pipe);
|
||||
|
||||
brw->attribs.FragmentProgram = (struct brw_fragment_program *)shader;
|
||||
brw->state.dirty.brw |= BRW_NEW_FS;
|
||||
}
|
||||
|
||||
static void brw_delete_fs_state(struct pipe_context *pipe, void *shader)
|
||||
{
|
||||
struct brw_fragment_program *brw_fp = (struct brw_fragment_program *) shader;
|
||||
|
||||
FREE((void *) brw_fp->program.tokens);
|
||||
FREE(brw_fp);
|
||||
}
|
||||
|
||||
|
||||
/************************************************************************
|
||||
* Vertex shader and other TNL state
|
||||
*/
|
||||
|
||||
static void *brw_create_vs_state(struct pipe_context *pipe,
|
||||
const struct pipe_shader_state *shader)
|
||||
{
|
||||
struct brw_vertex_program *brw_vp = CALLOC_STRUCT(brw_vertex_program);
|
||||
|
||||
brw_vp->program.tokens = tgsi_dup_tokens(shader->tokens);
|
||||
brw_vp->id = brw_context(pipe)->program_id++;
|
||||
|
||||
tgsi_scan_shader(shader->tokens, &brw_vp->info);
|
||||
|
||||
#if 0
|
||||
brw_shader_info(shader->tokens,
|
||||
&brw_vp->info2);
|
||||
#endif
|
||||
tgsi_dump(shader->tokens, 0);
|
||||
|
||||
return (void *)brw_vp;
|
||||
}
|
||||
|
||||
static void brw_bind_vs_state(struct pipe_context *pipe, void *vs)
|
||||
{
|
||||
struct brw_context *brw = brw_context(pipe);
|
||||
|
||||
brw->attribs.VertexProgram = (struct brw_vertex_program *)vs;
|
||||
brw->state.dirty.brw |= BRW_NEW_VS;
|
||||
|
||||
debug_printf("YYYYYYYYYYYYY BINDING VERTEX SHADER\n");
|
||||
}
|
||||
|
||||
static void brw_delete_vs_state(struct pipe_context *pipe, void *shader)
|
||||
{
|
||||
struct brw_vertex_program *brw_vp = (struct brw_vertex_program *) shader;
|
||||
|
||||
FREE((void *) brw_vp->program.tokens);
|
||||
FREE(brw_vp);
|
||||
}
|
||||
|
||||
|
||||
static void brw_set_clip_state( struct pipe_context *pipe,
|
||||
const struct pipe_clip_state *clip )
|
||||
{
|
||||
struct brw_context *brw = brw_context(pipe);
|
||||
|
||||
brw->attribs.Clip = *clip;
|
||||
}
|
||||
|
||||
|
||||
static void brw_set_viewport_state( struct pipe_context *pipe,
|
||||
const struct pipe_viewport_state *viewport )
|
||||
{
|
||||
struct brw_context *brw = brw_context(pipe);
|
||||
|
||||
brw->attribs.Viewport = *viewport; /* struct copy */
|
||||
brw->state.dirty.brw |= BRW_NEW_VIEWPORT;
|
||||
|
||||
/* pass the viewport info to the draw module */
|
||||
//draw_set_viewport_state(brw->draw, viewport);
|
||||
}
|
||||
|
||||
|
||||
static void brw_set_vertex_buffers(struct pipe_context *pipe,
|
||||
unsigned count,
|
||||
const struct pipe_vertex_buffer *buffers)
|
||||
{
|
||||
struct brw_context *brw = brw_context(pipe);
|
||||
memcpy(brw->vb.vbo_array, buffers, count * sizeof(buffers[0]));
|
||||
}
|
||||
|
||||
static void brw_set_vertex_elements(struct pipe_context *pipe,
|
||||
unsigned count,
|
||||
const struct pipe_vertex_element *elements)
|
||||
{
|
||||
/* flush ? */
|
||||
struct brw_context *brw = brw_context(pipe);
|
||||
uint i;
|
||||
|
||||
assert(count <= PIPE_MAX_ATTRIBS);
|
||||
|
||||
for (i = 0; i < count; i++) {
|
||||
struct brw_vertex_element_state el;
|
||||
memset(&el, 0, sizeof(el));
|
||||
|
||||
el.ve0.src_offset = elements[i].src_offset;
|
||||
el.ve0.src_format = brw_translate_surface_format(elements[i].src_format);
|
||||
el.ve0.valid = 1;
|
||||
el.ve0.vertex_buffer_index = elements[i].vertex_buffer_index;
|
||||
|
||||
el.ve1.dst_offset = i * 4;
|
||||
|
||||
el.ve1.vfcomponent3 = BRW_VFCOMPONENT_STORE_SRC;
|
||||
el.ve1.vfcomponent2 = BRW_VFCOMPONENT_STORE_SRC;
|
||||
el.ve1.vfcomponent1 = BRW_VFCOMPONENT_STORE_SRC;
|
||||
el.ve1.vfcomponent0 = BRW_VFCOMPONENT_STORE_SRC;
|
||||
|
||||
switch (elements[i].nr_components) {
|
||||
case 1: el.ve1.vfcomponent1 = BRW_VFCOMPONENT_STORE_0;
|
||||
case 2: el.ve1.vfcomponent2 = BRW_VFCOMPONENT_STORE_0;
|
||||
case 3: el.ve1.vfcomponent3 = BRW_VFCOMPONENT_STORE_1_FLT;
|
||||
break;
|
||||
}
|
||||
|
||||
brw->vb.inputs[i] = el;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/************************************************************************
|
||||
* Constant buffers
|
||||
*/
|
||||
|
||||
static void brw_set_constant_buffer(struct pipe_context *pipe,
|
||||
uint shader, uint index,
|
||||
const struct pipe_constant_buffer *buf)
|
||||
{
|
||||
struct brw_context *brw = brw_context(pipe);
|
||||
|
||||
assert(buf == 0 || index == 0);
|
||||
|
||||
brw->attribs.Constants[shader] = buf;
|
||||
brw->state.dirty.brw |= BRW_NEW_CONSTANTS;
|
||||
}
|
||||
|
||||
|
||||
/************************************************************************
|
||||
* Texture surfaces
|
||||
*/
|
||||
|
||||
|
||||
static void brw_set_sampler_textures(struct pipe_context *pipe,
|
||||
unsigned num,
|
||||
struct pipe_texture **texture)
|
||||
{
|
||||
struct brw_context *brw = brw_context(pipe);
|
||||
uint i;
|
||||
|
||||
assert(num <= PIPE_MAX_SAMPLERS);
|
||||
|
||||
/* Check for no-op */
|
||||
if (num == brw->num_textures &&
|
||||
!memcmp(brw->attribs.Texture, texture, num *
|
||||
sizeof(struct pipe_texture *)))
|
||||
return;
|
||||
|
||||
for (i = 0; i < num; i++)
|
||||
pipe_texture_reference((struct pipe_texture **) &brw->attribs.Texture[i],
|
||||
texture[i]);
|
||||
|
||||
for (i = num; i < brw->num_textures; i++)
|
||||
pipe_texture_reference((struct pipe_texture **) &brw->attribs.Texture[i],
|
||||
NULL);
|
||||
|
||||
brw->num_textures = num;
|
||||
|
||||
brw->state.dirty.brw |= BRW_NEW_TEXTURE;
|
||||
}
|
||||
|
||||
|
||||
/************************************************************************
|
||||
* Render targets, etc
|
||||
*/
|
||||
|
||||
static void brw_set_framebuffer_state(struct pipe_context *pipe,
|
||||
const struct pipe_framebuffer_state *fb)
|
||||
{
|
||||
struct brw_context *brw = brw_context(pipe);
|
||||
|
||||
brw->attribs.FrameBuffer = *fb; /* struct copy */
|
||||
|
||||
brw->state.dirty.brw |= BRW_NEW_FRAMEBUFFER;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/************************************************************************
|
||||
* Rasterizer state
|
||||
*/
|
||||
|
||||
static void *
|
||||
brw_create_rasterizer_state(struct pipe_context *pipe,
|
||||
const struct pipe_rasterizer_state *rasterizer)
|
||||
{
|
||||
DUP(pipe_rasterizer_state, rasterizer);
|
||||
}
|
||||
|
||||
static void brw_bind_rasterizer_state( struct pipe_context *pipe,
|
||||
void *setup )
|
||||
{
|
||||
struct brw_context *brw = brw_context(pipe);
|
||||
|
||||
brw->attribs.Raster = (struct pipe_rasterizer_state *)setup;
|
||||
|
||||
/* Also pass-through to draw module:
|
||||
*/
|
||||
//draw_set_rasterizer_state(brw->draw, setup);
|
||||
|
||||
brw->state.dirty.brw |= BRW_NEW_RASTERIZER;
|
||||
}
|
||||
|
||||
static void brw_delete_rasterizer_state(struct pipe_context *pipe,
|
||||
void *setup)
|
||||
{
|
||||
free(setup);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void
|
||||
brw_init_state_functions( struct brw_context *brw )
|
||||
{
|
||||
brw->pipe.create_blend_state = brw_create_blend_state;
|
||||
brw->pipe.bind_blend_state = brw_bind_blend_state;
|
||||
brw->pipe.delete_blend_state = brw_delete_blend_state;
|
||||
|
||||
brw->pipe.create_sampler_state = brw_create_sampler_state;
|
||||
brw->pipe.bind_sampler_states = brw_bind_sampler_states;
|
||||
brw->pipe.delete_sampler_state = brw_delete_sampler_state;
|
||||
|
||||
brw->pipe.create_depth_stencil_alpha_state = brw_create_depth_stencil_state;
|
||||
brw->pipe.bind_depth_stencil_alpha_state = brw_bind_depth_stencil_state;
|
||||
brw->pipe.delete_depth_stencil_alpha_state = brw_delete_depth_stencil_state;
|
||||
|
||||
brw->pipe.create_rasterizer_state = brw_create_rasterizer_state;
|
||||
brw->pipe.bind_rasterizer_state = brw_bind_rasterizer_state;
|
||||
brw->pipe.delete_rasterizer_state = brw_delete_rasterizer_state;
|
||||
brw->pipe.create_fs_state = brw_create_fs_state;
|
||||
brw->pipe.bind_fs_state = brw_bind_fs_state;
|
||||
brw->pipe.delete_fs_state = brw_delete_fs_state;
|
||||
brw->pipe.create_vs_state = brw_create_vs_state;
|
||||
brw->pipe.bind_vs_state = brw_bind_vs_state;
|
||||
brw->pipe.delete_vs_state = brw_delete_vs_state;
|
||||
|
||||
brw->pipe.set_blend_color = brw_set_blend_color;
|
||||
brw->pipe.set_clip_state = brw_set_clip_state;
|
||||
brw->pipe.set_constant_buffer = brw_set_constant_buffer;
|
||||
brw->pipe.set_framebuffer_state = brw_set_framebuffer_state;
|
||||
|
||||
// brw->pipe.set_feedback_state = brw_set_feedback_state;
|
||||
// brw->pipe.set_feedback_buffer = brw_set_feedback_buffer;
|
||||
|
||||
brw->pipe.set_polygon_stipple = brw_set_polygon_stipple;
|
||||
brw->pipe.set_scissor_state = brw_set_scissor_state;
|
||||
brw->pipe.set_sampler_textures = brw_set_sampler_textures;
|
||||
brw->pipe.set_viewport_state = brw_set_viewport_state;
|
||||
brw->pipe.set_vertex_buffers = brw_set_vertex_buffers;
|
||||
brw->pipe.set_vertex_elements = brw_set_vertex_elements;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue