1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright (C) 2009 Francisco Jerez. 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * All Rights Reserved. 4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining 6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * a copy of this software and associated documentation files (the 7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * "Software"), to deal in the Software without restriction, including 8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * without limitation the rights to use, copy, modify, merge, publish, 9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * distribute, sublicense, and/or sell copies of the Software, and to 10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * permit persons to whom the Software is furnished to do so, subject to 11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the following conditions: 12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice (including the 14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * next paragraph) shall be included in all copies or substantial 15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * portions of the Software. 16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "nouveau_driver.h" 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "nouveau_fbo.h" 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "nouveau_context.h" 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "nouveau_texture.h" 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/framebuffer.h" 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/renderbuffer.h" 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/fbobject.h" 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/mfeatures.h" 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgset_renderbuffer_format(struct gl_renderbuffer *rb, GLenum internalFormat) 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nouveau_surface *s = &to_nouveau_renderbuffer(rb)->surface; 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rb->InternalFormat = internalFormat; 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (internalFormat) { 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGB: 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGB8: 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rb->_BaseFormat = GL_RGB; 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rb->Format = MESA_FORMAT_XRGB8888; 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s->cpp = 4; 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGBA: 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGBA8: 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rb->_BaseFormat = GL_RGBA; 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rb->Format = MESA_FORMAT_ARGB8888; 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s->cpp = 4; 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGB5: 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rb->_BaseFormat = GL_RGB; 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rb->Format = MESA_FORMAT_RGB565; 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s->cpp = 2; 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_DEPTH_COMPONENT16: 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rb->_BaseFormat = GL_DEPTH_COMPONENT; 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rb->Format = MESA_FORMAT_Z16; 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s->cpp = 2; 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_DEPTH_COMPONENT: 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_DEPTH_COMPONENT24: 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_STENCIL_INDEX8_EXT: 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_DEPTH24_STENCIL8_EXT: 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rb->_BaseFormat = GL_DEPTH_STENCIL; 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rb->Format = MESA_FORMAT_Z24_S8; 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s->cpp = 4; 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s->format = rb->Format; 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnouveau_renderbuffer_storage(struct gl_context *ctx, struct gl_renderbuffer *rb, 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum internalFormat, 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint width, GLuint height) 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nouveau_surface *s = &to_nouveau_renderbuffer(rb)->surface; 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!set_renderbuffer_format(rb, internalFormat)) 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rb->Width = width; 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rb->Height = height; 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nouveau_surface_alloc(ctx, s, TILED, NOUVEAU_BO_VRAM | NOUVEAU_BO_MAP, 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rb->Format, width, height); 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org context_dirty(ctx, FRAMEBUFFER); 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnouveau_renderbuffer_del(struct gl_context *ctx, struct gl_renderbuffer *rb) 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nouveau_surface *s = &to_nouveau_renderbuffer(rb)->surface; 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nouveau_surface_ref(NULL, s); 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_delete_renderbuffer(ctx, rb); 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct gl_renderbuffer * 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnouveau_renderbuffer_new(struct gl_context *ctx, GLuint name) 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_renderbuffer *rb; 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rb = (struct gl_renderbuffer *) 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CALLOC_STRUCT(nouveau_renderbuffer); 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!rb) 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_init_renderbuffer(rb, name); 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rb->AllocStorage = nouveau_renderbuffer_storage; 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rb->Delete = nouveau_renderbuffer_del; 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return rb; 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnouveau_renderbuffer_map(struct gl_context *ctx, 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_renderbuffer *rb, 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint x, GLuint y, GLuint w, GLuint h, 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLbitfield mode, 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte **out_map, 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint *out_stride) 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nouveau_surface *s = &to_nouveau_renderbuffer(rb)->surface; 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte *map; 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int stride; 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int flags = 0; 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (mode & GL_MAP_READ_BIT) 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org flags |= NOUVEAU_BO_RD; 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (mode & GL_MAP_WRITE_BIT) 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org flags |= NOUVEAU_BO_WR; 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nouveau_bo_map(s->bo, flags, context_client(ctx)); 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org map = s->bo->map; 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org stride = s->pitch; 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (rb->Name == 0) { 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org map += stride * (rb->Height - 1); 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org stride = -stride; 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org map += x * s->cpp; 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org map += (int)y * stride; 161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *out_map = map; 163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *out_stride = stride; 164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnouveau_renderbuffer_unmap(struct gl_context *ctx, 168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_renderbuffer *rb) 169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean 173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnouveau_renderbuffer_dri_storage(struct gl_context *ctx, struct gl_renderbuffer *rb, 174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum internalFormat, 175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint width, GLuint height) 176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!set_renderbuffer_format(rb, internalFormat)) 178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rb->Width = width; 181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rb->Height = height; 182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct gl_renderbuffer * 187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnouveau_renderbuffer_dri_new(GLenum format, __DRIdrawable *drawable) 188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_renderbuffer *rb; 190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rb = nouveau_renderbuffer_new(NULL, 0); 192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!rb) 193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rb->AllocStorage = nouveau_renderbuffer_dri_storage; 196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!set_renderbuffer_format(rb, format)) { 198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nouveau_renderbuffer_del(NULL, rb); 199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return rb; 203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct gl_framebuffer * 206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnouveau_framebuffer_new(struct gl_context *ctx, GLuint name) 207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nouveau_framebuffer *nfb; 209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nfb = CALLOC_STRUCT(nouveau_framebuffer); 211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!nfb) 212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_initialize_user_framebuffer(&nfb->base, name); 215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return &nfb->base; 217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct gl_framebuffer * 220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnouveau_framebuffer_dri_new(const struct gl_config *visual) 221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nouveau_framebuffer *nfb; 223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nfb = CALLOC_STRUCT(nouveau_framebuffer); 225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!nfb) 226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_initialize_window_framebuffer(&nfb->base, visual); 229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nfb->need_front = !visual->doubleBufferMode; 230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return &nfb->base; 232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnouveau_bind_framebuffer(struct gl_context *ctx, GLenum target, 236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_framebuffer *dfb, 237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_framebuffer *rfb) 238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org context_dirty(ctx, FRAMEBUFFER); 240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnouveau_framebuffer_renderbuffer(struct gl_context *ctx, struct gl_framebuffer *fb, 244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum attachment, struct gl_renderbuffer *rb) 245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_framebuffer_renderbuffer(ctx, fb, attachment, rb); 247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org context_dirty(ctx, FRAMEBUFFER); 249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLenum 252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgget_tex_format(struct gl_texture_image *ti) 253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (ti->TexFormat) { 255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case MESA_FORMAT_ARGB8888: 256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_RGBA8; 257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case MESA_FORMAT_XRGB8888: 258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_RGB8; 259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case MESA_FORMAT_RGB565: 260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_RGB5; 261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_NONE; 263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnouveau_render_texture(struct gl_context *ctx, struct gl_framebuffer *fb, 268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_renderbuffer_attachment *att) 269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_renderbuffer *rb = att->Renderbuffer; 271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_texture_image *ti = 272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org att->Texture->Image[att->CubeMapFace][att->TextureLevel]; 273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Allocate a renderbuffer object for the texture if we 275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * haven't already done so. */ 276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!rb) { 277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rb = nouveau_renderbuffer_new(ctx, ~0); 278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(rb); 279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rb->AllocStorage = NULL; 281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_reference_renderbuffer(&att->Renderbuffer, rb); 282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Update the renderbuffer fields from the texture. */ 285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org set_renderbuffer_format(rb, get_tex_format(ti)); 286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rb->Width = ti->Width; 287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rb->Height = ti->Height; 288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nouveau_surface_ref(&to_nouveau_teximage(ti)->surface, 289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &to_nouveau_renderbuffer(rb)->surface); 290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org context_dirty(ctx, FRAMEBUFFER); 292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnouveau_finish_render_texture(struct gl_context *ctx, 296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_renderbuffer_attachment *att) 297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texture_dirty(att->Texture); 299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnouveau_fbo_functions_init(struct dd_function_table *functions) 303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if FEATURE_EXT_framebuffer_object 305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org functions->NewFramebuffer = nouveau_framebuffer_new; 306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org functions->NewRenderbuffer = nouveau_renderbuffer_new; 307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org functions->MapRenderbuffer = nouveau_renderbuffer_map; 308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org functions->UnmapRenderbuffer = nouveau_renderbuffer_unmap; 309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org functions->BindFramebuffer = nouveau_bind_framebuffer; 310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org functions->FramebufferRenderbuffer = nouveau_framebuffer_renderbuffer; 311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org functions->RenderTexture = nouveau_render_texture; 312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org functions->FinishRenderTexture = nouveau_finish_render_texture; 313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 315