summaryrefslogtreecommitdiffstats
path: root/src/gallium/state_trackers/dri/drm/dri2.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/gallium/state_trackers/dri/drm/dri2.c')
-rw-r--r--src/gallium/state_trackers/dri/drm/dri2.c50
1 files changed, 28 insertions, 22 deletions
diff --git a/src/gallium/state_trackers/dri/drm/dri2.c b/src/gallium/state_trackers/dri/drm/dri2.c
index 0d15b5c..e1216f1 100644
--- a/src/gallium/state_trackers/dri/drm/dri2.c
+++ b/src/gallium/state_trackers/dri/drm/dri2.c
@@ -38,9 +38,10 @@
#include "dri_screen.h"
#include "dri_context.h"
#include "dri_drawable.h"
-#include "dri_st_api.h"
#include "dri2.h"
+#include "GL/internal/dri_interface.h"
+
/**
* DRI2 flush extension.
*/
@@ -59,7 +60,7 @@ dri2_invalidate_drawable(__DRIdrawable *dPriv)
drawable->dPriv->lastStamp = *drawable->dPriv->pStamp;
if (ctx)
- ctx->st->notify_invalid_framebuffer(ctx->st, drawable->stfb);
+ ctx->st->notify_invalid_framebuffer(ctx->st, &drawable->base);
}
static const __DRI2flushExtension dri2FlushExtension = {
@@ -79,7 +80,7 @@ dri2_set_tex_buffer2(__DRIcontext *pDRICtx, GLint target,
struct dri_drawable *drawable = dri_drawable(dPriv);
struct pipe_resource *pt;
- dri_st_framebuffer_validate_att(drawable->stfb, ST_ATTACHMENT_FRONT_LEFT);
+ dri_drawable_validate_att(drawable, ST_ATTACHMENT_FRONT_LEFT);
pt = drawable->textures[ST_ATTACHMENT_FRONT_LEFT];
@@ -120,30 +121,31 @@ static const __DRItexBufferExtension dri2TexBufferExtension = {
};
/**
- * Get the format of an attachment.
+ * Get the format and binding of an attachment.
*/
-static INLINE enum pipe_format
+static INLINE void
dri2_drawable_get_format(struct dri_drawable *drawable,
- enum st_attachment_type statt)
+ enum st_attachment_type statt,
+ enum pipe_format *format,
+ unsigned *bind)
{
- enum pipe_format format;
-
switch (statt) {
case ST_ATTACHMENT_FRONT_LEFT:
case ST_ATTACHMENT_BACK_LEFT:
case ST_ATTACHMENT_FRONT_RIGHT:
case ST_ATTACHMENT_BACK_RIGHT:
- format = drawable->stvis.color_format;
+ *format = drawable->stvis.color_format;
+ *bind = PIPE_BIND_RENDER_TARGET | PIPE_BIND_SAMPLER_VIEW;
break;
case ST_ATTACHMENT_DEPTH_STENCIL:
- format = drawable->stvis.depth_stencil_format;
+ *format = drawable->stvis.depth_stencil_format;
+ *bind = PIPE_BIND_DEPTH_STENCIL; /* XXX sampler? */
break;
default:
- format = PIPE_FORMAT_NONE;
+ *format = PIPE_FORMAT_NONE;
+ *bind = 0;
break;
}
-
- return format;
}
@@ -174,9 +176,10 @@ dri2_drawable_get_buffers(struct dri_drawable *drawable,
for (i = 0; i < *count; i++) {
enum pipe_format format;
+ unsigned bind;
int att, bpp;
- format = dri2_drawable_get_format(drawable, statts[i]);
+ dri2_drawable_get_format(drawable, statts[i], &format, &bind);
if (format == PIPE_FORMAT_NONE)
continue;
@@ -263,7 +266,7 @@ dri2_drawable_process_buffers(struct dri_drawable *drawable,
struct pipe_resource templ;
struct winsys_handle whandle;
boolean have_depth = FALSE;
- unsigned i;
+ unsigned i, bind;
if (drawable->old_num == count &&
drawable->old_w == dri_drawable->w &&
@@ -275,7 +278,6 @@ dri2_drawable_process_buffers(struct dri_drawable *drawable,
pipe_resource_reference(&drawable->textures[i], NULL);
memset(&templ, 0, sizeof(templ));
- templ.bind = PIPE_BIND_RENDER_TARGET;
templ.target = PIPE_TEXTURE_2D;
templ.last_level = 0;
templ.width0 = dri_drawable->w;
@@ -319,16 +321,17 @@ dri2_drawable_process_buffers(struct dri_drawable *drawable,
break;
}
- format = dri2_drawable_get_format(drawable, statt);
+ dri2_drawable_get_format(drawable, statt, &format, &bind);
if (statt == ST_ATTACHMENT_INVALID || format == PIPE_FORMAT_NONE)
continue;
templ.format = format;
+ templ.bind = bind;
whandle.handle = buf->name;
whandle.stride = buf->pitch;
drawable->textures[statt] =
- screen->pipe_screen->resource_from_handle(screen->pipe_screen,
+ screen->base.screen->resource_from_handle(screen->base.screen,
&templ, &whandle);
}
@@ -342,7 +345,7 @@ dri2_drawable_process_buffers(struct dri_drawable *drawable,
* Backend functions for st_framebuffer interface.
*/
-void
+static void
dri2_allocate_textures(struct dri_drawable *drawable,
const enum st_attachment_type *statts,
unsigned count)
@@ -354,7 +357,7 @@ dri2_allocate_textures(struct dri_drawable *drawable,
dri2_drawable_process_buffers(drawable, buffers, num_buffers);
}
-void
+static void
dri2_flush_frontbuffer(struct dri_drawable *drawable,
enum st_attachment_type statt)
{
@@ -369,7 +372,7 @@ dri2_flush_frontbuffer(struct dri_drawable *drawable,
}
}
-__DRIimage *
+static __DRIimage *
dri2_lookup_egl_image(struct dri_context *ctx, void *handle)
{
__DRIimageLookupExtension *loader = ctx->sPriv->dri2.image;
@@ -431,7 +434,7 @@ dri2_create_image_from_name(__DRIcontext *context,
whandle.handle = name;
whandle.stride = pitch * util_format_get_blocksize(pf);
- img->texture = screen->pipe_screen->resource_from_handle(screen->pipe_screen,
+ img->texture = screen->base.screen->resource_from_handle(screen->base.screen,
&templ, &whandle);
if (!img->texture) {
FREE(img);
@@ -508,6 +511,9 @@ dri2_init_screen(__DRIscreen * sPriv)
screen->api = drm_api_create();
screen->sPriv = sPriv;
screen->fd = sPriv->fd;
+ screen->lookup_egl_image = dri2_lookup_egl_image;
+ screen->allocate_textures = dri2_allocate_textures;
+ screen->flush_frontbuffer = dri2_flush_frontbuffer;
sPriv->private = (void *)screen;
sPriv->extensions = dri_screen_extensions;