X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmesa%2Fdrivers%2Fdri%2Fr200%2Fr200_context.h;h=bec09e8ef6ab81fd2287bda5574fbd415bca8916;hb=eb9a5b6d5127858b01ec12672c999e7d25cd7aed;hp=cedf1b974f15dc2457b57f2a0294b861c199badb;hpb=886280763c8dfa7202bdacdeacf84ced69609b98;p=mesa.git diff --git a/src/mesa/drivers/dri/r200/r200_context.h b/src/mesa/drivers/dri/r200/r200_context.h index cedf1b974f1..bec09e8ef6a 100644 --- a/src/mesa/drivers/dri/r200/r200_context.h +++ b/src/mesa/drivers/dri/r200/r200_context.h @@ -1,4 +1,3 @@ -/* $XFree86: xc/lib/GL/mesa/src/drv/r200/r200_context.h,v 1.2 2002/12/16 16:18:54 dawes Exp $ */ /* Copyright (C) The Weather Channel, Inc. 2002. All Rights Reserved. @@ -46,27 +45,34 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include "mtypes.h" #include "colormac.h" #include "r200_reg.h" +#include "r200_vertprog.h" #define ENABLE_HW_3D_TEXTURE 1 /* XXX this is temporary! */ +#ifndef R200_EMIT_VAP_PVS_CNTL +#error This driver requires a newer libdrm to compile +#endif + struct r200_context; typedef struct r200_context r200ContextRec; typedef struct r200_context *r200ContextPtr; +/* This union is used to avoid warnings/miscompilation + with float to uint32_t casts due to strict-aliasing */ +typedef union { GLfloat f; uint32_t ui32; } float_ui32_type; + #include "r200_lock.h" -#include "r200_screen.h" +#include "radeon_screen.h" #include "mm.h" /* Flags for software fallback cases */ /* See correponding strings in r200_swtcl.c */ -#define R200_FALLBACK_TEXTURE 0x1 -#define R200_FALLBACK_DRAW_BUFFER 0x2 -#define R200_FALLBACK_STENCIL 0x4 -#define R200_FALLBACK_RENDER_MODE 0x8 -#define R200_FALLBACK_BLEND_EQ 0x10 -#define R200_FALLBACK_BLEND_FUNC 0x20 -#define R200_FALLBACK_DISABLE 0x40 -#define R200_FALLBACK_BORDER_MODE 0x80 +#define R200_FALLBACK_TEXTURE 0x01 +#define R200_FALLBACK_DRAW_BUFFER 0x02 +#define R200_FALLBACK_STENCIL 0x04 +#define R200_FALLBACK_RENDER_MODE 0x08 +#define R200_FALLBACK_DISABLE 0x10 +#define R200_FALLBACK_BORDER_MODE 0x20 /* The blit width for texture uploads */ @@ -92,9 +98,25 @@ typedef void (*r200_point_func)( r200ContextPtr, r200Vertex * ); +struct r200_vertex_program { + struct gl_vertex_program mesa_program; /* Must be first */ + int translated; + /* need excess instr: 1 for late loop checking, 2 for + additional instr due to instr/attr, 3 for fog */ + VERTEX_SHADER_INSTRUCTION instr[R200_VSF_MAX_INST + 6]; + int pos_end; + int inputs[VERT_ATTRIB_MAX]; + GLubyte inputmap_rev[16]; + int native; + int fogpidx; + int fogmode; +}; + struct r200_colorbuffer_state { GLuint clear; +#if 000 GLint drawOffset, drawPitch; +#endif int roundEnable; }; @@ -104,9 +126,11 @@ struct r200_depthbuffer_state { GLfloat scale; }; +#if 000 struct r200_pixel_state { GLint readOffset, readPitch; }; +#endif struct r200_scissor_state { drm_clip_rect_t rect; @@ -167,13 +191,15 @@ struct r200_tex_obj { GLuint pp_cubic_faces; /* cube face 1,2,3,4 log2 sizes */ GLboolean border_fallback; + + GLuint tile_bits; /* hw texture tile bits used on this texture */ }; struct r200_texture_env_state { r200TexObjPtr texobj; - GLenum format; - GLenum envMode; + GLuint outputreg; + GLuint unitneeded; }; #define R200_MAX_TEXTURE_UNITS 6 @@ -274,12 +300,17 @@ struct r200_state_atom { #define TEX_PP_TXSIZE 4 /*2c0c*/ #define TEX_PP_TXPITCH 5 /*2c10*/ #define TEX_PP_BORDER_COLOR 6 /*2c14*/ -#define TEX_CMD_1 7 -#define TEX_PP_TXOFFSET 8 /*2d00 */ -#define TEX_STATE_SIZE 9 - -#define CUBE_CMD_0 0 /* 1 register follows */ -#define CUBE_PP_CUBIC_FACES 1 /* 0x2c18 */ +#define TEX_CMD_1_OLDDRM 7 +#define TEX_PP_TXOFFSET_OLDDRM 8 /*2d00 */ +#define TEX_STATE_SIZE_OLDDRM 9 +#define TEX_PP_CUBIC_FACES 7 +#define TEX_PP_TXMULTI_CTL 8 +#define TEX_CMD_1_NEWDRM 9 +#define TEX_PP_TXOFFSET_NEWDRM 10 +#define TEX_STATE_SIZE_NEWDRM 11 + +#define CUBE_CMD_0 0 /* 1 register follows */ /* this command unnecessary */ +#define CUBE_PP_CUBIC_FACES 1 /* 0x2c18 */ /* with new enough drm */ #define CUBE_CMD_1 2 /* 5 registers follow */ #define CUBE_PP_CUBIC_OFFSET_F1 3 /* 0x2d04 */ #define CUBE_PP_CUBIC_OFFSET_F2 4 /* 0x2d08 */ @@ -304,6 +335,53 @@ struct r200_state_atom { #define TF_TFACTOR_5 6 #define TF_STATE_SIZE 7 +#define ATF_CMD_0 0 +#define ATF_TFACTOR_0 1 +#define ATF_TFACTOR_1 2 +#define ATF_TFACTOR_2 3 +#define ATF_TFACTOR_3 4 +#define ATF_TFACTOR_4 5 +#define ATF_TFACTOR_5 6 +#define ATF_TFACTOR_6 7 +#define ATF_TFACTOR_7 8 +#define ATF_STATE_SIZE 9 + +/* ATI_FRAGMENT_SHADER */ +#define AFS_CMD_0 0 +#define AFS_IC0 1 /* 2f00 */ +#define AFS_IC1 2 /* 2f04 */ +#define AFS_IA0 3 /* 2f08 */ +#define AFS_IA1 4 /* 2f0c */ +#define AFS_STATE_SIZE 33 + +#define PVS_CMD_0 0 +#define PVS_CNTL_1 1 +#define PVS_CNTL_2 2 +#define PVS_STATE_SIZE 3 + +/* those are quite big... */ +#define VPI_CMD_0 0 +#define VPI_OPDST_0 1 +#define VPI_SRC0_0 2 +#define VPI_SRC1_0 3 +#define VPI_SRC2_0 4 +#define VPI_OPDST_63 253 +#define VPI_SRC0_63 254 +#define VPI_SRC1_63 255 +#define VPI_SRC2_63 256 +#define VPI_STATE_SIZE 257 + +#define VPP_CMD_0 0 +#define VPP_PARAM0_0 1 +#define VPP_PARAM1_0 2 +#define VPP_PARAM2_0 3 +#define VPP_PARAM3_0 4 +#define VPP_PARAM0_95 381 +#define VPP_PARAM1_95 382 +#define VPP_PARAM2_95 383 +#define VPP_PARAM3_95 384 +#define VPP_STATE_SIZE 385 + #define TCL_CMD_0 0 #define TCL_LIGHT_MODEL_CTL_0 1 #define TCL_LIGHT_MODEL_CTL_1 2 @@ -369,6 +447,31 @@ struct r200_state_atom { #define VTX_STATE_CNTL 8 #define VTX_STATE_SIZE 9 +/* SPR - point sprite state + */ +#define SPR_CMD_0 0 +#define SPR_POINT_SPRITE_CNTL 1 +#define SPR_STATE_SIZE 2 + +#define PTP_CMD_0 0 +#define PTP_VPORT_SCALE_0 1 +#define PTP_VPORT_SCALE_1 2 +#define PTP_VPORT_SCALE_PTSIZE 3 +#define PTP_VPORT_SCALE_3 4 +#define PTP_CMD_1 5 +#define PTP_ATT_CONST_QUAD 6 +#define PTP_ATT_CONST_LIN 7 +#define PTP_ATT_CONST_CON 8 +#define PTP_ATT_CONST_3 9 +#define PTP_EYE_X 10 +#define PTP_EYE_Y 11 +#define PTP_EYE_Z 12 +#define PTP_EYE_3 13 +#define PTP_CLAMP_MIN 14 +#define PTP_CLAMP_MAX 15 +#define PTP_CLAMP_2 16 +#define PTP_CLAMP_3 17 +#define PTP_STATE_SIZE 18 #define VTX_COLOR(v,n) (((v)>>(R200_VTX_COLOR_0_SHIFT+(n)*2))&\ R200_VTX_COLOR_MASK) @@ -486,7 +589,10 @@ struct r200_state_atom { #define CST_SE_TCL_INPUT_VTX_3 17 #define CST_STATE_SIZE 18 - +#define PRF_CMD_0 0 +#define PRF_PP_TRI_PERF 1 +#define PRF_PP_PERF_CNTL 2 +#define PRF_STATE_SIZE 3 struct r200_hw_state { @@ -516,15 +622,23 @@ struct r200_hw_state { struct r200_state_atom tex[6]; struct r200_state_atom cube[6]; struct r200_state_atom zbs; - struct r200_state_atom mtl[2]; - struct r200_state_atom mat[9]; + struct r200_state_atom mtl[2]; + struct r200_state_atom mat[9]; struct r200_state_atom lit[8]; /* includes vec, scl commands */ struct r200_state_atom ucp[6]; struct r200_state_atom pix[6]; /* pixshader stages */ struct r200_state_atom eye; /* eye pos */ struct r200_state_atom grd; /* guard band clipping */ - struct r200_state_atom fog; - struct r200_state_atom glt; + struct r200_state_atom fog; + struct r200_state_atom glt; + struct r200_state_atom prf; + struct r200_state_atom afs[2]; + struct r200_state_atom pvs; + struct r200_state_atom vpi[2]; + struct r200_state_atom vpp[2]; + struct r200_state_atom atf; + struct r200_state_atom spr; + struct r200_state_atom ptp; int max_state_size; /* Number of bytes necessary for a full state emit. */ GLboolean is_dirty, all_dirty; @@ -535,11 +649,14 @@ struct r200_state { */ struct r200_colorbuffer_state color; struct r200_depthbuffer_state depth; +#if 00 struct r200_pixel_state pixel; +#endif struct r200_scissor_state scissor; struct r200_stencilbuffer_state stencil; struct r200_stipple_state stipple; struct r200_texture_state texture; + GLuint envneeded; }; /* Need refcounting on dma buffers: @@ -582,6 +699,7 @@ struct r200_dri_mirror { __DRIcontextPrivate *context; /* DRI context */ __DRIscreenPrivate *screen; /* DRI screen */ __DRIdrawablePrivate *drawable; /* DRI drawable bound to this ctx */ + __DRIdrawablePrivate *readable; /* DRI readable bound to this ctx */ drm_context_t hwContext; drm_hw_lock_t *hwLock; @@ -590,7 +708,7 @@ struct r200_dri_mirror { }; -#define R200_CMD_BUF_SZ (8*1024) +#define R200_CMD_BUF_SZ (16*1024) struct r200_store { GLuint statenr; @@ -604,22 +722,16 @@ struct r200_store { /* r200_tcl.c */ struct r200_tcl_info { - GLuint vertex_format; - GLint last_offset; GLuint hw_primitive; - struct r200_dma_region *aos_components[8]; +/* hw can handle 12 components max */ + struct r200_dma_region *aos_components[12]; GLuint nr_aos_components; GLuint *Elts; struct r200_dma_region indexed_verts; - struct r200_dma_region obj; - struct r200_dma_region rgba; - struct r200_dma_region spec; - struct r200_dma_region fog; - struct r200_dma_region tex[R200_MAX_TEXTURE_UNITS]; - struct r200_dma_region norm; + struct r200_dma_region vertex_data[15]; }; @@ -689,87 +801,6 @@ struct r200_ioctl { #define R200_MAX_PRIMS 64 -/* Want to keep a cache of these around. Each is parameterized by - * only a single value which has only a small range. Only expect a - * few, so just rescan the list each time? - */ -struct dynfn { - struct dynfn *next, *prev; - int key[2]; - char *code; -}; - -struct dfn_lists { - struct dynfn Vertex2f; - struct dynfn Vertex2fv; - struct dynfn Vertex3f; - struct dynfn Vertex3fv; - struct dynfn Color4ub; - struct dynfn Color4ubv; - struct dynfn Color3ub; - struct dynfn Color3ubv; - struct dynfn Color4f; - struct dynfn Color4fv; - struct dynfn Color3f; - struct dynfn Color3fv; - struct dynfn SecondaryColor3ubEXT; - struct dynfn SecondaryColor3ubvEXT; - struct dynfn SecondaryColor3fEXT; - struct dynfn SecondaryColor3fvEXT; - struct dynfn Normal3f; - struct dynfn Normal3fv; - struct dynfn TexCoord3f; - struct dynfn TexCoord3fv; - struct dynfn TexCoord2f; - struct dynfn TexCoord2fv; - struct dynfn TexCoord1f; - struct dynfn TexCoord1fv; - struct dynfn MultiTexCoord3fARB; - struct dynfn MultiTexCoord3fvARB; - struct dynfn MultiTexCoord2fARB; - struct dynfn MultiTexCoord2fvARB; - struct dynfn MultiTexCoord1fARB; - struct dynfn MultiTexCoord1fvARB; - struct dynfn FogCoordfEXT; - struct dynfn FogCoordfvEXT; -}; - -struct dfn_generators { - struct dynfn *(*Vertex2f)( GLcontext *, const int * ); - struct dynfn *(*Vertex2fv)( GLcontext *, const int * ); - struct dynfn *(*Vertex3f)( GLcontext *, const int * ); - struct dynfn *(*Vertex3fv)( GLcontext *, const int * ); - struct dynfn *(*Color4ub)( GLcontext *, const int * ); - struct dynfn *(*Color4ubv)( GLcontext *, const int * ); - struct dynfn *(*Color3ub)( GLcontext *, const int * ); - struct dynfn *(*Color3ubv)( GLcontext *, const int * ); - struct dynfn *(*Color4f)( GLcontext *, const int * ); - struct dynfn *(*Color4fv)( GLcontext *, const int * ); - struct dynfn *(*Color3f)( GLcontext *, const int * ); - struct dynfn *(*Color3fv)( GLcontext *, const int * ); - struct dynfn *(*SecondaryColor3ubEXT)( GLcontext *, const int * ); - struct dynfn *(*SecondaryColor3ubvEXT)( GLcontext *, const int * ); - struct dynfn *(*SecondaryColor3fEXT)( GLcontext *, const int * ); - struct dynfn *(*SecondaryColor3fvEXT)( GLcontext *, const int * ); - struct dynfn *(*Normal3f)( GLcontext *, const int * ); - struct dynfn *(*Normal3fv)( GLcontext *, const int * ); - struct dynfn *(*TexCoord3f)( GLcontext *, const int * ); - struct dynfn *(*TexCoord3fv)( GLcontext *, const int * ); - struct dynfn *(*TexCoord2f)( GLcontext *, const int * ); - struct dynfn *(*TexCoord2fv)( GLcontext *, const int * ); - struct dynfn *(*TexCoord1f)( GLcontext *, const int * ); - struct dynfn *(*TexCoord1fv)( GLcontext *, const int * ); - struct dynfn *(*MultiTexCoord3fARB)( GLcontext *, const int * ); - struct dynfn *(*MultiTexCoord3fvARB)( GLcontext *, const int * ); - struct dynfn *(*MultiTexCoord2fARB)( GLcontext *, const int * ); - struct dynfn *(*MultiTexCoord2fvARB)( GLcontext *, const int * ); - struct dynfn *(*MultiTexCoord1fARB)( GLcontext *, const int * ); - struct dynfn *(*MultiTexCoord1fvARB)( GLcontext *, const int * ); - struct dynfn *(*FogCoordfEXT)( GLcontext *, const int * ); - struct dynfn *(*FogCoordfvEXT)( GLcontext *, const int * ); -}; - - struct r200_prim { GLuint start; @@ -790,43 +821,6 @@ struct r200_prim { #define R200_MAX_VERTEX_SIZE ((3*6)+11) -struct r200_vbinfo { - GLint counter, initial_counter; - GLint *dmaptr; - void (*notify)( void ); - GLint vertex_size; - - union { float f; int i; r200_color_t color; } vertex[R200_MAX_VERTEX_SIZE]; - - GLfloat *normalptr; - GLfloat *floatcolorptr; - GLfloat *fogptr; - r200_color_t *colorptr; - GLfloat *floatspecptr; - r200_color_t *specptr; - GLfloat *texcoordptr[8]; /* 6 (TMU) + 2 for r200_vtxfmt_c.c when GL_TEXTURE6/7 */ - - - GLenum *prim; /* &ctx->Driver.CurrentExecPrimitive */ - GLuint primflags; - GLboolean enabled; /* *_NO_VTXFMT / *_NO_TCL env vars */ - GLboolean installed; - GLboolean fell_back; - GLboolean recheck; - GLint nrverts; - GLuint vtxfmt_0, vtxfmt_1; - - GLuint installed_vertex_format; - GLuint installed_color_3f_sz; - - struct r200_prim primlist[R200_MAX_PRIMS]; - int nrprims; - - struct dfn_lists dfn_cache; - struct dfn_generators codegen; - GLvertexformat vtxfmt; -}; - struct r200_context { GLcontext *glCtx; /* Mesa context */ @@ -835,11 +829,12 @@ struct r200_context { */ struct r200_hw_state hw; struct r200_state state; + struct r200_vertex_program *curr_vp_hw; /* Texture object bookkeeping */ unsigned nr_heaps; - driTexHeap * texture_heaps[ R200_NR_TEX_HEAPS ]; + driTexHeap * texture_heaps[ RADEON_NR_TEX_HEAPS ]; driTextureObject swapped; int texture_depth; float initialMaxAnisotropy; @@ -849,7 +844,7 @@ struct r200_context { GLuint TclFallback; GLuint Fallback; GLuint NewGLState; - GLuint tnl_index; /* index of bits for last tnl_install_attrs */ + DECLARE_RENDERINPUTS(tnl_index_bitset); /* index of bits for last tnl_install_attrs */ /* Vertex buffers */ @@ -883,7 +878,7 @@ struct r200_context { unsigned int lastStamp; GLboolean lost_context; GLboolean save_on_next_emit; - r200ScreenPtr r200Screen; /* Screen private DRI data */ + radeonScreenPtr r200Screen; /* Screen private DRI data */ drm_radeon_sarea_t *sarea; /* Private SAREA data */ /* TCL stuff @@ -908,7 +903,6 @@ struct r200_context { GLuint swap_count; GLuint swap_missed_count; - PFNGLXGETUSTPROC get_ust; /* r200_tcl.c */ @@ -918,10 +912,6 @@ struct r200_context { */ struct r200_swtcl_info swtcl; - /* r200_vtxfmt.c - */ - struct r200_vbinfo vb; - /* Mirrors of some DRI state */ struct r200_dri_mirror dri; @@ -931,6 +921,9 @@ struct r200_context { driOptionCache optionCache; GLboolean using_hyperz; + GLboolean texmicrotile; + + struct ati_fragment_shader *afs_loaded; }; #define R200_CONTEXT(ctx) ((r200ContextPtr)(ctx->DriverCtx)) @@ -956,6 +949,8 @@ extern GLboolean r200CreateContext( const __GLcontextModes *glVisual, __DRIcontextPrivate *driContextPriv, void *sharedContextPrivate); extern void r200SwapBuffers( __DRIdrawablePrivate *dPriv ); +extern void r200CopySubBuffer( __DRIdrawablePrivate * dPriv, + int x, int y, int w, int h ); extern GLboolean r200MakeCurrent( __DRIcontextPrivate *driContextPriv, __DRIdrawablePrivate *driDrawPriv, __DRIdrawablePrivate *driReadPriv );