Signed-off-by: Kristian Høgsberg <k...@bitplanet.net>
---
 src/mesa/drivers/dri/common/dri_util.c     |    2 +
 src/mesa/drivers/dri/common/dri_util.h     |    1 +
 src/mesa/drivers/dri/intel/intel_regions.h |    8 +++
 src/mesa/drivers/dri/intel/intel_screen.c  |   74 ++++++++++++++++++++++++++++
 4 files changed, 85 insertions(+), 0 deletions(-)

diff --git a/src/mesa/drivers/dri/common/dri_util.c 
b/src/mesa/drivers/dri/common/dri_util.c
index f5e7923..271232b 100644
--- a/src/mesa/drivers/dri/common/dri_util.c
+++ b/src/mesa/drivers/dri/common/dri_util.c
@@ -671,6 +671,8 @@ setupLoaderExtensions(__DRIscreen *psp,
            psp->systemTime = (__DRIsystemTimeExtension *) extensions[i];
        if (strcmp(extensions[i]->name, __DRI_DRI2_LOADER) == 0)
            psp->dri2.loader = (__DRIdri2LoaderExtension *) extensions[i];
+       if (strcmp(extensions[i]->name, __DRI_IMAGE_LOOKUP) == 0)
+           psp->dri2.image = (__DRIimageLookupExtension *) extensions[i];
     }
 }
 
diff --git a/src/mesa/drivers/dri/common/dri_util.h 
b/src/mesa/drivers/dri/common/dri_util.h
index e9d5a9d..9aa7c29 100644
--- a/src/mesa/drivers/dri/common/dri_util.h
+++ b/src/mesa/drivers/dri/common/dri_util.h
@@ -535,6 +535,7 @@ struct __DRIscreenRec {
         * fields will not be valid or initializaed in that case. */
        int enabled;
        __DRIdri2LoaderExtension *loader;
+       __DRIimageLookupExtension *image;
     } dri2;
 
     /* The lock actually in use, old sarea or DRI2 */
diff --git a/src/mesa/drivers/dri/intel/intel_regions.h 
b/src/mesa/drivers/dri/intel/intel_regions.h
index 6d36f3d..7ee6a98 100644
--- a/src/mesa/drivers/dri/intel/intel_regions.h
+++ b/src/mesa/drivers/dri/intel/intel_regions.h
@@ -148,4 +148,12 @@ void _mesa_copy_rect(GLubyte * dst,
                 const GLubyte * src,
                 GLuint src_pitch, GLuint src_x, GLuint src_y);
 
+struct __DRIimageRec {
+   struct intel_region *region;
+   GLenum internal_format;
+   GLuint format;
+   GLenum data_type;
+   void *data;
+};
+
 #endif
diff --git a/src/mesa/drivers/dri/intel/intel_screen.c 
b/src/mesa/drivers/dri/intel/intel_screen.c
index f7ce87e..c2c8c6e 100644
--- a/src/mesa/drivers/dri/intel/intel_screen.c
+++ b/src/mesa/drivers/dri/intel/intel_screen.c
@@ -41,6 +41,7 @@
 #include "intel_fbo.h"
 #include "intel_screen.h"
 #include "intel_tex.h"
+#include "intel_regions.h"
 
 #include "i915_drm.h"
 
@@ -141,11 +142,84 @@ static const struct __DRI2flushExtensionRec 
intelFlushExtension = {
     intelDRI2FlushInvalidate,
 };
 
+static __DRIimage *
+intel_create_image_internal(__DRIcontext *context,
+                           int width, int height, int internal_format,
+                           int name, int pitch, void *loaderPrivate)
+{
+    __DRIimage *image;
+    struct intel_context *intel = context->driverPrivate;
+    int cpp;
+
+    image = CALLOC(sizeof *image);
+    image->internal_format = internal_format;
+    switch (internal_format) {
+    case GL_RGBA:
+       image->format = MESA_FORMAT_ARGB8888;
+       image->data_type = GL_UNSIGNED_BYTE;
+       break;
+    case GL_RGB:
+       image->format = MESA_FORMAT_XRGB8888;
+       image->data_type = GL_UNSIGNED_BYTE;
+       break;
+    }
+    image->data = loaderPrivate;
+    cpp = _mesa_get_format_bytes(image->format);
+
+    if (name == 0) {
+       pitch = ((cpp * width + 63) & ~63) / cpp;
+       image->region = intel_region_alloc(intel, I915_TILING_NONE,
+                                         cpp, width, height, pitch, GL_TRUE);
+    } else {
+       image->region = intel_region_alloc_for_handle(intel, cpp, width, height,
+                                                    pitch, name, "image");
+
+    }
+    if (image->region == NULL) {
+       FREE(image);
+       return NULL;
+    }
+
+    return image;      
+}
+
+static __DRIimage *
+intel_create_image(__DRIcontext *context,
+                  int width, int height, int format, void *private)
+{
+   return intel_create_image_internal(context, width, height, format,
+                                     0, 0, private);
+}
+
+static __DRIimage *
+intel_create_image_from_name(__DRIcontext *context,
+                            int width, int height, int format,
+                            int name, int pitch, void *private)
+{
+   return intel_create_image_internal(context, width, height, format,
+                                     name, pitch, private);
+}
+
+static void
+intel_destroy_image(__DRIimage *image)
+{
+    intel_region_release(&image->region);
+    FREE(image);
+}
+
+static struct __DRIimageExtensionRec intelImageExtension = {
+    { __DRI_IMAGE, __DRI_IMAGE_VERSION },
+    intel_create_image,
+    intel_create_image_from_name,
+    intel_destroy_image,
+};
+
 static const __DRIextension *intelScreenExtensions[] = {
     &driReadDrawableExtension,
     &intelTexOffsetExtension.base,
     &intelTexBufferExtension.base,
     &intelFlushExtension.base,
+    &intelImageExtension.base,
     NULL
 };
 
-- 
1.6.5.rc2


------------------------------------------------------------------------------
SOLARIS 10 is the OS for Data Centers - provides features such as DTrace,
Predictive Self Healing and Award Winning ZFS. Get Solaris 10 NOW
http://p.sf.net/sfu/solaris-dev2dev
_______________________________________________
Mesa3d-dev mailing list
Mesa3d-dev@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/mesa3d-dev

Reply via email to