[g3dvl] move z-coord generation for multiple render targets into vertex shader
[mesa.git] / src / mesa / drivers / dri / intel / intel_buffer_objects.c
index 117d4daf3babb23147763eaf412a6ba2f7f93bfc..87da60a771e86cb20b86a1e2c8afbff64c7e5504 100644 (file)
@@ -40,7 +40,7 @@
 #include "intel_regions.h"
 
 static GLboolean
-intel_bufferobj_unmap(GLcontext * ctx,
+intel_bufferobj_unmap(struct gl_context * ctx,
                       GLenum target, struct gl_buffer_object *obj);
 
 /** Allocates a new drm_intel_bo to store the data for the buffer object. */
@@ -59,7 +59,7 @@ intel_bufferobj_alloc_buffer(struct intel_context *intel,
  * internal structure where somehow shared.
  */
 static struct gl_buffer_object *
-intel_bufferobj_alloc(GLcontext * ctx, GLuint name, GLenum target)
+intel_bufferobj_alloc(struct gl_context * ctx, GLuint name, GLenum target)
 {
    struct intel_buffer_object *obj = CALLOC_STRUCT(intel_buffer_object);
 
@@ -101,7 +101,7 @@ intel_bufferobj_cow(struct intel_context *intel,
  * Called via glDeleteBuffersARB().
  */
 static void
-intel_bufferobj_free(GLcontext * ctx, struct gl_buffer_object *obj)
+intel_bufferobj_free(struct gl_context * ctx, struct gl_buffer_object *obj)
 {
    struct intel_context *intel = intel_context(ctx);
    struct intel_buffer_object *intel_obj = intel_buffer_object(obj);
@@ -136,7 +136,7 @@ intel_bufferobj_free(GLcontext * ctx, struct gl_buffer_object *obj)
  * \return GL_TRUE for success, GL_FALSE if out of memory
  */
 static GLboolean
-intel_bufferobj_data(GLcontext * ctx,
+intel_bufferobj_data(struct gl_context * ctx,
                      GLenum target,
                      GLsizeiptrARB size,
                      const GLvoid * data,
@@ -193,7 +193,7 @@ intel_bufferobj_data(GLcontext * ctx,
  * Called via glBufferSubDataARB().
  */
 static void
-intel_bufferobj_subdata(GLcontext * ctx,
+intel_bufferobj_subdata(struct gl_context * ctx,
                         GLenum target,
                         GLintptrARB offset,
                         GLsizeiptrARB size,
@@ -214,21 +214,28 @@ intel_bufferobj_subdata(GLcontext * ctx,
       memcpy((char *)intel_obj->sys_buffer + offset, data, size);
    else {
       /* Flush any existing batchbuffer that might reference this data. */
-      if (drm_intel_bo_busy(intel_obj->buffer) ||
-         drm_intel_bo_references(intel->batch->buf, intel_obj->buffer)) {
-        drm_intel_bo *temp_bo;
+      if (intel->gen < 6) {
+        if (drm_intel_bo_busy(intel_obj->buffer) ||
+            drm_intel_bo_references(intel->batch->buf, intel_obj->buffer)) {
+           drm_intel_bo *temp_bo;
 
-        temp_bo = drm_intel_bo_alloc(intel->bufmgr, "subdata temp", size, 64);
+           temp_bo = drm_intel_bo_alloc(intel->bufmgr, "subdata temp", size, 64);
 
-        drm_intel_bo_subdata(temp_bo, 0, size, data);
+           drm_intel_bo_subdata(temp_bo, 0, size, data);
 
-        intel_emit_linear_blit(intel,
-                               intel_obj->buffer, offset,
-                               temp_bo, 0,
-                               size);
+           intel_emit_linear_blit(intel,
+                                  intel_obj->buffer, offset,
+                                  temp_bo, 0,
+                                  size);
 
-        drm_intel_bo_unreference(temp_bo);
+           drm_intel_bo_unreference(temp_bo);
+        } else {
+           drm_intel_bo_subdata(intel_obj->buffer, offset, size, data);
+        }
       } else {
+        if (drm_intel_bo_references(intel->batch->buf, intel_obj->buffer)) {
+           intel_batchbuffer_flush(intel->batch);
+        }
         drm_intel_bo_subdata(intel_obj->buffer, offset, size, data);
       }
    }
@@ -239,7 +246,7 @@ intel_bufferobj_subdata(GLcontext * ctx,
  * Called via glGetBufferSubDataARB().
  */
 static void
-intel_bufferobj_get_subdata(GLcontext * ctx,
+intel_bufferobj_get_subdata(struct gl_context * ctx,
                             GLenum target,
                             GLintptrARB offset,
                             GLsizeiptrARB size,
@@ -260,7 +267,7 @@ intel_bufferobj_get_subdata(GLcontext * ctx,
  * Called via glMapBufferARB().
  */
 static void *
-intel_bufferobj_map(GLcontext * ctx,
+intel_bufferobj_map(struct gl_context * ctx,
                     GLenum target,
                     GLenum access, struct gl_buffer_object *obj)
 {
@@ -322,7 +329,7 @@ intel_bufferobj_map(GLcontext * ctx,
  * and blit it into the real BO at unmap time.
  */
 static void *
-intel_bufferobj_map_range(GLcontext * ctx,
+intel_bufferobj_map_range(struct gl_context * ctx,
                          GLenum target, GLintptr offset, GLsizeiptr length,
                          GLbitfield access, struct gl_buffer_object *obj)
 {
@@ -415,7 +422,7 @@ intel_bufferobj_map_range(GLcontext * ctx,
  * would defeat the point.
  */
 static void
-intel_bufferobj_flush_mapped_range(GLcontext *ctx, GLenum target,
+intel_bufferobj_flush_mapped_range(struct gl_context *ctx, GLenum target,
                                   GLintptr offset, GLsizeiptr length,
                                   struct gl_buffer_object *obj)
 {
@@ -449,7 +456,7 @@ intel_bufferobj_flush_mapped_range(GLcontext *ctx, GLenum target,
  * Called via glUnmapBuffer().
  */
 static GLboolean
-intel_bufferobj_unmap(GLcontext * ctx,
+intel_bufferobj_unmap(struct gl_context * ctx,
                       GLenum target, struct gl_buffer_object *obj)
 {
    struct intel_context *intel = intel_context(ctx);
@@ -537,7 +544,7 @@ intel_bufferobj_buffer(struct intel_context *intel,
 }
 
 static void
-intel_bufferobj_copy_subdata(GLcontext *ctx,
+intel_bufferobj_copy_subdata(struct gl_context *ctx,
                             struct gl_buffer_object *src,
                             struct gl_buffer_object *dst,
                             GLintptr read_offset, GLintptr write_offset,
@@ -552,7 +559,7 @@ intel_bufferobj_copy_subdata(GLcontext *ctx,
       return;
 
    /* If we're in system memory, just map and memcpy. */
-   if (intel_src->sys_buffer || intel_dst->sys_buffer) {
+   if (intel_src->sys_buffer || intel_dst->sys_buffer || intel->gen >= 6) {
       /* The same buffer may be used, but note that regions copied may
        * not overlap.
        */
@@ -575,6 +582,7 @@ intel_bufferobj_copy_subdata(GLcontext *ctx,
         intel_bufferobj_unmap(ctx, GL_COPY_READ_BUFFER, src);
         intel_bufferobj_unmap(ctx, GL_COPY_WRITE_BUFFER, dst);
       }
+      return;
    }
 
    /* Otherwise, we have real BOs, so blit them. */
@@ -596,7 +604,7 @@ intel_bufferobj_copy_subdata(GLcontext *ctx,
 
 #if FEATURE_APPLE_object_purgeable
 static GLenum
-intel_buffer_purgeable(GLcontext * ctx,
+intel_buffer_purgeable(struct gl_context * ctx,
                        drm_intel_bo *buffer,
                        GLenum option)
 {
@@ -609,7 +617,7 @@ intel_buffer_purgeable(GLcontext * ctx,
 }
 
 static GLenum
-intel_buffer_object_purgeable(GLcontext * ctx,
+intel_buffer_object_purgeable(struct gl_context * ctx,
                               struct gl_buffer_object *obj,
                               GLenum option)
 {
@@ -636,7 +644,7 @@ intel_buffer_object_purgeable(GLcontext * ctx,
 }
 
 static GLenum
-intel_texture_object_purgeable(GLcontext * ctx,
+intel_texture_object_purgeable(struct gl_context * ctx,
                                struct gl_texture_object *obj,
                                GLenum option)
 {
@@ -650,7 +658,7 @@ intel_texture_object_purgeable(GLcontext * ctx,
 }
 
 static GLenum
-intel_render_object_purgeable(GLcontext * ctx,
+intel_render_object_purgeable(struct gl_context * ctx,
                               struct gl_renderbuffer *obj,
                               GLenum option)
 {
@@ -664,7 +672,7 @@ intel_render_object_purgeable(GLcontext * ctx,
 }
 
 static GLenum
-intel_buffer_unpurgeable(GLcontext * ctx,
+intel_buffer_unpurgeable(struct gl_context * ctx,
                          drm_intel_bo *buffer,
                          GLenum option)
 {
@@ -678,7 +686,7 @@ intel_buffer_unpurgeable(GLcontext * ctx,
 }
 
 static GLenum
-intel_buffer_object_unpurgeable(GLcontext * ctx,
+intel_buffer_object_unpurgeable(struct gl_context * ctx,
                                 struct gl_buffer_object *obj,
                                 GLenum option)
 {
@@ -686,7 +694,7 @@ intel_buffer_object_unpurgeable(GLcontext * ctx,
 }
 
 static GLenum
-intel_texture_object_unpurgeable(GLcontext * ctx,
+intel_texture_object_unpurgeable(struct gl_context * ctx,
                                  struct gl_texture_object *obj,
                                  GLenum option)
 {
@@ -700,7 +708,7 @@ intel_texture_object_unpurgeable(GLcontext * ctx,
 }
 
 static GLenum
-intel_render_object_unpurgeable(GLcontext * ctx,
+intel_render_object_unpurgeable(struct gl_context * ctx,
                                 struct gl_renderbuffer *obj,
                                 GLenum option)
 {