nouveau_texture.c revision d47a6ada9ca9670c60fc141fabadf40c63031c08
1fab1498f2f42726c7de46c3ed560d56dd072a8b3rossberg@chromium.org/* 23484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org * Copyright (C) 2009 Francisco Jerez. 33484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org * All Rights Reserved. 4ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org * 5ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org * Permission is hereby granted, free of charge, to any person obtaining 6ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org * a copy of this software and associated documentation files (the 7ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org * "Software"), to deal in the Software without restriction, including 8196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org * without limitation the rights to use, copy, modify, merge, publish, 9196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org * distribute, sublicense, and/or sell copies of the Software, and to 10196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org * permit persons to whom the Software is furnished to do so, subject to 11196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org * the following conditions: 12196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org * 13196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org * The above copyright notice and this permission notice (including the 14196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org * next paragraph) shall be included in all copies or substantial 15196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org * portions of the Software. 16196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org * 17196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 18196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 19196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 20196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org * IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE 21196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 22196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 23196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 24196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org * 25196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org */ 26ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 27ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org#include "nouveau_driver.h" 28ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org#include "nouveau_context.h" 29ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org#include "nouveau_texture.h" 30ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org#include "nouveau_fbo.h" 3157a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org#include "nouveau_util.h" 32ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 33ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org#include "main/pbo.h" 34a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org#include "main/texobj.h" 35e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org#include "main/texstore.h" 36ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org#include "main/texformat.h" 3757a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org#include "main/texcompress.h" 38ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org#include "main/texgetimage.h" 39ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org#include "main/mipmap.h" 40ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org#include "main/teximage.h" 41ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org#include "drivers/common/meta.h" 42ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org#include "swrast/s_texfetch.h" 43ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 44ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgstatic struct gl_texture_object * 45c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.orgnouveau_texture_new(struct gl_context *ctx, GLuint name, GLenum target) 46ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org{ 47ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org struct nouveau_texture *nt = CALLOC_STRUCT(nouveau_texture); 48ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 49ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org _mesa_initialize_texture_object(&nt->base, name, target); 50ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 51750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org return &nt->base; 52750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org} 53ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 54c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comstatic void 5557a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.orgnouveau_texture_free(struct gl_context *ctx, struct gl_texture_object *t) 5657a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org{ 575924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org struct nouveau_texture *nt = to_nouveau_texture(t); 58c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org int i; 59ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 60ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org for (i = 0; i < MAX_TEXTURE_LEVELS; i++) 61ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org nouveau_surface_ref(NULL, &nt->surfaces[i]); 62ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 63e3b8d0fe80e858c990832db1233c069f8b8cd5c9mstarzinger@chromium.org _mesa_delete_texture_object(ctx, t); 64ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org} 65ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 66ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgstatic struct gl_texture_image * 6757a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.orgnouveau_teximage_new(struct gl_context *ctx) 68ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org{ 69ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org struct nouveau_teximage *nti = CALLOC_STRUCT(nouveau_teximage); 70ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 71ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org return &nti->base.Base; 72ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org} 73ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 74ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgstatic void 75ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgnouveau_teximage_free(struct gl_context *ctx, struct gl_texture_image *ti) 76ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org{ 77ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org struct nouveau_teximage *nti = to_nouveau_teximage(ti); 78ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 7993a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org nouveau_surface_ref(NULL, &nti->surface); 80fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org} 8193a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org 82ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgstatic void 83ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgnouveau_teximage_map(struct gl_context *ctx, struct gl_texture_image *ti, 84ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org int access, int x, int y, int w, int h) 85ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org{ 867516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org struct nouveau_teximage *nti = to_nouveau_teximage(ti); 87ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org struct nouveau_surface *s = &nti->surface; 88ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org struct nouveau_surface *st = &nti->transfer.surface; 89ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org struct nouveau_client *client = context_client(ctx); 90ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 91ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org if (s->bo) { 92ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org if (!(access & GL_MAP_READ_BIT) && 93ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org nouveau_pushbuf_refd(context_push(ctx), s->bo)) { 94ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org unsigned size; 958496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org /* 96fab1498f2f42726c7de46c3ed560d56dd072a8b3rossberg@chromium.org * Heuristic: use a bounce buffer to pipeline 97fab1498f2f42726c7de46c3ed560d56dd072a8b3rossberg@chromium.org * teximage transfers. 98fab1498f2f42726c7de46c3ed560d56dd072a8b3rossberg@chromium.org */ 99fab1498f2f42726c7de46c3ed560d56dd072a8b3rossberg@chromium.org st->layout = LINEAR; 100fab1498f2f42726c7de46c3ed560d56dd072a8b3rossberg@chromium.org st->format = s->format; 101fab1498f2f42726c7de46c3ed560d56dd072a8b3rossberg@chromium.org st->cpp = s->cpp; 102ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org st->width = w; 103255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org st->height = h; 104255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org st->pitch = s->pitch; 105255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org nti->transfer.x = x; 106255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org nti->transfer.y = y; 107255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org 108255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org size = get_format_blocksy(st->format, h) * st->pitch; 109255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org nti->base.Map = nouveau_get_scratch(ctx, size, 110255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org &st->bo, &st->offset); 111255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org 112255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org } else { 113255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org int ret, flags = 0; 114255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org 115255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org if (access & GL_MAP_READ_BIT) 116255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org flags |= NOUVEAU_BO_RD; 117255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org if (access & GL_MAP_WRITE_BIT) 118255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org flags |= NOUVEAU_BO_WR; 119255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org 120255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org if (!s->bo->map) { 121255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org ret = nouveau_bo_map(s->bo, flags, client); 122255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org assert(!ret); 123a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org } 124a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org 125255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org nti->base.Map = s->bo->map + 126255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org get_format_blocksy(s->format, y) * s->pitch + 127255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org get_format_blocksx(s->format, x) * s->cpp; 128255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org 1298f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org } 130255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org } 131255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org} 132255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org 133255043f8054e713a64509c707cfabadd42344683machenbach@chromium.orgstatic void 134255043f8054e713a64509c707cfabadd42344683machenbach@chromium.orgnouveau_teximage_unmap(struct gl_context *ctx, struct gl_texture_image *ti) 135255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org{ 136255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org struct nouveau_teximage *nti = to_nouveau_teximage(ti); 137255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org struct nouveau_surface *s = &nti->surface; 138a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org struct nouveau_surface *st = &nti->transfer.surface; 139255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org 140255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org if (st->bo) { 1418f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org context_drv(ctx)->surface_copy(ctx, s, st, nti->transfer.x, 142255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org nti->transfer.y, 0, 0, 143255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org st->width, st->height); 14483e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org nouveau_surface_ref(NULL, st); 14583e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org 14683e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org } 14783e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org nti->base.Map = NULL; 14883e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org} 14983e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org 15083e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org 151ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgstatic void 152ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgnouveau_map_texture_image(struct gl_context *ctx, 153a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org struct gl_texture_image *ti, 154a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org GLuint slice, 155a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org GLuint x, GLuint y, GLuint w, GLuint h, 156a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org GLbitfield mode, 157a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org GLubyte **map, 158a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org GLint *stride) 159a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org{ 160a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org struct nouveau_teximage *nti = to_nouveau_teximage(ti); 161a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org struct nouveau_surface *s = &nti->surface; 162a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org struct nouveau_surface *st = &nti->transfer.surface; 163a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org struct nouveau_client *client = context_client(ctx); 164a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org 165a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org /* Nouveau has no support for 3D or cubemap textures. */ 166a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org assert(slice == 0); 167a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org 168a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org if (s->bo) { 169a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org if (!(mode & GL_MAP_READ_BIT) && 170a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org nouveau_pushbuf_refd(context_push(ctx), s->bo)) { 171a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org unsigned size; 172a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org /* 173a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org * Heuristic: use a bounce buffer to pipeline 174a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org * teximage transfers. 175a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org */ 176a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org st->layout = LINEAR; 177a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org st->format = s->format; 178a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org st->cpp = s->cpp; 179a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org st->width = w; 180a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org st->height = h; 181a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org st->pitch = s->pitch; 182a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org nti->transfer.x = x; 183a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org nti->transfer.y = y; 184a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org 185a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org size = get_format_blocksy(st->format, h) * st->pitch; 186a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org *map = nouveau_get_scratch(ctx, size, 187a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org &st->bo, &st->offset); 188a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org *stride = st->pitch; 189a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org } else { 190a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org int ret, flags = 0; 191a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org 192a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org if (mode & GL_MAP_READ_BIT) 193a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org flags |= NOUVEAU_BO_RD; 194a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org if (mode & GL_MAP_WRITE_BIT) 195a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org flags |= NOUVEAU_BO_WR; 196a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org 197a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org if (!s->bo->map) { 198a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org ret = nouveau_bo_map(s->bo, flags, client); 199a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org assert(!ret); 200f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 201f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 202f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org *map = s->bo->map + 203f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org get_format_blocksy(s->format, y) * s->pitch + 204f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org get_format_blocksx(s->format, x) * s->cpp; 205ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org *stride = s->pitch; 206ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org } 2075523ec3bee8180775e7a6fff2b57c04ef707ad3bvitalyr@chromium.org } else { 2085523ec3bee8180775e7a6fff2b57c04ef707ad3bvitalyr@chromium.org *map = nti->base.Map + 2095523ec3bee8180775e7a6fff2b57c04ef707ad3bvitalyr@chromium.org get_format_blocksy(s->format, y) * s->pitch + 2105523ec3bee8180775e7a6fff2b57c04ef707ad3bvitalyr@chromium.org get_format_blocksx(s->format, x) * s->cpp; 211ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org *stride = s->pitch; 212ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org } 213ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org} 214ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 215ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgstatic void 2166a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.orgnouveau_unmap_texture_image(struct gl_context *ctx, struct gl_texture_image *ti, 217ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org GLuint slice) 218ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org{ 2196a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org struct nouveau_teximage *nti = to_nouveau_teximage(ti); 220ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org struct nouveau_surface *s = &nti->surface; 221ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org struct nouveau_surface *st = &nti->transfer.surface; 222ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 223ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org if (st->bo) { 224ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org context_drv(ctx)->surface_copy(ctx, s, st, nti->transfer.x, 225ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org nti->transfer.y, 0, 0, 226ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org st->width, st->height); 227ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org nouveau_surface_ref(NULL, st); 228ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 229ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org } 230ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 2316a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org nti->base.Map = NULL; 2326a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org} 2336a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org 2346a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.orgstatic gl_format 235ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgnouveau_choose_tex_format(struct gl_context *ctx, GLenum target, 236ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org GLint internalFormat, 237ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org GLenum srcFormat, GLenum srcType) 238ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org{ 2396a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org switch (internalFormat) { 240ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org case 4: 241ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org case GL_RGBA: 2421c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org case GL_RGBA2: 243ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org case GL_RGBA4: 244ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org case GL_RGBA8: 245ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org case GL_RGBA12: 246a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org case GL_RGBA16: 2479e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org case GL_RGB10_A2: 248ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org case GL_COMPRESSED_RGBA: 24993a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org return MESA_FORMAT_ARGB8888; 250ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org case GL_RGB5_A1: 25193a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org return MESA_FORMAT_ARGB1555; 252ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 253ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org case GL_RGB: 254ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org case GL_RGB8: 255ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org case GL_RGB10: 256ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org case GL_RGB12: 2579e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org case GL_RGB16: 258ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org case GL_COMPRESSED_RGB: 259ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org return MESA_FORMAT_XRGB8888; 260ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org case 3: 261ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org case GL_R3_G3_B2: 262ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org case GL_RGB4: 263ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org case GL_RGB5: 264ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org return MESA_FORMAT_RGB565; 265ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 266ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org case 2: 267ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org case GL_LUMINANCE_ALPHA: 268ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org case GL_LUMINANCE4_ALPHA4: 269ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org case GL_LUMINANCE6_ALPHA2: 2702efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org case GL_LUMINANCE12_ALPHA4: 271c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org case GL_LUMINANCE12_ALPHA12: 272c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org case GL_LUMINANCE16_ALPHA16: 273ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org case GL_LUMINANCE8_ALPHA8: 274ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org case GL_COMPRESSED_LUMINANCE_ALPHA: 275ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org return MESA_FORMAT_ARGB8888; 276ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 277ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org case 1: 278ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org case GL_LUMINANCE: 279ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org case GL_LUMINANCE4: 280ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org case GL_LUMINANCE12: 281394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com case GL_LUMINANCE16: 282394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com case GL_LUMINANCE8: 283394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com case GL_COMPRESSED_LUMINANCE: 284ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org return MESA_FORMAT_L8; 2855523ec3bee8180775e7a6fff2b57c04ef707ad3bvitalyr@chromium.org 2865523ec3bee8180775e7a6fff2b57c04ef707ad3bvitalyr@chromium.org case GL_ALPHA: 2876a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org case GL_ALPHA4: 288ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org case GL_ALPHA12: 289ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org case GL_ALPHA16: 290ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org case GL_ALPHA8: 2916b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org case GL_COMPRESSED_ALPHA: 292fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org return MESA_FORMAT_A8; 2936b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org 2946b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org case GL_INTENSITY: 2956b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org case GL_INTENSITY4: 2966b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org case GL_INTENSITY12: 2976b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org case GL_INTENSITY16: 2986b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org case GL_INTENSITY8: 2996b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org return MESA_FORMAT_I8; 3006b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org 3016b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org case GL_RGB_S3TC: 3026b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org case GL_RGB4_S3TC: 3036b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: 3046b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org return MESA_FORMAT_RGB_DXT1; 3056b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org 306ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: 307ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org return MESA_FORMAT_RGBA_DXT1; 308ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 309ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org case GL_RGBA_S3TC: 3106b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org case GL_RGBA4_S3TC: 3116b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT: 312ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org return MESA_FORMAT_RGBA_DXT3; 313ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 314ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT: 315ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org return MESA_FORMAT_RGBA_DXT5; 316ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 317ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org default: 318ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org assert(0); 319ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org } 320355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org} 321ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 322ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgstatic GLboolean 323ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgteximage_fits(struct gl_texture_object *t, int level) 3244f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org{ 325ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org struct nouveau_surface *s = &to_nouveau_texture(t)->surfaces[level]; 326ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org struct gl_texture_image *ti = t->Image[0][level]; 3277ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org 328ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org if (!ti || !to_nouveau_teximage(ti)->surface.bo) 329ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org return GL_FALSE; 330ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 331ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org if (level == t->BaseLevel && (s->offset & 0x7f)) 3325a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org return GL_FALSE; 3335a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org 334ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org return t->Target == GL_TEXTURE_RECTANGLE || 335ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org (s->bo && s->format == ti->TexFormat && 336ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org s->width == ti->Width && s->height == ti->Height); 337ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org} 338ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org 339fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.orgstatic GLboolean 340ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgvalidate_teximage(struct gl_context *ctx, struct gl_texture_object *t, 34146839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org int level, int x, int y, int z, 342ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org int width, int height, int depth) 343ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org{ 344ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org struct gl_texture_image *ti = t->Image[0][level]; 345ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 346ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org if (teximage_fits(t, level)) { 347ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org struct nouveau_surface *ss = to_nouveau_texture(t)->surfaces; 348ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org struct nouveau_surface *s = &to_nouveau_teximage(ti)->surface; 349ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 350ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org if (t->Target == GL_TEXTURE_RECTANGLE) 351ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org nouveau_surface_ref(s, &ss[level]); 352ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org else 353b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org context_drv(ctx)->surface_copy(ctx, &ss[level], s, 354ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org x, y, x, y, 35554ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org width, height); 356f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 357750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org return GL_TRUE; 358750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org } 359e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org 3606b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org return GL_FALSE; 3616b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org} 3625697144afb43181fed170b81c194fe1cc0fce3b6machenbach@chromium.org 3633c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.orgstatic int 3643c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.orgget_last_level(struct gl_texture_object *t) 365865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org{ 366ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org struct gl_texture_image *base = t->Image[0][t->BaseLevel]; 367f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 368f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org if (t->Sampler.MinFilter == GL_NEAREST || 369f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org t->Sampler.MinFilter == GL_LINEAR || !base) 370f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return t->BaseLevel; 371f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org else 372ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org return MIN2(t->BaseLevel + base->MaxLog2, t->MaxLevel); 373ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org} 374ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 375ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgstatic void 376ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgrelayout_texture(struct gl_context *ctx, struct gl_texture_object *t) 377ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org{ 378ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org struct gl_texture_image *base = t->Image[0][t->BaseLevel]; 379ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 380ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org if (base && t->Target != GL_TEXTURE_RECTANGLE) { 381ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org struct nouveau_surface *ss = to_nouveau_texture(t)->surfaces; 382ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org struct nouveau_surface *s = &to_nouveau_teximage(base)->surface; 383ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org int i, ret, last = get_last_level(t); 384ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org enum nouveau_surface_layout layout = 385ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org (_mesa_is_format_compressed(s->format) ? LINEAR : SWIZZLED); 386ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org unsigned size, pitch, offset = 0, 387ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org width = s->width, 388ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org height = s->height; 389ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 39093a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org /* Deallocate the old storage. */ 391fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org for (i = 0; i < MAX_TEXTURE_LEVELS; i++) 39293a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org nouveau_bo_ref(NULL, &ss[i].bo); 393ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 394ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org /* Relayout the mipmap tree. */ 395ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org for (i = t->BaseLevel; i <= last; i++) { 396ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org pitch = _mesa_format_row_stride(s->format, width); 397f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org size = get_format_blocksy(s->format, height) * pitch; 398ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 399ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org /* Images larger than 16B have to be aligned. */ 400f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org if (size > 16) 401f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org offset = align(offset, 64); 402f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 403ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org ss[i] = (struct nouveau_surface) { 40493a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org .offset = offset, 405fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org .layout = layout, 40693a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org .format = s->format, 407f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org .width = width, 408ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org .height = height, 409ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org .cpp = s->cpp, 410ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org .pitch = pitch, 411a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org }; 412ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 413ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org offset += size; 414ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org width = MAX2(1, width / 2); 415ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org height = MAX2(1, height / 2); 416ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org } 417ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 418ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org /* Get new storage. */ 419ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org size = align(offset, 64); 42093a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org 421fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org ret = nouveau_bo_new(context_dev(ctx), NOUVEAU_BO_MAP | 42293a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org NOUVEAU_BO_GART | NOUVEAU_BO_VRAM, 423ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 0, size, NULL, &ss[last].bo); 424ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org assert(!ret); 425ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 426ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org for (i = t->BaseLevel; i < last; i++) 427ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org nouveau_bo_ref(ss[last].bo, &ss[i].bo); 428ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org } 429ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org} 430ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 431ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgGLboolean 432ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgnouveau_texture_validate(struct gl_context *ctx, struct gl_texture_object *t) 433ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org{ 434ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org struct nouveau_texture *nt = to_nouveau_texture(t); 435ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org int i, last = get_last_level(t); 436ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 437ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org if (!teximage_fits(t, t->BaseLevel) || 43883e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org !teximage_fits(t, last)) 43983e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org return GL_FALSE; 440efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org 44183e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org if (nt->dirty) { 442ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org nt->dirty = GL_FALSE; 443ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 444ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org /* Copy the teximages to the actual miptree. */ 445ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org for (i = t->BaseLevel; i <= last; i++) { 446ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org struct nouveau_surface *s = &nt->surfaces[i]; 447ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 4488c0a43f09f145d9fc6f969d559873018176eeb6adanno@chromium.org validate_teximage(ctx, t, i, 0, 0, 0, 449ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org s->width, s->height, 1); 450ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org } 451ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 452ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org PUSH_KICK(context_push(ctx)); 4537979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org } 4548c0a43f09f145d9fc6f969d559873018176eeb6adanno@chromium.org 455ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org return GL_TRUE; 456ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org} 457ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 458ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgvoid 459ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgnouveau_texture_reallocate(struct gl_context *ctx, struct gl_texture_object *t) 4608c0a43f09f145d9fc6f969d559873018176eeb6adanno@chromium.org{ 461ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org if (!teximage_fits(t, t->BaseLevel) || 462ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org !teximage_fits(t, get_last_level(t))) { 4637c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org texture_dirty(t); 4647c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org relayout_texture(ctx, t); 4657c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org nouveau_texture_validate(ctx, t); 4667c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org } 4677c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org} 4687c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org 4697c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.orgstatic unsigned 470ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgget_teximage_placement(struct gl_texture_image *ti) 471ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org{ 472ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org if (ti->TexFormat == MESA_FORMAT_A8 || 473ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org ti->TexFormat == MESA_FORMAT_L8 || 474ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org ti->TexFormat == MESA_FORMAT_I8) 475ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org /* 1 cpp formats will have to be swizzled by the CPU, 476ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org * so leave them in system RAM for now. */ 477ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org return NOUVEAU_BO_MAP; 478ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org else 479ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org return NOUVEAU_BO_GART | NOUVEAU_BO_MAP; 480ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org} 481ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 4827c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.orgstatic void 4837c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.orgnouveau_teximage(struct gl_context *ctx, GLint dims, 484528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org struct gl_texture_image *ti, 485ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org GLsizei imageSize, 4862efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org GLenum format, GLenum type, const GLvoid *pixels, 487ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org const struct gl_pixelstore_attrib *packing, 488ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org GLboolean compressed) 489ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org{ 490ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org struct gl_texture_object *t = ti->TexObject; 4911c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org const GLuint level = ti->Level; 4921c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org struct nouveau_surface *s = &to_nouveau_teximage(ti)->surface; 4931c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org struct nouveau_teximage *nti = to_nouveau_teximage(ti); 4941c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org int ret; 495e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org GLuint depth = compressed ? 1 : ti->Depth; 496e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 497e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org /* Allocate a new bo for the image. */ 498e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org nouveau_surface_alloc(ctx, s, LINEAR, get_teximage_placement(ti), 499ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org ti->TexFormat, ti->Width, ti->Height); 500ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org nti->base.RowStride = s->pitch / s->cpp; 501ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 5028c0a43f09f145d9fc6f969d559873018176eeb6adanno@chromium.org if (compressed) 5038c0a43f09f145d9fc6f969d559873018176eeb6adanno@chromium.org pixels = _mesa_validate_pbo_compressed_teximage(ctx, 5048c0a43f09f145d9fc6f969d559873018176eeb6adanno@chromium.org imageSize, 505ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org pixels, packing, "glCompressedTexImage"); 506ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org else 5078c0a43f09f145d9fc6f969d559873018176eeb6adanno@chromium.org pixels = _mesa_validate_pbo_teximage(ctx, 5088c0a43f09f145d9fc6f969d559873018176eeb6adanno@chromium.org dims, ti->Width, ti->Height, depth, format, type, 5098c0a43f09f145d9fc6f969d559873018176eeb6adanno@chromium.org pixels, packing, "glTexImage"); 5101456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org 5111456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org if (pixels) { 512ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org /* Store the pixel data. */ 513ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org nouveau_teximage_map(ctx, ti, GL_MAP_WRITE_BIT, 514dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org 0, 0, ti->Width, ti->Height); 515ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 516ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org ret = _mesa_texstore(ctx, dims, ti->_BaseFormat, 517ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org ti->TexFormat, 518ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org s->pitch, 519ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org &nti->base.Map, 520ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org ti->Width, ti->Height, depth, 521e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org format, type, pixels, packing); 522ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org assert(ret); 523ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 524ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org nouveau_teximage_unmap(ctx, ti); 525ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org _mesa_unmap_teximage_pbo(ctx, packing); 526f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 527ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org if (!validate_teximage(ctx, t, level, 0, 0, 0, 528ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org ti->Width, ti->Height, depth)) 529f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org /* It doesn't fit, mark it as dirty. */ 530ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org texture_dirty(t); 531ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org } 5329e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org 533ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org if (level == t->BaseLevel) { 534a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org if (!teximage_fits(t, level)) 535ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org relayout_texture(ctx, t); 536ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org nouveau_texture_validate(ctx, t); 537f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 538a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org 539a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org context_dirty_i(ctx, TEX_OBJ, ctx->Texture.CurrentUnit); 540a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org context_dirty_i(ctx, TEX_ENV, ctx->Texture.CurrentUnit); 541ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org} 542f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 543ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 544a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.orgstatic void 545ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgnouveau_teximage_123d(struct gl_context *ctx, GLuint dims, 546ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org struct gl_texture_image *ti, 547f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org GLenum format, GLenum type, const GLvoid *pixels, 5489e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org const struct gl_pixelstore_attrib *packing) 549ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org{ 550ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org nouveau_teximage(ctx, dims, ti, 0, format, type, pixels, 551f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org packing, GL_FALSE); 552ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org} 553a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org 554ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgstatic void 555ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgnouveau_compressed_teximage(struct gl_context *ctx, GLuint dims, 556f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org struct gl_texture_image *ti, 557f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org GLsizei imageSize, const GLvoid *data) 558f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org{ 559ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org nouveau_teximage(ctx, 2, ti, imageSize, 0, 0, data, 560ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org &ctx->Unpack, GL_TRUE); 561ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org} 56293a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org 563ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgstatic void 564ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgnouveau_texsubimage(struct gl_context *ctx, GLint dims, 5656a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org struct gl_texture_image *ti, 566ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org GLint xoffset, GLint yoffset, GLint zoffset, 567ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org GLint width, GLint height, GLint depth, 568ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org GLsizei imageSize, 569ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org GLenum format, GLenum type, const void *pixels, 570ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org const struct gl_pixelstore_attrib *packing, 571ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org GLboolean compressed) 572ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org{ 573f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org struct nouveau_surface *s = &to_nouveau_teximage(ti)->surface; 574f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org struct nouveau_teximage *nti = to_nouveau_teximage(ti); 575ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org int ret; 5769e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org 577ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org if (compressed) 578ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org pixels = _mesa_validate_pbo_compressed_teximage(ctx, 5797028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org imageSize, 5807028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org pixels, packing, "glCompressedTexSubImage"); 5817028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org else 5827028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org pixels = _mesa_validate_pbo_teximage(ctx, 5837028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org dims, width, height, depth, format, type, 5847028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org pixels, packing, "glTexSubImage"); 5857028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org 5867028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org if (pixels) { 5877028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org nouveau_teximage_map(ctx, ti, GL_MAP_WRITE_BIT, 5887028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org xoffset, yoffset, width, height); 5897028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org 5907028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org ret = _mesa_texstore(ctx, dims, ti->_BaseFormat, ti->TexFormat, 5917028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org s->pitch, 5927028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org &nti->base.Map, 5939e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org width, height, depth, 594ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org format, type, pixels, packing); 595a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org assert(ret); 596ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 597ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org nouveau_teximage_unmap(ctx, ti); 598ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org _mesa_unmap_teximage_pbo(ctx, packing); 599a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org } 6006d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org 601ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org if (!to_nouveau_texture(ti->TexObject)->dirty) 602ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org validate_teximage(ctx, ti->TexObject, ti->Level, 603a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org xoffset, yoffset, zoffset, 604ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org width, height, depth); 605ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org} 606ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 607ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgstatic void 608ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgnouveau_texsubimage_123d(struct gl_context *ctx, GLuint dims, 6099e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org struct gl_texture_image *ti, 610a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org GLint xoffset, GLint yoffset, GLint zoffset, 611ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org GLint width, GLint height, GLint depth, 612ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org GLenum format, GLenum type, const void *pixels, 6135a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org const struct gl_pixelstore_attrib *packing) 6145a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org{ 6155a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org nouveau_texsubimage(ctx, dims, ti, xoffset, yoffset, zoffset, 616ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org width, height, depth, 0, format, type, pixels, 617ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org packing, GL_FALSE); 618ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org} 619ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 620ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgstatic void 621ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgnouveau_compressed_texsubimage(struct gl_context *ctx, GLuint dims, 622ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org struct gl_texture_image *ti, 623ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org GLint xoffset, GLint yoffset, GLint zoffset, 624ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org GLsizei width, GLint height, GLint depth, 625ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org GLenum format, 626ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org GLint imageSize, const void *data) 627594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org{ 628594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org nouveau_texsubimage(ctx, dims, ti, xoffset, yoffset, zoffset, 629594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org width, height, depth, imageSize, format, 0, data, 630ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org &ctx->Unpack, GL_TRUE); 631ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org} 632ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 633ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgstatic void 634ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgnouveau_bind_texture(struct gl_context *ctx, GLenum target, 635ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org struct gl_texture_object *t) 636ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org{ 637ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org context_dirty_i(ctx, TEX_OBJ, ctx->Texture.CurrentUnit); 638ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org context_dirty_i(ctx, TEX_ENV, ctx->Texture.CurrentUnit); 6392efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org} 64046839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org 64146839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.orgstatic gl_format 642ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgget_texbuffer_format(struct gl_renderbuffer *rb, GLint format) 643ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org{ 644ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org struct nouveau_surface *s = &to_nouveau_renderbuffer(rb)->surface; 645ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 646ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org if (s->cpp < 4) 647ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org return s->format; 648ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org else if (format == __DRI_TEXTURE_FORMAT_RGBA) 649ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org return MESA_FORMAT_ARGB8888; 650ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org else 651ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org return MESA_FORMAT_XRGB8888; 652ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org} 653ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 654ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgvoid 655ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgnouveau_set_texbuffer(__DRIcontext *dri_ctx, 656ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org GLint target, GLint format, 657ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org __DRIdrawable *draw) 658ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org{ 659ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org struct nouveau_context *nctx = dri_ctx->driverPrivate; 660ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org struct gl_context *ctx = &nctx->base; 661ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org struct gl_framebuffer *fb = draw->driverPrivate; 66244bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org struct gl_renderbuffer *rb = 66344bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org fb->Attachment[BUFFER_FRONT_LEFT].Renderbuffer; 66444bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org struct gl_texture_object *t = _mesa_get_current_tex_object(ctx, target); 665a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org struct gl_texture_image *ti; 666a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org struct nouveau_teximage *nti; 66744bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org struct nouveau_surface *s; 6689e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org 66944bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org _mesa_lock_texture(ctx, t); 67044bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org ti = _mesa_get_tex_image(ctx, t, target, 0); 67144bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org nti = to_nouveau_teximage(ti); 67244bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org s = &to_nouveau_teximage(ti)->surface; 67344bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org 67444bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org /* Update the texture surface with the given drawable. */ 67544bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org nouveau_update_renderbuffers(dri_ctx, draw); 67644bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org nouveau_surface_ref(&to_nouveau_renderbuffer(rb)->surface, s); 67744bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org 67844bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org s->format = get_texbuffer_format(rb, format); 67944bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org 68044bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org /* Update the image fields. */ 68144bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org _mesa_init_teximage_fields(ctx, ti, s->width, s->height, 68244bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org 1, 0, s->cpp, s->format); 683ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org nti->base.RowStride = s->pitch / s->cpp; 684ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 685ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org /* Try to validate it. */ 686ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org if (!validate_teximage(ctx, t, 0, 0, 0, 0, s->width, s->height, 1)) 687ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org nouveau_texture_reallocate(ctx, t); 688ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 689ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org context_dirty_i(ctx, TEX_OBJ, ctx->Texture.CurrentUnit); 690bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org context_dirty_i(ctx, TEX_ENV, ctx->Texture.CurrentUnit); 691ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 69267255bead6b3c379ed821d8371271e34779602cajkummerow@chromium.org _mesa_unlock_texture(ctx, t); 69367255bead6b3c379ed821d8371271e34779602cajkummerow@chromium.org} 69467255bead6b3c379ed821d8371271e34779602cajkummerow@chromium.org 69567255bead6b3c379ed821d8371271e34779602cajkummerow@chromium.orgvoid 696ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgnouveau_texture_functions_init(struct dd_function_table *functions) 697ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org{ 698ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org functions->NewTextureObject = nouveau_texture_new; 699ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org functions->DeleteTexture = nouveau_texture_free; 700eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org functions->NewTextureImage = nouveau_teximage_new; 701eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org functions->FreeTextureImageBuffer = nouveau_teximage_free; 702eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org functions->ChooseTextureFormat = nouveau_choose_tex_format; 703eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org functions->TexImage = nouveau_teximage_123d; 704ab7dad4f999df008b590c74c2fe3d2e2c67ef7ffjkummerow@chromium.org functions->TexSubImage = nouveau_texsubimage_123d; 705ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org functions->CompressedTexImage = nouveau_compressed_teximage; 706ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org functions->CompressedTexSubImage = nouveau_compressed_texsubimage; 707ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org functions->BindTexture = nouveau_bind_texture; 708fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org functions->MapTextureImage = nouveau_map_texture_image; 709c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org functions->UnmapTextureImage = nouveau_unmap_texture_image; 710c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org} 711ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org