@@ -0,0 +1,73 @@ | |||
/************************************************************************** | |||
* | |||
* Copyright 2010 VMware, 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 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 | |||
* THE COPYRIGHT HOLDERS, AUTHORS 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. | |||
* | |||
* The above copyright notice and this permission notice (including the | |||
* next paragraph) shall be included in all copies or substantial portions | |||
* of the Software. | |||
* | |||
* | |||
**************************************************************************/ | |||
#include "target-helpers/soft_screen.h" | |||
#include "softpipe/sp_public.h" | |||
#include "llvmpipe/lp_public.h" | |||
#include "cell/ppu/cell_public.h" | |||
#include "util/u_debug.h" | |||
/** | |||
* Choose and create a software renderer screen. | |||
*/ | |||
struct pipe_screen * | |||
gallium_soft_create_screen( struct sw_winsys *winsys ) | |||
{ | |||
const char *default_driver = NULL; | |||
const char *driver = NULL; | |||
struct pipe_screen *screen = NULL; | |||
#if defined(GALLIUM_CELL) | |||
default_driver = "cell"; | |||
#elif defined(GALLIUM_LLVMPIPE) | |||
default_driver = "llvmpipe"; | |||
#elif defined(GALLIUM_SOFTPIPE) | |||
default_driver = "softpipe"; | |||
#else | |||
default_driver = ""; | |||
#endif | |||
driver = debug_get_option("GALLIUM_DRIVER", default_driver); | |||
#if defined(GALLIUM_CELL) | |||
if (screen == NULL && strcmp(driver, "cell") == 0) | |||
screen = cell_create_screen( winsys ); | |||
#endif | |||
#if defined(GALLIUM_LLVMPIPE) | |||
if (screen == NULL && strcmp(driver, "llvmpipe") == 0) | |||
screen = llvmpipe_create_screen( winsys ); | |||
#endif | |||
#if defined(GALLIUM_SOFTPIPE) | |||
if (screen == NULL) | |||
screen = softpipe_create_screen( winsys ); | |||
#endif | |||
return screen; | |||
} |
@@ -0,0 +1,12 @@ | |||
#ifndef SOFT_SCREEN_HELPER_H | |||
#define SOFT_SCREEN_HELPER_H | |||
#include "pipe/p_compiler.h" | |||
struct pipe_screen; | |||
struct sw_winsys; | |||
struct pipe_screen * | |||
gallium_soft_create_screen( struct sw_winsys *winsys ); | |||
#endif |
@@ -27,6 +27,7 @@ DEFINES += \ | |||
#-DGALLIUM_CELL will be defined by the config */ | |||
XLIB_TARGET_SOURCES = \ | |||
soft_screen.c \ | |||
xlib.c | |||
@@ -0,0 +1 @@ | |||
../../auxiliary/target-helpers/soft_screen.c |
@@ -36,6 +36,7 @@ | |||
#include "softpipe/sp_public.h" | |||
#include "llvmpipe/lp_public.h" | |||
#include "cell/ppu/cell_public.h" | |||
#include "target-helpers/soft_screen.h" | |||
#include "target-helpers/wrap_screen.h" | |||
#include "xm_public.h" | |||
@@ -63,8 +64,6 @@ PUBLIC const struct st_module st_module_OpenGL = { | |||
static struct pipe_screen * | |||
swrast_xlib_create_screen( Display *display ) | |||
{ | |||
const char *default_driver; | |||
const char *driver; | |||
struct sw_winsys *winsys; | |||
struct pipe_screen *screen = NULL; | |||
@@ -75,36 +74,7 @@ swrast_xlib_create_screen( Display *display ) | |||
if (winsys == NULL) | |||
return NULL; | |||
#if defined(GALLIUM_CELL) | |||
default_driver = "cell"; | |||
#elif defined(GALLIUM_LLVMPIPE) | |||
default_driver = "llvmpipe"; | |||
#elif defined(GALLIUM_SOFTPIPE) | |||
default_driver = "softpipe"; | |||
#else | |||
default_driver = ""; | |||
#endif | |||
driver = debug_get_option("GALLIUM_DRIVER", default_driver); | |||
/* Create a software rasterizer on top of that winsys: | |||
*/ | |||
#if defined(GALLIUM_CELL) | |||
if (screen == NULL && | |||
strcmp(driver, "cell") == 0) | |||
screen = cell_create_screen( winsys ); | |||
#endif | |||
#if defined(GALLIUM_LLVMPIPE) | |||
if (screen == NULL && | |||
strcmp(driver, "llvmpipe") == 0) | |||
screen = llvmpipe_create_screen( winsys ); | |||
#endif | |||
#if defined(GALLIUM_SOFTPIPE) | |||
if (screen == NULL) | |||
screen = softpipe_create_screen( winsys ); | |||
#endif | |||
screen = gallium_soft_create_screen( winsys ); | |||
if (screen == NULL) | |||
goto fail; |
@@ -4,11 +4,12 @@ include $(TOP)/configs/current | |||
LIBNAME = swdrm | |||
C_SOURCES = \ | |||
soft_screen.c \ | |||
wrapper_sw_winsys.c \ | |||
sw_drm_api.c | |||
LIBRARY_INCLUDES = | |||
LIBRARY_DEFINES = | |||
LIBRARY_DEFINES = -DGALLIUM_SOFTPIPE | |||
include ../../../Makefile.template |
@@ -0,0 +1 @@ | |||
../../../auxiliary/target-helpers/soft_screen.c |
@@ -24,8 +24,11 @@ | |||
**********************************************************/ | |||
#include "pipe/p_screen.h" | |||
#include "util/u_memory.h" | |||
#include "softpipe/sp_public.h" | |||
#include "target-helpers/soft_screen.h" | |||
#include "state_tracker/sw_winsys.h" | |||
#include "state_tracker/drm_api.h" | |||
#include "wrapper_sw_winsys.h" | |||
#include "sw_drm_api.h" | |||
@@ -60,14 +63,35 @@ sw_drm_create_screen(struct drm_api *_api, int drmFD, | |||
{ | |||
struct sw_drm_api *swapi = sw_drm_api(_api); | |||
struct drm_api *api = swapi->api; | |||
struct sw_winsys *sww; | |||
struct pipe_screen *screen; | |||
struct sw_winsys *sww = NULL; | |||
struct pipe_screen *screen = NULL; | |||
struct pipe_screen *soft_screen = NULL; | |||
screen = api->create_screen(api, drmFD, arg); | |||
if (screen == NULL) | |||
goto fail; | |||
sww = wrapper_sw_winsys_warp_pipe_screen(screen); | |||
if (sww == NULL) | |||
goto fail; | |||
soft_screen = gallium_soft_create_screen(sww); | |||
if (soft_screen == NULL) | |||
goto fail; | |||
return soft_screen; | |||
fail: | |||
if (soft_screen) | |||
soft_screen->destroy(soft_screen); | |||
if (sww) | |||
sww->destroy(sww); | |||
if (screen) | |||
screen->destroy(screen); | |||
return softpipe_create_screen(sww); | |||
return NULL; | |||
} | |||
static void |