Merge branch 'mesa_7_5_branch'
authorJakob Bornecrantz <jakob@vmware.com>
Fri, 12 Jun 2009 11:31:04 +0000 (12:31 +0100)
committerJakob Bornecrantz <jakob@vmware.com>
Fri, 12 Jun 2009 11:31:04 +0000 (12:31 +0100)
src/gallium/state_trackers/python/retrace/interpreter.py
src/gallium/state_trackers/wgl/shared/stw_framebuffer.c
src/mesa/drivers/common/driverfuncs.c
src/mesa/main/queryobj.c
src/mesa/main/queryobj.h
src/mesa/main/texstore.c
src/mesa/state_tracker/st_atom_shader.c

index 5d4d04498b24c66b18752f91ff49f64bcbedb9a2..5885e162c28c864dbcbaa0236aa48236d13debad 100755 (executable)
@@ -43,19 +43,27 @@ except ImportError:
         return struct.unpack(fmt, buf[offset:offset + size])
 
 
-def make_image(surface):
+def make_image(surface, x=None, y=None, w=None, h=None):
+    if x is None:
+        x = 0
+    if y is None:
+        y = 0
+    if w is None:
+        w = surface.width - x
+    if h is None:
+        h = surface.height - y
     data = surface.get_tile_rgba8(0, 0, surface.width, surface.height)
 
     import Image
     outimage = Image.fromstring('RGBA', (surface.width, surface.height), data, "raw", 'RGBA', 0, 1)
     return outimage
 
-def save_image(filename, surface):
-    outimage = make_image(surface)
+def save_image(filename, surface, x=None, y=None, w=None, h=None):
+    outimage = make_image(surface, x, y, w, h)
     outimage.save(filename, "PNG")
 
-def show_image(surface, title):
-    outimage = make_image(surface)
+def show_image(surface, title, x=None, y=None, w=None, h=None):
+    outimage = make_image(surface, x, y, w, h)
     
     import Tkinter as tk
     from PIL import Image, ImageTk
@@ -305,7 +313,11 @@ class Screen(Object):
     def get_tex_transfer(self, texture, face, level, zslice, usage, x, y, w, h):
         if texture is None:
             return None
-        return Transfer(texture.get_surface(face, level, zslice), x, y, w, h)
+        transfer = Transfer(texture.get_surface(face, level, zslice), x, y, w, h)
+        if transfer and usage != gallium.PIPE_TRANSFER_WRITE:
+            if self.interpreter.options.all:
+                self.interpreter.present(transfer.surface, 'transf_read', x, y, w, h)
+        return transfer
     
     def tex_transfer_destroy(self, transfer):
         self.interpreter.unregister_object(transfer)
@@ -314,6 +326,8 @@ class Screen(Object):
         if transfer is None:
             return
         transfer.surface.put_tile_raw(transfer.x, transfer.y, transfer.w, transfer.h, data, stride)
+        if self.interpreter.options.all:
+            self.interpreter.present(transfer.surface, 'transf_write', transfer.x, transfer.y, transfer.w, transfer.h)
 
     def user_buffer_create(self, data, size):
         # We don't really care to distinguish between user and regular buffers
@@ -577,6 +591,14 @@ class Context(Object):
         self.real.draw_range_elements(indexBuffer, indexSize, minIndex, maxIndex, mode, start, count)
         self._set_dirty()
         
+    def is_texture_referenced(self, texture, face, level):
+        #return self.real.is_texture_referenced(format, texture, face, level)
+        pass
+    
+    def is_buffer_referenced(self, buf):
+        #return self.real.is_buffer_referenced(format, buf)
+        pass
+    
     def _set_dirty(self):
         if self.interpreter.options.step:
             self._present()
@@ -602,6 +624,9 @@ class Context(Object):
     
         if self.cbufs and self.cbufs[0]:
             self.interpreter.present(self.cbufs[0], "cbuf")
+        if self.zsbuf:
+            if self.interpreter.options.all:
+                self.interpreter.present(self.zsbuf, "zsbuf")
     
 
 class Interpreter(parser.TraceDumper):
@@ -671,16 +696,16 @@ class Interpreter(parser.TraceDumper):
     def verbosity(self, level):
         return self.options.verbosity >= level
 
