radeon-gallium: DRI2 state tracker, part 3.
Properly setup the build process for adding in xorg and egl trackers, and finally put radeon_context and radeon_screen to bed.
This commit is contained in:
@@ -1,32 +1,12 @@
|
|||||||
|
# src/gallium/winsys/drm/radeon/Makefile
|
||||||
TOP = ../../../../..
|
TOP = ../../../../..
|
||||||
include $(TOP)/configs/current
|
include $(TOP)/configs/current
|
||||||
|
|
||||||
LIBNAME = radeon_dri.so
|
SUBDIRS = core dri2
|
||||||
|
|
||||||
MINIGLX_SOURCES =
|
default install clean:
|
||||||
|
@for dir in $(SUBDIRS) ; do \
|
||||||
PIPE_DRIVERS = \
|
if [ -d $$dir ] ; then \
|
||||||
$(TOP)/src/gallium/state_trackers/dri2/libdri2drm.a \
|
(cd $$dir && $(MAKE) $@) || exit 1; \
|
||||||
$(TOP)/src/gallium/drivers/softpipe/libsoftpipe.a \
|
fi \
|
||||||
$(TOP)/src/gallium/drivers/r300/libr300.a
|
done
|
||||||
|
|
||||||
DRIVER_SOURCES = \
|
|
||||||
radeon_buffer.c \
|
|
||||||
radeon_drm.c \
|
|
||||||
radeon_r300.c \
|
|
||||||
radeon_winsys_softpipe.c
|
|
||||||
|
|
||||||
C_SOURCES = \
|
|
||||||
$(COMMON_GALLIUM_SOURCES) \
|
|
||||||
$(DRIVER_SOURCES)
|
|
||||||
|
|
||||||
ASM_SOURCES =
|
|
||||||
|
|
||||||
DRIVER_DEFINES = -I../../../drivers/r300
|
|
||||||
|
|
||||||
include ../Makefile.template
|
|
||||||
|
|
||||||
DRI_LIB_DEPS += -ldrm_radeon
|
|
||||||
|
|
||||||
symlinks:
|
|
||||||
|
18
src/gallium/winsys/drm/radeon/core/Makefile
Normal file
18
src/gallium/winsys/drm/radeon/core/Makefile
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
|
||||||
|
TOP = ../../../../../..
|
||||||
|
include $(TOP)/configs/current
|
||||||
|
|
||||||
|
LIBNAME = radeonwinsys
|
||||||
|
|
||||||
|
C_SOURCES = \
|
||||||
|
radeon_buffer.c \
|
||||||
|
radeon_drm.c \
|
||||||
|
radeon_r300.c \
|
||||||
|
radeon_winsys_softpipe.c
|
||||||
|
|
||||||
|
LIBRARY_INCLUDES = -I$(TOP)/src/gallium/drivers/r300 \
|
||||||
|
$(shell pkg-config libdrm --cflags-only-I)
|
||||||
|
|
||||||
|
include ../../../../Makefile.template
|
||||||
|
|
||||||
|
symlinks:
|
@@ -29,20 +29,8 @@
|
|||||||
* Jérôme Glisse <glisse@freedesktop.org>
|
* Jérôme Glisse <glisse@freedesktop.org>
|
||||||
* Corbin Simpson <MostAwesomeDude@gmail.com>
|
* Corbin Simpson <MostAwesomeDude@gmail.com>
|
||||||
*/
|
*/
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
#include "state_tracker/st_public.h"
|
|
||||||
|
|
||||||
#include "util/u_memory.h"
|
|
||||||
|
|
||||||
#include "pipe/p_defines.h"
|
|
||||||
#include "pipe/p_inlines.h"
|
|
||||||
#include "radeon_buffer.h"
|
#include "radeon_buffer.h"
|
||||||
#include "radeon_screen.h"
|
|
||||||
#include "radeon_context.h"
|
|
||||||
#include "radeon_bo.h"
|
|
||||||
#include "radeon_drm.h"
|
|
||||||
|
|
||||||
|
|
||||||
static const char *radeon_get_name(struct pipe_winsys *ws)
|
static const char *radeon_get_name(struct pipe_winsys *ws)
|
||||||
{
|
{
|
@@ -30,11 +30,20 @@
|
|||||||
#ifndef RADEON_BUFFER_H
|
#ifndef RADEON_BUFFER_H
|
||||||
#define RADEON_BUFFER_H
|
#define RADEON_BUFFER_H
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
#include "pipe/internal/p_winsys_screen.h"
|
#include "pipe/internal/p_winsys_screen.h"
|
||||||
#include "radeon_screen.h"
|
#include "pipe/p_defines.h"
|
||||||
#include "radeon_context.h"
|
#include "pipe/p_inlines.h"
|
||||||
|
|
||||||
|
//#include "state_tracker/st_public.h"
|
||||||
|
|
||||||
|
#include "util/u_memory.h"
|
||||||
|
|
||||||
#include "radeon_bo.h"
|
#include "radeon_bo.h"
|
||||||
|
|
||||||
|
#include "radeon_drm.h"
|
||||||
|
|
||||||
struct radeon_pipe_buffer {
|
struct radeon_pipe_buffer {
|
||||||
struct pipe_buffer base;
|
struct pipe_buffer base;
|
||||||
struct radeon_bo *bo;
|
struct radeon_bo *bo;
|
@@ -33,8 +33,7 @@
|
|||||||
/* Create a pipe_screen. */
|
/* Create a pipe_screen. */
|
||||||
struct pipe_screen* radeon_create_screen(int drmFB, int pciID)
|
struct pipe_screen* radeon_create_screen(int drmFB, int pciID)
|
||||||
{
|
{
|
||||||
struct radeon_context* radeon = CALLOC_STRUCT(radeon_context);
|
struct pipe_winsys* winsys = radeon_pipe_winsys();
|
||||||
struct pipe_winsys* winsys = radeon_pipe_winsys(radeon);
|
|
||||||
|
|
||||||
if (getenv("RADEON_SOFTPIPE")) {
|
if (getenv("RADEON_SOFTPIPE")) {
|
||||||
return softpipe_create_screen(winsys);
|
return softpipe_create_screen(winsys);
|
@@ -37,9 +37,7 @@
|
|||||||
#include "state_tracker/drm_api.h"
|
#include "state_tracker/drm_api.h"
|
||||||
|
|
||||||
#include "radeon_buffer.h"
|
#include "radeon_buffer.h"
|
||||||
#include "radeon_context.h"
|
|
||||||
#include "radeon_r300.h"
|
#include "radeon_r300.h"
|
||||||
#include "radeon_screen.h"
|
|
||||||
#include "radeon_winsys_softpipe.h"
|
#include "radeon_winsys_softpipe.h"
|
||||||
|
|
||||||
struct pipe_screen* radeon_create_screen(int drmFB, int pciID);
|
struct pipe_screen* radeon_create_screen(int drmFB, int pciID);
|
@@ -28,11 +28,7 @@
|
|||||||
/*
|
/*
|
||||||
* Authors: Keith Whitwell <keithw-at-tungstengraphics-dot-com>
|
* Authors: Keith Whitwell <keithw-at-tungstengraphics-dot-com>
|
||||||
*/
|
*/
|
||||||
#include <stdio.h>
|
|
||||||
#include "pipe/p_defines.h"
|
|
||||||
#include "pipe/p_format.h"
|
|
||||||
#include "softpipe/sp_winsys.h"
|
|
||||||
#include "radeon_context.h"
|
|
||||||
#include "radeon_winsys_softpipe.h"
|
#include "radeon_winsys_softpipe.h"
|
||||||
|
|
||||||
struct radeon_softpipe_winsys {
|
struct radeon_softpipe_winsys {
|
||||||
@@ -58,17 +54,18 @@ static boolean radeon_is_format_supported(struct softpipe_winsys *sws, uint form
|
|||||||
|
|
||||||
struct pipe_context *radeon_create_softpipe(struct pipe_winsys* winsys)
|
struct pipe_context *radeon_create_softpipe(struct pipe_winsys* winsys)
|
||||||
{
|
{
|
||||||
struct radeon_softpipe_winsys *radeon_sp_ws;
|
struct softpipe_winsys *sp_winsys;
|
||||||
struct pipe_screen *pipe_screen;
|
struct pipe_screen *pipe_screen;
|
||||||
|
|
||||||
pipe_screen = softpipe_create_screen(winsys);
|
pipe_screen = softpipe_create_screen(winsys);
|
||||||
|
|
||||||
radeon_sp_ws = CALLOC_STRUCT(radeon_softpipe_winsys);
|
sp_winsys = CALLOC_STRUCT(softpipe_winsys);
|
||||||
if (radeon_sp_ws == NULL) {
|
if (sp_winsys == NULL) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
radeon_sp_ws->sp_winsys.is_format_supported = radeon_is_format_supported;
|
|
||||||
|
sp_winsys->is_format_supported = radeon_is_format_supported;
|
||||||
return softpipe_create(pipe_screen,
|
return softpipe_create(pipe_screen,
|
||||||
winsys,
|
winsys,
|
||||||
&radeon_sp_ws->sp_winsys);
|
sp_winsys);
|
||||||
}
|
}
|
@@ -30,7 +30,14 @@
|
|||||||
#ifndef RADEON_WINSYS_SOFTPIPE_H
|
#ifndef RADEON_WINSYS_SOFTPIPE_H
|
||||||
#define RADEON_WINSYS_SOFTPIPE_H
|
#define RADEON_WINSYS_SOFTPIPE_H
|
||||||
|
|
||||||
#include "radeon_context.h"
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#include "pipe/p_defines.h"
|
||||||
|
#include "pipe/p_format.h"
|
||||||
|
|
||||||
|
#include "softpipe/sp_winsys.h"
|
||||||
|
|
||||||
|
#include "util/u_memory.h"
|
||||||
|
|
||||||
struct pipe_context *radeon_create_softpipe(struct pipe_winsys* winsys);
|
struct pipe_context *radeon_create_softpipe(struct pipe_winsys* winsys);
|
||||||
|
|
25
src/gallium/winsys/drm/radeon/dri2/Makefile
Normal file
25
src/gallium/winsys/drm/radeon/dri2/Makefile
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
|
||||||
|
TOP = ../../../../../..
|
||||||
|
include $(TOP)/configs/current
|
||||||
|
|
||||||
|
LIBNAME = radeon_dri.so
|
||||||
|
|
||||||
|
MINIGLX_SOURCES =
|
||||||
|
|
||||||
|
PIPE_DRIVERS = \
|
||||||
|
$(TOP)/src/gallium/drivers/softpipe/libsoftpipe.a \
|
||||||
|
$(TOP)/src/gallium/drivers/r300/libr300.a \
|
||||||
|
$(TOP)/src/gallium/state_trackers/dri2/libdri2drm.a \
|
||||||
|
$(TOP)/src/gallium/winsys/drm/radeon/core/libradeonwinsys.a
|
||||||
|
|
||||||
|
C_SOURCES = \
|
||||||
|
$(COMMON_GALLIUM_SOURCES) \
|
||||||
|
$(DRIVER_SOURCES)
|
||||||
|
|
||||||
|
ASM_SOURCES =
|
||||||
|
|
||||||
|
include ../../Makefile.template
|
||||||
|
|
||||||
|
DRI_LIB_DEPS += -ldrm_radeon
|
||||||
|
|
||||||
|
symlinks:
|
@@ -1,272 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright © 2008 Jérôme Glisse
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
/*
|
|
||||||
* Authors:
|
|
||||||
* Jérôme Glisse <glisse@freedesktop.org>
|
|
||||||
*/
|
|
||||||
#include <stdio.h>
|
|
||||||
#include "dri_util.h"
|
|
||||||
#include "pipe/p_defines.h"
|
|
||||||
#include "pipe/p_inlines.h"
|
|
||||||
#include "state_tracker/st_public.h"
|
|
||||||
#include "state_tracker/st_context.h"
|
|
||||||
#include "radeon_screen.h"
|
|
||||||
#include "radeon_context.h"
|
|
||||||
#include "radeon_buffer.h"
|
|
||||||
#include "radeon_winsys_softpipe.h"
|
|
||||||
|
|
||||||
#define need_GL_ARB_point_parameters
|
|
||||||
#define need_GL_ARB_vertex_buffer_object
|
|
||||||
#define need_GL_EXT_cull_vertex
|
|
||||||
#define need_GL_EXT_compiled_vertex_array
|
|
||||||
#include "extension_helper.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Extension strings exported by the radeon driver.
|
|
||||||
*/
|
|
||||||
const struct dri_extension radeon_card_extensions[] = {
|
|
||||||
/* XXX these are technically not supported
|
|
||||||
{"GL_ARB_texture_rectangle", NULL},
|
|
||||||
{"GL_ARB_pixel_buffer_object", NULL}, */
|
|
||||||
{"GL_ARB_point_parameters", GL_ARB_point_parameters_functions},
|
|
||||||
{"GL_ARB_vertex_buffer_object", GL_ARB_vertex_buffer_object_functions},
|
|
||||||
{"GL_EXT_compiled_vertex_array", GL_EXT_compiled_vertex_array_functions},
|
|
||||||
{"GL_EXT_cull_vertex", GL_EXT_cull_vertex_functions},
|
|
||||||
{NULL, NULL}
|
|
||||||
};
|
|
||||||
|
|
||||||
static void radeon_update_renderbuffers(__DRIcontext *dri_context,
|
|
||||||
__DRIdrawable *dri_drawable)
|
|
||||||
{
|
|
||||||
struct radeon_framebuffer *radeon_fb;
|
|
||||||
struct radeon_context *radeon_context;
|
|
||||||
unsigned attachments[10];
|
|
||||||
__DRIbuffer *buffers;
|
|
||||||
__DRIscreen *screen;
|
|
||||||
int i, count;
|
|
||||||
|
|
||||||
radeon_context = dri_context->driverPrivate;
|
|
||||||
screen = dri_drawable->driScreenPriv;
|
|
||||||
radeon_fb = dri_drawable->driverPrivate;
|
|
||||||
for (count = 0, i = 0; count < 6; count++) {
|
|
||||||
if (radeon_fb->attachments & (1 << count)) {
|
|
||||||
attachments[i++] = count;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
buffers = (*screen->dri2.loader->getBuffers)(dri_drawable,
|
|
||||||
&dri_drawable->w,
|
|
||||||
&dri_drawable->h,
|
|
||||||
attachments,
|
|
||||||
i,
|
|
||||||
&count,
|
|
||||||
dri_drawable->loaderPrivate);
|
|
||||||
if (buffers == NULL) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* set one cliprect to cover the whole dri_drawable */
|
|
||||||
dri_drawable->x = 0;
|
|
||||||
dri_drawable->y = 0;
|
|
||||||
dri_drawable->backX = 0;
|
|
||||||
dri_drawable->backY = 0;
|
|
||||||
dri_drawable->numClipRects = 1;
|
|
||||||
dri_drawable->pClipRects[0].x1 = 0;
|
|
||||||
dri_drawable->pClipRects[0].y1 = 0;
|
|
||||||
dri_drawable->pClipRects[0].x2 = dri_drawable->w;
|
|
||||||
dri_drawable->pClipRects[0].y2 = dri_drawable->h;
|
|
||||||
dri_drawable->numBackClipRects = 1;
|
|
||||||
dri_drawable->pBackClipRects[0].x1 = 0;
|
|
||||||
dri_drawable->pBackClipRects[0].y1 = 0;
|
|
||||||
dri_drawable->pBackClipRects[0].x2 = dri_drawable->w;
|
|
||||||
dri_drawable->pBackClipRects[0].y2 = dri_drawable->h;
|
|
||||||
|
|
||||||
for (i = 0; i < count; i++) {
|
|
||||||
struct pipe_surface *ps;
|
|
||||||
enum pipe_format format = 0;
|
|
||||||
int index = 0;
|
|
||||||
|
|
||||||
switch (buffers[i].attachment) {
|
|
||||||
case __DRI_BUFFER_FRONT_LEFT:
|
|
||||||
index = ST_SURFACE_FRONT_LEFT;
|
|
||||||
switch (buffers[i].cpp) {
|
|
||||||
case 4:
|
|
||||||
format = PIPE_FORMAT_A8R8G8B8_UNORM;
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
format = PIPE_FORMAT_R5G6B5_UNORM;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
/* FIXME: error */
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case __DRI_BUFFER_BACK_LEFT:
|
|
||||||
index = ST_SURFACE_BACK_LEFT;
|
|
||||||
switch (buffers[i].cpp) {
|
|
||||||
case 4:
|
|
||||||
format = PIPE_FORMAT_A8R8G8B8_UNORM;
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
format = PIPE_FORMAT_R5G6B5_UNORM;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
/* FIXME: error */
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case __DRI_BUFFER_STENCIL:
|
|
||||||
case __DRI_BUFFER_DEPTH:
|
|
||||||
index = ST_SURFACE_DEPTH;
|
|
||||||
switch (buffers[i].cpp) {
|
|
||||||
case 4:
|
|
||||||
format = PIPE_FORMAT_Z24S8_UNORM;
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
format = PIPE_FORMAT_Z16_UNORM;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
/* FIXME: error */
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case __DRI_BUFFER_ACCUM:
|
|
||||||
default:
|
|
||||||
fprintf(stderr,
|
|
||||||
"unhandled buffer attach event, attacment type %d\n",
|
|
||||||
buffers[i].attachment);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
ps = radeon_surface_from_handle(radeon_context,
|
|
||||||
buffers[i].name,
|
|
||||||
format,
|
|
||||||
dri_drawable->w,
|
|
||||||
dri_drawable->h,
|
|
||||||
buffers[i].pitch);
|
|
||||||
assert(ps);
|
|
||||||
st_set_framebuffer_surface(radeon_fb->st_framebuffer, index, ps);
|
|
||||||
}
|
|
||||||
st_resize_framebuffer(radeon_fb->st_framebuffer,
|
|
||||||
dri_drawable->w,
|
|
||||||
dri_drawable->h);
|
|
||||||
}
|
|
||||||
|
|
||||||
GLboolean radeon_context_create(const __GLcontextModes *visual,
|
|
||||||
__DRIcontextPrivate *dri_context,
|
|
||||||
void *shared_context)
|
|
||||||
{
|
|
||||||
__DRIscreenPrivate *dri_screen;
|
|
||||||
struct radeon_context *radeon_context;
|
|
||||||
struct radeon_screen *radeon_screen;
|
|
||||||
struct pipe_context *pipe;
|
|
||||||
struct st_context *shared_st_context = NULL;
|
|
||||||
|
|
||||||
dri_context->driverPrivate = NULL;
|
|
||||||
radeon_context = calloc(1, sizeof(struct radeon_context));
|
|
||||||
if (radeon_context == NULL) {
|
|
||||||
return GL_FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (shared_context) {
|
|
||||||
shared_st_context = ((struct radeon_context*)shared_context)->st_context;
|
|
||||||
}
|
|
||||||
|
|
||||||
dri_screen = dri_context->driScreenPriv;
|
|
||||||
radeon_screen = dri_screen->private;
|
|
||||||
radeon_context->dri_screen = dri_screen;
|
|
||||||
radeon_context->radeon_screen = radeon_screen;
|
|
||||||
radeon_context->drm_fd = dri_screen->fd;
|
|
||||||
|
|
||||||
radeon_context->pipe_winsys = radeon_pipe_winsys(radeon_screen);
|
|
||||||
if (radeon_context->pipe_winsys == NULL) {
|
|
||||||
free(radeon_context);
|
|
||||||
return GL_FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!getenv("RADEON_SOFTPIPE")) {
|
|
||||||
fprintf(stderr, "Creating r300 context...\n");
|
|
||||||
pipe =
|
|
||||||
r300_create_context(NULL,
|
|
||||||
radeon_context->pipe_winsys,
|
|
||||||
radeon_create_r300_winsys(radeon_context->drm_fd));
|
|
||||||
radeon_context->pipe_screen = pipe->screen;
|
|
||||||
} else {
|
|
||||||
pipe = radeon_create_softpipe(radeon_context);
|
|
||||||
}
|
|
||||||
radeon_context->st_context = st_create_context(pipe, visual,
|
|
||||||
shared_st_context);
|
|
||||||
driInitExtensions(radeon_context->st_context->ctx,
|
|
||||||
radeon_card_extensions, GL_TRUE);
|
|
||||||
dri_context->driverPrivate = radeon_context;
|
|
||||||
return GL_TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
void radeon_context_destroy(__DRIcontextPrivate *dri_context)
|
|
||||||
{
|
|
||||||
struct radeon_context *radeon_context;
|
|
||||||
|
|
||||||
radeon_context = dri_context->driverPrivate;
|
|
||||||
st_finish(radeon_context->st_context);
|
|
||||||
st_destroy_context(radeon_context->st_context);
|
|
||||||
free(radeon_context);
|
|
||||||
}
|
|
||||||
|
|
||||||
GLboolean radeon_context_bind(__DRIcontextPrivate *dri_context,
|
|
||||||
__DRIdrawablePrivate *dri_drawable,
|
|
||||||
__DRIdrawablePrivate *dri_readable)
|
|
||||||
{
|
|
||||||
struct radeon_framebuffer *drawable;
|
|
||||||
struct radeon_framebuffer *readable;
|
|
||||||
struct radeon_context *radeon_context;
|
|
||||||
|
|
||||||
if (dri_context == NULL) {
|
|
||||||
st_make_current(NULL, NULL, NULL);
|
|
||||||
return GL_TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
radeon_context = dri_context->driverPrivate;
|
|
||||||
drawable = dri_drawable->driverPrivate;
|
|
||||||
readable = dri_readable->driverPrivate;
|
|
||||||
st_make_current(radeon_context->st_context,
|
|
||||||
drawable->st_framebuffer,
|
|
||||||
readable->st_framebuffer);
|
|
||||||
|
|
||||||
radeon_update_renderbuffers(dri_context, dri_drawable);
|
|
||||||
if (dri_drawable != dri_readable) {
|
|
||||||
radeon_update_renderbuffers(dri_context, dri_readable);
|
|
||||||
}
|
|
||||||
return GL_TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
GLboolean radeon_context_unbind(__DRIcontextPrivate *dri_context)
|
|
||||||
{
|
|
||||||
struct radeon_context *radeon_context;
|
|
||||||
|
|
||||||
radeon_context = dri_context->driverPrivate;
|
|
||||||
st_flush(radeon_context->st_context, PIPE_FLUSH_RENDER_CACHE, NULL);
|
|
||||||
return GL_TRUE;
|
|
||||||
}
|
|
@@ -1,70 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright © 2008 Jérôme Glisse
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
/*
|
|
||||||
* Authors:
|
|
||||||
* Jérôme Glisse <glisse@freedesktop.org>
|
|
||||||
*/
|
|
||||||
#ifndef RADEON_CONTEXT_H
|
|
||||||
#define RADEON_CONTEXT_H
|
|
||||||
|
|
||||||
#include "dri_util.h"
|
|
||||||
#include "state_tracker/st_public.h"
|
|
||||||
#include "state_tracker/st_context.h"
|
|
||||||
#include "radeon_screen.h"
|
|
||||||
|
|
||||||
#include "radeon_r300.h"
|
|
||||||
|
|
||||||
struct radeon_framebuffer {
|
|
||||||
struct st_framebuffer *st_framebuffer;
|
|
||||||
unsigned attachments;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct radeon_context {
|
|
||||||
/* st */
|
|
||||||
struct st_context *st_context;
|
|
||||||
/* pipe */
|
|
||||||
struct pipe_screen *pipe_screen;
|
|
||||||
struct pipe_winsys *pipe_winsys;
|
|
||||||
/* DRI */
|
|
||||||
__DRIscreenPrivate *dri_screen;
|
|
||||||
__DRIdrawablePrivate *dri_drawable;
|
|
||||||
__DRIdrawablePrivate *dri_readable;
|
|
||||||
/* DRM */
|
|
||||||
int drm_fd;
|
|
||||||
/* RADEON */
|
|
||||||
struct radeon_screen *radeon_screen;
|
|
||||||
};
|
|
||||||
|
|
||||||
GLboolean radeon_context_create(const __GLcontextModes*,
|
|
||||||
__DRIcontextPrivate*,
|
|
||||||
void*);
|
|
||||||
void radeon_context_destroy(__DRIcontextPrivate*);
|
|
||||||
GLboolean radeon_context_bind(__DRIcontextPrivate*,
|
|
||||||
__DRIdrawablePrivate*,
|
|
||||||
__DRIdrawablePrivate*);
|
|
||||||
GLboolean radeon_context_unbind(__DRIcontextPrivate*);
|
|
||||||
|
|
||||||
#endif
|
|
@@ -1,288 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright © 2008 Jérôme Glisse
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
/*
|
|
||||||
* Authors:
|
|
||||||
* Jérôme Glisse <glisse@freedesktop.org>
|
|
||||||
*/
|
|
||||||
#include <stdio.h>
|
|
||||||
#include "pipe/p_screen.h"
|
|
||||||
#include "pipe/p_defines.h"
|
|
||||||
#include "pipe/p_inlines.h"
|
|
||||||
#include "pipe/p_context.h"
|
|
||||||
#include "pipe/p_state.h"
|
|
||||||
#include "state_tracker/st_public.h"
|
|
||||||
#include "state_tracker/st_context.h"
|
|
||||||
#include "utils.h"
|
|
||||||
#include "xf86drm.h"
|
|
||||||
#include "drm.h"
|
|
||||||
#include "dri_util.h"
|
|
||||||
#include "radeon_screen.h"
|
|
||||||
#include "radeon_context.h"
|
|
||||||
#include "radeon_buffer.h"
|
|
||||||
#include "radeon_bo.h"
|
|
||||||
#include "radeon_bo_gem.h"
|
|
||||||
#include "radeon_drm.h"
|
|
||||||
|
|
||||||
extern const struct dri_extension radeon_card_extensions[];
|
|
||||||
|
|
||||||
static const __DRIextension *radeon_screen_extensions[] = {
|
|
||||||
&driReadDrawableExtension,
|
|
||||||
&driCopySubBufferExtension.base,
|
|
||||||
&driSwapControlExtension.base,
|
|
||||||
&driFrameTrackingExtension.base,
|
|
||||||
&driMediaStreamCounterExtension.base,
|
|
||||||
NULL
|
|
||||||
};
|
|
||||||
|
|
||||||
static __DRIconfig **radeon_fill_in_modes(unsigned pixel_bits,
|
|
||||||
unsigned depth_bits,
|
|
||||||
GLboolean have_back_buffer)
|
|
||||||
{
|
|
||||||
__DRIconfig **configs;
|
|
||||||
unsigned depth_buffer_factor;
|
|
||||||
unsigned back_buffer_factor;
|
|
||||||
unsigned num_modes;
|
|
||||||
GLenum fb_format;
|
|
||||||
GLenum fb_type;
|
|
||||||
uint8_t depth_bits_array[3];
|
|
||||||
uint8_t stencil_bits_array[3];
|
|
||||||
uint8_t msaa_samples_array[1];
|
|
||||||
/* TODO: pageflipping ? */
|
|
||||||
static const GLenum back_buffer_modes[] = {
|
|
||||||
GLX_NONE, GLX_SWAP_UNDEFINED_OML, GLX_SWAP_COPY_OML
|
|
||||||
};
|
|
||||||
|
|
||||||
stencil_bits_array[0] = 0;
|
|
||||||
stencil_bits_array[1] = 0;
|
|
||||||
if (depth_bits == 24) {
|
|
||||||
stencil_bits_array[2] = 8;
|
|
||||||
num_modes = 3;
|
|
||||||
}
|
|
||||||
|
|
||||||
depth_bits_array[0] = 0;
|
|
||||||
depth_bits_array[1] = depth_bits;
|
|
||||||
depth_bits_array[2] = depth_bits;
|
|
||||||
depth_buffer_factor = (depth_bits == 24) ? 3 : 2;
|
|
||||||
|
|
||||||
back_buffer_factor = (have_back_buffer) ? 3 : 1;
|
|
||||||
|
|
||||||
msaa_samples_array[0] = 0;
|
|
||||||
|
|
||||||
if (pixel_bits == 16) {
|
|
||||||
fb_format = GL_RGB;
|
|
||||||
fb_type = GL_UNSIGNED_SHORT_5_6_5;
|
|
||||||
} else {
|
|
||||||
fb_format = GL_BGRA;
|
|
||||||
fb_type = GL_UNSIGNED_INT_8_8_8_8_REV;
|
|
||||||
}
|
|
||||||
|
|
||||||
configs = (__DRIconfig **)driCreateConfigs(fb_format,
|
|
||||||
fb_type,
|
|
||||||
depth_bits_array,
|
|
||||||
stencil_bits_array,
|
|
||||||
depth_buffer_factor,
|
|
||||||
back_buffer_modes,
|
|
||||||
back_buffer_factor,
|
|
||||||
msaa_samples_array,
|
|
||||||
1);
|
|
||||||
if (configs == NULL) {
|
|
||||||
fprintf(stderr, "[%s:%u] Error creating FBConfig!\n",
|
|
||||||
__FILE__, __LINE__);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
return configs;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void radeon_screen_destroy(__DRIscreenPrivate *dri_screen)
|
|
||||||
{
|
|
||||||
struct radeon_screen *radeon_screen = (struct radeon_screen*)dri_screen->private;
|
|
||||||
|
|
||||||
radeon_bo_manager_gem_dtor(radeon_screen->bom);
|
|
||||||
dri_screen = NULL;
|
|
||||||
free(radeon_screen);
|
|
||||||
}
|
|
||||||
|
|
||||||
static const __DRIconfig **radeon_screen_init(__DRIscreenPrivate *dri_screen)
|
|
||||||
{
|
|
||||||
struct radeon_screen *radeon_screen;
|
|
||||||
|
|
||||||
/* Calling driInitExtensions here, with a NULL context pointer,
|
|
||||||
* does not actually enable the extensions. It just makes sure
|
|
||||||
* that all the dispatch offsets for all the extensions that
|
|
||||||
* *might* be enables are known. This is needed because the
|
|
||||||
* dispatch offsets need to be known when _mesa_context_create is
|
|
||||||
* called, but we can't enable the extensions until we have a
|
|
||||||
* context pointer.
|
|
||||||
*
|
|
||||||
* Hello chicken. Hello egg. How are you two today?
|
|
||||||
*/
|
|
||||||
driInitExtensions(NULL, radeon_card_extensions, GL_FALSE);
|
|
||||||
|
|
||||||
radeon_screen = calloc(1, sizeof(struct radeon_screen));
|
|
||||||
if (radeon_screen == NULL) {
|
|
||||||
fprintf(stderr, "\nERROR! Allocating private area failed\n");
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
dri_screen->private = (void*)radeon_screen;
|
|
||||||
dri_screen->extensions = radeon_screen_extensions;
|
|
||||||
radeon_screen->dri_screen = dri_screen;
|
|
||||||
|
|
||||||
radeon_screen->bom = radeon_bo_manager_gem_ctor(dri_screen->fd);
|
|
||||||
if (radeon_screen->bom == NULL) {
|
|
||||||
radeon_screen_destroy(dri_screen);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return driConcatConfigs(radeon_fill_in_modes(16, 16, 1),
|
|
||||||
radeon_fill_in_modes(32, 24, 1));
|
|
||||||
}
|
|
||||||
|
|
||||||
static boolean radeon_buffer_create(__DRIscreenPrivate *dri_screen,
|
|
||||||
__DRIdrawablePrivate *dri_drawable,
|
|
||||||
const __GLcontextModes *visual,
|
|
||||||
boolean is_pixmap)
|
|
||||||
{
|
|
||||||
if (is_pixmap) {
|
|
||||||
/* TODO: implement ? */
|
|
||||||
return GL_FALSE;
|
|
||||||
} else {
|
|
||||||
enum pipe_format color_format, depth_format, stencil_format;
|
|
||||||
struct radeon_framebuffer *radeon_fb;
|
|
||||||
|
|
||||||
radeon_fb = calloc(1, sizeof(struct radeon_framebuffer));
|
|
||||||
if (radeon_fb == NULL) {
|
|
||||||
return GL_FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (visual->redBits) {
|
|
||||||
case 5:
|
|
||||||
color_format = PIPE_FORMAT_R5G6B5_UNORM;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
color_format = PIPE_FORMAT_A8R8G8B8_UNORM;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (visual->depthBits) {
|
|
||||||
case 24:
|
|
||||||
depth_format = PIPE_FORMAT_S8Z24_UNORM;
|
|
||||||
break;
|
|
||||||
case 16:
|
|
||||||
depth_format = PIPE_FORMAT_Z16_UNORM;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
depth_format = PIPE_FORMAT_NONE;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (visual->stencilBits) {
|
|
||||||
case 8:
|
|
||||||
/* force depth format */
|
|
||||||
depth_format = PIPE_FORMAT_S8Z24_UNORM;
|
|
||||||
stencil_format = PIPE_FORMAT_S8Z24_UNORM;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
stencil_format = PIPE_FORMAT_NONE;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
radeon_fb->st_framebuffer = st_create_framebuffer(visual,
|
|
||||||
color_format,
|
|
||||||
depth_format,
|
|
||||||
stencil_format,
|
|
||||||
dri_drawable->w,
|
|
||||||
dri_drawable->h,
|
|
||||||
(void*)radeon_fb);
|
|
||||||
if (radeon_fb->st_framebuffer == NULL) {
|
|
||||||
free(radeon_fb);
|
|
||||||
return GL_FALSE;
|
|
||||||
}
|
|
||||||
dri_drawable->driverPrivate = (void *) radeon_fb;
|
|
||||||
|
|
||||||
radeon_fb->attachments = (1 << __DRI_BUFFER_FRONT_LEFT);
|
|
||||||
if (visual->doubleBufferMode) {
|
|
||||||
radeon_fb->attachments |= (1 << __DRI_BUFFER_BACK_LEFT);
|
|
||||||
}
|
|
||||||
if (visual->depthBits || visual->stencilBits) {
|
|
||||||
radeon_fb->attachments |= (1 << __DRI_BUFFER_DEPTH);
|
|
||||||
}
|
|
||||||
|
|
||||||
return GL_TRUE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void radeon_buffer_destroy(__DRIdrawablePrivate * dri_drawable)
|
|
||||||
{
|
|
||||||
struct radeon_framebuffer *radeon_fb;
|
|
||||||
|
|
||||||
radeon_fb = dri_drawable->driverPrivate;
|
|
||||||
assert(radeon_fb->st_framebuffer);
|
|
||||||
st_unreference_framebuffer(radeon_fb->st_framebuffer);
|
|
||||||
free(radeon_fb);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void radeon_swap_buffers(__DRIdrawablePrivate *dri_drawable)
|
|
||||||
{
|
|
||||||
struct radeon_framebuffer *radeon_fb;
|
|
||||||
struct pipe_surface *back_surf = NULL;
|
|
||||||
|
|
||||||
radeon_fb = dri_drawable->driverPrivate;
|
|
||||||
assert(radeon_fb);
|
|
||||||
assert(radeon_fb->st_framebuffer);
|
|
||||||
|
|
||||||
st_get_framebuffer_surface(radeon_fb->st_framebuffer,
|
|
||||||
ST_SURFACE_BACK_LEFT,
|
|
||||||
&back_surf);
|
|
||||||
if (back_surf) {
|
|
||||||
st_notify_swapbuffers(radeon_fb->st_framebuffer);
|
|
||||||
/* TODO: do we want to do anythings ? */
|
|
||||||
st_notify_swapbuffers_complete(radeon_fb->st_framebuffer);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Called via glXCopySubBufferMESA() to copy a subrect of the back
|
|
||||||
* buffer to the front buffer/screen.
|
|
||||||
*/
|
|
||||||
static void radeon_copy_sub_buffer(__DRIdrawablePrivate *dri_drawable,
|
|
||||||
int x, int y, int w, int h)
|
|
||||||
{
|
|
||||||
/* TODO: ... */
|
|
||||||
}
|
|
||||||
|
|
||||||
const struct __DriverAPIRec driDriverAPI = {
|
|
||||||
.InitScreen = NULL,
|
|
||||||
.DestroyScreen = radeon_screen_destroy,
|
|
||||||
.CreateContext = radeon_context_create,
|
|
||||||
.DestroyContext = radeon_context_destroy,
|
|
||||||
.CreateBuffer = radeon_buffer_create,
|
|
||||||
.DestroyBuffer = radeon_buffer_destroy,
|
|
||||||
.SwapBuffers = radeon_swap_buffers,
|
|
||||||
.MakeCurrent = radeon_context_bind,
|
|
||||||
.UnbindContext = radeon_context_unbind,
|
|
||||||
.CopySubBuffer = radeon_copy_sub_buffer,
|
|
||||||
.InitScreen2 = radeon_screen_init,
|
|
||||||
};
|
|
@@ -1,41 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright © 2008 Jérôme Glisse
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
/*
|
|
||||||
* Authors:
|
|
||||||
* Jérôme Glisse <glisse@freedesktop.org>
|
|
||||||
*/
|
|
||||||
#ifndef RADEON_SCREEN_H
|
|
||||||
#define RADEON_SCREEN_H
|
|
||||||
|
|
||||||
#include "dri_util.h"
|
|
||||||
#include "radeon_bo.h"
|
|
||||||
|
|
||||||
struct radeon_screen {
|
|
||||||
__DRIscreenPrivate *dri_screen;
|
|
||||||
struct radeon_bo_manager *bom;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
Reference in New Issue
Block a user