summaryrefslogtreecommitdiff
path: root/src/gallium/targets
diff options
context:
space:
mode:
Diffstat (limited to 'src/gallium/targets')
-rw-r--r--src/gallium/targets/egl-gdi/egl-static.c86
-rw-r--r--src/gallium/targets/egl/Makefile3
-rw-r--r--src/gallium/targets/egl/egl.c99
-rw-r--r--src/gallium/targets/egl/egl.h44
-rw-r--r--src/gallium/targets/egl/st_GL.c20
-rw-r--r--src/gallium/targets/egl/st_GLESv1_CM.c6
-rw-r--r--src/gallium/targets/egl/st_GLESv2.c6
-rw-r--r--src/gallium/targets/egl/st_OpenVG.c2
-rw-r--r--src/gallium/targets/libgl-xlib/Makefile13
-rw-r--r--src/gallium/targets/libgl-xlib/SConscript4
-rw-r--r--src/gallium/targets/libgl-xlib/xlib.c12
11 files changed, 144 insertions, 151 deletions
diff --git a/src/gallium/targets/egl-gdi/egl-static.c b/src/gallium/targets/egl-gdi/egl-static.c
index 4655d79117..da6e5ce339 100644
--- a/src/gallium/targets/egl-gdi/egl-static.c
+++ b/src/gallium/targets/egl-gdi/egl-static.c
@@ -35,27 +35,6 @@
static struct st_api *stapis[ST_API_COUNT];
-static uint
-get_api_mask(void)
-{
- uint api_mask = 0x0;
-
-#if FEATURE_GL
- api_mask |= 1 << ST_API_OPENGL;
-#endif
-#if FEATURE_ES1
- api_mask |= 1 << ST_API_OPENGL_ES1;
-#endif
-#if FEATURE_ES2
- api_mask |= 1 << ST_API_OPENGL_ES2;
-#endif
-#if FEATURE_VG
- api_mask |= 1 << ST_API_OPENVG;
-#endif
-
- return api_mask;
-}
-
static struct st_api *
get_st_api(enum st_api_type api)
{
@@ -66,28 +45,18 @@ get_st_api(enum st_api_type api)
return stapi;
switch (api) {
-#if FEATURE_GL
- case ST_API_OPENGL:
- stapi = st_gl_api_create();
- break;
-#endif
-#if FEATURE_ES1
- case ST_API_OPENGL_ES1:
- stapi = st_gl_api_create_es1();
- break;
-#endif
-#if FEATURE_ES2
- case ST_API_OPENGL_ES2:
- stapi = st_gl_api_create_es2();
- break;
+#if FEATURE_GL || FEATURE_ES1 || FEATURE_ES2
+ case ST_API_OPENGL:
+ stapi = st_gl_api_create();
+ break;
#endif
#if FEATURE_VG
- case ST_API_OPENVG:
- stapi = (struct st_api *) vg_api_get();
- break;
+ case ST_API_OPENVG:
+ stapi = (struct st_api *) vg_api_get();
+ break;
#endif
- default:
- break;
+ default:
+ break;
}
stapis[api] = stapi;
@@ -96,27 +65,9 @@ get_st_api(enum st_api_type api)
}
static struct st_api *
-guess_gl_api(void)
+guess_gl_api(enum st_profile_type profile)
{
- struct st_api *stapi = NULL;
-
-#if FEATURE_GL
- stapi = get_st_api(ST_API_OPENGL);
- if (stapi)
- return stapi;
-#endif
-#if FEATURE_ES1
- stapi = get_st_api(ST_API_OPENGL_ES1);
- if (stapi)
- return stapi;
-#endif
-#if FEATURE_ES2
- stapi = get_st_api(ST_API_OPENGL_ES2);
- if (stapi)
- return stapi;
-#endif
-
- return stapi;
+ return get_st_api(ST_API_OPENGL);
}
static struct pipe_screen *
@@ -140,10 +91,19 @@ create_sw_screen(struct sw_winsys *ws)
static void
init_loader(struct egl_g3d_loader *loader)
{
- if (loader->api_mask)
- return;
+#if FEATURE_GL
+ loader->profile_masks[ST_API_OPENGL] |= ST_PROFILE_DEFAULT_MASK;
+#endif
+#if FEATURE_ES1
+ loader->profile_masks[ST_API_OPENGL] |= ST_PROFILE_OPENGL_ES1_MASK;
+#endif
+#if FEATURE_ES2
+ loader->profile_masks[ST_API_OPENGL] |= ST_PROFILE_OPENGL_ES2_MASK;
+#endif
+#if FEATURE_VG
+ loader->profile_masks[ST_API_OPENVG] |= ST_PROFILE_DEFAULT_MASK;
+#endif
- loader->api_mask = get_api_mask();
loader->get_st_api = get_st_api;
loader->guess_gl_api = guess_gl_api;
loader->create_drm_screen = create_drm_screen;
diff --git a/src/gallium/targets/egl/Makefile b/src/gallium/targets/egl/Makefile
index 2784fd0d10..78f7241199 100644
--- a/src/gallium/targets/egl/Makefile
+++ b/src/gallium/targets/egl/Makefile
@@ -126,7 +126,8 @@ endif
# OpenGL state tracker
GL_CPPFLAGS := -I$(TOP)/src/mesa $(API_DEFINES)
-GL_SYS := $(DRI_LIB_DEPS) -L$(TOP)/$(LIB_DIR) -l$(GL_LIB)
+# do not link to $(GL_LIB) as the it supports GLES too
+GL_SYS := $(DRI_LIB_DEPS)
GL_LIBS := $(TOP)/src/mesa/libmesagallium.a
# OpenGL ES 1.x state tracker
diff --git a/src/gallium/targets/egl/egl.c b/src/gallium/targets/egl/egl.c
index a573b21217..786d5d1105 100644
--- a/src/gallium/targets/egl/egl.c
+++ b/src/gallium/targets/egl/egl.c
@@ -37,6 +37,8 @@
#include "state_tracker/drm_driver.h"
#include "common/egl_g3d_loader.h"
+#include "egl.h"
+
struct egl_g3d_loader egl_g3d_loader;
static struct st_module {
@@ -98,6 +100,8 @@ load_st_module(struct st_module *stmod,
{
struct st_api *(*create_api)(void);
+ _eglLog(_EGL_DEBUG, "searching for st module %s", name);
+
stmod->name = loader_strdup(name);
if (stmod->name)
_eglSearchPathForEach(dlopen_st_module_cb, (void *) stmod);
@@ -180,14 +184,11 @@ load_pipe_module(struct pipe_module *pmod, const char *name)
}
}
- if (!pmod->drmdd)
- pmod->name = NULL;
-
return (pmod->drmdd != NULL);
}
static struct st_api *
-get_st_api(enum st_api_type api)
+get_st_api_full(enum st_api_type api, enum st_profile_type profile)
{
struct st_module *stmod = &st_modules[api];
const char *names[8], *symbol;
@@ -199,17 +200,19 @@ get_st_api(enum st_api_type api)
switch (api) {
case ST_API_OPENGL:
symbol = ST_CREATE_OPENGL_SYMBOL;
- names[count++] = "GL";
- break;
- case ST_API_OPENGL_ES1:
- symbol = ST_CREATE_OPENGL_ES1_SYMBOL;
- names[count++] = "GLESv1_CM";
- names[count++] = "GL";
- break;
- case ST_API_OPENGL_ES2:
- symbol = ST_CREATE_OPENGL_ES2_SYMBOL;
- names[count++] = "GLESv2";
- names[count++] = "GL";
+ switch (profile) {
+ case ST_PROFILE_OPENGL_ES1:
+ names[count++] = "GLESv1_CM";
+ names[count++] = "GL";
+ break;
+ case ST_PROFILE_OPENGL_ES2:
+ names[count++] = "GLESv2";
+ names[count++] = "GL";
+ break;
+ default:
+ names[count++] = "GL";
+ break;
+ }
break;
case ST_API_OPENVG:
symbol = ST_CREATE_OPENVG_SYMBOL;
@@ -230,7 +233,7 @@ get_st_api(enum st_api_type api)
}
if (!stmod->stapi) {
- EGLint level = (egl_g3d_loader.api_mask & (1 << api)) ?
+ EGLint level = (egl_g3d_loader.profile_masks[api]) ?
_EGL_WARNING : _EGL_DEBUG;
_eglLog(level, "unable to load " ST_PREFIX "%s" UTIL_DL_EXT, names[0]);
}
@@ -241,50 +244,31 @@ get_st_api(enum st_api_type api)
}
static struct st_api *
-guess_gl_api(void)
+get_st_api(enum st_api_type api)
{
- struct st_api *stapi;
- int gl_apis[] = {
- ST_API_OPENGL,
- ST_API_OPENGL_ES1,
- ST_API_OPENGL_ES2,
- -1
- };
- int i, api = -1;
-
- /* determine the api from the loaded libraries */
- for (i = 0; gl_apis[i] != -1; i++) {
- if (st_modules[gl_apis[i]].stapi) {
- api = gl_apis[i];
- break;
- }
- }
- /* determine the api from the linked libraries */
- if (api == -1) {
- struct util_dl_library *self = util_dl_open(NULL);
+ enum st_profile_type profile = ST_PROFILE_DEFAULT;
+
+ /* determine the profile from the linked libraries */
+ if (api == ST_API_OPENGL) {
+ struct util_dl_library *self;
+ self = util_dl_open(NULL);
if (self) {
- if (util_dl_get_proc_address(self, "glColor4d"))
- api = ST_API_OPENGL;
- else if (util_dl_get_proc_address(self, "glColor4x"))
- api = ST_API_OPENGL_ES1;
+ if (util_dl_get_proc_address(self, "glColor4x"))
+ profile = ST_PROFILE_OPENGL_ES1;
else if (util_dl_get_proc_address(self, "glShaderBinary"))
- api = ST_API_OPENGL_ES2;
+ profile = ST_PROFILE_OPENGL_ES2;
util_dl_close(self);
}
}
- stapi = (api != -1) ? get_st_api(api) : NULL;
- if (!stapi) {
- for (i = 0; gl_apis[i] != -1; i++) {
- api = gl_apis[i];
- stapi = get_st_api(api);
- if (stapi)
- break;
- }
- }
+ return get_st_api_full(api, profile);
+}
- return stapi;
+static struct st_api *
+guess_gl_api(enum st_profile_type profile)
+{
+ return get_st_api_full(ST_API_OPENGL, profile);
}
static struct pipe_module *
@@ -318,7 +302,7 @@ static struct pipe_screen *
create_drm_screen(const char *name, int fd)
{
struct pipe_module *pmod = get_pipe_module(name);
- return (pmod && pmod->drmdd->create_screen) ?
+ return (pmod && pmod->drmdd && pmod->drmdd->create_screen) ?
pmod->drmdd->create_screen(fd) : NULL;
}
@@ -333,23 +317,20 @@ create_sw_screen(struct sw_winsys *ws)
static const struct egl_g3d_loader *
loader_init(void)
{
- uint api_mask = 0x0;
-
/* TODO detect at runtime? */
#if FEATURE_GL
- api_mask |= 1 << ST_API_OPENGL;
+ egl_g3d_loader.profile_masks[ST_API_OPENGL] |= ST_PROFILE_DEFAULT_MASK;
#endif
#if FEATURE_ES1
- api_mask |= 1 << ST_API_OPENGL_ES1;
+ egl_g3d_loader.profile_masks[ST_API_OPENGL] |= ST_PROFILE_OPENGL_ES1_MASK;
#endif
#if FEATURE_ES2
- api_mask |= 1 << ST_API_OPENGL_ES2;
+ egl_g3d_loader.profile_masks[ST_API_OPENGL] |= ST_PROFILE_OPENGL_ES2_MASK;
#endif
#if FEATURE_VG
- api_mask |= 1 << ST_API_OPENVG;
+ egl_g3d_loader.profile_masks[ST_API_OPENVG] |= ST_PROFILE_DEFAULT_MASK;
#endif
- egl_g3d_loader.api_mask = api_mask;
egl_g3d_loader.get_st_api = get_st_api;
egl_g3d_loader.guess_gl_api = guess_gl_api;
egl_g3d_loader.create_drm_screen = create_drm_screen;
diff --git a/src/gallium/targets/egl/egl.h b/src/gallium/targets/egl/egl.h
new file mode 100644
index 0000000000..5fd0678540
--- /dev/null
+++ b/src/gallium/targets/egl/egl.h
@@ -0,0 +1,44 @@
+/*
+ * Mesa 3-D graphics library
+ * Version: 7.9
+ *
+ * Copyright (C) 2010 LunarG Inc.
+ *
+ * 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 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 AUTHORS OR COPYRIGHT HOLDERS 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.
+ *
+ * Authors:
+ * Chia-I Wu <olv@lunarg.com>
+ */
+
+#ifndef _EGL_H_
+#define _EGL_H_
+
+#include "pipe/p_compiler.h"
+#include "state_tracker/st_api.h"
+
+#define ST_CREATE_OPENGL_SYMBOL "st_api_create_OpenGL"
+#define ST_CREATE_OPENVG_SYMBOL "st_api_create_OpenVG"
+
+PUBLIC struct st_api *
+st_api_create_OpenGL(void);
+
+PUBLIC struct st_api *
+st_api_create_OpenVG(void);
+
+#endif /* _EGL_H_ */
diff --git a/src/gallium/targets/egl/st_GL.c b/src/gallium/targets/egl/st_GL.c
index 17b7bf9d48..c1df844aa4 100644
--- a/src/gallium/targets/egl/st_GL.c
+++ b/src/gallium/targets/egl/st_GL.c
@@ -1,26 +1,8 @@
#include "state_tracker/st_gl_api.h"
-#include "state_tracker/st_api.h"
+#include "egl.h"
-#if FEATURE_GL
PUBLIC struct st_api *
st_api_create_OpenGL(void)
{
return st_gl_api_create();
}
-#endif
-
-#if FEATURE_ES1
-PUBLIC struct st_api *
-st_api_create_OpenGL_ES1(void)
-{
- return st_gl_api_create_es1();
-}
-#endif
-
-#if FEATURE_ES2
-PUBLIC struct st_api *
-st_api_create_OpenGL_ES2(void)
-{
- return st_gl_api_create_es2();
-}
-#endif
diff --git a/src/gallium/targets/egl/st_GLESv1_CM.c b/src/gallium/targets/egl/st_GLESv1_CM.c
index c1652d5131..c1df844aa4 100644
--- a/src/gallium/targets/egl/st_GLESv1_CM.c
+++ b/src/gallium/targets/egl/st_GLESv1_CM.c
@@ -1,8 +1,8 @@
-#include "state_tracker/st_api.h"
#include "state_tracker/st_gl_api.h"
+#include "egl.h"
PUBLIC struct st_api *
-st_api_create_OpenGL_ES1(void)
+st_api_create_OpenGL(void)
{
- return st_gl_api_create_es1();
+ return st_gl_api_create();
}
diff --git a/src/gallium/targets/egl/st_GLESv2.c b/src/gallium/targets/egl/st_GLESv2.c
index 9c26989008..c1df844aa4 100644
--- a/src/gallium/targets/egl/st_GLESv2.c
+++ b/src/gallium/targets/egl/st_GLESv2.c
@@ -1,8 +1,8 @@
-#include "state_tracker/st_api.h"
#include "state_tracker/st_gl_api.h"
+#include "egl.h"
PUBLIC struct st_api *
-st_api_create_OpenGL_ES2(void)
+st_api_create_OpenGL(void)
{
- return st_gl_api_create_es2();
+ return st_gl_api_create();
}
diff --git a/src/gallium/targets/egl/st_OpenVG.c b/src/gallium/targets/egl/st_OpenVG.c
index e29a237479..d0bf4dbae9 100644
--- a/src/gallium/targets/egl/st_OpenVG.c
+++ b/src/gallium/targets/egl/st_OpenVG.c
@@ -1,5 +1,5 @@
-#include "state_tracker/st_api.h"
#include "vg_api.h"
+#include "egl.h"
PUBLIC struct st_api *
st_api_create_OpenVG(void)
diff --git a/src/gallium/targets/libgl-xlib/Makefile b/src/gallium/targets/libgl-xlib/Makefile
index fe0541543a..79e516a2a7 100644
--- a/src/gallium/targets/libgl-xlib/Makefile
+++ b/src/gallium/targets/libgl-xlib/Makefile
@@ -25,7 +25,8 @@ INCLUDE_DIRS = \
$(X11_CFLAGS)
DEFINES += \
- -DGALLIUM_SOFTPIPE
+ -DGALLIUM_SOFTPIPE \
+ -DGALLIUM_GALAHAD
#-DGALLIUM_CELL will be defined by the config */
XLIB_TARGET_SOURCES = \
@@ -50,6 +51,14 @@ LIBS = \
$(CELL_SPU_LIB) \
+# LLVM
+ifeq ($(MESA_LLVM),1)
+DEFINES += -DGALLIUM_LLVMPIPE
+GL_LIB_DEPS += $(LLVM_LIBS)
+LDFLAGS += $(LLVM_LDFLAGS)
+endif
+
+
.SUFFIXES : .cpp
.c.o:
@@ -68,7 +77,7 @@ $(TOP)/$(LIB_DIR)/gallium:
# Make the libGL.so library
$(TOP)/$(LIB_DIR)/gallium/$(GL_LIB_NAME): $(XLIB_TARGET_OBJECTS) $(LIBS) Makefile
$(TOP)/bin/mklib -o $(GL_LIB) \
- -linker "$(CXX)" \
+ -linker "$(CXX)" -ldflags '$(LDFLAGS)' \
-major $(GL_MAJOR) -minor $(GL_MINOR) -patch $(GL_TINY) \
-cplusplus \
-install $(TOP)/$(LIB_DIR)/gallium \
diff --git a/src/gallium/targets/libgl-xlib/SConscript b/src/gallium/targets/libgl-xlib/SConscript
index 88e216a65b..27b562e1d5 100644
--- a/src/gallium/targets/libgl-xlib/SConscript
+++ b/src/gallium/targets/libgl-xlib/SConscript
@@ -48,6 +48,10 @@ if True:
env.Append(CPPDEFINES = 'GALLIUM_SOFTPIPE')
env.Prepend(LIBS = [softpipe])
+if True:
+ env.Append(CPPDEFINES = 'GALLIUM_GALAHAD')
+ env.Prepend(LIBS = [galahad])
+
if env['llvm']:
env.Append(CPPDEFINES = 'GALLIUM_LLVMPIPE')
env.Tool('udis86')
diff --git a/src/gallium/targets/libgl-xlib/xlib.c b/src/gallium/targets/libgl-xlib/xlib.c
index 5a9c80c856..5914f63352 100644
--- a/src/gallium/targets/libgl-xlib/xlib.c
+++ b/src/gallium/targets/libgl-xlib/xlib.c
@@ -78,6 +78,10 @@ st_api_create_OpenGL()
#include "cell/ppu/cell_public.h"
#endif
+#ifdef GALLIUM_GALAHAD
+#include "galahad/glhd_public.h"
+#endif
+
static struct pipe_screen *
swrast_create_screen(struct sw_winsys *winsys)
{
@@ -112,6 +116,14 @@ swrast_create_screen(struct sw_winsys *winsys)
screen = softpipe_create_screen( winsys );
#endif
+#if defined(GALLIUM_GALAHAD)
+ if (screen) {
+ struct pipe_screen *galahad_screen = galahad_screen_create(screen);
+ if (galahad_screen)
+ screen = galahad_screen;
+ }
+#endif
+
return screen;
}