gallium: Convert state trackers to drm driver interface

This commit is contained in:
Jakob Bornecrantz 2010-05-27 00:38:30 +02:00
parent 76aed4b070
commit f9d9574913
13 changed files with 35 additions and 98 deletions

View file

@ -39,7 +39,6 @@
#include "pipe/p_context.h"
#include "pipe/p_state.h"
#include "state_tracker/st_api.h"
#include "state_tracker/drm_api.h"
struct dri_context;
struct dri_drawable;
@ -75,7 +74,6 @@ struct dri_screen
enum st_attachment_type statt);
/* gallium */
struct drm_api *api;
boolean d_depth_bits_last;
boolean sd_depth_bits_last;
boolean auto_fake_front;

View file

@ -33,7 +33,7 @@
#include "util/u_inlines.h"
#include "util/u_format.h"
#include "util/u_debug.h"
#include "state_tracker/drm_api.h"
#include "state_tracker/drm_driver.h"
#include "dri_screen.h"
#include "dri_context.h"
@ -508,7 +508,6 @@ dri2_init_screen(__DRIscreen * sPriv)
if (!screen)
return NULL;
screen->api = drm_api_create();
screen->sPriv = sPriv;
screen->fd = sPriv->fd;
screen->lookup_egl_image = dri2_lookup_egl_image;
@ -518,7 +517,7 @@ dri2_init_screen(__DRIscreen * sPriv)
sPriv->private = (void *)screen;
sPriv->extensions = dri_screen_extensions;
pscreen = screen->api->create_screen(screen->api, screen->fd);
pscreen = driver_descriptor.create_screen(screen->fd);
/* dri_init_screen_helper checks pscreen for us */
configs = dri_init_screen_helper(screen, pscreen, 32);

View file

@ -255,7 +255,6 @@ drisw_init_screen(__DRIscreen * sPriv)
if (!screen)
return NULL;
screen->api = NULL; /* not needed */
screen->sPriv = sPriv;
screen->fd = -1;
screen->allocate_textures = drisw_allocate_textures;

View file

