Converted the Savage driver to the new DRI interface and enabled compilation

in the Mesa tree.
This commit is contained in:
Felix Kuehling
2004-08-22 20:31:40 +00:00
parent b1e178c69b
commit c2530b5730
8 changed files with 381 additions and 34 deletions

View File

@@ -30,8 +30,8 @@ DRIVER_DIRS = dri
PROGRAM_DIRS =
WINDOW_SYSTEM=dri
# Savage is missing. ffb, gamma, and sis are also missing because they have
# ffb, gamma, and sis are missing because they have
# not be converted to use the new interface.
#
DRI_DIRS = dri_client i810 i830 i915 mach64 mga r128 r200 radeon tdfx unichrome
DRI_DIRS = dri_client i810 i830 i915 mach64 mga r128 r200 radeon tdfx unichrome savage

View File

@@ -28,8 +28,8 @@ DRIVER_DIRS = dri
PROGRAM_DIRS =
WINDOW_SYSTEM=dri
# Savage is missing. ffb, gamma, and sis are also missing because they have
# ffb, gamma, and sis are missing because they have
# not be converted to use the new interface.
#
DRI_DIRS = dri_client i810 i830 i915 mach64 mga r128 r200 radeon tdfx unichrome
DRI_DIRS = dri_client i810 i830 i915 mach64 mga r128 r200 radeon tdfx unichrome savage

View File

@@ -28,9 +28,9 @@ DRIVER_DIRS = dri
PROGRAM_DIRS =
WINDOW_SYSTEM=dri
# Savage is missing. ffb, gamma, and sis are also missing because they have
# ffb, gamma, and sis are missing because they have
# not be converted to use the new interface. Do i810 & i830 really
# need to be included here?
#
DRI_DIRS = dri_client i810 i830 i915 mach64 mga r128 r200 radeon tdfx unichrome
DRI_DIRS = dri_client i810 i830 i915 mach64 mga r128 r200 radeon tdfx unichrome savage

View File

@@ -37,6 +37,7 @@ SHARED_INCLUDES = \
-I$(TOP)/src/mesa/drivers/dri/common \
-Iserver \
-I$(DRM_SOURCE_PATH)/shared \
-I$(DRM_SOURCE_PATH)/linux \
-I$(TOP)/include \
-I$(TOP)/include/GL/internal \
-I$(TOP)/src/mesa \

View File

@@ -0,0 +1,40 @@
# src/mesa/drivers/dri/r128/Makefile
TOP = ../../../../..
include $(TOP)/configs/current
LIBNAME = savage_dri.so
# Doesn't exist yet.
#MINIGLX_SOURCES = server/savage_dri.c
COMMON_SOURCES = \
../../common/driverfuncs.c \
../common/mm.c \
../common/utils.c \
../common/texmem.c \
../common/vblank.c \
../common/xmlconfig.c \
../common/dri_util.c \
../common/glcontextmodes.c
DRIVER_SOURCES = \
savage_xmesa.c \
savagedd.c \
savagestate.c \
savagetex.c \
savagetris.c \
savageioctl.c \
savagespan.c \
savagedma.c
C_SOURCES = \
$(COMMON_SOURCES) \
$(DRIVER_SOURCES)
ASM_SOURCES =
include ../Makefile.template
symlinks:

View File

