Clean up warnings in r300 code by making some symbols static, adding prototypes
[mesa.git] / src / mesa / drivers / dri / r300 / r300_context.c
index bcfbe2b6c8d8e817167c8fc494f3a39d2f152645..9100ac2565b7345743023fd9b1f44dc13ec80ed4 100644 (file)
@@ -40,6 +40,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 #include "matrix.h"
 #include "extensions.h"
 #include "state.h"
+#include "bufferobj.h"
 
 #include "swrast/swrast.h"
 #include "swrast_setup/swrast_setup.h"
@@ -66,6 +67,53 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 int future_hw_tcl_on=0;
 int hw_tcl_on=0;
 
+#if 1
+#define need_GL_ARB_multisample
+#define need_GL_ARB_texture_compression
+#define need_GL_EXT_blend_minmax
+#include "extension_helper.h"
+
+static const struct dri_extension card_extensions[] = {
+  {"GL_ARB_multisample",               GL_ARB_multisample_functions},
+  {"GL_ARB_multitexture",              NULL},
+  {"GL_ARB_texture_border_clamp",      NULL},
+  {"GL_ARB_texture_compression",       GL_ARB_texture_compression_functions},
+/* disable until we support it, fixes a few things in ut2004 */
+/*     {"GL_ARB_texture_cube_map",     NULL}, */
+  {"GL_ARB_texture_env_add",           NULL},
+  {"GL_ARB_texture_env_combine",       NULL},
+  {"GL_ARB_texture_env_crossbar",      NULL},
+  {"GL_ARB_texture_env_dot3",          NULL},
+  {"GL_ARB_texture_mirrored_repeat",   NULL},
+  {"GL_ARB_vertex_buffer_object",      NULL},
+  {"GL_ARB_vertex_program",            NULL},
+#if USE_ARB_F_P == 1
+  {"GL_ARB_fragment_program",          NULL},
+#endif
+  {"GL_EXT_blend_equation_separate",   NULL},
+  {"GL_EXT_blend_func_separate",       NULL},
+  {"GL_EXT_blend_minmax",              GL_EXT_blend_minmax_functions},
+  {"GL_EXT_blend_subtract",            NULL},
+  {"GL_EXT_secondary_color",           NULL},
+  {"GL_EXT_stencil_wrap",              NULL},
+  {"GL_EXT_texture_edge_clamp",                NULL},
+  {"GL_EXT_texture_env_combine",       NULL},
+  {"GL_EXT_texture_env_dot3",          NULL},
+  {"GL_EXT_texture_filter_anisotropic",        NULL},
+  {"GL_EXT_texture_lod_bias",          NULL},
+  {"GL_EXT_texture_mirror_clamp",      NULL},
+  {"GL_EXT_texture_rectangle",         NULL},
+  {"GL_ATI_texture_env_combine3",      NULL},
+  {"GL_ATI_texture_mirror_once",       NULL},
+  {"GL_MESA_pack_invert",              NULL},
+  {"GL_MESA_ycbcr_texture",            NULL},
+  {"GL_NV_blend_square",               NULL},
+  {"GL_NV_vertex_program",             NULL},
+  {"GL_SGIS_generate_mipmap",          NULL},
+  {NULL,                               NULL}
+};
+
+#else
 /* Extension strings exported by the R300 driver.
  */
 static const char *const card_extensions[] = {
@@ -73,14 +121,18 @@ static const char *const card_extensions[] = {
        "GL_ARB_multitexture",
        "GL_ARB_texture_border_clamp",
        "GL_ARB_texture_compression",
-       "GL_ARB_texture_cube_map",
+/* disable until we support it, fixes a few things in ut2004 */
+/*     "GL_ARB_texture_cube_map", */
        "GL_ARB_texture_env_add",
        "GL_ARB_texture_env_combine",
+       "GL_ARB_texture_env_crossbar",
        "GL_ARB_texture_env_dot3",
        "GL_ARB_texture_mirrored_repeat",
        "GL_ARB_vertex_buffer_object",
        "GL_ARB_vertex_program",
-       //"GL_ARB_fragment_program",
+#if USE_ARB_F_P == 1
+       "GL_ARB_fragment_program",
+#endif
        "GL_EXT_blend_equation_separate",
        "GL_EXT_blend_func_separate",
        "GL_EXT_blend_minmax",
@@ -103,7 +155,7 @@ static const char *const card_extensions[] = {
        "GL_SGIS_generate_mipmap",
        NULL
 };
-
+#endif
 extern struct tnl_pipeline_stage _r300_render_stage;
 extern struct tnl_pipeline_stage _r300_tcl_stage;
 
@@ -140,34 +192,55 @@ static const struct tnl_pipeline_stage *r300_pipeline[] = {
        0,
 };
 
-void r300BufferData(GLcontext *ctx, GLenum target, GLsizeiptrARB size,
+static void r300BufferData(GLcontext *ctx, GLenum target, GLsizeiptrARB size,
                const GLvoid *data, GLenum usage, struct gl_buffer_object *obj)
 {
        r300ContextPtr rmesa = R300_CONTEXT(ctx);
        drm_radeon_mem_alloc_t alloc;
        int offset, ret;
 
+       /* Free previous buffer */
+       if (obj->OnCard) {
+               drm_radeon_mem_free_t memfree;
+               
+               memfree.region = RADEON_MEM_REGION_GART;
+               memfree.region_offset = (char *)obj->Data - (char *)rmesa->radeon.radeonScreen->gartTextures.map;
+
+               ret = drmCommandWrite(rmesa->radeon.radeonScreen->driScreen->fd,
+                                     DRM_RADEON_FREE, &memfree, sizeof(memfree));
+
+               if (ret) {
+                       WARN_ONCE("Failed to free GART memroy!\n");
+               }
+               obj->OnCard = GL_FALSE;
+       }
+       
        alloc.region = RADEON_MEM_REGION_GART;
        alloc.alignment = 4;
        alloc.size = size;
        alloc.region_offset = &offset;
 
        ret = drmCommandWriteRead( rmesa->radeon.dri.fd, DRM_RADEON_ALLOC, &alloc, sizeof(alloc));
-       if(ret){
+       if (ret) {
                WARN_ONCE("Ran out of GART memory!\n");
+               obj->Data = NULL;
                _mesa_buffer_data(ctx, target, size, data, usage, obj);
                return ;
        }
        obj->Data = ((char *)rmesa->radeon.radeonScreen->gartTextures.map) + offset;
-       memcpy(obj->Data, data, size);
+       
+       if (data)
+               memcpy(obj->Data, data, size);
+       
        obj->Size = size;
        obj->Usage = usage;
+       obj->OnCard = GL_TRUE;
 #if 0
        fprintf(stderr, "allocated %d bytes at %p, offset=%d\n", size, obj->Data, offset);
 #endif
 }
 
-void r300DeleteBuffer(GLcontext *ctx, struct gl_buffer_object *obj)
+static void r300DeleteBuffer(GLcontext *ctx, struct gl_buffer_object *obj)
 {
        r300ContextPtr rmesa = R300_CONTEXT(ctx);
        
@@ -226,10 +299,13 @@ GLboolean r300CreateContext(const __GLcontextModes * glVisual,
        r300InitStateFuncs(&functions);
        r300InitTextureFuncs(&functions);
        r300InitShaderFuncs(&functions);
-       if(hw_tcl_on){
+       
+#if 0 /* Needs various Mesa changes... */
+       if (hw_tcl_on) {
                functions.BufferData = r300BufferData;
                functions.DeleteBuffer = r300DeleteBuffer;
        }
+#endif
        
        if (!radeonInitContext(&r300->radeon, &functions,
                               glVisual, driContextPriv, sharedContextPrivate)) {
@@ -318,12 +394,6 @@ GLboolean r300CreateContext(const __GLcontextModes * glVisual,
        _tnl_allow_pixel_fog(ctx, GL_FALSE);
        _tnl_allow_vertex_fog(ctx, GL_TRUE);
 
-#if 0
-       //if(driQueryOptionb(&rmesa->optionCache, "arb_vertex_program"))
-               _mesa_enable_extension( ctx, "GL_ARB_vertex_program");
-       //if(driQueryOptionb(&rmesa->optionCache, "nv_vertex_program"))
-               _mesa_enable_extension( ctx, "GL_NV_vertex_program");
-#endif
        /* currently bogus data */
        ctx->Const.MaxVertexProgramInstructions=VSF_MAX_FRAGMENT_LENGTH;
        ctx->Const.MaxVertexProgramAttribs=16; // r420
@@ -331,7 +401,20 @@ GLboolean r300CreateContext(const __GLcontextModes * glVisual,
        ctx->Const.MaxVertexProgramLocalParams=256; // r420
        ctx->Const.MaxVertexProgramEnvParams=256; // r420
        ctx->Const.MaxVertexProgramAddressRegs=1;
-               
+
+#if USE_ARB_F_P
+       ctx->Const.MaxFragmentProgramTemps = PFS_NUM_TEMP_REGS;
+       ctx->Const.MaxFragmentProgramAttribs = 11; /* copy i915... */
+       ctx->Const.MaxFragmentProgramLocalParams = PFS_NUM_CONST_REGS;
+       ctx->Const.MaxFragmentProgramEnvParams = PFS_NUM_CONST_REGS;
+       ctx->Const.MaxFragmentProgramAluInstructions = PFS_MAX_ALU_INST;
+       ctx->Const.MaxFragmentProgramTexInstructions = PFS_MAX_TEX_INST;
+       ctx->Const.MaxFragmentProgramInstructions = PFS_MAX_ALU_INST+PFS_MAX_TEX_INST;
+       ctx->Const.MaxFragmentProgramTexIndirections = PFS_MAX_TEX_INDIRECT;
+       ctx->Const.MaxFragmentProgramAddressRegs = 0; /* and these are?? */
+       ctx->_MaintainTexEnvProgram = GL_TRUE;
+#endif
+
        driInitExtensions(ctx, card_extensions, GL_TRUE);
        
        radeonInitSpanFuncs(ctx);
@@ -373,8 +456,10 @@ void r300DestroyContext(__DRIcontextPrivate * driContextPriv)
        r300ContextPtr r300 = (r300ContextPtr) driContextPriv->driverPrivate;
        radeonContextPtr current = ctx ? RADEON_CONTEXT(ctx) : NULL;
 
-       fprintf(stderr, "Destroying context !\n");
-       sleep(1);
+       if (RADEON_DEBUG & DEBUG_DRI) {
+               fprintf(stderr, "Destroying context !\n");
+       }
+
        /* check if we're deleting the currently bound context */
        if (&r300->radeon == current) {
                radeonFlush(r300->radeon.glCtx);