X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmesa%2Fswrast%2Fs_context.h;h=d7ad764a9e2d3ebea45a1b56150b79c1829cf821;hb=26b8dfc8cadf0f1a8604fc77b226cc7de005f9ca;hp=a3f61cd5e54c448fe2c4492af7da3614cc0e99c4;hpb=29c471aafc6a3fef23d553e31a555d1782854a77;p=mesa.git diff --git a/src/mesa/swrast/s_context.h b/src/mesa/swrast/s_context.h index a3f61cd5e54..d7ad764a9e2 100644 --- a/src/mesa/swrast/s_context.h +++ b/src/mesa/swrast/s_context.h @@ -1,8 +1,8 @@ /* * Mesa 3-D graphics library - * Version: 6.5.2 + * Version: 6.5.3 * - * Copyright (C) 1999-2006 Brian Paul All Rights Reserved. + * Copyright (C) 1999-2007 Brian Paul 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"), @@ -43,31 +43,33 @@ #ifndef S_CONTEXT_H #define S_CONTEXT_H -#include "mtypes.h" +#include "main/compiler.h" +#include "main/mtypes.h" +#include "program/prog_execute.h" #include "swrast.h" #include "s_span.h" -typedef void (*texture_sample_func)(GLcontext *ctx, +typedef void (*texture_sample_func)(struct gl_context *ctx, const struct gl_texture_object *tObj, GLuint n, const GLfloat texcoords[][4], - const GLfloat lambda[], GLchan rgba[][4]); + const GLfloat lambda[], GLfloat rgba[][4]); -typedef void (_ASMAPIP blend_func)( GLcontext *ctx, GLuint n, +typedef void (_ASMAPIP blend_func)( struct gl_context *ctx, GLuint n, const GLubyte mask[], GLvoid *src, const GLvoid *dst, GLenum chanType); -typedef void (*swrast_point_func)( GLcontext *ctx, const SWvertex *); +typedef void (*swrast_point_func)( struct gl_context *ctx, const SWvertex *); -typedef void (*swrast_line_func)( GLcontext *ctx, +typedef void (*swrast_line_func)( struct gl_context *ctx, const SWvertex *, const SWvertex *); -typedef void (*swrast_tri_func)( GLcontext *ctx, const SWvertex *, +typedef void (*swrast_tri_func)( struct gl_context *ctx, const SWvertex *, const SWvertex *, const SWvertex *); -typedef void (*validate_texture_image_func)(GLcontext *ctx, +typedef void (*validate_texture_image_func)(struct gl_context *ctx, struct gl_texture_object *texObj, GLuint face, GLuint level); @@ -107,6 +109,67 @@ typedef void (*validate_texture_image_func)(GLcontext *ctx, _NEW_DEPTH) +struct swrast_texture_image; + + +/** + * Fetch a texel from texture image at given position. + */ +typedef void (*FetchTexelFuncF)(const struct swrast_texture_image *texImage, + GLint col, GLint row, GLint img, + GLfloat *texelOut); + + +typedef void (*StoreTexelFunc)(struct swrast_texture_image *texImage, + GLint col, GLint row, GLint img, + const void *texel); + +/** + * Subclass of gl_texture_image. + * We need extra fields/info to keep tracking of mapped texture buffers, + * strides and Fetch/Store functions. + */ +struct swrast_texture_image +{ + struct gl_texture_image Base; + + GLboolean _IsPowerOfTwo; /**< Are all dimensions powers of two? */ + + /** used for mipmap LOD computation */ + GLfloat WidthScale, HeightScale, DepthScale; + +#if 0 + GLubyte *Data; /**< The actual texture data in malloc'd memory */ + + GLint TexelSize; /**< bytes per texel block */ +#endif + + FetchTexelFuncF FetchTexelf; + StoreTexelFunc Store; + +#if 0 + /** These fields only valid when texture memory is mapped */ + GLubyte **SliceMaps; /**< points to OneMap or a malloc'd array */ + GLint RowStride; /**< bytes per row of blocks */ +#endif +}; + + +/** cast wrapper */ +static inline struct swrast_texture_image * +swrast_texture_image(struct gl_texture_image *img) +{ + return (struct swrast_texture_image *) img; +} + +/** cast wrapper */ +static inline const struct swrast_texture_image * +swrast_texture_image_const(const struct gl_texture_image *img) +{ + return (const struct swrast_texture_image *) img; +} + + /** * \struct SWcontext * \brief Per-context state that's private to the software rasterizer module. @@ -127,18 +190,21 @@ typedef struct * _swrast_validate_derived(): */ GLbitfield _RasterMask; - GLfloat _BackfaceSign; + GLfloat _BackfaceSign; /** +1 or -1 */ + GLfloat _BackfaceCullSign; /** +1, 0, or -1 */ GLboolean _PreferPixelFog; /* Compute fog blend factor per fragment? */ - GLboolean _AnyTextureCombine; + GLboolean _TextureCombinePrimary; GLboolean _FogEnabled; - GLenum _FogMode; /* either GL_FOG_MODE or fragment program's fog mode */ + GLboolean _DeferredTexture; - /** Fragment attributes to compute during rasterization. - * Mask of FRAG_BIT_* flags. - */ - GLbitfield _FragmentAttribs; - GLuint _MinFragmentAttrib; /**< Lowest bit set in _FragmentAttribs */ - GLuint _MaxFragmentAttrib; /**< Highest bit set in _FragmentAttribs + 1 */ + /** List/array of the fragment attributes to interpolate */ + GLuint _ActiveAttribs[FRAG_ATTRIB_MAX]; + /** Same info, but as a bitmask */ + GLbitfield _ActiveAttribMask; + /** Number of fragment attributes to interpolate */ + GLuint _NumActiveAttribs; + /** Indicates how each attrib is to be interpolated (lines/tris) */ + GLenum _InterpMode[FRAG_ATTRIB_MAX]; /* GL_FLAT or GL_SMOOTH (for now) */ /* Accum buffer temporaries. */ @@ -148,11 +214,13 @@ typedef struct /* Working values: */ GLuint StippleCounter; /**< Line stipple counter */ + GLuint PointLineFacing; GLbitfield NewState; GLuint StateChanges; GLenum Primitive; /* current primitive being drawn (ala glBegin) */ + GLboolean SpecularVertexAdd; /**< Add specular/secondary color per vertex */ - void (*InvalidateState)( GLcontext *ctx, GLbitfield new_state ); + void (*InvalidateState)( struct gl_context *ctx, GLbitfield new_state ); /** * When the NewState mask intersects these masks, we invalidate the @@ -169,9 +237,9 @@ typedef struct * Will be called when the GL state change mask intersects the above masks. */ /*@{*/ - void (*choose_point)( GLcontext * ); - void (*choose_line)( GLcontext * ); - void (*choose_triangle)( GLcontext * ); + void (*choose_point)( struct gl_context * ); + void (*choose_line)( struct gl_context * ); + void (*choose_triangle)( struct gl_context * ); /*@}*/ /** @@ -200,6 +268,7 @@ typedef struct * on some systems. */ SWspanarrays *SpanArrays; + SWspanarrays *ZoomedArrays; /**< For pixel zooming */ /** * Used to buffer N GL_POINTS, instead of rendering one by one. @@ -214,32 +283,60 @@ typedef struct /** Buffer for saving the sampled texture colors. * Needed for GL_ARB_texture_env_crossbar implementation. */ - GLchan *TexelBuffer; + GLfloat *TexelBuffer; validate_texture_image_func ValidateTextureImage; + /** State used during execution of fragment programs */ + struct gl_program_machine FragProgMachine; + } SWcontext; extern void -_swrast_validate_derived( GLcontext *ctx ); +_swrast_validate_derived( struct gl_context *ctx ); +extern void +_swrast_update_texture_samplers(struct gl_context *ctx); -#define SWRAST_CONTEXT(ctx) ((SWcontext *)ctx->swrast_context) -#define RENDER_START(SWctx, GLctx) \ - do { \ - if ((SWctx)->Driver.SpanRenderStart) { \ - (*(SWctx)->Driver.SpanRenderStart)(GLctx); \ - } \ - } while (0) +/** Return SWcontext for the given struct gl_context */ +static inline SWcontext * +SWRAST_CONTEXT(struct gl_context *ctx) +{ + return (SWcontext *) ctx->swrast_context; +} -#define RENDER_FINISH(SWctx, GLctx) \ - do { \ - if ((SWctx)->Driver.SpanRenderFinish) { \ - (*(SWctx)->Driver.SpanRenderFinish)(GLctx); \ - } \ - } while (0) +/** const version of above */ +static inline const SWcontext * +CONST_SWRAST_CONTEXT(const struct gl_context *ctx) +{ + return (const SWcontext *) ctx->swrast_context; +} + + +/** + * Called prior to framebuffer reading/writing. + * For drivers that rely on swrast for fallback rendering, this is the + * driver's opportunity to map renderbuffers and textures. + */ +static inline void +swrast_render_start(struct gl_context *ctx) +{ + SWcontext *swrast = SWRAST_CONTEXT(ctx); + if (swrast->Driver.SpanRenderStart) + swrast->Driver.SpanRenderStart(ctx); +} + + +/** Called after framebuffer reading/writing */ +static inline void +swrast_render_finish(struct gl_context *ctx) +{ + SWcontext *swrast = SWRAST_CONTEXT(ctx); + if (swrast->Driver.SpanRenderFinish) + swrast->Driver.SpanRenderFinish(ctx); +} @@ -253,6 +350,34 @@ _swrast_validate_derived( GLcontext *ctx ); +/* + * Fixed point arithmetic macros + */ +#ifndef FIXED_FRAC_BITS +#define FIXED_FRAC_BITS 11 +#endif + +#define FIXED_SHIFT FIXED_FRAC_BITS +#define FIXED_ONE (1 << FIXED_SHIFT) +#define FIXED_HALF (1 << (FIXED_SHIFT-1)) +#define FIXED_FRAC_MASK (FIXED_ONE - 1) +#define FIXED_INT_MASK (~FIXED_FRAC_MASK) +#define FIXED_EPSILON 1 +#define FIXED_SCALE ((float) FIXED_ONE) +#define FIXED_DBL_SCALE ((double) FIXED_ONE) +#define FloatToFixed(X) (IROUND((X) * FIXED_SCALE)) +#define FixedToDouble(X) ((X) * (1.0 / FIXED_DBL_SCALE)) +#define IntToFixed(I) ((I) << FIXED_SHIFT) +#define FixedToInt(X) ((X) >> FIXED_SHIFT) +#define FixedToUns(X) (((unsigned int)(X)) >> FIXED_SHIFT) +#define FixedCeil(X) (((X) + FIXED_ONE - FIXED_EPSILON) & FIXED_INT_MASK) +#define FixedFloor(X) ((X) & FIXED_INT_MASK) +#define FixedToFloat(X) ((X) * (1.0F / FIXED_SCALE)) +#define PosFloatToFixed(X) FloatToFixed(X) +#define SignedFloatToFixed(X) FloatToFixed(X) + + + /* * XXX these macros are just bandages for now in order to make * CHAN_BITS==32 compile cleanly. @@ -266,4 +391,19 @@ _swrast_validate_derived( GLcontext *ctx ); #define FixedToChan(X) FixedToInt(X) #endif + +/** + * For looping over fragment attributes in the pointe, line + * triangle rasterizers. + */ +#define ATTRIB_LOOP_BEGIN \ + { \ + GLuint a; \ + for (a = 0; a < swrast->_NumActiveAttribs; a++) { \ + const GLuint attr = swrast->_ActiveAttribs[a]; + +#define ATTRIB_LOOP_END } } + + + #endif