@@ -34,6 +34,8 @@
#include "simple_list.h"
#include "utils.h"
#include "swrast/swrast.h"
#include "swrast_setup/swrast_setup.h"
#include "tnl/tnl.h"
@@ -55,6 +57,10 @@
#include "savagedma.h"
#ifdef USE_NEW_INTERFACE
static PFNGLXCREATECONTEXTMODES create_context_modes = NULL;
#endif /* USE_NEW_INTERFACE */
#ifndef SAVAGE_DEBUG
int SAVAGE_DEBUG = (0
/* | DEBUG_ALWAYS_SYNC */
@@ -88,31 +94,6 @@ savageInitDriver(__DRIscreenPrivate *sPriv)
SAVAGEDRIPtr gDRIPriv = (SAVAGEDRIPtr)sPriv->pDevPriv;
/* Check the DRI version */
{
int major, minor, patch;
if (XF86DRIQueryVersion(sPriv->display, &major, &minor, &patch)) {
if (major != 4 || minor < 0) {
__driUtilMessage("savage DRI driver expected DRI version 4.0.x but got version %d.%d.%d", major, minor, patch);
return GL_FALSE;
}
}
}
/* Check that the DDX driver version is compatible */
if (sPriv->ddxMajor != 1 ||
sPriv->ddxMinor < 0) {
__driUtilMessage("savage DRI driver expected DDX driver version 1.0.x but got version %d.%d.%d", sPriv->ddxMajor, sPriv->ddxMinor, sPriv->ddxPatch);
return GL_FALSE;
}
/* Check that the DRM driver version is compatible */
if (sPriv->drmMajor != 1 ||
sPriv->drmMinor < 0) {
__driUtilMessage("savage DRI driver expected DRM driver version 1.1.x but got version %d.%d.%d", sPriv->drmMajor, sPriv->drmMinor, sPriv->drmPatch);
return GL_FALSE;
}
/* Allocate the private area */
savageScreen = (savageScreenPrivate *)Xmalloc(sizeof(savageScreenPrivate));
if (!savageScreen)
@@ -813,8 +794,9 @@ static const struct __DriverAPIRec savageAPI = {
#ifndef DRI_NEW_INTERFACE_ONLY
/*
* This is the bootstrap function for the driver.
* This is the (old) bootstrap function for the driver.
* The __driCreateScreen name is the symbol that libGL.so fetches.
* Return: pointer to a __DRIscreenPrivate.
*/
@@ -825,6 +807,147 @@ void *__driCreateScreen(Display *dpy, int scrn, __DRIscreen *psc,
psp = __driUtilCreateScreen(dpy, scrn, psc, numConfigs, config, &savageAPI);
return (void *) psp;
}
#endif /* DRI_NEW_INTERFACE_ONLY */
#ifdef USE_NEW_INTERFACE
static __GLcontextModes *
savageFillInModes( unsigned pixel_bits, unsigned depth_bits,
unsigned stencil_bits, GLboolean have_back_buffer )
{
__GLcontextModes * modes;
__GLcontextModes * m;
unsigned num_modes;
unsigned depth_buffer_factor;
unsigned back_buffer_factor;
GLenum fb_format;
GLenum fb_type;
/* Right now GLX_SWAP_COPY_OML isn't supported, but it would be easy
* enough to add support. Basically, if a context is created with an
* fbconfig where the swap method is GLX_SWAP_COPY_OML, pageflipping
* will never be used.
*
* FK: What about drivers that don't use page flipping? Could they
* just expose GLX_SWAP_COPY_OML?
*/
static const GLenum back_buffer_modes[] = {
GLX_NONE, GLX_SWAP_UNDEFINED_OML /*, GLX_SWAP_COPY_OML */
};
uint8_t depth_bits_array[2];
uint8_t stencil_bits_array[2];
depth_bits_array[0] = depth_bits;
depth_bits_array[1] = depth_bits;
/* Just like with the accumulation buffer, always provide some modes
* with a stencil buffer. It will be a sw fallback, but some apps won't
* care about that.
*/
stencil_bits_array[0] = 0;
stencil_bits_array[1] = (stencil_bits == 0) ? 8 : stencil_bits;
depth_buffer_factor = ((depth_bits != 0) || (stencil_bits != 0)) ? 2 : 1;
back_buffer_factor = (have_back_buffer) ? 2 : 1;
num_modes = depth_buffer_factor * back_buffer_factor * 4;
if ( pixel_bits == 16 ) {
fb_format = GL_RGB;
fb_type = GL_UNSIGNED_SHORT_5_6_5;
}
else {
fb_format = GL_BGR;
fb_type = GL_UNSIGNED_INT_8_8_8_8_REV;
}
modes = (*create_context_modes)( num_modes, sizeof( __GLcontextModes ) );
m = modes;
if ( ! driFillInModes( & m, fb_format, fb_type,
depth_bits_array, stencil_bits_array, depth_buffer_factor,
back_buffer_modes, back_buffer_factor,
GLX_TRUE_COLOR ) ) {
fprintf( stderr, "[%s:%u] Error creating FBConfig!\n",
__func__, __LINE__ );
return NULL;
}
if ( ! driFillInModes( & m, fb_format, fb_type,
depth_bits_array, stencil_bits_array, depth_buffer_factor,
back_buffer_modes, back_buffer_factor,
GLX_DIRECT_COLOR ) ) {
fprintf( stderr, "[%s:%u] Error creating FBConfig!\n",
__func__, __LINE__ );
return NULL;
}
/* Mark the visual as slow if there are "fake" stencil bits.
*/
for ( m = modes ; m != NULL ; m = m->next ) {
if ( (m->stencilBits != 0) && (m->stencilBits != stencil_bits) ) {
m->visualRating = GLX_SLOW_CONFIG;
}
}
return modes;
}
/**
* This is the bootstrap function for the driver. libGL supplies all of the
* requisite information about the system, and the driver initializes itself.
* This routine also fills in the linked list pointed to by \c driver_modes
* with the \c __GLcontextModes that the driver can support for windows or
* pbuffers.
*
* \return A pointer to a \c __DRIscreenPrivate on success, or \c NULL on
* failure.
*/
void * __driCreateNewScreen( __DRInativeDisplay *dpy, int scrn, __DRIscreen *psc,
const __GLcontextModes * modes,
const __DRIversion * ddx_version,
const __DRIversion * dri_version,
const __DRIversion * drm_version,
const __DRIframebuffer * frame_buffer,
drmAddress pSAREA, int fd,
int internal_api_version,
__GLcontextModes ** driver_modes )
{
__DRIscreenPrivate *psp;
static const __DRIversion ddx_expected = { 1, 0, 0 };
static const __DRIversion dri_expected = { 4, 0, 0 };
static const __DRIversion drm_expected = { 1, 0, 0 };
if ( ! driCheckDriDdxDrmVersions2( "Savage",
dri_version, & dri_expected,
ddx_version, & ddx_expected,
drm_version, & drm_expected ) ) {
return NULL;
}
psp = __driUtilCreateNewScreen(dpy, scrn, psc, NULL,
ddx_version, dri_version, drm_version,
frame_buffer, pSAREA, fd,
internal_api_version, &savageAPI);
if ( psp != NULL ) {
create_context_modes = (PFNGLXCREATECONTEXTMODES)
glXGetProcAddress( (const GLubyte *) "__glXCreateContextModes" );
if ( create_context_modes != NULL ) {
SAVAGEDRIPtr dri_priv = (SAVAGEDRIPtr)psp->pDevPriv;
*driver_modes = savageFillInModes( dri_priv->cpp*8,
(dri_priv->cpp == 2) ? 16 : 24,
(dri_priv->cpp == 2) ? 0 : 8,
(dri_priv->backOffset != dri_priv->depthOffset) );
}
}
return (void *) psp;
}
#endif /* USE_NEW_INTERFACE */
#endif

View File

@@ -37,7 +37,6 @@ typedef struct savage_texture_object_t *savageTextureObjectPtr;
#include "xf86drm.h"
#include "drm.h"
#include "savage_drm.h"
#include "savage_sarea.h"
#include "savage_init.h"
#include "mm.h"
#include "tnl/t_vertex.h"
@@ -237,7 +236,7 @@ struct savage_context_t {
unsigned int texAge[SAVAGE_NR_TEX_HEAPS];
drm_context_t hHWContext;
drmLock *driHwLock;
drm_hw_lock_t *driHwLock;
GLuint driFd;
__DRIdrawablePrivate *driDrawable;

View File

@@ -0,0 +1,184 @@
/*
* Copyright 1998-2003 VIA Technologies, Inc. All Rights Reserved.
* Copyright 2001-2003 S3 Graphics, Inc. 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
* VIA, S3 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 __SAVAGE_DRI_H__
#define __SAVAGE_DRI_H__
#include "xf86drm.h"
#include "drm.h"
#define SAVAGE_DEFAULT_AGP_MODE 1
#define SAVAGE_MAX_AGP_MODE 4
/* Buffer are aligned on 4096 byte boundaries.
*/
/* this is used for backbuffer, depthbuffer, etc..*/
/* alignment */
#define SAVAGE_BUFFER_ALIGN 0x00000fff
typedef struct{
drm_context_t ctxOwner;
unsigned long agp_offset;
unsigned long agp_handle;
unsigned long map_handle;
int flags;
} savageAgpBuffer , *savageAgpBufferPtr;
typedef struct _server{
int reserved_map_agpstart;
int reserved_map_idx;
#if 0
int buffer_map_idx;
#endif
int sarea_priv_offset;
#if 0
int primary_size;
int warp_ucode_size;
#endif
int chipset;
int sgram; /* seems no use */
unsigned int frontOffset;
unsigned int frontPitch;
unsigned int frontbufferSize;
unsigned int backOffset;
unsigned int backPitch;
unsigned int backbufferSize;
unsigned int depthOffset;
unsigned int depthPitch;
unsigned int depthbufferSize;
unsigned int textureOffset;
int textureSize;
int logTextureGranularity;
drmRegion agp;
/* PCI mappings */
drmRegion aperture;
drmRegion registers;
drmRegion status;
/* AGP mappings */
#if 0
drmRegion warp;
drmRegion primary;
drmRegion buffers;
#endif
drmRegion agpTextures;
int logAgpTextureGranularity;
#if 0
drmBufMapPtr drmBuffers;
#endif
/*for agp*/
int numBuffer;
savageAgpBufferPtr agpBuffer;
} SAVAGEDRIServerPrivateRec, *SAVAGEDRIServerPrivatePtr;
typedef struct {
int chipset;
int width;
int height;
int mem;
int cpp;
int zpp;
int agpMode;
drm_handle_t frontbuffer;
unsigned int frontbufferSize;
unsigned int frontOffset;
unsigned int frontPitch;
unsigned int frontBitmapDesc; /*Bitmap Descriptior*/
unsigned int IsfrontTiled;
drm_handle_t backbuffer;
unsigned int backbufferSize;
unsigned int backOffset;
unsigned int backPitch;
unsigned int backBitmapDesc; /*Bitmap Descriptior*/
drm_handle_t depthbuffer;
unsigned int depthbufferSize;
unsigned int depthOffset;
unsigned int depthPitch;
unsigned int depthBitmapDesc; /*Bitmap Descriptior*/
drm_handle_t textures;
drm_handle_t xvmcSurfHandle;
unsigned int textureOffset;
unsigned int textureSize;
int logTextureGranularity;
/* Allow calculation of setup dma addresses.
*/
unsigned int agpBufferOffset;
unsigned int agpTextureOffset;
unsigned int agpTextureSize;
drmRegion agpTextures;
int logAgpTextureGranularity;
/* unsigned int mAccess;*/
drmRegion aperture;
unsigned int aperturePitch; /* in byte */
drmRegion registers;
drmRegion BCIcmdBuf;
drmRegion status;
#if 0
drmRegion primary;
drmRegion buffers;
#endif
/*For shadow status*/
unsigned long sareaPhysAddr;
unsigned int sarea_priv_offset;
int shadowStatus;
} SAVAGEDRIRec, *SAVAGEDRIPtr;
#endif