;;
xr600)
GALLIUM_DRIVERS_DIRS="$GALLIUM_DRIVERS_DIRS r600"
- gallium_check_st "r600/drm" "dri-r600" "" "" "xvmc-r600" "vdpau-r600" "va-r600"
+ gallium_check_st "r600/drm radeon/drm" "dri-r600" "" "" "xvmc-r600" "vdpau-r600" "va-r600"
;;
xnouveau)
PKG_CHECK_MODULES([NOUVEAU], [libdrm_nouveau >= $LIBDRM_NOUVEAU_REQUIRED])
#include "r600_resource.h"
#include "r600_shader.h"
#include "r600_pipe.h"
+#include "../../winsys/r600/drm/r600_drm_public.h"
/*
* pipe_context
return TRUE;
}
-struct pipe_screen *r600_screen_create(struct radeon *radeon)
+struct pipe_screen *r600_screen_create(struct radeon_winsys *rw)
{
struct r600_screen *rscreen;
+ struct radeon *radeon = r600_drm_winsys_create(rw);
rscreen = CALLOC_STRUCT(r600_screen);
if (rscreen == NULL) {
#ifndef R600_PIPE_H
#define R600_PIPE_H
+#include "../../winsys/radeon/drm/radeon_winsys.h"
+
#include <pipe/p_state.h>
#include <pipe/p_screen.h>
#include <pipe/p_context.h>
struct r600_pipe_state *states[R600_PIPE_NSTATES];
struct r600_context ctx;
struct r600_vertex_element *vertex_elements;
- struct r600_pipe_resource_state fs_resource[PIPE_MAX_ATTRIBS];
+ struct r600_pipe_resource_state fs_resource[PIPE_MAX_ATTRIBS];
struct pipe_framebuffer_state framebuffer;
struct pipe_index_buffer index_buffer;
unsigned cb_target_mask;
#ifndef R600_PUBLIC_H
#define R600_PUBLIC_H
-struct pipe_screen *r600_screen_create(struct radeon *radeon);
+struct radeon_winsys;
+
+struct pipe_screen *r600_screen_create(struct radeon_winsys *rw);
#endif
$(TOP)/src/gallium/drivers/r600/libr600.a \
$(TOP)/src/gallium/state_trackers/dri/drm/libdridrm.a \
$(TOP)/src/gallium/winsys/r600/drm/libr600winsys.a \
+ $(TOP)/src/gallium/winsys/radeon/drm/libradeonwinsys.a \
$(TOP)/src/gallium/drivers/trace/libtrace.a \
$(TOP)/src/gallium/drivers/rbug/librbug.a \
$(TOP)/src/gallium/drivers/noop/libnoop.a
#include "state_tracker/drm_driver.h"
#include "target-helpers/inline_debug_helper.h"
-#include "r600/drm/r600_drm_public.h"
+#include "radeon/drm/radeon_drm_public.h"
#include "r600/r600_public.h"
static struct pipe_screen *create_screen(int fd)
{
- struct radeon *radeon;
+ struct radeon_winsys *radeon;
struct pipe_screen *screen;
- radeon = r600_drm_winsys_create(fd);
+ radeon = radeon_drm_winsys_create(fd);
if (!radeon)
return NULL;
# r300
ifneq ($(findstring radeon/drm,$(GALLIUM_WINSYS_DIRS)),)
+ifneq ($(findstring r300,$(GALLIUM_DRIVERS_DIRS)),)
egl_CPPFLAGS += -D_EGL_PIPE_R300=1
egl_LIBS += \
$(TOP)/src/gallium/winsys/radeon/drm/libradeonwinsys.a \
$(TOP)/src/gallium/drivers/r300/libr300.a
endif
+endif
# r600
ifneq ($(findstring r600/drm,$(GALLIUM_WINSYS_DIRS)),)
egl_CPPFLAGS += -D_EGL_PIPE_R600=1
egl_LIBS += \
$(TOP)/src/gallium/winsys/r600/drm/libr600winsys.a \
+ $(TOP)/src/gallium/winsys/radeon/drm/libradeonwinsys.a \
$(TOP)/src/gallium/drivers/r600/libr600.a
endif
#include "radeon/drm/radeon_drm_public.h"
#include "r300/r300_public.h"
/* for r600 */
-#include "r600/drm/r600_drm_public.h"
#include "r600/r600_public.h"
/* for vmwgfx */
#include "svga/drm/svga_drm_public.h"
pipe_r600_create_screen(int fd)
{
#if _EGL_PIPE_R600
- struct radeon *rw;
+ struct radeon_winsys *rw;
struct pipe_screen *screen;
- rw = r600_drm_winsys_create(fd);
+ rw = radeon_drm_winsys_create(fd);
if (!rw)
return NULL;
# r600 pipe driver
r600_LIBS = \
$(TOP)/src/gallium/winsys/r600/drm/libr600winsys.a \
+ $(TOP)/src/gallium/winsys/radeon/drm/libradeonwinsys.a \
$(TOP)/src/gallium/drivers/r600/libr600.a
# vmwgfx pipe driver
$(TOP)/src/gallium/winsys/svga/drm/libsvgadrm.a \
$(TOP)/src/gallium/drivers/svga/libsvga.a
+
+
# LLVM
ifeq ($(MESA_LLVM),1)
-pipe_LIBS += $(TOP)/src/gallium/drivers/llvmpipe/libllvmpipe.a
pipe_SYS += $(LLVM_LIBS)
pipe_LDFLAGS += $(LLVM_LDFLAGS)
endif
+ifneq ($(findstring llvmpipe,$(GALLIUM_DRIVERS_DIRS)),)
+pipe_LIBS += $(TOP)/src/gallium/drivers/llvmpipe/libllvmpipe.a
+endif
+
# determine the targets/sources
pipe_TARGETS =
pipe_SOURCES =
endif
ifneq ($(findstring radeon/drm,$(GALLIUM_WINSYS_DIRS)),)
+ifneq ($(findstring r300,$(GALLIUM_DRIVERS_DIRS)),)
pipe_TARGETS += $(PIPE_PREFIX)r300.so
pipe_SOURCES += pipe_r300.c
endif
+endif
ifneq ($(findstring r600/drm,$(GALLIUM_WINSYS_DIRS)),)
pipe_TARGETS += $(PIPE_PREFIX)r600.so
-
#include "state_tracker/drm_driver.h"
#include "target-helpers/inline_debug_helper.h"
-#include "r600/drm/r600_drm_public.h"
+#include "radeon/drm/radeon_drm_public.h"
#include "r600/r600_public.h"
static struct pipe_screen *
create_screen(int fd)
{
- struct radeon *rw;
+ struct radeon_winsys *rw;
struct pipe_screen *screen;
- rw = r600_drm_winsys_create(fd);
+ rw = radeon_drm_winsys_create(fd);
if (!rw)
return NULL;
$(TOP)/src/gallium/drivers/r600/libr600.a \
$(TOP)/src/gallium/winsys/g3dvl/dri/libvldri.a \
$(TOP)/src/gallium/winsys/r600/drm/libr600winsys.a \
+ $(TOP)/src/gallium/winsys/radeon/drm/libradeonwinsys.a \
$(TOP)/src/gallium/drivers/softpipe/libsoftpipe.a \
$(TOP)/src/gallium/drivers/trace/libtrace.a \
$(TOP)/src/gallium/auxiliary/libgallium.a
#include "state_tracker/drm_driver.h"
#include "target-helpers/inline_debug_helper.h"
-#include "r600/drm/r600_drm_public.h"
+#include "radeon/drm/radeon_drm_public.h"
#include "r600/r600_public.h"
static struct pipe_screen *create_screen(int fd)
{
- struct radeon *radeon;
+ struct radeon_winsys *radeon;
struct pipe_screen *screen;
- radeon = r600_drm_winsys_create(fd);
+ radeon = radeon_drm_winsys_create(fd);
if (!radeon)
return NULL;
$(TOP)/src/gallium/drivers/r600/libr600.a \
$(TOP)/src/gallium/winsys/g3dvl/dri/libvldri.a \
$(TOP)/src/gallium/winsys/r600/drm/libr600winsys.a \
+ $(TOP)/src/gallium/winsys/radeon/drm/libradeonwinsys.a \
$(TOP)/src/gallium/drivers/trace/libtrace.a \
$(TOP)/src/gallium/auxiliary/libgallium.a
#include "state_tracker/drm_driver.h"
#include "target-helpers/inline_debug_helper.h"
-#include "r600/drm/r600_drm_public.h"
+#include "radeon/drm/radeon_drm_public.h"
#include "r600/r600_public.h"
static struct pipe_screen *create_screen(int fd)
{
- struct radeon *radeon;
+ struct radeon_winsys *radeon;
struct pipe_screen *screen;
- radeon = r600_drm_winsys_create(fd);
+ radeon = radeon_drm_winsys_create(fd);
if (!radeon)
return NULL;
$(TOP)/src/gallium/drivers/r600/libr600.a \
$(TOP)/src/gallium/winsys/g3dvl/dri/libvldri.a \
$(TOP)/src/gallium/winsys/r600/drm/libr600winsys.a \
+ $(TOP)/src/gallium/winsys/radeon/drm/libradeonwinsys.a \
$(TOP)/src/gallium/drivers/trace/libtrace.a \
$(TOP)/src/gallium/auxiliary/libgallium.a
#include "state_tracker/drm_driver.h"
#include "target-helpers/inline_debug_helper.h"
-#include "r600/drm/r600_drm_public.h"
+#include "radeon/drm/radeon_drm_public.h"
#include "r600/r600_public.h"
static struct pipe_screen *create_screen(int fd)
{
- struct radeon *radeon;
+ struct radeon_winsys *radeon;
struct pipe_screen *screen;
- radeon = r600_drm_winsys_create(fd);
+ radeon = radeon_drm_winsys_create(fd);
if (!radeon)
return NULL;
#include "r600_drm_public.h"
#include "xf86drm.h"
#include "radeon_drm.h"
+#include "../../radeon/drm/radeon_winsys.h"
#ifndef RADEON_INFO_TILING_CONFIG
#define RADEON_INFO_TILING_CONFIG 0x6
return radeon->minor_version;
}
-
-static int radeon_get_device(struct radeon *radeon)
-{
- struct drm_radeon_info info = {};
- int r;
-
- radeon->device = 0;
- info.request = RADEON_INFO_DEVICE_ID;
- info.value = (uintptr_t)&radeon->device;
- r = drmCommandWriteRead(radeon->fd, DRM_RADEON_INFO, &info,
- sizeof(struct drm_radeon_info));
- return r;
-}
-
static int r600_interpret_tiling(struct radeon *radeon, uint32_t tiling_config)
{
switch ((tiling_config & 0xe) >> 1) {
return PTR_TO_UINT(key1) != PTR_TO_UINT(key2);
}
-static struct radeon *radeon_new(int fd, unsigned device)
+static struct radeon *radeon_new(struct radeon_winsys *rw)
{
struct radeon *radeon;
int r;
- drmVersionPtr version;
radeon = calloc(1, sizeof(*radeon));
if (radeon == NULL) {
return NULL;
}
- radeon->fd = fd;
- radeon->device = device;
- radeon->refcount = 1;
-
- version = drmGetVersion(radeon->fd);
- if (version->version_major != 2) {
- fprintf(stderr, "%s: DRM version is %d.%d.%d but this driver is "
- "only compatible with 2.x.x\n", __FUNCTION__,
- version->version_major, version->version_minor,
- version->version_patchlevel);
- drmFreeVersion(version);
- exit(1);
- }
-
- radeon->minor_version = version->version_minor;
-
- drmFreeVersion(version);
- r = radeon_get_device(radeon);
- if (r) {
- fprintf(stderr, "Failed to get device id\n");
- return radeon_decref(radeon);
- }
+ rw->query_info(rw, &radeon->info);
+ radeon->fd = radeon->info.fd;
+ radeon->device = radeon->info.pci_id;
+ radeon->num_backends = radeon->info.r600_num_backends;
+ radeon->refcount = 1;
+ radeon->minor_version = radeon->info.drm_minor;
radeon->family = radeon_family_from_device(radeon->device);
if (radeon->family == CHIP_UNKNOWN) {
return radeon;
}
-struct radeon *r600_drm_winsys_create(int drmfd)
+struct radeon *r600_drm_winsys_create(struct radeon_winsys *rw)
{
- return radeon_new(drmfd, 0);
+ return radeon_new(rw);
}
struct radeon *radeon_decref(struct radeon *radeon)
#ifndef R600_DRM_PUBLIC_H
#define R600_DRM_PUBLIC_H
-struct radeon;
+struct radeon_winsys;
-struct radeon *r600_drm_winsys_create(int drmFD);
+struct radeon *r600_drm_winsys_create(struct radeon_winsys *rw);
#endif
#include "util/u_hash_table.h"
#include <os/os_thread.h>
#include "r600.h"
+#include "../../radeon/drm/radeon_winsys.h"
#define PKT_COUNT_C 0xC000FFFF
#define PKT_COUNT_S(x) (((x) & 0x3FFF) << 16)
struct r600_bo;
struct radeon {
+ struct radeon_info info;
int fd;
int refcount;
unsigned device;
#ifndef RADEON_INFO_WANT_CMASK
#define RADEON_INFO_WANT_CMASK 8
#endif
+#ifndef RADEON_INFO_NUM_BACKENDS
+#define RADEON_INFO_NUM_BACKENDS 10
+#endif
/* Enable/disable feature access for one command stream.
* If enable == TRUE, return TRUE on success.
#define CHIPSET(pci_id, name, family) case pci_id:
#include "pci_ids/r300_pci_ids.h"
#undef CHIPSET
+ ws->gen = R300;
+ break;
+
+#define CHIPSET(pci_id, name, family) case pci_id:
+#include "pci_ids/r600_pci_ids.h"
+#undef CHIPSET
+ ws->gen = R600;
break;
default:
ws->num_cpus = sysconf(_SC_NPROCESSORS_ONLN);
/* Generation-specific queries. */
- if (!radeon_get_drm_value(ws->fd, RADEON_INFO_NUM_GB_PIPES,
- "GB pipe count",
- &ws->info.r300_num_gb_pipes))
- return FALSE;
+ if (ws->gen == R300) {
+ if (!radeon_get_drm_value(ws->fd, RADEON_INFO_NUM_GB_PIPES,
+ "GB pipe count",
+ &ws->info.r300_num_gb_pipes))
+ return FALSE;
- if (!radeon_get_drm_value(ws->fd, RADEON_INFO_NUM_Z_PIPES,
- "Z pipe count",
- &ws->info.r300_num_z_pipes))
- return FALSE;
+ if (!radeon_get_drm_value(ws->fd, RADEON_INFO_NUM_Z_PIPES,
+ "Z pipe count",
+ &ws->info.r300_num_z_pipes))
+ return FALSE;
+ }
+ else if (ws->gen == R600) {
+ if (!radeon_get_drm_value(ws->fd, RADEON_INFO_NUM_BACKENDS,
+ "num backends",
+ &ws->info.r600_num_backends))
+ return FALSE;
+ }
return TRUE;
}
}
ws->fd = fd;
+ ws->info.fd = fd;
if (!do_winsys_init(ws))
goto fail;
#include "radeon_winsys.h"
#include "os/os_thread.h"
+enum radeon_generation {
+ R300,
+ R600
+};
+
struct radeon_drm_winsys {
struct radeon_winsys base;
int fd; /* DRM file descriptor */
int num_cs; /* The number of command streams created. */
+ enum radeon_generation gen;
struct radeon_info info;
struct pb_manager *kman;
uint32_t pci_id;
uint32_t gart_size;
uint32_t vram_size;
+ uint32_t fd; /* XXX transitional */
uint32_t drm_major; /* version */
uint32_t drm_minor;
uint32_t r300_num_gb_pipes;
uint32_t r300_num_z_pipes;
+
+ uint32_t r600_num_backends;
};
enum radeon_feature_id {