Cell: implement pipe_screen for cell driver
This commit is contained in:
parent
4f36cf5858
commit
f04736c8be
|
@ -29,6 +29,7 @@ SOURCES = \
|
|||
cell_state_emit.c \
|
||||
cell_state_shader.c \
|
||||
cell_pipe_state.c \
|
||||
cell_screen.c \
|
||||
cell_state_vertex.c \
|
||||
cell_spu.c \
|
||||
cell_surface.c \
|
||||
|
|
|
@ -37,9 +37,12 @@
|
|||
#include "pipe/p_format.h"
|
||||
#include "pipe/p_util.h"
|
||||
#include "pipe/p_winsys.h"
|
||||
#include "cell/common.h"
|
||||
#include "pipe/p_screen.h"
|
||||
|
||||
#include "draw/draw_context.h"
|
||||
#include "draw/draw_private.h"
|
||||
|
||||
#include "cell/common.h"
|
||||
#include "cell_clear.h"
|
||||
#include "cell_context.h"
|
||||
#include "cell_draw_arrays.h"
|
||||
|
@ -76,73 +79,24 @@ cell_is_format_supported( struct pipe_context *pipe,
|
|||
|
||||
static int cell_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 1;
|
||||
case PIPE_CAP_S3TC:
|
||||
return 0;
|
||||
case PIPE_CAP_ANISOTROPIC_FILTER:
|
||||
return 0;
|
||||
case PIPE_CAP_POINT_SPRITE:
|
||||
return 1;
|
||||
case PIPE_CAP_MAX_RENDER_TARGETS:
|
||||
return 1;
|
||||
case PIPE_CAP_OCCLUSION_QUERY:
|
||||
return 1;
|
||||
case PIPE_CAP_TEXTURE_SHADOW_MAP:
|
||||
return 1;
|
||||
case PIPE_CAP_MAX_TEXTURE_2D_LEVELS:
|
||||
return 12; /* max 2Kx2K */
|
||||
case PIPE_CAP_MAX_TEXTURE_3D_LEVELS:
|
||||
return 8; /* max 128x128x128 */
|
||||
case PIPE_CAP_MAX_TEXTURE_CUBE_LEVELS:
|
||||
return 12; /* max 2Kx2K */
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
return pipe->screen->get_param(pipe->screen, param);
|
||||
}
|
||||
|
||||
static float cell_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 255.0; /* arbitrary */
|
||||
|
||||
case PIPE_CAP_MAX_POINT_WIDTH:
|
||||
/* fall-through */
|
||||
case PIPE_CAP_MAX_POINT_WIDTH_AA:
|
||||
return 255.0; /* arbitrary */
|
||||
|
||||
case PIPE_CAP_MAX_TEXTURE_ANISOTROPY:
|
||||
return 0.0;
|
||||
|
||||
case PIPE_CAP_MAX_TEXTURE_LOD_BIAS:
|
||||
return 16.0; /* arbitrary */
|
||||
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
return pipe->screen->get_paramf(pipe->screen, param);
|
||||
}
|
||||
|
||||
|
||||
static const char *
|
||||
cell_get_name( struct pipe_context *pipe )
|
||||
{
|
||||
return "Cell";
|
||||
return pipe->screen->get_name(pipe->screen);
|
||||
}
|
||||
|
||||
static const char *
|
||||
cell_get_vendor( struct pipe_context *pipe )
|
||||
{
|
||||
return "Tungsten Graphics, Inc.";
|
||||
return pipe->screen->get_vendor(pipe->screen);
|
||||
}
|
||||
|
||||
|
||||
|
@ -174,7 +128,8 @@ cell_draw_create(struct cell_context *cell)
|
|||
|
||||
|
||||
struct pipe_context *
|
||||
cell_create_context(struct pipe_winsys *winsys, struct cell_winsys *cws)
|
||||
cell_create_context(struct pipe_screen *screen,
|
||||
struct cell_winsys *cws)
|
||||
{
|
||||
struct cell_context *cell;
|
||||
uint spu, buf;
|
||||
|
@ -187,7 +142,8 @@ cell_create_context(struct pipe_winsys *winsys, struct cell_winsys *cws)
|
|||
memset(cell, 0, sizeof(*cell));
|
||||
|
||||
cell->winsys = cws;
|
||||
cell->pipe.winsys = winsys;
|
||||
cell->pipe.winsys = screen->winsys;
|
||||
cell->pipe.screen = screen;
|
||||
cell->pipe.destroy = cell_destroy_context;
|
||||
|
||||
/* queries */
|
||||
|
|
|
@ -128,7 +128,7 @@ cell_context(struct pipe_context *pipe)
|
|||
|
||||
|
||||
extern struct pipe_context *
|
||||
cell_create_context(struct pipe_winsys *ws, struct cell_winsys *cws);
|
||||
cell_create_context(struct pipe_screen *screen, struct cell_winsys *cws);
|
||||
|
||||
extern void
|
||||
cell_vertex_shader_queue_flush(struct draw_context *draw);
|
||||
|
|
|
@ -0,0 +1,147 @@
|
|||
/**************************************************************************
|
||||
*
|
||||
* 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 "pipe/p_defines.h"
|
||||
#include "pipe/p_screen.h"
|
||||
|
||||
#include "cell_screen.h"
|
||||
#include "cell_texture.h"
|
||||
#include "cell_winsys.h"
|
||||
|
||||
|
||||
static const char *
|
||||
cell_get_vendor(struct pipe_screen *screen)
|
||||
{
|
||||
return "Tungsten Graphics, Inc.";
|
||||
}
|
||||
|
||||
|
||||
static const char *
|
||||
cell_get_name(struct pipe_screen *screen)
|
||||
{
|
||||
return "Cell";
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
cell_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 1;
|
||||
case PIPE_CAP_S3TC:
|
||||
return 0;
|
||||
case PIPE_CAP_ANISOTROPIC_FILTER:
|
||||
return 0;
|
||||
case PIPE_CAP_POINT_SPRITE:
|
||||
return 1;
|
||||
case PIPE_CAP_MAX_RENDER_TARGETS:
|
||||
return 1;
|
||||
case PIPE_CAP_OCCLUSION_QUERY:
|
||||
return 1;
|
||||
case PIPE_CAP_TEXTURE_SHADOW_MAP:
|
||||
return 1;
|
||||
case PIPE_CAP_MAX_TEXTURE_2D_LEVELS:
|
||||
return 12; /* max 2Kx2K */
|
||||
case PIPE_CAP_MAX_TEXTURE_3D_LEVELS:
|
||||
return 8; /* max 128x128x128 */
|
||||
case PIPE_CAP_MAX_TEXTURE_CUBE_LEVELS:
|
||||
return 12; /* max 2Kx2K */
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static float
|
||||
cell_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 255.0; /* arbitrary */
|
||||
|
||||
case PIPE_CAP_MAX_POINT_WIDTH:
|
||||
/* fall-through */
|
||||
case PIPE_CAP_MAX_POINT_WIDTH_AA:
|
||||
return 255.0; /* arbitrary */
|
||||
|
||||
case PIPE_CAP_MAX_TEXTURE_ANISOTROPY:
|
||||
return 0.0;
|
||||
|
||||
case PIPE_CAP_MAX_TEXTURE_LOD_BIAS:
|
||||
return 16.0; /* arbitrary */
|
||||
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
cell_destroy_screen( struct pipe_screen *screen )
|
||||
{
|
||||
FREE(screen);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Create a new pipe_screen object
|
||||
* Note: we're not presently subclassing pipe_screen (no cell_screen) but
|
||||
* that would be the place to put SPU thread/context info...
|
||||
*/
|
||||
struct pipe_screen *
|
||||
cell_create_screen(struct pipe_winsys *winsys)
|
||||
{
|
||||
struct pipe_screen *screen = CALLOC_STRUCT(pipe_screen);
|
||||
|
||||
if (!screen)
|
||||
return NULL;
|
||||
|
||||
screen->winsys = winsys;
|
||||
|
||||
screen->destroy = cell_destroy_screen;
|
||||
|
||||
screen->get_name = cell_get_name;
|
||||
screen->get_vendor = cell_get_vendor;
|
||||
screen->get_param = cell_get_param;
|
||||
screen->get_paramf = cell_get_paramf;
|
||||
|
||||
cell_init_screen_texture_funcs(screen);
|
||||
|
||||
return screen;
|
||||
}
|
|
@ -0,0 +1,41 @@
|
|||
/**************************************************************************
|
||||
*
|
||||
* 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 CELL_SCREEN_H
|
||||
#define CELL_SCREEN_H
|
||||
|
||||
|
||||
struct pipe_screen;
|
||||
struct pipe_winsys;
|
||||
|
||||
|
||||
extern struct pipe_screen *
|
||||
cell_create_screen(struct pipe_winsys *winsys);
|
||||
|
||||
|
||||
#endif /* CELL_SCREEN_H */
|
|
@ -83,18 +83,29 @@ static struct pipe_texture *
|
|||
cell_texture_create(struct pipe_context *pipe,
|
||||
const struct pipe_texture *templat)
|
||||
{
|
||||
return pipe->screen->texture_create(pipe->screen, templat);
|
||||
|
||||
}
|
||||
|
||||
static struct pipe_texture *
|
||||
cell_texture_create_screen(struct pipe_screen *screen,
|
||||
const struct pipe_texture *templat)
|
||||
{
|
||||
struct pipe_winsys *ws = screen->winsys;
|
||||
struct cell_texture *spt = CALLOC_STRUCT(cell_texture);
|
||||
if (!spt)
|
||||
return NULL;
|
||||
|
||||
spt->base = *templat;
|
||||
spt->base.refcount = 1;
|
||||
spt->base.pipe = NULL;
|
||||
spt->base.screen = screen;
|
||||
|
||||
cell_texture_layout(spt);
|
||||
|
||||
spt->buffer = pipe->winsys->buffer_create(pipe->winsys, 32,
|
||||
PIPE_BUFFER_USAGE_PIXEL,
|
||||
spt->buffer_size);
|
||||
spt->buffer = ws->buffer_create(ws, 32,
|
||||
PIPE_BUFFER_USAGE_PIXEL,
|
||||
spt->buffer_size);
|
||||
|
||||
if (!spt->buffer) {
|
||||
FREE(spt);
|
||||
|
@ -107,6 +118,14 @@ cell_texture_create(struct pipe_context *pipe,
|
|||
|
||||
static void
|
||||
cell_texture_release(struct pipe_context *pipe, struct pipe_texture **pt)
|
||||
{
|
||||
return pipe->screen->texture_release(pipe->screen, pt);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
cell_texture_release_screen(struct pipe_screen *screen,
|
||||
struct pipe_texture **pt)
|
||||
{
|
||||
if (!*pt)
|
||||
return;
|
||||
|
@ -122,7 +141,7 @@ cell_texture_release(struct pipe_context *pipe, struct pipe_texture **pt)
|
|||
DBG("%s deleting %p\n", __FUNCTION__, (void *) spt);
|
||||
*/
|
||||
|
||||
pipe_buffer_reference(pipe->winsys, &spt->buffer, NULL);
|
||||
pipe_buffer_reference(screen->winsys, &spt->buffer, NULL);
|
||||
|
||||
FREE(spt);
|
||||
}
|
||||
|
@ -146,14 +165,24 @@ cell_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 *
|
||||
cell_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 cell_texture *spt = cell_texture(pt);
|
||||
struct pipe_surface *ps;
|
||||
|
||||
ps = pipe->winsys->surface_alloc(pipe->winsys);
|
||||
ps = ws->surface_alloc(ws);
|
||||
if (ps) {
|
||||
assert(ps->refcount);
|
||||
assert(ps->winsys);
|
||||
pipe_buffer_reference(pipe->winsys, &ps->buffer, spt->buffer);
|
||||
pipe_buffer_reference(ws, &ps->buffer, spt->buffer);
|
||||
ps->format = pt->format;
|
||||
ps->cpp = pt->cpp;
|
||||
ps->width = pt->width[level];
|
||||
|
@ -270,3 +299,11 @@ cell_init_texture_functions(struct cell_context *cell)
|
|||
cell->pipe.texture_update = cell_texture_update;
|
||||
cell->pipe.get_tex_surface = cell_get_tex_surface;
|
||||
}
|
||||
|
||||
void
|
||||
cell_init_screen_texture_funcs(struct pipe_screen *screen)
|
||||
{
|
||||
screen->texture_create = cell_texture_create_screen;
|
||||
screen->texture_release = cell_texture_release_screen;
|
||||
screen->get_tex_surface = cell_get_tex_surface_screen;
|
||||
}
|
||||
|
|
|
@ -68,4 +68,8 @@ extern void
|
|||
cell_init_texture_functions(struct cell_context *cell);
|
||||
|
||||
|
||||
extern void
|
||||
cell_init_screen_texture_funcs(struct pipe_screen *screen);
|
||||
|
||||
|
||||
#endif /* CELL_TEXTURE_H */
|
||||
|
|
|
@ -36,6 +36,8 @@
|
|||
#include "glxheader.h"
|
||||
#include "xmesaP.h"
|
||||
|
||||
#undef ASSERT
|
||||
|
||||
#include "pipe/p_winsys.h"
|
||||
#include "pipe/p_format.h"
|
||||
#include "pipe/p_context.h"
|
||||
|
@ -45,6 +47,7 @@
|
|||
|
||||
#ifdef GALLIUM_CELL
|
||||
#include "cell/ppu/cell_context.h"
|
||||
#include "cell/ppu/cell_screen.h"
|
||||
#include "cell/ppu/cell_winsys.h"
|
||||
#else
|
||||
#define TILE_SIZE 32 /* avoid compilation errors */
|
||||
|
@ -448,7 +451,8 @@ xmesa_create_pipe_context(XMesaContext xmesa, uint pixelformat)
|
|||
#ifdef GALLIUM_CELL
|
||||
if (!getenv("GALLIUM_NOCELL")) {
|
||||
struct cell_winsys *cws = cell_get_winsys(pixelformat);
|
||||
pipe = cell_create_context(pws, cws);
|
||||
struct pipe_screen *screen = cell_create_screen(pws);
|
||||
pipe = cell_create_context(screen, cws);
|
||||
if (pipe)
|
||||
pipe->priv = xmesa;
|
||||
return pipe;
|
||||
|
|
Loading…
Reference in New Issue