-    def present(self, surface, description):
+    def present(self, surface, description, x=None, y=None, w=None, h=None):
         if self.call_no < self.options.start:
             return
 
         if self.options.images:
-            filename = '%s_%04u.png' % (description, self.call_no)
-            save_image(filename, surface)
+            filename = '%04u_%s.png' % (self.call_no, description)
+            save_image(filename, surface, x, y, w, h)
         else:
             title = '%u. %s' % (self.call_no, description)
-            show_image(surface, title)
+            show_image(surface, title, x, y, w, h)
     
 
 class Main(parser.Main):
@@ -690,6 +715,7 @@ class Main(parser.Main):
         optparser.add_option("-q", "--quiet", action="store_const", const=0, dest="verbosity", help="no messages")
         optparser.add_option("-v", "--verbose", action="count", dest="verbosity", default=1, help="increase verbosity level")
         optparser.add_option("-i", "--images", action="store_true", dest="images", default=False, help="save images instead of showing them")
+        optparser.add_option("-a", "--all", action="store_true", dest="all", default=False, help="show depth, stencil, and transfers")
         optparser.add_option("-s", "--step", action="store_true", dest="step", default=False, help="step trhough every draw")
         optparser.add_option("-f", "--from", action="store", type="int", dest="start", default=0, help="from call no")
         optparser.add_option("-t", "--to", action="store", type="int", dest="stop", default=0, help="until call no")
index a601fc5646b78a04512b45c2bdbf098c5fa37160..58f18303191f993114006aaee4fc7e721521d8a1 100644 (file)
@@ -45,7 +45,7 @@
 #include "stw_tls.h"
 
 
