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:
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:
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,
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
functions->FramebufferRenderbuffer = nouveau_framebuffer_renderbuffer;
functions->RenderTexture = nouveau_render_texture;
functions->FinishRenderTexture = nouveau_finish_render_texture;
+ functions->ValidateFramebuffer = nouveau_check_framebuffer_complete;
}