On Sat, May 5, 2012 at 9:44 AM, Roland Scheidegger <srol...@vmware.com> wrote:
[snip]...

>> +    * or the original texture stuff would not work
>> +    *
>> +    * FIXME: we may use multi-texture to handle this case. But fallback is
>> +    * definitely a much simple and straight way.
>> +    */
>> +   if (ctx->Texture._EnabledUnits)
>> +      fallback = GL_TRUE;
>> +
>>     if (_mesa_is_color_format(format)) {
>>        /* use more compact format when possible */
>>        /* XXX disable special case for GL_LUMINANCE for now to work around
>
> Wouldn't you also have to test for active fragment shader too (i.e.
> essentially same test that _mesa_meta_Bitmap is doing I think they might
> have the same prerequisites for fallback for the hilarious combination
> of these ops with ordinary fragment shading)? Though I guess maybe you
> could avoid fallback in some cases (like drawing to stencil buffer then
> texture bound shouldn't matter I think though a fragment shader writing
> to depth or killing fragments still would).

Yes and thanks. And here is the new patch based on your comments:

>From 1e1bacb8cba6ee55b4659613f8a9037b4f54d9c5 Mon Sep 17 00:00:00 2001
From: Yuanhan Liu <yuanhan....@linux.intel.com>
Date: Fri, 4 May 2012 22:23:37 +0800
Subject: [PATCH] meta: do fallback when texture is enabled for DrawPixels

If there are already some texture unit enabled, a fallback is needed,
or the original texture stuff would not work.

A much better way is to use multi-texture to handle this case: like
treat the pixels as texture 1 and the original texture as texture 2.
I haven't do much inverstigation on that way, but fallback is definitely
a much simpler and straight way.

This would fix oglc mipsel test case.

v2: Roland: do fallback also for active fragment shader
            no need to fallback for stencil buffer

Signed-off-by: Yuanhan Liu <yuanhan....@linux.intel.com>
---
 src/mesa/drivers/common/meta.c |   13 +++++++++++++
 1 files changed, 13 insertions(+), 0 deletions(-)

diff --git a/src/mesa/drivers/common/meta.c b/src/mesa/drivers/common/meta.c
index 95336fc..eedc889 100644
--- a/src/mesa/drivers/common/meta.c
+++ b/src/mesa/drivers/common/meta.c
@@ -2206,10 +2206,23 @@ _mesa_meta_DrawPixels(struct gl_context *ctx,
     */
    fallback = GL_FALSE;
    if (ctx->_ImageTransferState ||
+       ctx->FragmentProgram._Enabled ||
        ctx->Fog.Enabled) {
       fallback = GL_TRUE;
    }

+   /*
+    * If there are already some texture unit enabled, a fallback is needed,
+    * or the original texture stuff would not work
+    *
+    * No need to fallback if drawing to stencil buffer.
+    *
+    * FIXME: we may use multi-texture to handle this case. But fallback is
+    * definitely a much simple and straight way.
+    */
+   if (ctx->Texture._EnabledUnits && !_mesa_is_stencil_format(format))
+      fallback = GL_TRUE;
+
    if (_mesa_is_color_format(format)) {
       /* use more compact format when possible */
       /* XXX disable special case for GL_LUMINANCE for now to work around
-- 
1.7.3.1
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to