-struct stw_framebuffer *
+static INLINE struct stw_framebuffer *
 stw_framebuffer_from_hwnd_locked(
    HWND hwnd )
 {
index 56abdbdfcb4f56e25036e064180d0bd37d084ec0..f31a2a25bf3361f4ce8a5812f48e4294c6576855 100644 (file)
@@ -231,6 +231,7 @@ _mesa_init_driver_functions(struct dd_function_table *driver)
    driver->BeginQuery = _mesa_begin_query;
    driver->EndQuery = _mesa_end_query;
    driver->WaitQuery = _mesa_wait_query;
+   driver->CheckQuery = _mesa_check_query;
 
    /* APPLE_vertex_array_object */
    driver->NewArrayObject = _mesa_new_array_object;
index 554e0b0d1814e96cc98dea3ff702183af9b33f32..c25b31af023c30e10203a38b64010eacb94fe8b9 100644 (file)
@@ -83,12 +83,26 @@ void
 _mesa_wait_query(GLcontext *ctx, struct gl_query_object *q)
 {
    /* For software drivers, _mesa_end_query() should have completed the query.
-    * For real hardware, implement a proper WaitQuery() driver function.
+    * For real hardware, implement a proper WaitQuery() driver function,
+    * which may require issuing a flush.
     */
    assert(q->Ready);
 }
 
 
+/**
+ * Check if a query results are ready.  Software driver fallback.
+ * Called via ctx->Driver.CheckQuery().
+ */
+void
+_mesa_check_query(GLcontext *ctx, struct gl_query_object *q)
+{
+   /* No-op for sw rendering.
+    * HW drivers may need to flush at this time.
+    */
+}
+
+
 /**
  * Delete a query object.  Called via ctx->Driver.DeleteQuery().
  * Not removed from hash table here.
index 9a9774641bb85d259f680399de57cb4c86b46644..bc02b65b54c199301eea9601e8ea9ade683e439f 100644 (file)
@@ -48,6 +48,9 @@ _mesa_end_query(GLcontext *ctx, struct gl_query_object *q);
 extern void
 _mesa_wait_query(GLcontext *ctx, struct gl_query_object *q);
 
+extern void
+_mesa_check_query(GLcontext *ctx, struct gl_query_object *q);
+
 
 extern void GLAPIENTRY
 _mesa_GenQueriesARB(GLsizei n, GLuint *ids);
index f3739f950b0898cc9ae1bf52be43489eb4058a75..bfced1b3f4fd1d2d1204bef4dc99661805a71c3f 100644 (file)
@@ -2689,12 +2689,45 @@ GLboolean
 _mesa_texstore_z24_s8(TEXSTORE_PARAMS)
 {
    const GLfloat depthScale = (GLfloat) 0xffffff;
+   const GLint srcRowStride
+      = _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType)
+      / sizeof(GLuint);
+   GLint img, row;
 
    ASSERT(dstFormat == &_mesa_texformat_z24_s8);
-   ASSERT(srcFormat == GL_DEPTH_STENCIL_EXT);
-   ASSERT(srcType == GL_UNSIGNED_INT_24_8_EXT);
+   ASSERT(srcFormat == GL_DEPTH_STENCIL_EXT || srcFormat == GL_DEPTH_COMPONENT);
+   ASSERT(srcFormat != GL_DEPTH_STENCIL_EXT || srcType == GL_UNSIGNED_INT_24_8_EXT);
 
-   if (ctx->Pixel.DepthScale == 1.0f &&
+   /* In case we only upload depth we need to preserve the stencil */
+   if (srcFormat == GL_DEPTH_COMPONENT) {
+      for (img = 0; img < srcDepth; img++) {
+         GLuint *dstRow = (GLuint *) dstAddr
+            + dstImageOffsets[dstZoffset + img]
+            + dstYoffset * dstRowStride / sizeof(GLuint)
+            + dstXoffset;
+         const GLuint *src
+            = (const GLuint *) _mesa_image_address(dims, srcPacking, srcAddr,
+                  srcWidth, srcHeight,
+                  srcFormat, srcType,
+                  img, 0, 0);
+         for (row = 0; row < srcHeight; row++) {
+            GLuint depth[MAX_WIDTH];
+            GLint i;
+            _mesa_unpack_depth_span(ctx, srcWidth,
+                                    GL_UNSIGNED_INT, /* dst type */
+                                    depth, /* dst addr */
+                                    depthScale,
+                                    srcType, src, srcPacking);
+
+            for (i = 0; i < srcWidth; i++)
+               dstRow[i] = depth[i] << 8 | (dstRow[i] & 0x000000FF);
+
+            src += srcRowStride;
+            dstRow += dstRowStride / sizeof(GLuint);
+         }
+      }
+   }
+   else if (ctx->Pixel.DepthScale == 1.0f &&
        ctx->Pixel.DepthBias == 0.0f &&
        !srcPacking->SwapBytes) {
       /* simple path */
index cb869c98a3d11554214ab4d37a4fcb9bc508cdd9..ee649be885e2fa882ea5e80685796eb93a00c2cd 100644 (file)
@@ -175,11 +175,12 @@ find_translated_vp(struct st_context *st,
 
    /* See if we need to translate vertex program to TGSI form */
    if (xvp->serialNo != stvp->serialNo) {
-      GLuint outAttr, dummySlot;
+      GLuint outAttr;
       const GLbitfield outputsWritten = stvp->Base.Base.OutputsWritten;
       GLuint numVpOuts = 0;
       GLboolean emitPntSize = GL_FALSE, emitBFC0 = GL_FALSE, emitBFC1 = GL_FALSE;
-      GLint maxGeneric;
+      GLbitfield usedGenerics = 0x0;
+      GLbitfield usedOutputSlots = 0x0;
 
       /* Compute mapping of vertex program outputs to slots, which depends
        * on the fragment program's input->slot mapping.
@@ -192,10 +193,12 @@ find_translated_vp(struct st_context *st,
 
          if (outAttr == VERT_RESULT_HPOS) {
             /* always put xformed position into slot zero */
-            xvp->output_to_slot[VERT_RESULT_HPOS] = 0;
+            GLuint slot = 0;
+            xvp->output_to_slot[VERT_RESULT_HPOS] = slot;
             xvp->output_to_semantic_name[outAttr] = TGSI_SEMANTIC_POSITION;
             xvp->output_to_semantic_index[outAttr] = 0;
             numVpOuts++;
+            usedOutputSlots |= (1 << slot);
          }
          else if (outputsWritten & (1 << outAttr)) {
             /* see if the frag prog wants this vert output */
@@ -209,6 +212,12 @@ find_translated_vp(struct st_context *st,
                   xvp->output_to_semantic_name[outAttr] = stfp->input_semantic_name[fpInSlot];
                   xvp->output_to_semantic_index[outAttr] = stfp->input_semantic_index[fpInSlot];
                   numVpOuts++;
+                  usedOutputSlots |= (1 << vpOutSlot);
+               }
+               else {
+#if 0 /*debug*/
+                  printf("VP output %d not used by FP\n", outAttr);
+#endif
                }
             }
             else if (outAttr == VERT_RESULT_PSIZ)
@@ -226,45 +235,49 @@ find_translated_vp(struct st_context *st,
 
       /* must do these last */
       if (emitPntSize) {
-         xvp->output_to_slot[VERT_RESULT_PSIZ] = numVpOuts++;
+         GLuint slot = numVpOuts++;
+         xvp->output_to_slot[VERT_RESULT_PSIZ] = slot;
          xvp->output_to_semantic_name[VERT_RESULT_PSIZ] = TGSI_SEMANTIC_PSIZE;
          xvp->output_to_semantic_index[VERT_RESULT_PSIZ] = 0;
+         usedOutputSlots |= (1 << slot);
       }
       if (emitBFC0) {
-         xvp->output_to_slot[VERT_RESULT_BFC0] = numVpOuts++;
+         GLuint slot = numVpOuts++;
+         xvp->output_to_slot[VERT_RESULT_BFC0] = slot;
          xvp->output_to_semantic_name[VERT_RESULT_BFC0] = TGSI_SEMANTIC_COLOR;
          xvp->output_to_semantic_index[VERT_RESULT_BFC0] = 0;
+         usedOutputSlots |= (1 << slot);
       }
       if (emitBFC1) {
-         xvp->output_to_slot[VERT_RESULT_BFC1] = numVpOuts++;
+         GLuint slot = numVpOuts++;
+         xvp->output_to_slot[VERT_RESULT_BFC1] = slot;
          xvp->output_to_semantic_name[VERT_RESULT_BFC1] = TGSI_SEMANTIC_COLOR;
          xvp->output_to_semantic_index[VERT_RESULT_BFC1] = 1;
+         usedOutputSlots |= (1 << slot);
       }
 
-      /* Unneeded vertex program outputs will go to this slot.
-       * We could use this info to do dead code elimination in the
-       * vertex program.
-       */
-      dummySlot = numVpOuts;
-
-      /* find max GENERIC slot index */
-      maxGeneric = -1;
+      /* build usedGenerics mask */
+      usedGenerics = 0x0;
       for (outAttr = 0; outAttr < VERT_RESULT_MAX; outAttr++) {
          if (xvp->output_to_semantic_name[outAttr] == TGSI_SEMANTIC_GENERIC) {
-            maxGeneric = MAX2(maxGeneric,
-                              xvp->output_to_semantic_index[outAttr]);
+            usedGenerics |= (1 << xvp->output_to_semantic_index[outAttr]);
          }
       }
 
-      /* Map vert program outputs that aren't used to the dummy slot
-       * (and an unused generic attribute slot).
+      /* For each vertex program output that doesn't match up to a fragment
+       * program input, map the vertex program output to a free slot and
+       * free generic attribute.
        */
       for (outAttr = 0; outAttr < VERT_RESULT_MAX; outAttr++) {
          if (outputsWritten & (1 << outAttr)) {
             if (xvp->output_to_slot[outAttr] == UNUSED) {
-               xvp->output_to_slot[outAttr] = dummySlot;
+               GLint freeGeneric = _mesa_ffs(~usedGenerics) - 1;
+               GLint freeSlot = _mesa_ffs(~usedOutputSlots) - 1;
+               usedGenerics |= (1 << freeGeneric);
+               usedOutputSlots |= (1 << freeSlot);
+               xvp->output_to_slot[outAttr] = freeSlot;
                xvp->output_to_semantic_name[outAttr] = TGSI_SEMANTIC_GENERIC;
-               xvp->output_to_semantic_index[outAttr] = maxGeneric + 1;
+               xvp->output_to_semantic_index[outAttr] = freeGeneric;
             }
          }