@ -33,6 +33,7 @@
#include "egllog.h"
#include "native_kms.h"
#include "state_tracker/drm_driver.h"
static boolean
kms_surface_validate(struct native_surface *nsurf, uint attachment_mask,
@ -657,8 +658,6 @@ kms_display_destroy(struct native_display *ndpy)
if (kdpy->fd >= 0)
drmClose(kdpy->fd);
if (kdpy->api && kdpy->api->destroy)
kdpy->api->destroy(kdpy->api);
FREE(kdpy);
}
@ -674,7 +673,7 @@ kms_display_init_screen(struct native_display *ndpy)
fd = kdpy->fd;
if (fd >= 0) {
drmVersionPtr version = drmGetVersion(fd);
if (!version || strcmp(version->name, kdpy->api->driver_name)) {
if (!version || strcmp(version->name, driver_descriptor.driver_name)) {
if (version) {
_eglLog(_EGL_WARNING, "unknown driver name %s", version->name);
drmFreeVersion(version);
@ -689,7 +688,7 @@ kms_display_init_screen(struct native_display *ndpy)
drmFreeVersion(version);
}
else {
fd = drmOpen(kdpy->api->driver_name, NULL);
fd = drmOpen(driver_descriptor.driver_name, NULL);
}
if (fd < 0) {
@ -704,7 +703,7 @@ kms_display_init_screen(struct native_display *ndpy)
}
#endif
kdpy->base.screen = kdpy->api->create_screen(kdpy->api, fd);
kdpy->base.screen = driver_descriptor.create_screen(fd);
if (!kdpy->base.screen) {
_eglLog(_EGL_WARNING, "failed to create DRM screen");
drmClose(fd);
@ -724,8 +723,7 @@ static struct native_display_modeset kms_display_modeset = {
};
static struct native_display *
kms_create_display(int fd, struct native_event_handler *event_handler,
struct drm_api *api)
kms_create_display(int fd, struct native_event_handler *event_handler)
{
struct kms_display *kdpy;
@ -734,14 +732,6 @@ kms_create_display(int fd, struct native_event_handler *event_handler,
return NULL;
kdpy->event_handler = event_handler;
kdpy->api = api;
if (!kdpy->api) {
_eglLog(_EGL_WARNING, "failed to create DRM API");
FREE(kdpy);
return NULL;
}
kdpy->fd = fd;
if (!kms_display_init_screen(&kdpy->base)) {
kms_display_destroy(&kdpy->base);
@ -790,21 +780,13 @@ native_get_probe_result(struct native_probe *nprobe)
return NATIVE_PROBE_UNKNOWN;
}
/* the api is destroyed with the native display */
static struct drm_api *drm_api;
const char *
native_get_name(void)
{
static char kms_name[32];
if (!drm_api)
drm_api = drm_api_create();
if (drm_api)
util_snprintf(kms_name, sizeof(kms_name), "KMS/%s", drm_api->name);
else
util_snprintf(kms_name, sizeof(kms_name), "KMS");
util_snprintf(kms_name, sizeof(kms_name), "KMS/%s", driver_descriptor.name);
return kms_name;
}
@ -816,15 +798,8 @@ native_create_display(EGLNativeDisplayType dpy,
struct native_display *ndpy = NULL;
int fd;
if (!drm_api)
drm_api = drm_api_create();
if (drm_api) {
/* well, this makes fd 0 being ignored */
fd = (dpy != EGL_DEFAULT_DISPLAY) ?
(int) pointer_to_intptr((void *) dpy) : -1;
ndpy = kms_create_display(fd, event_handler, drm_api);
}
fd = (dpy != EGL_DEFAULT_DISPLAY) ? (int) pointer_to_intptr((void *) dpy) : -1;
ndpy = kms_create_display(fd, event_handler);
return ndpy;
}

View file

@ -32,7 +32,6 @@
#include "pipe/p_compiler.h"
#include "util/u_format.h"
#include "pipe/p_state.h"
#include "state_tracker/drm_api.h"
#include "common/native.h"
#include "common/native_helper.h"
@ -53,7 +52,6 @@ struct kms_display {
struct native_event_handler *event_handler;
int fd;
struct drm_api *api;
drmModeResPtr resources;
struct kms_config *config;

View file

@ -32,7 +32,7 @@
#include "pipe/p_screen.h"
#include "pipe/p_context.h"
#include "pipe/p_state.h"
#include "state_tracker/drm_api.h"
#include "state_tracker/drm_driver.h"
#include "egllog.h"
#include "native_x11.h"
@ -50,7 +50,6 @@ struct dri2_display {
struct native_event_handler *event_handler;
struct drm_api *api;
struct x11_screen *xscr;
int xscr_number;
const char *dri_driver;
@ -662,8 +661,6 @@ dri2_display_destroy(struct native_display *ndpy)
x11_screen_destroy(dri2dpy->xscr);
if (dri2dpy->own_dpy)
XCloseDisplay(dri2dpy->dpy);
if (dri2dpy->api && dri2dpy->api->destroy)
dri2dpy->api->destroy(dri2dpy->api);
FREE(dri2dpy);
}
@ -695,7 +692,7 @@ static boolean
dri2_display_init_screen(struct native_display *ndpy)
{
struct dri2_display *dri2dpy = dri2_display(ndpy);
const char *driver = dri2dpy->api->name;
const char *driver = driver_descriptor.name;
int fd;
if (!x11_screen_support(dri2dpy->xscr, X11_SCREEN_EXTENSION_DRI2) ||
@ -709,7 +706,7 @@ dri2_display_init_screen(struct native_display *ndpy)
if (!dri2dpy->dri_driver || !driver ||
strcmp(dri2dpy->dri_driver, driver) != 0) {
_eglLog(_EGL_WARNING, "Driver mismatch: %s != %s",
dri2dpy->dri_driver, dri2dpy->api->name);
dri2dpy->dri_driver, driver);
return FALSE;
}
@ -718,7 +715,7 @@ dri2_display_init_screen(struct native_display *ndpy)
if (fd < 0)
return FALSE;
dri2dpy->base.screen = dri2dpy->api->create_screen(dri2dpy->api, fd);
dri2dpy->base.screen = driver_descriptor.create_screen(fd);
if (!dri2dpy->base.screen) {
_eglLog(_EGL_WARNING, "failed to create DRM screen");
return FALSE;
@ -742,8 +739,7 @@ dri2_display_hash_table_compare(void *key1, void *key2)
struct native_display *
x11_create_dri2_display(EGLNativeDisplayType dpy,
struct native_event_handler *event_handler,
struct drm_api *api)
struct native_event_handler *event_handler)
{
struct dri2_display *dri2dpy;
@ -752,7 +748,6 @@ x11_create_dri2_display(EGLNativeDisplayType dpy,
return NULL;
dri2dpy->event_handler = event_handler;
dri2dpy->api = api;
dri2dpy->dpy = dpy;
if (!dri2dpy->dpy) {

View file

@ -27,15 +27,14 @@
#include "util/u_debug.h"
#include "util/u_memory.h"
#include "util/u_string.h"
#include "state_tracker/drm_api.h"
#include "egllog.h"
#include "native_x11.h"
#include "x11_screen.h"
#define X11_PROBE_MAGIC 0x11980BE /* "X11PROBE" */
#include "state_tracker/drm_driver.h"
static struct drm_api *api;
#define X11_PROBE_MAGIC 0x11980BE /* "X11PROBE" */
static void
x11_probe_destroy(struct native_probe *nprobe)
@ -96,15 +95,12 @@ native_get_probe_result(struct native_probe *nprobe)
if (!nprobe || nprobe->magic != X11_PROBE_MAGIC)
return NATIVE_PROBE_UNKNOWN;
if (!api)
api = drm_api_create();
/* this is a software driver */
if (!api)
if (!driver_descriptor.create_screen)
return NATIVE_PROBE_SUPPORTED;
/* the display does not support DRI2 or the driver mismatches */
if (!nprobe->data || strcmp(api->name, (const char *) nprobe->data) != 0)
if (!nprobe->data || strcmp(driver_descriptor.name, (const char *) nprobe->data) != 0)
return NATIVE_PROBE_FALLBACK;
return NATIVE_PROBE_EXACT;
@ -115,13 +111,7 @@ native_get_name(void)
{
static char x11_name[32];
if (!api)
api = drm_api_create();
if (api)
util_snprintf(x11_name, sizeof(x11_name), "X11/%s", api->name);
else
util_snprintf(x11_name, sizeof(x11_name), "X11");
util_snprintf(x11_name, sizeof(x11_name), "X11/%s", driver_descriptor.name);
return x11_name;
}
@ -133,12 +123,12 @@ native_create_display(EGLNativeDisplayType dpy,
struct native_display *ndpy = NULL;
boolean force_sw;
if (!api)
api = drm_api_create();
force_sw = debug_get_bool_option("EGL_SOFTWARE", FALSE);
if (api && !force_sw) {
ndpy = x11_create_dri2_display(dpy, event_handler, api);
if (!driver_descriptor.create_screen)
force_sw = TRUE;
if (!force_sw) {
ndpy = x11_create_dri2_display(dpy, event_handler);
}
if (!ndpy) {

View file

@ -26,7 +26,6 @@
#ifndef _NATIVE_X11_H_
#define _NATIVE_X11_H_
#include "state_tracker/drm_api.h"
#include "common/native.h"
struct native_display *
@ -35,7 +34,6 @@ x11_create_ximage_display(EGLNativeDisplayType dpy,
struct native_display *
x11_create_dri2_display(EGLNativeDisplayType dpy,
struct native_event_handler *event_handler,
struct drm_api *api);
struct native_event_handler *event_handler);
#endif /* _NATIVE_X11_H_ */

View file

@ -50,6 +50,7 @@
#include <X11/extensions/dpms.h>
#endif
#include "state_tracker/drm_driver.h"
#include "util/u_inlines.h"
#include "util/u_rect.h"

View file

@ -42,6 +42,8 @@
#include "util/u_format.h"
#include "state_tracker/drm_driver.h"
/* Make all the #if cases in the code esier to read */
#ifndef DRI2INFOREC_VERSION
#define DRI2INFOREC_VERSION 1

View file

@ -51,6 +51,7 @@
#include <pciaccess.h>
#include "state_tracker/drm_driver.h"
#include "pipe/p_context.h"
#include "xorg_tracker.h"
#include "xorg_winsys.h"
@ -267,18 +268,12 @@ drv_init_drm(ScrnInfoPtr pScrn)
);
ms->api = drm_api_create();
ms->fd = drmOpen(ms->api ? ms->api->driver_name : NULL, BusID);
ms->fd = drmOpen(driver_descriptor.driver_name, BusID);
xfree(BusID);
if (ms->fd >= 0)
return TRUE;
if (ms->api && ms->api->destroy)
ms->api->destroy(ms->api);
ms->api = NULL;
return FALSE;
}
@ -290,10 +285,6 @@ drv_close_drm(ScrnInfoPtr pScrn)
{
modesettingPtr ms = modesettingPTR(pScrn);
if (ms->api && ms->api->destroy)
ms->api->destroy(ms->api);
ms->api = NULL;
drmClose(ms->fd);
ms->fd = -1;
@ -314,17 +305,10 @@ drv_init_resource_management(ScrnInfoPtr pScrn)
if (ms->screen || ms->kms)
return TRUE;
if (ms->api) {
ms->screen = ms->api->create_screen(ms->api, ms->fd);
ms->screen = driver_descriptor.create_screen(ms->fd);
if (ms->screen)
return TRUE;
if (ms->api->destroy)
ms->api->destroy(ms->api);
ms->api = NULL;
}
if (ms->screen)
return TRUE;
#ifdef HAVE_LIBKMS
if (!kms_create(ms->fd, &ms->kms))
@ -430,7 +414,6 @@ drv_pre_init(ScrnInfoPtr pScrn, int flags)
}
ms->fd = -1;
ms->api = NULL;
if (!drv_init_drm(pScrn))
return FALSE;

View file

@ -49,7 +49,6 @@
#include "pipe/p_screen.h"
#include "util/u_inlines.h"
#include "util/u_debug.h"
#include "state_tracker/drm_api.h"
#define DRV_ERROR(msg) xf86DrvMsg(pScrn->scrnIndex, X_ERROR, msg);
@ -123,7 +122,6 @@ typedef struct _modesettingRec
struct kms_bo *root_bo;
/* gallium */
struct drm_api *api;
struct pipe_screen *screen;
struct pipe_context *ctx;
boolean d_depth_bits_last;

View file

@ -4,6 +4,7 @@ include $(TOP)/configs/current
LIBNAME = radeon_drv.so
C_SOURCES = \
radeon_target.c \
radeon_xorg.c
DRIVER_DEFINES = \