#include "matrix.h"
#include "extensions.h"
#include "state.h"
+#include "bufferobj.h"
#include "swrast/swrast.h"
#include "swrast_setup/swrast_setup.h"
#include "utils.h"
#include "xmlpool.h" /* for symbolic values of enum-type options */
+/* hw_tcl_on derives from future_hw_tcl_on when its safe to change it. */
+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[] = {
"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",
"GL_SGIS_generate_mipmap",
NULL
};
-
+#endif
extern struct tnl_pipeline_stage _r300_render_stage;
+extern struct tnl_pipeline_stage _r300_tcl_stage;
static const struct tnl_pipeline_stage *r300_pipeline[] = {
/* Try and go straight to t&l
*/
-// &_r300_tcl_stage,
+ &_r300_tcl_stage,
/* Catch any t&l fallbacks
*/
&_tnl_fog_coordinate_stage,
&_tnl_texgen_stage,
&_tnl_texture_transform_stage,
- //&_tnl_vertex_program_stage,
+ &_tnl_vertex_program_stage,
/* Try again to go to tcl?
* - no good for asymmetric-twoside (do with multipass)
0,
};
+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) {
+ 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;
+
+ 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
+}
+
+static void r300DeleteBuffer(GLcontext *ctx, struct gl_buffer_object *obj)
+{
+ r300ContextPtr rmesa = R300_CONTEXT(ctx);
+
+ if(r300IsGartMemory(rmesa, obj->Data, obj->Size)){
+ drm_radeon_mem_free_t memfree;
+ int ret;
+
+ 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->Data = NULL;
+ }
+ _mesa_delete_buffer_object(ctx, obj);
+}
+
/* Create the device specific rendering context.
*/
GLboolean r300CreateContext(const __GLcontextModes * glVisual,
r300InitIoctlFuncs(&functions);
r300InitStateFuncs(&functions);
r300InitTextureFuncs(&functions);
- r300InitVertexProgFuncs(&functions);
+ r300InitShaderFuncs(&functions);
+
+#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)) {
_ac_CreateContext(ctx);
_tnl_CreateContext(ctx);
_swsetup_CreateContext(ctx);
+ _swsetup_Wakeup(ctx);
_ae_create_context(ctx);
/* Install the customized pipeline:
_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=128;
- ctx->Const.MaxVertexProgramAttribs=64;
- ctx->Const.MaxVertexProgramTemps=64;
- ctx->Const.MaxVertexProgramLocalParams=64;
- ctx->Const.MaxVertexProgramEnvParams=64;
- ctx->Const.MaxVertexProgramAddressRegs=8;
-
+ ctx->Const.MaxVertexProgramInstructions=VSF_MAX_FRAGMENT_LENGTH;
+ ctx->Const.MaxVertexProgramAttribs=16; // r420
+ ctx->Const.MaxVertexProgramTemps=VSF_MAX_FRAGMENT_TEMPS;
+ 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);
tcl_mode = driQueryOptioni(&r300->radeon.optionCache, "tcl_mode");
if (driQueryOptionb(&r300->radeon.optionCache, "no_rast")) {
fprintf(stderr, "disabling 3D acceleration\n");
+#if R200_MERGED
FALLBACK(&r300->radeon, RADEON_FALLBACK_DISABLE, 1);
+#endif
}
if (tcl_mode == DRI_CONF_TCL_SW ||
!(r300->radeon.radeonScreen->chipset & RADEON_CHIPSET_TCL)) {
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);
- _mesa_make_current2(NULL, NULL, NULL);
+ _mesa_make_current(NULL, NULL, NULL);
}
/* Free r300 context resources */