summaryrefslogtreecommitdiff
path: root/src/gallium/winsys
diff options
context:
space:
mode:
authorBen Skeggs <skeggsb@gmail.com>2008-06-25 04:05:11 +1000
committerBen Skeggs <skeggsb@gmail.com>2008-06-25 04:05:11 +1000
commitb40ed6a0b54d1ba74799aeb3f529c4d298625aa1 (patch)
treeda1ae04dcd8c1db1294f3caab9ba28760ccb3f8e /src/gallium/winsys
parent95fe122f67024f55d555e2816a95409a8b53a49e (diff)
parent0561a293b6596641c0200df7e6580599ecb8b111 (diff)
Merge remote branch 'upstream/gallium-0.1' into nouveau-gallium-0.1
Diffstat (limited to 'src/gallium/winsys')
-rw-r--r--src/gallium/winsys/common/intel_drm/intel_be_device.c9
-rw-r--r--src/gallium/winsys/common/intel_drm/intel_be_device.h7
-rw-r--r--src/gallium/winsys/dri/intel/Makefile5
-rw-r--r--src/gallium/winsys/dri/intel/intel_context.c23
-rw-r--r--src/gallium/winsys/dri/intel/intel_screen.c81
-rw-r--r--src/gallium/winsys/dri/intel/intel_screen.h2
-rw-r--r--src/gallium/winsys/gdi/wmesa.c3
7 files changed, 96 insertions, 34 deletions
diff --git a/src/gallium/winsys/common/intel_drm/intel_be_device.c b/src/gallium/winsys/common/intel_drm/intel_be_device.c
index 3eed0fe410..efb57a394e 100644
--- a/src/gallium/winsys/common/intel_drm/intel_be_device.c
+++ b/src/gallium/winsys/common/intel_drm/intel_be_device.c
@@ -16,6 +16,8 @@
#include "pipe/p_util.h"
#include "pipe/p_inlines.h"
+#include "i915simple/i915_screen.h"
+
/* Turn a pipe winsys into an intel/pipe winsys:
*/
static INLINE struct intel_be_device *
@@ -192,7 +194,7 @@ intel_be_fence_finish( struct pipe_winsys *sws,
*/
boolean
-intel_be_init_device(struct intel_be_device *dev, int fd)
+intel_be_init_device(struct intel_be_device *dev, int fd, unsigned id)
{
dev->fd = fd;
dev->max_batch_size = 16 * 4096;
@@ -252,6 +254,11 @@ intel_be_init_device(struct intel_be_device *dev, int fd)
1, 40, dev->max_batch_size * 16, 0,
dev->fMan);
+ /* Fill in this struct with callbacks that i915simple will need to
+ * communicate with the window system, buffer manager, etc.
+ */
+ dev->screen = i915_create_screen(&dev->base, id);
+
return true;
}
diff --git a/src/gallium/winsys/common/intel_drm/intel_be_device.h b/src/gallium/winsys/common/intel_drm/intel_be_device.h
index ec5cace71c..abf0253917 100644
--- a/src/gallium/winsys/common/intel_drm/intel_be_device.h
+++ b/src/gallium/winsys/common/intel_drm/intel_be_device.h
@@ -12,6 +12,11 @@ struct intel_be_device
{
struct pipe_winsys base;
+ /**
+ * Hw level screen
+ */
+ struct pipe_screen *screen;
+
int fd; /**< Drm file discriptor */
size_t max_batch_size;
@@ -28,7 +33,7 @@ struct intel_be_device
};
boolean
-intel_be_init_device(struct intel_be_device *device, int fd);
+intel_be_init_device(struct intel_be_device *device, int fd, unsigned id);
void
intel_be_destroy_device(struct intel_be_device *dev);
diff --git a/src/gallium/winsys/dri/intel/Makefile b/src/gallium/winsys/dri/intel/Makefile
index 00ce21f690..5b51f0815d 100644
--- a/src/gallium/winsys/dri/intel/Makefile
+++ b/src/gallium/winsys/dri/intel/Makefile
@@ -6,8 +6,9 @@ LIBNAME = i915_dri.so
PIPE_DRIVERS = \
$(TOP)/src/gallium/drivers/softpipe/libsoftpipe.a \
- $(TOP)/src/gallium/drivers/i915simple/libi915simple.a \
- $(TOP)/src/gallium/winsys/common/intel_drm/libinteldrm.a
+ $(TOP)/src/gallium/winsys/common/intel_drm/libinteldrm.a \
+ $(TOP)/src/gallium/drivers/i915simple/libi915simple.a
+
DRIVER_SOURCES = \
intel_winsys_softpipe.c \
diff --git a/src/gallium/winsys/dri/intel/intel_context.c b/src/gallium/winsys/dri/intel/intel_context.c
index 8284e0edbb..97ef731aaa 100644
--- a/src/gallium/winsys/dri/intel/intel_context.c
+++ b/src/gallium/winsys/dri/intel/intel_context.c
@@ -134,25 +134,6 @@ static const struct dri_debug_control debug_control[] = {
-/**
- * Create i915 hardware rendering context.
- */
-static struct pipe_context *
-intel_create_i915simple(struct intel_context *intel,
- struct pipe_winsys *winsys)
-{
- struct pipe_screen *screen;
-
- /* Fill in this struct with callbacks that i915simple will need to
- * communicate with the window system, buffer manager, etc.
- */
- screen = i915_create_screen(winsys, intel->intelScreen->deviceID);
-
- /* Create the i915simple context:
- */
- return i915_create_context(screen, winsys, &intel->base.base );
-}
-
static void
intel_lock_hardware(struct intel_be_context *context)
{
@@ -250,7 +231,9 @@ intelCreateContext(const __GLcontextModes * visual,
case PCI_CHIP_Q35_G:
case PCI_CHIP_I915_G:
case PCI_CHIP_I915_GM:
- pipe = intel_create_i915simple( intel, &intelScreen->base.base );
+ pipe = i915_create_context(intelScreen->base.screen,
+ &intelScreen->base.base,
+ &intel->base.base);
break;
default:
fprintf(stderr, "Unknown PCIID %x in %s, using software driver\n",
diff --git a/src/gallium/winsys/dri/intel/intel_screen.c b/src/gallium/winsys/dri/intel/intel_screen.c
index 8817a80a5a..18427a4586 100644
--- a/src/gallium/winsys/dri/intel/intel_screen.c
+++ b/src/gallium/winsys/dri/intel/intel_screen.c
@@ -38,10 +38,69 @@
#include "intel_drm/ws_dri_bufpool.h"
#include "pipe/p_context.h"
+#include "pipe/p_screen.h"
+#include "pipe/p_inlines.h"
#include "state_tracker/st_public.h"
#include "state_tracker/st_cb_fbo.h"
+static void
+intelCreateSurface(struct intel_screen *intelScreen, struct pipe_winsys *winsys, unsigned handle);
+
+static void
+intelCreateSurface(struct intel_screen *intelScreen, struct pipe_winsys *winsys, unsigned handle)
+{
+ struct intel_be_buffer *be_buf = malloc(sizeof(*be_buf));
+ struct pipe_screen *screen = intelScreen->base.screen;
+ struct pipe_texture *texture;
+ struct pipe_texture templat;
+ struct pipe_surface *surface;
+ struct pipe_buffer *buffer = &be_buf->base;
+ unsigned pitch;
+
+ assert(intelScreen->front.cpp == 4);
+
+ /* XXX create a intel_be function for this */
+ {
+ driGenBuffers(intelScreen->base.staticPool, "front", 1, &intelScreen->front.buffer, 0, 0, 0);
+ driBOSetReferenced(intelScreen->front.buffer, handle);
+
+ memset(be_buf, 0, sizeof(*be_buf));
+ buffer->refcount = 1;
+ buffer->alignment = 0;
+ buffer->usage = 0;
+ buffer->size = driBOSize(intelScreen->front.buffer);
+ be_buf->driBO = intelScreen->front.buffer;
+ }
+ memset(&templat, 0, sizeof(templat));
+ templat.tex_usage |= PIPE_TEXTURE_USAGE_DISPLAY_TARGET;
+ templat.target = PIPE_TEXTURE_2D;
+ templat.last_level = 0;
+ templat.depth[0] = 1;
+ templat.format = PIPE_FORMAT_A8R8G8B8_UNORM;
+ templat.cpp = intelScreen->front.cpp;
+ templat.width[0] = intelScreen->front.width;
+ templat.height[0] = intelScreen->front.height;
+ pitch = intelScreen->front.pitch / intelScreen->front.cpp;
+
+ texture = screen->texture_blanket(screen,
+ &templat,
+ &pitch,
+ buffer);
+
+ /* Unref the buffer we don't need it anyways */
+ pipe_buffer_reference(screen->winsys, &buffer, NULL);
+
+ surface = screen->get_tex_surface(screen,
+ texture,
+ 0,
+ 0,
+ 0,
+ PIPE_BUFFER_USAGE_GPU_WRITE);
+
+ intelScreen->front.texture = texture;
+ intelScreen->front.surface = surface;
+}
PUBLIC const char __driConfigOptions[] =
DRI_CONF_BEGIN DRI_CONF_SECTION_PERFORMANCE
@@ -157,10 +216,12 @@ intelUpdateScreenRotation(__DRIscreenPrivate * sPriv, drmI830Sarea * sarea)
}
#else
if (intelScreen->base.staticPool) {
- if (intelScreen->front.buffer)
+ if (intelScreen->front.buffer) {
driBOUnReference(intelScreen->front.buffer);
- driGenBuffers(intelScreen->base.staticPool, "front", 1, &intelScreen->front.buffer, 0, 0, 0);
- driBOSetReferenced(intelScreen->front.buffer, sarea->front_bo_handle);
+ pipe_surface_reference(&intelScreen->front.surface, NULL);
+ pipe_texture_reference(&intelScreen->front.texture, NULL);
+ }
+ intelCreateSurface(intelScreen, &intelScreen->base.base, sarea->front_bo_handle);
}
#endif
}
@@ -198,10 +259,12 @@ intel_flush_frontbuffer( struct pipe_winsys *winsys,
struct pipe_surface *surf,
void *context_private)
{
- struct intel_context *intel = (struct intel_context *) context_private;
- __DRIdrawablePrivate *dPriv = intel->driDrawable;
+ //struct intel_context *intel = (struct intel_context *) context_private;
+ //__DRIdrawablePrivate *dPriv = intel->driDrawable;
+
+ assert((int)"Doesn't work currently" & 0);
- intelDisplaySurface(dPriv, surf, NULL);
+ //intelDisplaySurface(dPriv, surf, NULL);
}
static boolean
@@ -254,9 +317,9 @@ intelInitDriver(__DRIscreenPrivate * sPriv)
(*glx_enable_extension) (psc, "GLX_SGI_make_current_read");
}
- intel_be_init_device(&intelScreen->base, sPriv->fd);
intelScreen->base.base.flush_frontbuffer = intel_flush_frontbuffer;
intelScreen->base.base.get_name = intel_get_name;
+ intel_be_init_device(&intelScreen->base, sPriv->fd, intelScreen->deviceID);
return GL_TRUE;
}
@@ -418,8 +481,8 @@ intelFillInModes(unsigned pixel_bits, unsigned depth_bits,
GLX_NONE, GLX_SWAP_UNDEFINED_OML, GLX_SWAP_COPY_OML
};
- u_int8_t depth_bits_array[3];
- u_int8_t stencil_bits_array[3];
+ uint8_t depth_bits_array[3];
+ uint8_t stencil_bits_array[3];
depth_bits_array[0] = 0;
diff --git a/src/gallium/winsys/dri/intel/intel_screen.h b/src/gallium/winsys/dri/intel/intel_screen.h
index 8036917903..e62f9e71ec 100644
--- a/src/gallium/winsys/dri/intel/intel_screen.h
+++ b/src/gallium/winsys/dri/intel/intel_screen.h
@@ -47,6 +47,8 @@ struct intel_screen
/* We create a static dri buffer for the frontbuffer.
*/
struct _DriBufferObject *buffer;
+ struct pipe_surface *surface;
+ struct pipe_texture *texture;
char *map; /* memory map */
int offset; /* from start of video mem, in bytes */
diff --git a/src/gallium/winsys/gdi/wmesa.c b/src/gallium/winsys/gdi/wmesa.c
index 74a8292352..0b93f8c4c3 100644
--- a/src/gallium/winsys/gdi/wmesa.c
+++ b/src/gallium/winsys/gdi/wmesa.c
@@ -469,7 +469,8 @@ wm_surface_alloc_storage(struct pipe_winsys *winsys,
struct pipe_surface *surf,
unsigned width, unsigned height,
enum pipe_format format,
- unsigned flags)
+ unsigned flags,
+ unsigned tex_usage)
{
const unsigned alignment = 64;