R1xx/r2xx: Don't use an alpha texture format for GLX_TEXTURE_FORMAT_RGB_EXT
[mesa.git] / src / mesa / drivers / dri / r300 / r300_texstate.c
index 4f145bdbb4e977af586318908e4c1b1f0c477a3c..6d6a90aa88a288b02fe41519c042aa8e7454cd39 100644 (file)
@@ -117,6 +117,7 @@ static const struct tx_table {
        _ASSIGN(INTENSITY_FLOAT16, R300_EASY_TX_FORMAT(X, X, X, X, FL_I16)),
        _ASSIGN(Z16, R300_EASY_TX_FORMAT(X, X, X, X, X16)),
        _ASSIGN(Z24_S8, R300_EASY_TX_FORMAT(X, X, X, X, X24_Y8)),
+       _ASSIGN(S8_Z24, R300_EASY_TX_FORMAT(Y, Y, Y, Y, X24_Y8)),
        _ASSIGN(Z32, R300_EASY_TX_FORMAT(X, X, X, X, X32)),
        /* *INDENT-ON* */
 };
@@ -268,40 +269,29 @@ static GLboolean r300_validate_texture(GLcontext * ctx, struct gl_texture_object
        return GL_TRUE;
 }
 
-
 /**
  * Ensure all enabled and complete textures are uploaded along with any buffers being used.
  */
 GLboolean r300ValidateBuffers(GLcontext * ctx)
 {
        r300ContextPtr rmesa = R300_CONTEXT(ctx);
-       struct radeon_cs_space_check bos[16];
        struct radeon_renderbuffer *rrb;
-       int num_bo = 0;
        int i;
-       int flushed = 0, ret;
-again:
-       num_bo = 0;
+
+       radeon_validate_reset_bos(&rmesa->radeon);
 
        rrb = radeon_get_colorbuffer(&rmesa->radeon);
        /* color buffer */
        if (rrb && rrb->bo) {
-               bos[num_bo].bo = rrb->bo;
-               bos[num_bo].read_domains = 0;
-               bos[num_bo].write_domain = RADEON_GEM_DOMAIN_VRAM;
-               bos[num_bo].new_accounted = 0;
-               num_bo++;
+               radeon_validate_bo(&rmesa->radeon, rrb->bo,
+                                  0, RADEON_GEM_DOMAIN_VRAM);
        }
 
        /* depth buffer */
        rrb = radeon_get_depthbuffer(&rmesa->radeon);
-       /* color buffer */
        if (rrb && rrb->bo) {
-               bos[num_bo].bo = rrb->bo;
-               bos[num_bo].read_domains = 0;
-               bos[num_bo].write_domain = RADEON_GEM_DOMAIN_VRAM;
-               bos[num_bo].new_accounted = 0;
-               num_bo++;
+               radeon_validate_bo(&rmesa->radeon, rrb->bo,
+                                  0, RADEON_GEM_DOMAIN_VRAM);
        }
        
        for (i = 0; i < ctx->Const.MaxTextureImageUnits; ++i) {
@@ -317,26 +307,17 @@ again:
                }
                t = radeon_tex_obj(ctx->Texture.Unit[i]._Current);
                if (t->image_override && t->bo)
-                       bos[num_bo].bo = t->bo;
+                       radeon_validate_bo(&rmesa->radeon, t->bo,
+                                          RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM, 0);
+
                else if (t->mt->bo)
-                       bos[num_bo].bo = t->mt->bo;
-               bos[num_bo].read_domains = RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM;
-               bos[num_bo].write_domain = 0;
-               bos[num_bo].new_accounted = 0;
-               num_bo++;
+                       radeon_validate_bo(&rmesa->radeon, t->mt->bo,
+                                          RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM, 0);
        }
+       if (rmesa->radeon.dma.current)
+               radeon_validate_bo(&rmesa->radeon, rmesa->radeon.dma.current, RADEON_GEM_DOMAIN_GTT, 0);
 
