[Mesa-dev] [PATCH 3/5] i965: Implement SetTextureStorageForBufferObject

Jason Ekstrand jason at jlekstrand.net
Thu Jan 8 16:47:15 PST 2015


---
 src/mesa/drivers/dri/i965/intel_tex.c | 44 +++++++++++++++++++++++++++++++++++
 1 file changed, 44 insertions(+)

diff --git a/src/mesa/drivers/dri/i965/intel_tex.c b/src/mesa/drivers/dri/i965/intel_tex.c
index 3be72d5..fd2e003 100644
--- a/src/mesa/drivers/dri/i965/intel_tex.c
+++ b/src/mesa/drivers/dri/i965/intel_tex.c
@@ -5,6 +5,7 @@
 #include "main/mipmap.h"
 #include "drivers/common/meta.h"
 #include "brw_context.h"
+#include "intel_buffer_objects.h"
 #include "intel_mipmap_tree.h"
 #include "intel_tex.h"
 #include "intel_fbo.h"
@@ -298,6 +299,47 @@ intel_texture_view(struct gl_context *ctx,
    return GL_TRUE;
 }
 
+static bool
+intel_set_texture_storage_for_buffer_object(struct gl_context *ctx,
+                                            struct gl_texture_object *tex_obj,
+                                            struct gl_buffer_object *buffer_obj,
+                                            uint32_t buffer_offset,
+                                            uint32_t row_stride)
+{
+   struct brw_context *brw = brw_context(ctx);
+   struct intel_texture_object *intel_texobj = intel_texture_object(tex_obj);
+   struct gl_texture_image *image = tex_obj->Image[0][0];
+   struct intel_texture_image *intel_image = intel_texture_image(image);
+   struct intel_buffer_object *intel_buffer_obj = intel_buffer_object(buffer_obj);
+
+   assert(intel_texobj->mt == NULL);
+
+   drm_intel_bo *bo = intel_bufferobj_buffer(brw, intel_buffer_obj,
+                                             buffer_offset,
+                                             row_stride * image->Height);
+   intel_texobj->mt =
+      intel_miptree_create_for_bo(brw, bo,
+                                  image->TexFormat,
+                                  buffer_offset,
+                                  image->Width, image->Height, image->Depth,
+                                  row_stride);
+   if (!intel_texobj->mt)
+      return false;
+
+   if (!_swrast_init_texture_image(image))
+      return false;
+
+   intel_miptree_reference(&intel_image->mt, intel_texobj->mt);
+
+   /* The miptree is in a validated state, so no need to check later. */
+   intel_texobj->needs_validate = false;
+   intel_texobj->validated_first_level = 0;
+   intel_texobj->validated_last_level = 0;
+   intel_texobj->_Format = intel_texobj->mt->format;
+
+   return true;
+}
+
 void
 intelInitTextureFuncs(struct dd_function_table *functions)
 {
@@ -311,4 +353,6 @@ intelInitTextureFuncs(struct dd_function_table *functions)
    functions->MapTextureImage = intel_map_texture_image;
    functions->UnmapTextureImage = intel_unmap_texture_image;
    functions->TextureView = intel_texture_view;
+   functions->SetTextureStorageForBufferObject =
+      intel_set_texture_storage_for_buffer_object;
 }
-- 
2.2.0



More information about the mesa-dev mailing list