i965/nir: Don't support gl_FrontFacing as an input variable
[mesa.git] / src / mesa / drivers / dri / nouveau / nouveau_fbo.c
index a692051c082950839b0a2c9019d33c4f4594afef..6c479f5f0c637c1ea0700479eaa8380b130624d1 100644 (file)
@@ -44,23 +44,23 @@ set_renderbuffer_format(struct gl_renderbuffer *rb, GLenum internalFormat)
        case GL_RGB:
        case GL_RGB8:
                rb->_BaseFormat  = GL_RGB;
-               rb->Format = MESA_FORMAT_XRGB8888;
+               rb->Format = MESA_FORMAT_B8G8R8X8_UNORM;
                s->cpp = 4;
                break;
        case GL_RGBA:
        case GL_RGBA8:
                rb->_BaseFormat  = GL_RGBA;
-               rb->Format = MESA_FORMAT_ARGB8888;
+               rb->Format = MESA_FORMAT_B8G8R8A8_UNORM;
                s->cpp = 4;
                break;
        case GL_RGB5:
                rb->_BaseFormat  = GL_RGB;
-               rb->Format = MESA_FORMAT_RGB565;
+               rb->Format = MESA_FORMAT_B5G6R5_UNORM;
                s->cpp = 2;
                break;
        case GL_DEPTH_COMPONENT16:
                rb->_BaseFormat  = GL_DEPTH_COMPONENT;
-               rb->Format = MESA_FORMAT_Z16;
+               rb->Format = MESA_FORMAT_Z_UNORM16;
                s->cpp = 2;
                break;
        case GL_DEPTH_COMPONENT:
@@ -68,7 +68,7 @@ set_renderbuffer_format(struct gl_renderbuffer *rb, GLenum internalFormat)
        case GL_STENCIL_INDEX8_EXT:
        case GL_DEPTH24_STENCIL8_EXT:
                rb->_BaseFormat  = GL_DEPTH_STENCIL;
-               rb->Format = MESA_FORMAT_Z24_S8;
+               rb->Format = MESA_FORMAT_S8_UINT_Z24_UNORM;
                s->cpp = 4;
                break;
        default:
@@ -252,8 +252,7 @@ nouveau_render_texture(struct gl_context *ctx, struct gl_framebuffer *fb,
                       struct gl_renderbuffer_attachment *att)
 {
        struct gl_renderbuffer *rb = att->Renderbuffer;
-       struct gl_texture_image *ti =
-               att->Texture->Image[att->CubeMapFace][att->TextureLevel];
+       struct gl_texture_image *ti = rb->TexImage;
 
        /* Update the renderbuffer fields from the texture. */
        nouveau_surface_ref(&to_nouveau_teximage(ti)->surface,
@@ -264,9 +263,60 @@ nouveau_render_texture(struct gl_context *ctx, struct gl_framebuffer *fb,
 
 static void
 nouveau_finish_render_texture(struct gl_context *ctx,
-                             struct gl_renderbuffer_attachment *att)
+                             struct gl_renderbuffer *rb)
 {
-       texture_dirty(att->Texture);
+       if (rb && rb->TexImage)
+               texture_dirty(rb->TexImage->TexObject);
+}
+
+static int
+validate_format_bpp(mesa_format format)
+{
+       switch (format) {
+       case MESA_FORMAT_B8G8R8X8_UNORM:
+       case MESA_FORMAT_B8G8R8A8_UNORM:
+       case MESA_FORMAT_S8_UINT_Z24_UNORM:
+               return 32;
+       case MESA_FORMAT_B5G6R5_UNORM:
+       case MESA_FORMAT_Z_UNORM16:
+               return 16;
+       default:
+               return 0;
+       }
+}
+
+static void
+nouveau_check_framebuffer_complete(struct gl_context *ctx,
+                                  struct gl_framebuffer *fb)
+{
+       struct gl_renderbuffer_attachment *color =
+               &fb->Attachment[BUFFER_COLOR0];
+       struct gl_renderbuffer_attachment *depth =
+               &fb->Attachment[BUFFER_DEPTH];
+       int color_bpp = 0, zeta_bpp;
+
+       if (color->Type == GL_TEXTURE) {
+               color_bpp = validate_format_bpp(
+                               color->Renderbuffer->TexImage->TexFormat);
+               if (!color_bpp)
+                       goto err;
+       }
+
+       if (depth->Type == GL_TEXTURE) {
+               zeta_bpp = validate_format_bpp(
+                               depth->Renderbuffer->TexImage->TexFormat);
+               if (!zeta_bpp)
+                       goto err;
+               /* NV04/NV05 requires same bpp-ness for color/zeta */
+               if (context_chipset(ctx) < 0x10 &&
+                   color_bpp && color_bpp != zeta_bpp)
+                       goto err;
+       }
+
+       return;
+err:
+       fb->_Status = GL_FRAMEBUFFER_UNSUPPORTED_EXT;
+       return;
 }
 
 void
@@ -280,4 +330,5 @@ nouveau_fbo_functions_init(struct dd_function_table *functions)
        functions->FramebufferRenderbuffer = nouveau_framebuffer_renderbuffer;
        functions->RenderTexture = nouveau_render_texture;
        functions->FinishRenderTexture = nouveau_finish_render_texture;
+       functions->ValidateFramebuffer = nouveau_check_framebuffer_complete;
 }