-       ret = radeon_cs_space_check(rmesa->radeon.cmdbuf.cs, bos, num_bo);
-       if (ret == RADEON_CS_SPACE_OP_TO_BIG)
-               return GL_FALSE;
-       if (ret == RADEON_CS_SPACE_FLUSH) {
-               r300Flush(ctx);
-               if (flushed)
-                       return GL_FALSE;
-               flushed = 1;
-               goto again;
-       }
-       return GL_TRUE;
+       return radeon_revalidate_bos(ctx);
 }
 
 void r300SetTexOffset(__DRIcontext * pDRICtx, GLint texname,
@@ -384,7 +365,7 @@ void r300SetTexOffset(__DRIcontext * pDRICtx, GLint texname,
        t->pp_txpitch |= pitch_val;
 }
 
-void r300SetTexBuffer(__DRIcontext *pDRICtx, GLint target, __DRIdrawable *dPriv)
+void r300SetTexBuffer2(__DRIcontext *pDRICtx, GLint target, GLint glx_texture_format, __DRIdrawable *dPriv)
 {
        struct gl_texture_unit *texUnit;
        struct gl_texture_object *texObj;
@@ -393,16 +374,19 @@ void r300SetTexBuffer(__DRIcontext *pDRICtx, GLint target, __DRIdrawable *dPriv)
        radeon_texture_image *rImage;
        radeonContextPtr radeon;
        r300ContextPtr rmesa;
-       GLframebuffer *fb;
+       struct radeon_framebuffer *rfb;
        radeonTexObjPtr t;
        uint32_t pitch_val;
+       uint32_t internalFormat, type, format;
 
-       target = GL_TEXTURE_RECTANGLE_ARB;
+       type = GL_BGRA;
+       format = GL_UNSIGNED_BYTE;
+       internalFormat = (glx_texture_format == GLX_TEXTURE_FORMAT_RGB_EXT ? 3 : 4);
 
        radeon = pDRICtx->driverPrivate;
        rmesa = pDRICtx->driverPrivate;
 
-       fb = dPriv->driverPrivate;
+       rfb = dPriv->driverPrivate;
         texUnit = &radeon->glCtx->Texture.Unit[radeon->glCtx->Texture.CurrentUnit];
        texObj = _mesa_select_tex_object(radeon->glCtx, texUnit, target);
         texImage = _mesa_get_tex_image(radeon->glCtx, texObj, target, 0);
@@ -415,17 +399,17 @@ void r300SetTexBuffer(__DRIcontext *pDRICtx, GLint target, __DRIdrawable *dPriv)
 
        radeon_update_renderbuffers(pDRICtx, dPriv);
        /* back & depth buffer are useless free them right away */
-       rb = (void*)fb->Attachment[BUFFER_DEPTH].Renderbuffer;
+       rb = (void*)rfb->base.Attachment[BUFFER_DEPTH].Renderbuffer;
        if (rb && rb->bo) {
                radeon_bo_unref(rb->bo);
         rb->bo = NULL;
        }
-       rb = (void*)fb->Attachment[BUFFER_BACK_LEFT].Renderbuffer;
+       rb = (void*)rfb->base.Attachment[BUFFER_BACK_LEFT].Renderbuffer;
        if (rb && rb->bo) {
                radeon_bo_unref(rb->bo);
                rb->bo = NULL;
        }
-       rb = (void*)fb->Attachment[BUFFER_FRONT_LEFT].Renderbuffer;
+       rb = rfb->color_rb[0];
        if (rb->bo == NULL) {
                /* Failed to BO for the buffer */
                return;
@@ -433,21 +417,29 @@ void r300SetTexBuffer(__DRIcontext *pDRICtx, GLint target, __DRIdrawable *dPriv)
        
        _mesa_lock_texture(radeon->glCtx, texObj);
        if (t->bo) {
+               radeon_bo_unref(t->bo);
                t->bo = NULL;
        }
+       if (rImage->bo) {
+               radeon_bo_unref(rImage->bo);
+               rImage->bo = NULL;
+       }
        if (t->mt) {
+               radeon_miptree_unreference(t->mt);
                t->mt = NULL;
        }
        if (rImage->mt) {
                radeon_miptree_unreference(rImage->mt);
                rImage->mt = NULL;
        }
-       fprintf(stderr,"settexbuf %dx%d@%d\n", rb->width, rb->height, rb->cpp);
        _mesa_init_teximage_fields(radeon->glCtx, target, texImage,
                                   rb->width, rb->height, 1, 0, rb->cpp);
-       texImage->TexFormat = &_mesa_texformat_rgba8888_rev;
+       texImage->RowStride = rb->pitch / rb->cpp;
+       texImage->TexFormat = radeonChooseTextureFormat(radeon->glCtx,
+                                                       internalFormat,
+                                                       type, format, 0);
        rImage->bo = rb->bo;
-       
+       radeon_bo_ref(rImage->bo);
        t->bo = rb->bo;
        radeon_bo_ref(t->bo);
        t->tile_bits = 0;
@@ -457,7 +449,10 @@ void r300SetTexBuffer(__DRIcontext *pDRICtx, GLint target, __DRIdrawable *dPriv)
        pitch_val = rb->pitch;
        switch (rb->cpp) {
        case 4:
-               t->pp_txformat = R300_EASY_TX_FORMAT(X, Y, Z, W, W8Z8Y8X8);
+               if (glx_texture_format == GLX_TEXTURE_FORMAT_RGB_EXT)
+                       t->pp_txformat = R300_EASY_TX_FORMAT(X, Y, Z, ONE, W8Z8Y8X8);
+               else
+                       t->pp_txformat = R300_EASY_TX_FORMAT(X, Y, Z, W, W8Z8Y8X8);
                t->pp_txfilter |= tx_table[2].filter;
                pitch_val /= 4;
                break;
@@ -478,7 +473,19 @@ void r300SetTexBuffer(__DRIcontext *pDRICtx, GLint target, __DRIdrawable *dPriv)
               ((rb->height - 1) << R300_TX_HEIGHTMASK_SHIFT);
        t->pp_txsize |= R300_TX_SIZE_TXPITCH_EN;
        t->pp_txpitch |= pitch_val;
+
+       if (rmesa->radeon.radeonScreen->chip_family >= CHIP_FAMILY_RV515) {
+           if (rb->width > 2048)
+               t->pp_txpitch |= R500_TXWIDTH_BIT11;
+           if (rb->height > 2048)
+               t->pp_txpitch |= R500_TXHEIGHT_BIT11;
+       }
        t->validated = GL_TRUE;
        _mesa_unlock_texture(radeon->glCtx, texObj);
        return;
 }
+
+void r300SetTexBuffer(__DRIcontext *pDRICtx, GLint target, __DRIdrawable *dPriv)
+{
+        r300SetTexBuffer2(pDRICtx, target, GLX_TEXTURE_FORMAT_RGBA_EXT, dPriv);
+}