gallium/i965: implement pipe_screen for i965 driver (untested)

This commit is contained in:
Brian 2008-02-27 10:17:57 -07:00
parent 17188e4d5a
commit 03b5267f52
9 changed files with 338 additions and 96 deletions

View File

@ -6,6 +6,7 @@ LIBNAME = i965simple
C_SOURCES = \
brw_blit.c \
brw_flush.c \
brw_screen.c \
brw_strings.c \
brw_surface.c \
brw_cc.c \

View File

@ -40,15 +40,14 @@
#include "pipe/p_winsys.h"
#include "pipe/p_context.h"
#include "pipe/p_util.h"
#include "pipe/p_screen.h"
/***************************************
* Mesa's Driver Functions
***************************************/
#ifndef BRW_DEBUG
int BRW_DEBUG = (0);
#endif
static void brw_destroy(struct pipe_context *pipe)
{
struct brw_context *brw = brw_context(pipe);
@ -56,6 +55,7 @@ static void brw_destroy(struct pipe_context *pipe)
FREE(brw);
}
static void brw_clear(struct pipe_context *pipe, struct pipe_surface *ps,
unsigned clearValue)
{
@ -74,64 +74,17 @@ static void brw_clear(struct pipe_context *pipe, struct pipe_surface *ps,
static int
brw_get_param(struct pipe_context *pipe, int param)
{
switch (param) {
case PIPE_CAP_MAX_TEXTURE_IMAGE_UNITS:
return 8;
case PIPE_CAP_NPOT_TEXTURES:
return 1;
case PIPE_CAP_TWO_SIDED_STENCIL:
return 1;
case PIPE_CAP_GLSL:
return 0;
case PIPE_CAP_S3TC:
return 0;
case PIPE_CAP_ANISOTROPIC_FILTER:
return 0;
case PIPE_CAP_POINT_SPRITE:
return 0;
case PIPE_CAP_MAX_RENDER_TARGETS:
return 1;
case PIPE_CAP_OCCLUSION_QUERY:
return 0;
case PIPE_CAP_TEXTURE_SHADOW_MAP:
return 1;
case PIPE_CAP_MAX_TEXTURE_2D_LEVELS:
return 11; /* max 1024x1024 */
case PIPE_CAP_MAX_TEXTURE_3D_LEVELS:
return 8; /* max 128x128x128 */
case PIPE_CAP_MAX_TEXTURE_CUBE_LEVELS:
return 11; /* max 1024x1024 */
default:
return 0;
}
return pipe->screen->get_param(pipe->screen, param);
}
static float
brw_get_paramf(struct pipe_context *pipe, int param)
{
switch (param) {
case PIPE_CAP_MAX_LINE_WIDTH:
/* fall-through */
case PIPE_CAP_MAX_LINE_WIDTH_AA:
return 7.5;
case PIPE_CAP_MAX_POINT_WIDTH:
/* fall-through */
case PIPE_CAP_MAX_POINT_WIDTH_AA:
return 255.0;
case PIPE_CAP_MAX_TEXTURE_ANISOTROPY:
return 4.0;
case PIPE_CAP_MAX_TEXTURE_LOD_BIAS:
return 16.0;
default:
return 0;
}
return pipe->screen->get_paramf(pipe->screen, param);
}
static boolean
brw_is_format_supported( struct pipe_context *pipe,
enum pipe_format format, uint type )
@ -200,22 +153,23 @@ brw_is_format_supported( struct pipe_context *pipe,
struct pipe_context *brw_create(struct pipe_winsys *pipe_winsys,
struct pipe_context *brw_create(struct pipe_screen *screen,
struct brw_winsys *brw_winsys,
unsigned pci_id)
{
struct brw_context *brw;
pipe_winsys->printf(pipe_winsys,
"%s: creating brw_context with pci id 0x%x\n",
__FUNCTION__, pci_id);
screen->winsys->printf(screen->winsys,
"%s: creating brw_context with pci id 0x%x\n",
__FUNCTION__, pci_id);
brw = CALLOC_STRUCT(brw_context);
if (brw == NULL)
return NULL;
brw->winsys = brw_winsys;
brw->pipe.winsys = pipe_winsys;
brw->pipe.winsys = screen->winsys;
brw->pipe.screen = screen;
brw->pipe.destroy = brw_destroy;
brw->pipe.is_format_supported = brw_is_format_supported;

View File

@ -0,0 +1,168 @@
/**************************************************************************
*
* Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas.
* 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 TUNGSTEN 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.
*
**************************************************************************/
#include "pipe/p_util.h"
#include "pipe/p_winsys.h"
#include "brw_context.h"
#include "brw_screen.h"
#include "brw_tex_layout.h"
static const char *
brw_get_vendor( struct pipe_screen *screen )
{
return "Tungsten Graphics, Inc.";
}
static const char *
brw_get_name( struct pipe_screen *screen )
{
static char buffer[128];
const char *chipset;
switch (brw_screen(screen)->pci_id) {
case PCI_CHIP_I965_Q:
chipset = "Intel(R) 965Q";
break;
case PCI_CHIP_I965_G:
case PCI_CHIP_I965_G_1:
chipset = "Intel(R) 965G";
break;
case PCI_CHIP_I965_GM:
chipset = "Intel(R) 965GM";
break;
case PCI_CHIP_I965_GME:
chipset = "Intel(R) 965GME/GLE";
break;
default:
chipset = "unknown";
break;
}
sprintf(buffer, "i965 (chipset: %s)", chipset);
return buffer;
}
static int
brw_get_param(struct pipe_screen *screen, int param)
{
switch (param) {
case PIPE_CAP_MAX_TEXTURE_IMAGE_UNITS:
return 8;
case PIPE_CAP_NPOT_TEXTURES:
return 1;
case PIPE_CAP_TWO_SIDED_STENCIL:
return 1;
case PIPE_CAP_GLSL:
return 0;
case PIPE_CAP_S3TC:
return 0;
case PIPE_CAP_ANISOTROPIC_FILTER:
return 0;
case PIPE_CAP_POINT_SPRITE:
return 0;
case PIPE_CAP_MAX_RENDER_TARGETS:
return 1;
case PIPE_CAP_OCCLUSION_QUERY:
return 0;
case PIPE_CAP_TEXTURE_SHADOW_MAP:
return 1;
case PIPE_CAP_MAX_TEXTURE_2D_LEVELS:
return 11; /* max 1024x1024 */
case PIPE_CAP_MAX_TEXTURE_3D_LEVELS:
return 8; /* max 128x128x128 */
case PIPE_CAP_MAX_TEXTURE_CUBE_LEVELS:
return 11; /* max 1024x1024 */
default:
return 0;
}
}
static float
brw_get_paramf(struct pipe_screen *screen, int param)
{
switch (param) {
case PIPE_CAP_MAX_LINE_WIDTH:
/* fall-through */
case PIPE_CAP_MAX_LINE_WIDTH_AA:
return 7.5;
case PIPE_CAP_MAX_POINT_WIDTH:
/* fall-through */
case PIPE_CAP_MAX_POINT_WIDTH_AA:
return 255.0;
case PIPE_CAP_MAX_TEXTURE_ANISOTROPY:
return 4.0;
case PIPE_CAP_MAX_TEXTURE_LOD_BIAS:
return 16.0;
default:
return 0;
}
}
static void
brw_destroy_screen( struct pipe_screen *screen )
{
FREE(screen);
}
/**
* Create a new brw_screen object
*/
struct pipe_screen *
brw_create_screen(struct pipe_winsys *winsys, uint pci_id)
{
struct brw_screen *brwscreen = CALLOC_STRUCT(brw_screen);
if (!brwscreen)
return NULL;
brwscreen->pci_id = pci_id;
brwscreen->screen.winsys = winsys;
brwscreen->screen.destroy = brw_destroy_screen;
brwscreen->screen.get_name = brw_get_name;
brwscreen->screen.get_vendor = brw_get_vendor;
brwscreen->screen.get_param = brw_get_param;
brwscreen->screen.get_paramf = brw_get_paramf;
brw_init_screen_texture_funcs(&brwscreen->screen);
return &brwscreen->screen;
}

View File

@ -0,0 +1,68 @@
/**************************************************************************
*
* Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas.
* 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 TUNGSTEN 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 BRW_SCREEN_H
#define BRW_SCREEN_H
#include "pipe/p_screen.h"
#ifdef __cplusplus
extern "C" {
#endif
/**
* Subclass of pipe_screen
*/
struct brw_screen
{
struct pipe_screen screen;
uint pci_id;
};
/** cast wrapper */
static INLINE struct brw_screen *
brw_screen(struct pipe_screen *pscreen)
{
return (struct brw_screen *) pscreen;
}
extern struct pipe_screen *
brw_create_screen(struct pipe_winsys *winsys, uint pci_id);
#ifdef __cplusplus
}
#endif
#endif /* BRW_SCREEN_H */

View File

@ -28,39 +28,18 @@
#include "brw_context.h"
#include "brw_reg.h"
#include "pipe/p_screen.h"
static const char *brw_get_vendor( struct pipe_context *pipe )
{
return "Tungsten Graphics, Inc.";
return pipe->screen->get_vendor(pipe->screen);
}
static const char *brw_get_name( struct pipe_context *pipe )
{
static char buffer[128];
const char *chipset;
switch (brw_context(pipe)->pci_id) {
case PCI_CHIP_I965_Q:
chipset = "Intel(R) 965Q";
break;
case PCI_CHIP_I965_G:
case PCI_CHIP_I965_G_1:
chipset = "Intel(R) 965G";
break;
case PCI_CHIP_I965_GM:
chipset = "Intel(R) 965GM";
break;
case PCI_CHIP_I965_GME:
chipset = "Intel(R) 965GME/GLE";
break;
default:
chipset = "unknown";
break;
}
sprintf(buffer, "i965 (chipset: %s)", chipset);
return buffer;
return pipe->screen->get_name(pipe->screen);
}

View File

@ -71,8 +71,6 @@ static unsigned minify( unsigned d )
}
static boolean brw_miptree_layout(struct pipe_context *, struct brw_texture *);
static void intel_miptree_set_image_offset(struct brw_texture *tex,
unsigned level,
unsigned img,
@ -199,7 +197,7 @@ static void i945_miptree_layout_2d(struct brw_texture *tex)
}
}
static boolean brw_miptree_layout(struct pipe_context *pipe, struct brw_texture *tex)
static boolean brw_miptree_layout(struct brw_texture *tex)
{
struct pipe_texture *pt = &tex->base;
/* XXX: these vary depending on image format:
@ -304,17 +302,26 @@ static struct pipe_texture *
brw_texture_create(struct pipe_context *pipe,
const struct pipe_texture *templat)
{
return pipe->screen->texture_create(pipe->screen, templat);
}
static struct pipe_texture *
brw_texture_create_screen(struct pipe_screen *screen,
const struct pipe_texture *templat)
{
struct pipe_winsys *ws = screen->winsys;
struct brw_texture *tex = CALLOC_STRUCT(brw_texture);
if (tex) {
tex->base = *templat;
tex->base.refcount = 1;
if (brw_miptree_layout(pipe, tex))
tex->buffer = pipe->winsys->buffer_create(pipe->winsys, 64,
PIPE_BUFFER_USAGE_PIXEL,
tex->pitch * tex->base.cpp *
tex->total_height);
if (brw_miptree_layout(tex))
tex->buffer = ws->buffer_create(ws, 64,
PIPE_BUFFER_USAGE_PIXEL,
tex->pitch * tex->base.cpp *
tex->total_height);
if (!tex->buffer) {
FREE(tex);
@ -328,6 +335,14 @@ brw_texture_create(struct pipe_context *pipe,
static void
brw_texture_release(struct pipe_context *pipe, struct pipe_texture **pt)
{
pipe->screen->texture_release(pipe->screen, pt);
}
static void
brw_texture_release_screen(struct pipe_screen *screen,
struct pipe_texture **pt)
{
if (!*pt)
return;
@ -337,6 +352,7 @@ brw_texture_release(struct pipe_context *pipe, struct pipe_texture **pt)
__FUNCTION__, (void *) *pt, (*pt)->refcount - 1);
*/
if (--(*pt)->refcount <= 0) {
struct pipe_winsys *ws = screen->winsys;
struct brw_texture *tex = (struct brw_texture *)*pt;
uint i;
@ -344,7 +360,7 @@ brw_texture_release(struct pipe_context *pipe, struct pipe_texture **pt)
DBG("%s deleting %p\n", __FUNCTION__, (void *) tex);
*/
pipe_buffer_reference(pipe->winsys, &tex->buffer, NULL);
pipe_buffer_reference(ws, &tex->buffer, NULL);
for (i = 0; i < PIPE_MAX_TEXTURE_LEVELS; i++)
if (tex->image_offset[i])
@ -371,6 +387,16 @@ brw_get_tex_surface(struct pipe_context *pipe,
struct pipe_texture *pt,
unsigned face, unsigned level, unsigned zslice)
{
return pipe->screen->get_tex_surface(pipe->screen, pt, face, level, zslice);
}
static struct pipe_surface *
brw_get_tex_surface_screen(struct pipe_screen *screen,
struct pipe_texture *pt,
unsigned face, unsigned level, unsigned zslice)
{
struct pipe_winsys *ws = screen->winsys;
struct brw_texture *tex = (struct brw_texture *)pt;
struct pipe_surface *ps;
unsigned offset; /* in bytes */
@ -388,11 +414,11 @@ brw_get_tex_surface(struct pipe_context *pipe,
assert(zslice == 0);
}
ps = pipe->winsys->surface_alloc(pipe->winsys);
ps = ws->surface_alloc(ws);
if (ps) {
assert(ps->format);
assert(ps->refcount);
pipe_buffer_reference(pipe->winsys, &ps->buffer, tex->buffer);
pipe_buffer_reference(ws, &ps->buffer, tex->buffer);
ps->format = pt->format;
ps->cpp = pt->cpp;
ps->width = pt->width[level];
@ -412,3 +438,13 @@ brw_init_texture_functions(struct brw_context *brw)
brw->pipe.texture_update = brw_texture_update;
brw->pipe.get_tex_surface = brw_get_tex_surface;
}
void
brw_init_screen_texture_funcs(struct pipe_screen *screen)
{
screen->texture_create = brw_texture_create_screen;
screen->texture_release = brw_texture_release_screen;
screen->get_tex_surface = brw_get_tex_surface_screen;
}

View File

@ -1,12 +1,44 @@
/*
Copyright (C) Intel Corp. 2006. All Rights Reserved.
Intel funded Tungsten Graphics (http://www.tungstengraphics.com) to
develop this 3D driver.
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, sublicense, 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 NONINFRINGEMENT.
IN NO EVENT SHALL THE COPYRIGHT OWNER(S) 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 BRW_TEX_LAYOUT_H
#define BRW_TEX_LAYOUT_H
struct brw_context;
struct pipe_screen;
extern void
brw_init_texture_functions(struct brw_context *brw);
extern void
brw_init_screen_texture_funcs(struct pipe_screen *screen);
#endif

View File

@ -53,6 +53,8 @@
struct pipe_buffer;
struct pipe_fence_handle;
struct pipe_winsys;
struct pipe_screen;
/* The pipe driver currently understands the following chipsets:
*/
@ -181,7 +183,7 @@ struct brw_winsys {
#define BRW_BUFFER_USAGE_LIT_VERTEX (PIPE_BUFFER_USAGE_CUSTOM << 0)
struct pipe_context *brw_create(struct pipe_winsys *,
struct pipe_context *brw_create(struct pipe_screen *,
struct brw_winsys *,
unsigned pci_id);

View File

@ -40,6 +40,7 @@
#include "pipe/p_util.h"
#include "pipe/p_inlines.h"
#include "i965simple/brw_winsys.h"
#include "i965simple/brw_screen.h"
#include "brw_aub.h"
#include "xm_winsys_aub.h"
@ -565,6 +566,7 @@ struct pipe_context *
xmesa_create_i965simple( struct pipe_winsys *winsys )
{
struct aub_brw_winsys *iws = CALLOC_STRUCT( aub_brw_winsys );
struct pipe_screen *screen = brw_create_screen(winsys, 0/* XXX pci_id */);
/* Fill in this struct with callbacks that i965simple will need to
* communicate with the window system, buffer manager, etc.
@ -583,7 +585,7 @@ xmesa_create_i965simple( struct pipe_winsys *winsys )
/* Create the i965simple context:
*/
return brw_create( winsys,
return brw_create( screen,
&iws->winsys,
0 );
}