st_cb_texture.c revision a971476cc7913edde1944f33f164cd507199e1dd
124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian/************************************************************************** 224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * 324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas. 424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * All Rights Reserved. 524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * 624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * Permission is hereby granted, free of charge, to any person obtaining a 724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * copy of this software and associated documentation files (the 824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * "Software"), to deal in the Software without restriction, including 924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * without limitation the rights to use, copy, modify, merge, publish, 1024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * distribute, sub license, and/or sell copies of the Software, and to 1124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * permit persons to whom the Software is furnished to do so, subject to 1224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * the following conditions: 1324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * 1424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * The above copyright notice and this permission notice (including the 1524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * next paragraph) shall be included in all copies or substantial portions 1624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * of the Software. 1724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * 1824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 1924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 2024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 2124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR 2224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 2324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 2424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 2524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * 2624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian **************************************************************************/ 2724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 28f2c023291a1f2887294d2aac504f8b82857ad092Brian Paul#include "main/mfeatures.h" 297b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul#include "main/bufferobj.h" 3024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#include "main/enums.h" 3165d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul#include "main/fbobject.h" 3245e76d2665b38ba3787548310efc59e969124c01Brian Paul#include "main/formats.h" 3324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#include "main/image.h" 34f2c023291a1f2887294d2aac504f8b82857ad092Brian Paul#include "main/imports.h" 3524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#include "main/macros.h" 362440ff74d69a8caf49b05a960b4c7e282a96565eBrian#include "main/mipmap.h" 371c131752c3e07ef91f49d4970dafca6d26585334Brian Paul#include "main/pack.h" 38b70610b9823fc7dc3672735c11be1a75fbb1a2a4Brian Paul#include "main/pbo.h" 391c131752c3e07ef91f49d4970dafca6d26585334Brian Paul#include "main/pixeltransfer.h" 4024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#include "main/texcompress.h" 41a4bec69e7271eda0137874973aa8c7d44175fedfBrian Paul#include "main/texgetimage.h" 4224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#include "main/teximage.h" 4324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#include "main/texobj.h" 4424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#include "main/texstore.h" 4524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 46b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell#include "state_tracker/st_debug.h" 4724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#include "state_tracker/st_context.h" 48b27498c7cad7dae4e3b3ef9517b9c0aef58f73f6Brian#include "state_tracker/st_cb_fbo.h" 49b0427bedde80e3189524651a327235bdfddbc613José Fonseca#include "state_tracker/st_cb_flush.h" 5024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#include "state_tracker/st_cb_texture.h" 51f8ab24760d0d3f07e9ee81c98207ddf92dfe74daBrian#include "state_tracker/st_format.h" 52753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer#include "state_tracker/st_texture.h" 5362abcb9aacc33218d0143a743c738435794b32a9Brian#include "state_tracker/st_gen_mipmap.h" 54afd16512bc354cf1a7220cb9bf3ce445503c7af4Keith Whitwell#include "state_tracker/st_atom.h" 5524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 5624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#include "pipe/p_context.h" 57b245840b86cf877c9b8d666edf229364a84f1deaBrian#include "pipe/p_defines.h" 5828486880ca3ec39419ccee0cb1a3bedc9ef7117cJosé Fonseca#include "util/u_inlines.h" 598fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell#include "pipe/p_shader_tokens.h" 604f25420bdd834e81a3e22733304efc5261c2998aBrian Paul#include "util/u_tile.h" 613c0dc8242b64518d5635263ba65b39afa919dd86Michel Dänzer#include "util/u_blit.h" 623400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol#include "util/u_format.h" 6351b339af2e8b80575a24bb9146f031c9605180bbBrian Paul#include "util/u_surface.h" 648f55a95178069d5e8b18647e6b675fc403d68073Roland Scheidegger#include "util/u_sampler.h" 65c1785c19ca0716a7e85777242949a0c33e28988fPatrice Mandin#include "util/u_math.h" 664c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger#include "util/u_box.h" 6724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 6824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#define DBG if (0) printf 6924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 7024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 711c5f27a18b775b3784fcd265d60e0affa0b31581Michel Dänzerstatic enum pipe_texture_target 725390a43ce06b27f6d54bc5f237aa305b6948f2afBriangl_target_to_pipe(GLenum target) 735390a43ce06b27f6d54bc5f237aa305b6948f2afBrian{ 745390a43ce06b27f6d54bc5f237aa305b6948f2afBrian switch (target) { 755390a43ce06b27f6d54bc5f237aa305b6948f2afBrian case GL_TEXTURE_1D: 765390a43ce06b27f6d54bc5f237aa305b6948f2afBrian return PIPE_TEXTURE_1D; 775390a43ce06b27f6d54bc5f237aa305b6948f2afBrian case GL_TEXTURE_2D: 788cd0873d319cefce74164147c9855e81f051d1e1Chia-I Wu case GL_TEXTURE_EXTERNAL_OES: 795390a43ce06b27f6d54bc5f237aa305b6948f2afBrian return PIPE_TEXTURE_2D; 807f15dca6d963b0a69131e8761c477064dba49307Luca Barbieri case GL_TEXTURE_RECTANGLE_NV: 817f15dca6d963b0a69131e8761c477064dba49307Luca Barbieri return PIPE_TEXTURE_RECT; 825390a43ce06b27f6d54bc5f237aa305b6948f2afBrian case GL_TEXTURE_3D: 835390a43ce06b27f6d54bc5f237aa305b6948f2afBrian return PIPE_TEXTURE_3D; 845390a43ce06b27f6d54bc5f237aa305b6948f2afBrian case GL_TEXTURE_CUBE_MAP_ARB: 855390a43ce06b27f6d54bc5f237aa305b6948f2afBrian return PIPE_TEXTURE_CUBE; 869b56a2cb626b254bcb7b7202e6babd1b5570208fBrian Paul case GL_TEXTURE_1D_ARRAY_EXT: 879b56a2cb626b254bcb7b7202e6babd1b5570208fBrian Paul return PIPE_TEXTURE_1D_ARRAY; 889b56a2cb626b254bcb7b7202e6babd1b5570208fBrian Paul case GL_TEXTURE_2D_ARRAY_EXT: 899b56a2cb626b254bcb7b7202e6babd1b5570208fBrian Paul return PIPE_TEXTURE_2D_ARRAY; 90874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul case GL_TEXTURE_BUFFER: 91874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul return PIPE_BUFFER; 925390a43ce06b27f6d54bc5f237aa305b6948f2afBrian default: 935390a43ce06b27f6d54bc5f237aa305b6948f2afBrian assert(0); 945390a43ce06b27f6d54bc5f237aa305b6948f2afBrian return 0; 955390a43ce06b27f6d54bc5f237aa305b6948f2afBrian } 965390a43ce06b27f6d54bc5f237aa305b6948f2afBrian} 975390a43ce06b27f6d54bc5f237aa305b6948f2afBrian 985390a43ce06b27f6d54bc5f237aa305b6948f2afBrian 994e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul/** called via ctx->Driver.NewTextureImage() */ 10024df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic struct gl_texture_image * 101f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergst_NewTextureImage(struct gl_context * ctx) 10224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 10324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian DBG("%s\n", __FUNCTION__); 10424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian (void) ctx; 105f1a59a6dd7b7b0523db191d82b3af1a841c6475dBrian Paul return (struct gl_texture_image *) ST_CALLOC_STRUCT(st_texture_image); 10624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 10724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 10824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 109146f536b3332b7a2022bb4ba5e2d1d2ec4bedd98Brian Paul/** called via ctx->Driver.DeleteTextureImage() */ 110146f536b3332b7a2022bb4ba5e2d1d2ec4bedd98Brian Paulstatic void 111146f536b3332b7a2022bb4ba5e2d1d2ec4bedd98Brian Paulst_DeleteTextureImage(struct gl_context * ctx, struct gl_texture_image *img) 112146f536b3332b7a2022bb4ba5e2d1d2ec4bedd98Brian Paul{ 113146f536b3332b7a2022bb4ba5e2d1d2ec4bedd98Brian Paul /* nothing special (yet) for st_texture_image */ 114146f536b3332b7a2022bb4ba5e2d1d2ec4bedd98Brian Paul _mesa_delete_texture_image(ctx, img); 115146f536b3332b7a2022bb4ba5e2d1d2ec4bedd98Brian Paul} 116146f536b3332b7a2022bb4ba5e2d1d2ec4bedd98Brian Paul 117146f536b3332b7a2022bb4ba5e2d1d2ec4bedd98Brian Paul 1184e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul/** called via ctx->Driver.NewTextureObject() */ 11924df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic struct gl_texture_object * 120f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergst_NewTextureObject(struct gl_context * ctx, GLuint name, GLenum target) 12124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 122f1a59a6dd7b7b0523db191d82b3af1a841c6475dBrian Paul struct st_texture_object *obj = ST_CALLOC_STRUCT(st_texture_object); 12324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 12424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian DBG("%s\n", __FUNCTION__); 12524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian _mesa_initialize_texture_object(&obj->base, name, target); 12624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 12724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian return &obj->base; 12824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 12924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 13030f46e7b4c9d6c6f8c1c01825b344b90adc93982Brian Paul/** called via ctx->Driver.DeleteTextureObject() */ 13124df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 132f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergst_DeleteTextureObject(struct gl_context *ctx, 1336f715dcc219071e574e363a9db4365c9c31ebbd3Brian struct gl_texture_object *texObj) 13424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 13576c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul struct st_context *st = st_context(ctx); 13624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct st_texture_object *stObj = st_texture_object(texObj); 137753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer if (stObj->pt) 138287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(&stObj->pt, NULL); 1392d6befd9d1e8dcf6495fe1b9cef12224046f3095Brian Paul if (stObj->sampler_view) { 1406835103878afd27a1d66d29d16cbfb0b1e894a94Brian Paul pipe_sampler_view_release(st->pipe, &stObj->sampler_view); 1412d6befd9d1e8dcf6495fe1b9cef12224046f3095Brian Paul } 14224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian _mesa_delete_texture_object(ctx, texObj); 14324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 14424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 14524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1460bb29949ba8a9e5a15dc0640dbb0a4e7990a1d57Eric Anholt/** called via ctx->Driver.FreeTextureImageBuffer() */ 14724df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 148a61e164ae09cc2aec5df483809a2c6d74e36bf99Brian Paulst_FreeTextureImageBuffer(struct gl_context *ctx, 149a61e164ae09cc2aec5df483809a2c6d74e36bf99Brian Paul struct gl_texture_image *texImage) 15024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 15124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct st_texture_image *stImage = st_texture_image(texImage); 15224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 15324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian DBG("%s\n", __FUNCTION__); 15424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 155753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer if (stImage->pt) { 156287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(&stImage->pt, NULL); 15724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 15824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 159aff65241c8bf6206c6dfcbe774b87991f965d46fBrian Paul if (stImage->TexData) { 160aff65241c8bf6206c6dfcbe774b87991f965d46fBrian Paul _mesa_align_free(stImage->TexData); 161aff65241c8bf6206c6dfcbe774b87991f965d46fBrian Paul stImage->TexData = NULL; 16224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 16324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 16424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 16524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1660abb2659dda3ac7828cade6f9a999c511e33e905Brian Paul/** called via ctx->Driver.MapTextureImage() */ 1670abb2659dda3ac7828cade6f9a999c511e33e905Brian Paulstatic void 1680abb2659dda3ac7828cade6f9a999c511e33e905Brian Paulst_MapTextureImage(struct gl_context *ctx, 1690abb2659dda3ac7828cade6f9a999c511e33e905Brian Paul struct gl_texture_image *texImage, 1700abb2659dda3ac7828cade6f9a999c511e33e905Brian Paul GLuint slice, GLuint x, GLuint y, GLuint w, GLuint h, 1710abb2659dda3ac7828cade6f9a999c511e33e905Brian Paul GLbitfield mode, 1720abb2659dda3ac7828cade6f9a999c511e33e905Brian Paul GLubyte **mapOut, GLint *rowStrideOut) 1730abb2659dda3ac7828cade6f9a999c511e33e905Brian Paul{ 1740abb2659dda3ac7828cade6f9a999c511e33e905Brian Paul struct st_context *st = st_context(ctx); 1750abb2659dda3ac7828cade6f9a999c511e33e905Brian Paul struct st_texture_image *stImage = st_texture_image(texImage); 1760abb2659dda3ac7828cade6f9a999c511e33e905Brian Paul unsigned pipeMode; 1770abb2659dda3ac7828cade6f9a999c511e33e905Brian Paul GLubyte *map; 1780abb2659dda3ac7828cade6f9a999c511e33e905Brian Paul 1790abb2659dda3ac7828cade6f9a999c511e33e905Brian Paul pipeMode = 0x0; 1800abb2659dda3ac7828cade6f9a999c511e33e905Brian Paul if (mode & GL_MAP_READ_BIT) 1810abb2659dda3ac7828cade6f9a999c511e33e905Brian Paul pipeMode |= PIPE_TRANSFER_READ; 1820abb2659dda3ac7828cade6f9a999c511e33e905Brian Paul if (mode & GL_MAP_WRITE_BIT) 1830abb2659dda3ac7828cade6f9a999c511e33e905Brian Paul pipeMode |= PIPE_TRANSFER_WRITE; 18484c7c14697c82fe25586f8186b4f47d80a6f05f9Brian Paul if (mode & GL_MAP_INVALIDATE_RANGE_BIT) 18584c7c14697c82fe25586f8186b4f47d80a6f05f9Brian Paul pipeMode |= PIPE_TRANSFER_DISCARD_RANGE; 1860abb2659dda3ac7828cade6f9a999c511e33e905Brian Paul 1870abb2659dda3ac7828cade6f9a999c511e33e905Brian Paul map = st_texture_image_map(st, stImage, slice, pipeMode, x, y, w, h); 1880abb2659dda3ac7828cade6f9a999c511e33e905Brian Paul if (map) { 1890abb2659dda3ac7828cade6f9a999c511e33e905Brian Paul *mapOut = map; 1900abb2659dda3ac7828cade6f9a999c511e33e905Brian Paul *rowStrideOut = stImage->transfer->stride; 1910abb2659dda3ac7828cade6f9a999c511e33e905Brian Paul } 1920abb2659dda3ac7828cade6f9a999c511e33e905Brian Paul else { 1930abb2659dda3ac7828cade6f9a999c511e33e905Brian Paul *mapOut = NULL; 1940abb2659dda3ac7828cade6f9a999c511e33e905Brian Paul *rowStrideOut = 0; 1950abb2659dda3ac7828cade6f9a999c511e33e905Brian Paul } 1960abb2659dda3ac7828cade6f9a999c511e33e905Brian Paul} 1970abb2659dda3ac7828cade6f9a999c511e33e905Brian Paul 1980abb2659dda3ac7828cade6f9a999c511e33e905Brian Paul 1990abb2659dda3ac7828cade6f9a999c511e33e905Brian Paul/** called via ctx->Driver.UnmapTextureImage() */ 2000abb2659dda3ac7828cade6f9a999c511e33e905Brian Paulstatic void 2010abb2659dda3ac7828cade6f9a999c511e33e905Brian Paulst_UnmapTextureImage(struct gl_context *ctx, 2020abb2659dda3ac7828cade6f9a999c511e33e905Brian Paul struct gl_texture_image *texImage, 2030abb2659dda3ac7828cade6f9a999c511e33e905Brian Paul GLuint slice) 2040abb2659dda3ac7828cade6f9a999c511e33e905Brian Paul{ 2050abb2659dda3ac7828cade6f9a999c511e33e905Brian Paul struct st_context *st = st_context(ctx); 2060abb2659dda3ac7828cade6f9a999c511e33e905Brian Paul struct st_texture_image *stImage = st_texture_image(texImage); 2070abb2659dda3ac7828cade6f9a999c511e33e905Brian Paul st_texture_image_unmap(st, stImage); 2080abb2659dda3ac7828cade6f9a999c511e33e905Brian Paul} 2090abb2659dda3ac7828cade6f9a999c511e33e905Brian Paul 2100abb2659dda3ac7828cade6f9a999c511e33e905Brian Paul 2114e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul/** 2128283db88414f600e66510de713382c36899d4b03Brian Paul * Return default texture resource binding bitmask for the given format. 2131ad2484f03cbe9ae6bd4ebe50d6894e570d65952Brian Paul */ 2141ad2484f03cbe9ae6bd4ebe50d6894e570d65952Brian Paulstatic GLuint 2158283db88414f600e66510de713382c36899d4b03Brian Pauldefault_bindings(struct st_context *st, enum pipe_format format) 2161ad2484f03cbe9ae6bd4ebe50d6894e570d65952Brian Paul{ 2178283db88414f600e66510de713382c36899d4b03Brian Paul struct pipe_screen *screen = st->pipe->screen; 2188283db88414f600e66510de713382c36899d4b03Brian Paul const unsigned target = PIPE_TEXTURE_2D; 2198283db88414f600e66510de713382c36899d4b03Brian Paul unsigned bindings; 2208283db88414f600e66510de713382c36899d4b03Brian Paul 2218283db88414f600e66510de713382c36899d4b03Brian Paul if (util_format_is_depth_or_stencil(format)) 2228283db88414f600e66510de713382c36899d4b03Brian Paul bindings = PIPE_BIND_SAMPLER_VIEW | PIPE_BIND_DEPTH_STENCIL; 2238283db88414f600e66510de713382c36899d4b03Brian Paul else 2248283db88414f600e66510de713382c36899d4b03Brian Paul bindings = PIPE_BIND_SAMPLER_VIEW | PIPE_BIND_RENDER_TARGET; 2258283db88414f600e66510de713382c36899d4b03Brian Paul 226e968975cb57eb854769292f7c6ff773c64a386c3Marek Olšák if (screen->is_format_supported(screen, format, target, 0, bindings)) 2278283db88414f600e66510de713382c36899d4b03Brian Paul return bindings; 228ba48811fa8cbe80c67cdbbb9b8180aaf64433c4eMarek Olšák else { 229ba48811fa8cbe80c67cdbbb9b8180aaf64433c4eMarek Olšák /* Try non-sRGB. */ 230ba48811fa8cbe80c67cdbbb9b8180aaf64433c4eMarek Olšák format = util_format_linear(format); 231ba48811fa8cbe80c67cdbbb9b8180aaf64433c4eMarek Olšák 232e968975cb57eb854769292f7c6ff773c64a386c3Marek Olšák if (screen->is_format_supported(screen, format, target, 0, bindings)) 233ba48811fa8cbe80c67cdbbb9b8180aaf64433c4eMarek Olšák return bindings; 234ba48811fa8cbe80c67cdbbb9b8180aaf64433c4eMarek Olšák else 235ba48811fa8cbe80c67cdbbb9b8180aaf64433c4eMarek Olšák return PIPE_BIND_SAMPLER_VIEW; 236ba48811fa8cbe80c67cdbbb9b8180aaf64433c4eMarek Olšák } 2371ad2484f03cbe9ae6bd4ebe50d6894e570d65952Brian Paul} 2381ad2484f03cbe9ae6bd4ebe50d6894e570d65952Brian Paul 2391ad2484f03cbe9ae6bd4ebe50d6894e570d65952Brian Paul 240e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul/** Return number of image dimensions (1, 2 or 3) for a texture target. */ 241e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paulstatic GLuint 242e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paulget_texture_dims(GLenum target) 243e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul{ 244e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul switch (target) { 245e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul case GL_TEXTURE_1D: 246e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul case GL_TEXTURE_1D_ARRAY_EXT: 247874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul case GL_TEXTURE_BUFFER: 248e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul return 1; 249e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul case GL_TEXTURE_2D: 250e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul case GL_TEXTURE_CUBE_MAP_ARB: 251168554904bc079650124fbd026d9b75834eabc92Marek Olšák case GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB: 252168554904bc079650124fbd026d9b75834eabc92Marek Olšák case GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB: 253168554904bc079650124fbd026d9b75834eabc92Marek Olšák case GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB: 254168554904bc079650124fbd026d9b75834eabc92Marek Olšák case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB: 255168554904bc079650124fbd026d9b75834eabc92Marek Olšák case GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB: 256168554904bc079650124fbd026d9b75834eabc92Marek Olšák case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB: 257e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul case GL_TEXTURE_RECTANGLE_NV: 258e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul case GL_TEXTURE_2D_ARRAY_EXT: 2598cd0873d319cefce74164147c9855e81f051d1e1Chia-I Wu case GL_TEXTURE_EXTERNAL_OES: 260e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul return 2; 261e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul case GL_TEXTURE_3D: 262e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul return 3; 263e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul default: 264e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul assert(0 && "invalid texture target in get_texture_dims()"); 265e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul return 1; 266e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul } 267e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul} 268e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul 269e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul 2701ad2484f03cbe9ae6bd4ebe50d6894e570d65952Brian Paul/** 2714cdcec08d14a0709b09dc82a35367b2bcc817957Brian Paul * Given the size of a mipmap image, try to compute the size of the level=0 2724cdcec08d14a0709b09dc82a35367b2bcc817957Brian Paul * mipmap image. 2734cdcec08d14a0709b09dc82a35367b2bcc817957Brian Paul * 2744cdcec08d14a0709b09dc82a35367b2bcc817957Brian Paul * Note that this isn't always accurate for odd-sized, non-POW textures. 2754cdcec08d14a0709b09dc82a35367b2bcc817957Brian Paul * For example, if level=1 and width=40 then the level=0 width may be 80 or 81. 2764cdcec08d14a0709b09dc82a35367b2bcc817957Brian Paul * 2774cdcec08d14a0709b09dc82a35367b2bcc817957Brian Paul * \return GL_TRUE for success, GL_FALSE for failure 2784cdcec08d14a0709b09dc82a35367b2bcc817957Brian Paul */ 2794cdcec08d14a0709b09dc82a35367b2bcc817957Brian Paulstatic GLboolean 2804cdcec08d14a0709b09dc82a35367b2bcc817957Brian Paulguess_base_level_size(GLenum target, 2814cdcec08d14a0709b09dc82a35367b2bcc817957Brian Paul GLuint width, GLuint height, GLuint depth, GLuint level, 2824cdcec08d14a0709b09dc82a35367b2bcc817957Brian Paul GLuint *width0, GLuint *height0, GLuint *depth0) 2834cdcec08d14a0709b09dc82a35367b2bcc817957Brian Paul{ 2844cdcec08d14a0709b09dc82a35367b2bcc817957Brian Paul const GLuint dims = get_texture_dims(target); 2854cdcec08d14a0709b09dc82a35367b2bcc817957Brian Paul 2864cdcec08d14a0709b09dc82a35367b2bcc817957Brian Paul assert(width >= 1); 2874cdcec08d14a0709b09dc82a35367b2bcc817957Brian Paul assert(height >= 1); 2884cdcec08d14a0709b09dc82a35367b2bcc817957Brian Paul assert(depth >= 1); 2894cdcec08d14a0709b09dc82a35367b2bcc817957Brian Paul 2904cdcec08d14a0709b09dc82a35367b2bcc817957Brian Paul if (level > 0) { 2914cdcec08d14a0709b09dc82a35367b2bcc817957Brian Paul /* Depending on the image's size, we can't always make a guess here */ 2924cdcec08d14a0709b09dc82a35367b2bcc817957Brian Paul if ((dims >= 1 && width == 1) || 2934cdcec08d14a0709b09dc82a35367b2bcc817957Brian Paul (dims >= 2 && height == 1) || 2944cdcec08d14a0709b09dc82a35367b2bcc817957Brian Paul (dims >= 3 && depth == 1)) { 2954cdcec08d14a0709b09dc82a35367b2bcc817957Brian Paul /* we can't determine the image size at level=0 */ 2964cdcec08d14a0709b09dc82a35367b2bcc817957Brian Paul return GL_FALSE; 2974cdcec08d14a0709b09dc82a35367b2bcc817957Brian Paul } 2984cdcec08d14a0709b09dc82a35367b2bcc817957Brian Paul 2994cdcec08d14a0709b09dc82a35367b2bcc817957Brian Paul /* grow the image size until we hit level = 0 */ 3004cdcec08d14a0709b09dc82a35367b2bcc817957Brian Paul while (level > 0) { 3014cdcec08d14a0709b09dc82a35367b2bcc817957Brian Paul if (width > 1) 3024cdcec08d14a0709b09dc82a35367b2bcc817957Brian Paul width <<= 1; 3034cdcec08d14a0709b09dc82a35367b2bcc817957Brian Paul if (height > 1) 3044cdcec08d14a0709b09dc82a35367b2bcc817957Brian Paul height <<= 1; 3054cdcec08d14a0709b09dc82a35367b2bcc817957Brian Paul if (depth > 1) 3064cdcec08d14a0709b09dc82a35367b2bcc817957Brian Paul depth <<= 1; 3074cdcec08d14a0709b09dc82a35367b2bcc817957Brian Paul level--; 3084cdcec08d14a0709b09dc82a35367b2bcc817957Brian Paul } 3094cdcec08d14a0709b09dc82a35367b2bcc817957Brian Paul } 3104cdcec08d14a0709b09dc82a35367b2bcc817957Brian Paul 3114cdcec08d14a0709b09dc82a35367b2bcc817957Brian Paul *width0 = width; 3124cdcec08d14a0709b09dc82a35367b2bcc817957Brian Paul *height0 = height; 3134cdcec08d14a0709b09dc82a35367b2bcc817957Brian Paul *depth0 = depth; 3144cdcec08d14a0709b09dc82a35367b2bcc817957Brian Paul 3154cdcec08d14a0709b09dc82a35367b2bcc817957Brian Paul return GL_TRUE; 3164cdcec08d14a0709b09dc82a35367b2bcc817957Brian Paul} 3174cdcec08d14a0709b09dc82a35367b2bcc817957Brian Paul 3184cdcec08d14a0709b09dc82a35367b2bcc817957Brian Paul 3194cdcec08d14a0709b09dc82a35367b2bcc817957Brian Paul/** 320e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul * Try to allocate a pipe_resource object for the given st_texture_object. 321f52f5136e6eed23e55098681e5b082cc452136d6Brian * 322e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul * We use the given st_texture_image as a clue to determine the size of the 323e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul * mipmap image at level=0. 3242b53f4a9c674e9b02df8a06759e7a2340f257081Brian Paul * 3252b53f4a9c674e9b02df8a06759e7a2340f257081Brian Paul * \return GL_TRUE for success, GL_FALSE if out of memory. 32624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 3272b53f4a9c674e9b02df8a06759e7a2340f257081Brian Paulstatic GLboolean 328753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzerguess_and_alloc_texture(struct st_context *st, 329753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer struct st_texture_object *stObj, 330afc54983370033b65e3a7cbb29bd9c87156f0881Brian const struct st_texture_image *stImage) 33124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 3324cdcec08d14a0709b09dc82a35367b2bcc817957Brian Paul GLuint lastLevel, width, height, depth; 333e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul GLuint bindings; 3341dd8e2757852682af44b63193c89dff3c09c7703Brian Paul GLuint ptWidth, ptHeight, ptDepth, ptLayers; 335a1f95a8bf64f863289b6759caeec76d7e054400eRoland Scheidegger enum pipe_format fmt; 33624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 33724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian DBG("%s\n", __FUNCTION__); 33824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 339f52f5136e6eed23e55098681e5b082cc452136d6Brian assert(!stObj->pt); 340f52f5136e6eed23e55098681e5b082cc452136d6Brian 3414cdcec08d14a0709b09dc82a35367b2bcc817957Brian Paul if (!guess_base_level_size(stObj->base.Target, 3424cdcec08d14a0709b09dc82a35367b2bcc817957Brian Paul stImage->base.Width2, 3434cdcec08d14a0709b09dc82a35367b2bcc817957Brian Paul stImage->base.Height2, 3444cdcec08d14a0709b09dc82a35367b2bcc817957Brian Paul stImage->base.Depth2, 3456dbad425bc423eb7db7c99aab161955c7b4cdc4cBrian Paul stImage->base.Level, 3464cdcec08d14a0709b09dc82a35367b2bcc817957Brian Paul &width, &height, &depth)) { 3474cdcec08d14a0709b09dc82a35367b2bcc817957Brian Paul /* we can't determine the image size at level=0 */ 3484cdcec08d14a0709b09dc82a35367b2bcc817957Brian Paul stObj->width0 = stObj->height0 = stObj->depth0 = 0; 3494cdcec08d14a0709b09dc82a35367b2bcc817957Brian Paul /* this is not an out of memory error */ 3504cdcec08d14a0709b09dc82a35367b2bcc817957Brian Paul return GL_TRUE; 351e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul } 352e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul 353e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul /* At this point, (width x height x depth) is the expected size of 354e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul * the level=0 mipmap image. 355e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul */ 356296378b6c8b205048244746e260739448c4ee590Brian Paul 3574b7812919a5db2f72bd3b9f6d760ffeb469ee3e4Brian Paul /* Guess a reasonable value for lastLevel. With OpenGL we have no 3584b7812919a5db2f72bd3b9f6d760ffeb469ee3e4Brian Paul * idea how many mipmap levels will be in a texture until we start 3594b7812919a5db2f72bd3b9f6d760ffeb469ee3e4Brian Paul * to render with it. Make an educated guess here but be prepared 3604b7812919a5db2f72bd3b9f6d760ffeb469ee3e4Brian Paul * to re-allocating a texture buffer with space for more (or fewer) 3614b7812919a5db2f72bd3b9f6d760ffeb469ee3e4Brian Paul * mipmap levels later. 36224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 363ecfaab88b2577bd0395bc05d75a036126806a9c4Brian Paul if ((stObj->base.Sampler.MinFilter == GL_NEAREST || 364ecfaab88b2577bd0395bc05d75a036126806a9c4Brian Paul stObj->base.Sampler.MinFilter == GL_LINEAR || 3652a2236606fd6ae473a2f4db6ef6d3d5030261316José Fonseca stImage->base._BaseFormat == GL_DEPTH_COMPONENT || 3662a2236606fd6ae473a2f4db6ef6d3d5030261316José Fonseca stImage->base._BaseFormat == GL_DEPTH_STENCIL_EXT) && 36705bad193f56d48384097e37e47fae3fdda85f144Brian Paul !stObj->base.GenerateMipmap && 3686dbad425bc423eb7db7c99aab161955c7b4cdc4cBrian Paul stImage->base.Level == 0) { 36905bad193f56d48384097e37e47fae3fdda85f144Brian Paul /* only alloc space for a single mipmap level */ 370e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul lastLevel = 0; 37124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 37224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian else { 37305bad193f56d48384097e37e47fae3fdda85f144Brian Paul /* alloc space for a full mipmap */ 374c1785c19ca0716a7e85777242949a0c33e28988fPatrice Mandin GLuint l2width = util_logbase2(width); 375c1785c19ca0716a7e85777242949a0c33e28988fPatrice Mandin GLuint l2height = util_logbase2(height); 376c1785c19ca0716a7e85777242949a0c33e28988fPatrice Mandin GLuint l2depth = util_logbase2(depth); 377e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul lastLevel = MAX2(MAX2(l2width, l2height), l2depth); 37824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 37924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 380e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul /* Save the level=0 dimensions */ 381e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul stObj->width0 = width; 382e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul stObj->height0 = height; 383e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul stObj->depth0 = depth; 384e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul 3851f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul fmt = st_mesa_format_to_pipe_format(stImage->base.TexFormat); 3861ad2484f03cbe9ae6bd4ebe50d6894e570d65952Brian Paul 3878283db88414f600e66510de713382c36899d4b03Brian Paul bindings = default_bindings(st, fmt); 3881ad2484f03cbe9ae6bd4ebe50d6894e570d65952Brian Paul 3891dd8e2757852682af44b63193c89dff3c09c7703Brian Paul st_gl_texture_dims_to_pipe_dims(stObj->base.Target, 3901dd8e2757852682af44b63193c89dff3c09c7703Brian Paul width, height, depth, 3911dd8e2757852682af44b63193c89dff3c09c7703Brian Paul &ptWidth, &ptHeight, &ptDepth, &ptLayers); 3921dd8e2757852682af44b63193c89dff3c09c7703Brian Paul 393753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer stObj->pt = st_texture_create(st, 3945390a43ce06b27f6d54bc5f237aa305b6948f2afBrian gl_target_to_pipe(stObj->base.Target), 395a1f95a8bf64f863289b6759caeec76d7e054400eRoland Scheidegger fmt, 3965390a43ce06b27f6d54bc5f237aa305b6948f2afBrian lastLevel, 3971dd8e2757852682af44b63193c89dff3c09c7703Brian Paul ptWidth, 3981dd8e2757852682af44b63193c89dff3c09c7703Brian Paul ptHeight, 3991dd8e2757852682af44b63193c89dff3c09c7703Brian Paul ptDepth, 4001dd8e2757852682af44b63193c89dff3c09c7703Brian Paul ptLayers, 4018283db88414f600e66510de713382c36899d4b03Brian Paul bindings); 40224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 403c91b4edff978ee19afb4fe38ad69efc52db90691Vadim Girlin stObj->lastLevel = lastLevel; 404c91b4edff978ee19afb4fe38ad69efc52db90691Vadim Girlin 4052b53f4a9c674e9b02df8a06759e7a2340f257081Brian Paul DBG("%s returning %d\n", __FUNCTION__, (stObj->pt != NULL)); 4062b53f4a9c674e9b02df8a06759e7a2340f257081Brian Paul 4072b53f4a9c674e9b02df8a06759e7a2340f257081Brian Paul return stObj->pt != NULL; 40824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 40924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 41024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 411212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian/** 4124e6bb0774ffa93141a3a8ec7bb47b190810b2a4bBrian Paul * Called via ctx->Driver.AllocTextureImageBuffer(). 4134e6bb0774ffa93141a3a8ec7bb47b190810b2a4bBrian Paul * If the texture object/buffer already has space for the indicated image, 4144e6bb0774ffa93141a3a8ec7bb47b190810b2a4bBrian Paul * we're done. Otherwise, allocate memory for the new texture image. 4154e6bb0774ffa93141a3a8ec7bb47b190810b2a4bBrian Paul */ 4164e6bb0774ffa93141a3a8ec7bb47b190810b2a4bBrian Paulstatic GLboolean 4174e6bb0774ffa93141a3a8ec7bb47b190810b2a4bBrian Paulst_AllocTextureImageBuffer(struct gl_context *ctx, 418c9a7dfcf92e6adb4b85338c2c8dbbfbaf39fbfe7Pauli Nieminen struct gl_texture_image *texImage) 4194e6bb0774ffa93141a3a8ec7bb47b190810b2a4bBrian Paul{ 4204e6bb0774ffa93141a3a8ec7bb47b190810b2a4bBrian Paul struct st_context *st = st_context(ctx); 4214e6bb0774ffa93141a3a8ec7bb47b190810b2a4bBrian Paul struct st_texture_image *stImage = st_texture_image(texImage); 4224e6bb0774ffa93141a3a8ec7bb47b190810b2a4bBrian Paul struct st_texture_object *stObj = st_texture_object(texImage->TexObject); 4234e6bb0774ffa93141a3a8ec7bb47b190810b2a4bBrian Paul const GLuint level = texImage->Level; 424c9a7dfcf92e6adb4b85338c2c8dbbfbaf39fbfe7Pauli Nieminen GLuint width = texImage->Width; 425c9a7dfcf92e6adb4b85338c2c8dbbfbaf39fbfe7Pauli Nieminen GLuint height = texImage->Height; 426c9a7dfcf92e6adb4b85338c2c8dbbfbaf39fbfe7Pauli Nieminen GLuint depth = texImage->Depth; 4274e6bb0774ffa93141a3a8ec7bb47b190810b2a4bBrian Paul 4284e6bb0774ffa93141a3a8ec7bb47b190810b2a4bBrian Paul DBG("%s\n", __FUNCTION__); 4294e6bb0774ffa93141a3a8ec7bb47b190810b2a4bBrian Paul 430aff65241c8bf6206c6dfcbe774b87991f965d46fBrian Paul assert(!stImage->TexData); 4314e6bb0774ffa93141a3a8ec7bb47b190810b2a4bBrian Paul assert(!stImage->pt); /* xxx this might be wrong */ 4324e6bb0774ffa93141a3a8ec7bb47b190810b2a4bBrian Paul 4334e6bb0774ffa93141a3a8ec7bb47b190810b2a4bBrian Paul /* Look if the parent texture object has space for this image */ 4344e6bb0774ffa93141a3a8ec7bb47b190810b2a4bBrian Paul if (stObj->pt && 4354e6bb0774ffa93141a3a8ec7bb47b190810b2a4bBrian Paul level <= stObj->pt->last_level && 4364e6bb0774ffa93141a3a8ec7bb47b190810b2a4bBrian Paul st_texture_match_image(stObj->pt, texImage)) { 4374e6bb0774ffa93141a3a8ec7bb47b190810b2a4bBrian Paul /* this image will fit in the existing texture object's memory */ 4384e6bb0774ffa93141a3a8ec7bb47b190810b2a4bBrian Paul pipe_resource_reference(&stImage->pt, stObj->pt); 4394e6bb0774ffa93141a3a8ec7bb47b190810b2a4bBrian Paul return GL_TRUE; 4404e6bb0774ffa93141a3a8ec7bb47b190810b2a4bBrian Paul } 4414e6bb0774ffa93141a3a8ec7bb47b190810b2a4bBrian Paul 4424e6bb0774ffa93141a3a8ec7bb47b190810b2a4bBrian Paul /* The parent texture object does not have space for this image */ 4434e6bb0774ffa93141a3a8ec7bb47b190810b2a4bBrian Paul 4444e6bb0774ffa93141a3a8ec7bb47b190810b2a4bBrian Paul pipe_resource_reference(&stObj->pt, NULL); 4456835103878afd27a1d66d29d16cbfb0b1e894a94Brian Paul pipe_sampler_view_release(st->pipe, &stObj->sampler_view); 4464e6bb0774ffa93141a3a8ec7bb47b190810b2a4bBrian Paul 4474e6bb0774ffa93141a3a8ec7bb47b190810b2a4bBrian Paul if (!guess_and_alloc_texture(st, stObj, stImage)) { 4484e6bb0774ffa93141a3a8ec7bb47b190810b2a4bBrian Paul /* Probably out of memory. 4494e6bb0774ffa93141a3a8ec7bb47b190810b2a4bBrian Paul * Try flushing any pending rendering, then retry. 4504e6bb0774ffa93141a3a8ec7bb47b190810b2a4bBrian Paul */ 4514e6bb0774ffa93141a3a8ec7bb47b190810b2a4bBrian Paul st_finish(st); 4524e6bb0774ffa93141a3a8ec7bb47b190810b2a4bBrian Paul if (!guess_and_alloc_texture(st, stObj, stImage)) { 4534e6bb0774ffa93141a3a8ec7bb47b190810b2a4bBrian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage"); 4544e6bb0774ffa93141a3a8ec7bb47b190810b2a4bBrian Paul return GL_FALSE; 4554e6bb0774ffa93141a3a8ec7bb47b190810b2a4bBrian Paul } 4564e6bb0774ffa93141a3a8ec7bb47b190810b2a4bBrian Paul } 4574e6bb0774ffa93141a3a8ec7bb47b190810b2a4bBrian Paul 4584e6bb0774ffa93141a3a8ec7bb47b190810b2a4bBrian Paul if (stObj->pt && 4594e6bb0774ffa93141a3a8ec7bb47b190810b2a4bBrian Paul st_texture_match_image(stObj->pt, texImage)) { 4604e6bb0774ffa93141a3a8ec7bb47b190810b2a4bBrian Paul /* The image will live in the object's mipmap memory */ 4614e6bb0774ffa93141a3a8ec7bb47b190810b2a4bBrian Paul pipe_resource_reference(&stImage->pt, stObj->pt); 4624e6bb0774ffa93141a3a8ec7bb47b190810b2a4bBrian Paul assert(stImage->pt); 4634e6bb0774ffa93141a3a8ec7bb47b190810b2a4bBrian Paul return GL_TRUE; 4644e6bb0774ffa93141a3a8ec7bb47b190810b2a4bBrian Paul } 4654e6bb0774ffa93141a3a8ec7bb47b190810b2a4bBrian Paul else { 4664e6bb0774ffa93141a3a8ec7bb47b190810b2a4bBrian Paul /* Create a new, temporary texture/resource/buffer to hold this 4675d67d4fbebb7c7d6582c4c92fc5cea4a8e6a60abBrian Paul * one texture image. Note that when we later access this image 4685d67d4fbebb7c7d6582c4c92fc5cea4a8e6a60abBrian Paul * (either for mapping or copying) we'll want to always specify 4695d67d4fbebb7c7d6582c4c92fc5cea4a8e6a60abBrian Paul * mipmap level=0, even if the image represents some other mipmap 4705d67d4fbebb7c7d6582c4c92fc5cea4a8e6a60abBrian Paul * level. 4714e6bb0774ffa93141a3a8ec7bb47b190810b2a4bBrian Paul */ 4724e6bb0774ffa93141a3a8ec7bb47b190810b2a4bBrian Paul enum pipe_format format = 4734e6bb0774ffa93141a3a8ec7bb47b190810b2a4bBrian Paul st_mesa_format_to_pipe_format(texImage->TexFormat); 4744e6bb0774ffa93141a3a8ec7bb47b190810b2a4bBrian Paul GLuint bindings = default_bindings(st, format); 4754e6bb0774ffa93141a3a8ec7bb47b190810b2a4bBrian Paul GLuint ptWidth, ptHeight, ptDepth, ptLayers; 4764e6bb0774ffa93141a3a8ec7bb47b190810b2a4bBrian Paul 4774e6bb0774ffa93141a3a8ec7bb47b190810b2a4bBrian Paul st_gl_texture_dims_to_pipe_dims(stObj->base.Target, 4784e6bb0774ffa93141a3a8ec7bb47b190810b2a4bBrian Paul width, height, depth, 4794e6bb0774ffa93141a3a8ec7bb47b190810b2a4bBrian Paul &ptWidth, &ptHeight, &ptDepth, &ptLayers); 4804e6bb0774ffa93141a3a8ec7bb47b190810b2a4bBrian Paul 4814e6bb0774ffa93141a3a8ec7bb47b190810b2a4bBrian Paul stImage->pt = st_texture_create(st, 4824e6bb0774ffa93141a3a8ec7bb47b190810b2a4bBrian Paul gl_target_to_pipe(stObj->base.Target), 4834e6bb0774ffa93141a3a8ec7bb47b190810b2a4bBrian Paul format, 4844e6bb0774ffa93141a3a8ec7bb47b190810b2a4bBrian Paul 0, /* lastLevel */ 4854e6bb0774ffa93141a3a8ec7bb47b190810b2a4bBrian Paul ptWidth, 4864e6bb0774ffa93141a3a8ec7bb47b190810b2a4bBrian Paul ptHeight, 4874e6bb0774ffa93141a3a8ec7bb47b190810b2a4bBrian Paul ptDepth, 4884e6bb0774ffa93141a3a8ec7bb47b190810b2a4bBrian Paul ptLayers, 4894e6bb0774ffa93141a3a8ec7bb47b190810b2a4bBrian Paul bindings); 4904e6bb0774ffa93141a3a8ec7bb47b190810b2a4bBrian Paul return stImage->pt != NULL; 4914e6bb0774ffa93141a3a8ec7bb47b190810b2a4bBrian Paul } 4924e6bb0774ffa93141a3a8ec7bb47b190810b2a4bBrian Paul} 4934e6bb0774ffa93141a3a8ec7bb47b190810b2a4bBrian Paul 49419840c46f38b7bfe04bfaa925a6f56b3777be6ffBrian Paul 49519840c46f38b7bfe04bfaa925a6f56b3777be6ffBrian Paul/** 49619840c46f38b7bfe04bfaa925a6f56b3777be6ffBrian Paul * Preparation prior to glTexImage. Basically check the 'surface_based' 49719840c46f38b7bfe04bfaa925a6f56b3777be6ffBrian Paul * field and switch to a "normal" tex image if necessary. 49819840c46f38b7bfe04bfaa925a6f56b3777be6ffBrian Paul */ 49919840c46f38b7bfe04bfaa925a6f56b3777be6ffBrian Paulstatic void 50019840c46f38b7bfe04bfaa925a6f56b3777be6ffBrian Paulprep_teximage(struct gl_context *ctx, struct gl_texture_image *texImage, 50119840c46f38b7bfe04bfaa925a6f56b3777be6ffBrian Paul GLenum format, GLenum type) 50219840c46f38b7bfe04bfaa925a6f56b3777be6ffBrian Paul{ 50319840c46f38b7bfe04bfaa925a6f56b3777be6ffBrian Paul struct gl_texture_object *texObj = texImage->TexObject; 50419840c46f38b7bfe04bfaa925a6f56b3777be6ffBrian Paul struct st_texture_object *stObj = st_texture_object(texObj); 50519840c46f38b7bfe04bfaa925a6f56b3777be6ffBrian Paul 50619840c46f38b7bfe04bfaa925a6f56b3777be6ffBrian Paul /* switch to "normal" */ 50719840c46f38b7bfe04bfaa925a6f56b3777be6ffBrian Paul if (stObj->surface_based) { 50819840c46f38b7bfe04bfaa925a6f56b3777be6ffBrian Paul const GLenum target = texObj->Target; 50919840c46f38b7bfe04bfaa925a6f56b3777be6ffBrian Paul const GLuint level = texImage->Level; 51019840c46f38b7bfe04bfaa925a6f56b3777be6ffBrian Paul gl_format texFormat; 51119840c46f38b7bfe04bfaa925a6f56b3777be6ffBrian Paul 51219840c46f38b7bfe04bfaa925a6f56b3777be6ffBrian Paul _mesa_clear_texture_object(ctx, texObj); 51319840c46f38b7bfe04bfaa925a6f56b3777be6ffBrian Paul pipe_resource_reference(&stObj->pt, NULL); 51419840c46f38b7bfe04bfaa925a6f56b3777be6ffBrian Paul 51519840c46f38b7bfe04bfaa925a6f56b3777be6ffBrian Paul /* oops, need to init this image again */ 51619840c46f38b7bfe04bfaa925a6f56b3777be6ffBrian Paul texFormat = _mesa_choose_texture_format(ctx, texObj, target, level, 517c5af8891805fc4f590c1371c098cdbc704c44e00Pauli Nieminen texImage->InternalFormat, format, 518c5af8891805fc4f590c1371c098cdbc704c44e00Pauli Nieminen type); 51919840c46f38b7bfe04bfaa925a6f56b3777be6ffBrian Paul 52019840c46f38b7bfe04bfaa925a6f56b3777be6ffBrian Paul _mesa_init_teximage_fields(ctx, texImage, 521c5af8891805fc4f590c1371c098cdbc704c44e00Pauli Nieminen texImage->Width, texImage->Height, 522c5af8891805fc4f590c1371c098cdbc704c44e00Pauli Nieminen texImage->Depth, texImage->Border, 523c5af8891805fc4f590c1371c098cdbc704c44e00Pauli Nieminen texImage->InternalFormat, texFormat); 52419840c46f38b7bfe04bfaa925a6f56b3777be6ffBrian Paul 52519840c46f38b7bfe04bfaa925a6f56b3777be6ffBrian Paul stObj->surface_based = GL_FALSE; 52619840c46f38b7bfe04bfaa925a6f56b3777be6ffBrian Paul } 52719840c46f38b7bfe04bfaa925a6f56b3777be6ffBrian Paul} 52819840c46f38b7bfe04bfaa925a6f56b3777be6ffBrian Paul 52919840c46f38b7bfe04bfaa925a6f56b3777be6ffBrian Paul 53024df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 5318f5fffe75d2f8ae7c7ee706b53379a25bc673ae4Brian Paulst_TexImage(struct gl_context * ctx, GLuint dims, 5328f5fffe75d2f8ae7c7ee706b53379a25bc673ae4Brian Paul struct gl_texture_image *texImage, 5338f5fffe75d2f8ae7c7ee706b53379a25bc673ae4Brian Paul GLenum format, GLenum type, const void *pixels, 5348f5fffe75d2f8ae7c7ee706b53379a25bc673ae4Brian Paul const struct gl_pixelstore_attrib *unpack) 53524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 536c5af8891805fc4f590c1371c098cdbc704c44e00Pauli Nieminen prep_teximage(ctx, texImage, format, type); 537c5af8891805fc4f590c1371c098cdbc704c44e00Pauli Nieminen _mesa_store_teximage(ctx, dims, texImage, format, type, pixels, unpack); 53824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 53924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 54024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 54124df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 542e8fdd0e0d5286f4a9c763ffde44decec51124ebcBrian Paulst_CompressedTexImage(struct gl_context *ctx, GLuint dims, 543e8fdd0e0d5286f4a9c763ffde44decec51124ebcBrian Paul struct gl_texture_image *texImage, 544e8fdd0e0d5286f4a9c763ffde44decec51124ebcBrian Paul GLsizei imageSize, const GLvoid *data) 54524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 546c5af8891805fc4f590c1371c098cdbc704c44e00Pauli Nieminen prep_teximage(ctx, texImage, GL_NONE, GL_NONE); 5475606bd574e264c4beda8eb1d10b48d17e9b8b497Pauli Nieminen _mesa_store_compressed_teximage(ctx, dims, texImage, imageSize, data); 54824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 54924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 55024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 55151b339af2e8b80575a24bb9146f031c9605180bbBrian Paul 55251b339af2e8b80575a24bb9146f031c9605180bbBrian Paul/** 55351b339af2e8b80575a24bb9146f031c9605180bbBrian Paul * glGetTexImage() helper: decompress a compressed texture by rendering 55451b339af2e8b80575a24bb9146f031c9605180bbBrian Paul * a textured quad. Store the results in the user's buffer. 55551b339af2e8b80575a24bb9146f031c9605180bbBrian Paul */ 55651b339af2e8b80575a24bb9146f031c9605180bbBrian Paulstatic void 5574368a657670f1f3f13d8497f749cb5439f91529eBrian Pauldecompress_with_blit(struct gl_context * ctx, 55851b339af2e8b80575a24bb9146f031c9605180bbBrian Paul GLenum format, GLenum type, GLvoid *pixels, 55951b339af2e8b80575a24bb9146f031c9605180bbBrian Paul struct gl_texture_image *texImage) 56051b339af2e8b80575a24bb9146f031c9605180bbBrian Paul{ 56176c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul struct st_context *st = st_context(ctx); 56276c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul struct pipe_context *pipe = st->pipe; 56351b339af2e8b80575a24bb9146f031c9605180bbBrian Paul struct st_texture_image *stImage = st_texture_image(texImage); 5644368a657670f1f3f13d8497f749cb5439f91529eBrian Paul struct st_texture_object *stObj = st_texture_object(texImage->TexObject); 5650315cb9f8f3ec38fa9594860754fb53a67cf4c23Brian Paul struct pipe_sampler_view *src_view; 56651b339af2e8b80575a24bb9146f031c9605180bbBrian Paul const GLuint width = texImage->Width; 56751b339af2e8b80575a24bb9146f031c9605180bbBrian Paul const GLuint height = texImage->Height; 56851b339af2e8b80575a24bb9146f031c9605180bbBrian Paul struct pipe_surface *dst_surface; 569287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct pipe_resource *dst_texture; 57051b339af2e8b80575a24bb9146f031c9605180bbBrian Paul struct pipe_transfer *tex_xfer; 571127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger unsigned bind = (PIPE_BIND_RENDER_TARGET | /* util_blit may choose to render */ 572287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell PIPE_BIND_TRANSFER_READ); 57351b339af2e8b80575a24bb9146f031c9605180bbBrian Paul 57451b339af2e8b80575a24bb9146f031c9605180bbBrian Paul /* create temp / dest surface */ 5754c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger if (!util_create_rgba_surface(pipe, width, height, bind, 57651b339af2e8b80575a24bb9146f031c9605180bbBrian Paul &dst_texture, &dst_surface)) { 57751b339af2e8b80575a24bb9146f031c9605180bbBrian Paul _mesa_problem(ctx, "util_create_rgba_surface() failed " 57851b339af2e8b80575a24bb9146f031c9605180bbBrian Paul "in decompress_with_blit()"); 57951b339af2e8b80575a24bb9146f031c9605180bbBrian Paul return; 58051b339af2e8b80575a24bb9146f031c9605180bbBrian Paul } 58151b339af2e8b80575a24bb9146f031c9605180bbBrian Paul 5828d45bbc4221d83bc2bfd0295f56b0f6d35b16a99Marek Olšák /* Disable conditional rendering. */ 5838d45bbc4221d83bc2bfd0295f56b0f6d35b16a99Marek Olšák if (st->render_condition) { 5848d45bbc4221d83bc2bfd0295f56b0f6d35b16a99Marek Olšák pipe->render_condition(pipe, NULL, 0); 5858d45bbc4221d83bc2bfd0295f56b0f6d35b16a99Marek Olšák } 5868d45bbc4221d83bc2bfd0295f56b0f6d35b16a99Marek Olšák 5870315cb9f8f3ec38fa9594860754fb53a67cf4c23Brian Paul /* Create sampler view that limits fetches to the source mipmap level */ 5880315cb9f8f3ec38fa9594860754fb53a67cf4c23Brian Paul { 5890315cb9f8f3ec38fa9594860754fb53a67cf4c23Brian Paul struct pipe_sampler_view sv_temp; 5900315cb9f8f3ec38fa9594860754fb53a67cf4c23Brian Paul 5910315cb9f8f3ec38fa9594860754fb53a67cf4c23Brian Paul u_sampler_view_default_template(&sv_temp, stObj->pt, stObj->pt->format); 5920315cb9f8f3ec38fa9594860754fb53a67cf4c23Brian Paul 5935e7e7d96b341e937d3b795e94ac4a863c357f724Marek Olšák sv_temp.format = util_format_linear(sv_temp.format); 5940315cb9f8f3ec38fa9594860754fb53a67cf4c23Brian Paul sv_temp.u.tex.first_level = 5950315cb9f8f3ec38fa9594860754fb53a67cf4c23Brian Paul sv_temp.u.tex.last_level = texImage->Level; 5960315cb9f8f3ec38fa9594860754fb53a67cf4c23Brian Paul 5970315cb9f8f3ec38fa9594860754fb53a67cf4c23Brian Paul src_view = pipe->create_sampler_view(pipe, stObj->pt, &sv_temp); 5980315cb9f8f3ec38fa9594860754fb53a67cf4c23Brian Paul if (!src_view) { 5990315cb9f8f3ec38fa9594860754fb53a67cf4c23Brian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "glGetTexImage"); 6000315cb9f8f3ec38fa9594860754fb53a67cf4c23Brian Paul return; 6010315cb9f8f3ec38fa9594860754fb53a67cf4c23Brian Paul } 6020315cb9f8f3ec38fa9594860754fb53a67cf4c23Brian Paul } 60320b92c9d1ed8802cf0acb1c24884d0cef2bce10eBrian Paul 60451b339af2e8b80575a24bb9146f031c9605180bbBrian Paul /* blit/render/decompress */ 60576c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul util_blit_pixels_tex(st->blit, 606287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell src_view, /* pipe_resource (src) */ 60751b339af2e8b80575a24bb9146f031c9605180bbBrian Paul 0, 0, /* src x0, y0 */ 60851b339af2e8b80575a24bb9146f031c9605180bbBrian Paul width, height, /* src x1, y1 */ 60951b339af2e8b80575a24bb9146f031c9605180bbBrian Paul dst_surface, /* pipe_surface (dst) */ 61051b339af2e8b80575a24bb9146f031c9605180bbBrian Paul 0, 0, /* dst x0, y0 */ 61151b339af2e8b80575a24bb9146f031c9605180bbBrian Paul width, height, /* dst x1, y1 */ 61251b339af2e8b80575a24bb9146f031c9605180bbBrian Paul 0.0, /* z */ 61351b339af2e8b80575a24bb9146f031c9605180bbBrian Paul PIPE_TEX_MIPFILTER_NEAREST); 61451b339af2e8b80575a24bb9146f031c9605180bbBrian Paul 6158d45bbc4221d83bc2bfd0295f56b0f6d35b16a99Marek Olšák /* Restore conditional rendering state. */ 6168d45bbc4221d83bc2bfd0295f56b0f6d35b16a99Marek Olšák if (st->render_condition) { 6178d45bbc4221d83bc2bfd0295f56b0f6d35b16a99Marek Olšák pipe->render_condition(pipe, st->render_condition, 6188d45bbc4221d83bc2bfd0295f56b0f6d35b16a99Marek Olšák st->condition_mode); 6198d45bbc4221d83bc2bfd0295f56b0f6d35b16a99Marek Olšák } 6208d45bbc4221d83bc2bfd0295f56b0f6d35b16a99Marek Olšák 62151b339af2e8b80575a24bb9146f031c9605180bbBrian Paul /* map the dst_surface so we can read from it */ 6223e06803c2c6cf83009708b23d3ebafc0ea3dc525Brian Paul tex_xfer = pipe_get_transfer(pipe, 6234c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger dst_texture, 0, 0, 6244c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger PIPE_TRANSFER_READ, 6254c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger 0, 0, width, height); 62651b339af2e8b80575a24bb9146f031c9605180bbBrian Paul 6271b448c7a5cafa68eeead2a4c45f4362a9883383bBrian Paul pixels = _mesa_map_pbo_dest(ctx, &ctx->Pack, pixels); 62851b339af2e8b80575a24bb9146f031c9605180bbBrian Paul 6297b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul /* copy/pack data into user buffer */ 630c9d0526084e87799f11bdb7322f257b88f1033c4Brian Paul if (_mesa_format_matches_format_and_type(stImage->base.TexFormat, 631c9d0526084e87799f11bdb7322f257b88f1033c4Brian Paul format, type, 632c9d0526084e87799f11bdb7322f257b88f1033c4Brian Paul ctx->Pack.SwapBytes)) { 6337b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul /* memcpy */ 634b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol const uint bytesPerRow = width * util_format_get_blocksize(stImage->pt->format); 635287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell ubyte *map = pipe_transfer_map(pipe, tex_xfer); 6367b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul GLuint row; 6377b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul for (row = 0; row < height; row++) { 6387b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul GLvoid *dest = _mesa_image_address2d(&ctx->Pack, pixels, width, 6397b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul height, format, type, row, 0); 6407b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul memcpy(dest, map, bytesPerRow); 6417b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul map += tex_xfer->stride; 6427b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul } 643287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_transfer_unmap(pipe, tex_xfer); 64451b339af2e8b80575a24bb9146f031c9605180bbBrian Paul } 6457b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul else { 6467b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul /* format translation via floats */ 6477b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul GLuint row; 64819789e403ca3d0171d18f3c862738225902315e9Andre Maasikas enum pipe_format pformat = util_format_linear(dst_texture->format); 6493e88e432244336518e1bbcf303ee53eae4df2a02Brian Paul GLfloat *rgba; 6503e88e432244336518e1bbcf303ee53eae4df2a02Brian Paul 6513e88e432244336518e1bbcf303ee53eae4df2a02Brian Paul rgba = (GLfloat *) malloc(width * 4 * sizeof(GLfloat)); 6523e88e432244336518e1bbcf303ee53eae4df2a02Brian Paul if (!rgba) { 6533e88e432244336518e1bbcf303ee53eae4df2a02Brian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "glGetTexImage()"); 6543e88e432244336518e1bbcf303ee53eae4df2a02Brian Paul goto end; 6553e88e432244336518e1bbcf303ee53eae4df2a02Brian Paul } 6563e88e432244336518e1bbcf303ee53eae4df2a02Brian Paul 6577b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul for (row = 0; row < height; row++) { 6587b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul const GLbitfield transferOps = 0x0; /* bypassed for glGetTexImage() */ 6597b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul GLvoid *dest = _mesa_image_address2d(&ctx->Pack, pixels, width, 6607b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul height, format, type, row, 0); 6617b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul 662b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell if (ST_DEBUG & DEBUG_FALLBACK) 663b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell debug_printf("%s: fallback format translation\n", __FUNCTION__); 664b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell 6657b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul /* get float[4] rgba row from surface */ 6669d380f487a4f2628594821a4fed5fe587ce52031Brian Paul pipe_get_tile_rgba_format(pipe, tex_xfer, 0, row, width, 1, 66719789e403ca3d0171d18f3c862738225902315e9Andre Maasikas pformat, rgba); 6687b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul 6697b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul _mesa_pack_rgba_span_float(ctx, width, (GLfloat (*)[4]) rgba, format, 6707b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul type, dest, &ctx->Pack, transferOps); 6717b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul } 6723e88e432244336518e1bbcf303ee53eae4df2a02Brian Paul 6733e88e432244336518e1bbcf303ee53eae4df2a02Brian Paul free(rgba); 6747b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul } 6757b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul 6763e88e432244336518e1bbcf303ee53eae4df2a02Brian Paulend: 6771b448c7a5cafa68eeead2a4c45f4362a9883383bBrian Paul _mesa_unmap_pbo_dest(ctx, &ctx->Pack); 67851b339af2e8b80575a24bb9146f031c9605180bbBrian Paul 679287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe->transfer_destroy(pipe, tex_xfer); 68063af29bfbe265318bcf5be69e420de361b900321Keith Whitwell 68151b339af2e8b80575a24bb9146f031c9605180bbBrian Paul /* destroy the temp / dest surface */ 68251b339af2e8b80575a24bb9146f031c9605180bbBrian Paul util_destroy_rgba_surface(dst_texture, dst_surface); 6830315cb9f8f3ec38fa9594860754fb53a67cf4c23Brian Paul 6846835103878afd27a1d66d29d16cbfb0b1e894a94Brian Paul pipe_sampler_view_release(pipe, &src_view); 68551b339af2e8b80575a24bb9146f031c9605180bbBrian Paul} 68651b339af2e8b80575a24bb9146f031c9605180bbBrian Paul 68751b339af2e8b80575a24bb9146f031c9605180bbBrian Paul 68851b339af2e8b80575a24bb9146f031c9605180bbBrian Paul 68924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian/** 6901a867385d56022e904ef0235cbed545057fcb998Brian Paul * Called via ctx->Driver.GetTexImage() 69124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 69224df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 6934368a657670f1f3f13d8497f749cb5439f91529eBrian Paulst_GetTexImage(struct gl_context * ctx, 6948df7ca71125ee0ad74260378ff7e185dcf66f3bcBrian Paul GLenum format, GLenum type, GLvoid * pixels, 6958df7ca71125ee0ad74260378ff7e185dcf66f3bcBrian Paul struct gl_texture_image *texImage) 69624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 69724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct st_texture_image *stImage = st_texture_image(texImage); 69824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 6998df7ca71125ee0ad74260378ff7e185dcf66f3bcBrian Paul if (stImage->pt && util_format_is_s3tc(stImage->pt->format)) { 70051b339af2e8b80575a24bb9146f031c9605180bbBrian Paul /* Need to decompress the texture. 7011a867385d56022e904ef0235cbed545057fcb998Brian Paul * We'll do this by rendering a textured quad (which is hopefully 702068fcc029d58f97a7bdbaa01fdbafacbb37e9d68Brian Paul * faster than using the fallback code in texcompress.c). 70351b339af2e8b80575a24bb9146f031c9605180bbBrian Paul * Note that we only expect RGBA formats (no Z/depth formats). 70451b339af2e8b80575a24bb9146f031c9605180bbBrian Paul */ 7054368a657670f1f3f13d8497f749cb5439f91529eBrian Paul decompress_with_blit(ctx, format, type, pixels, texImage); 70651b339af2e8b80575a24bb9146f031c9605180bbBrian Paul } 7071a867385d56022e904ef0235cbed545057fcb998Brian Paul else { 7084368a657670f1f3f13d8497f749cb5439f91529eBrian Paul _mesa_get_teximage(ctx, format, type, pixels, texImage); 70924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 71024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 71124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 71224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 71324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian/** 7145facd7986ace899673499f396897469720476799Brian Paul * Do a CopyTexSubImage operation using a read transfer from the source, 7155facd7986ace899673499f396897469720476799Brian Paul * a write transfer to the destination and get_tile()/put_tile() to access 7165facd7986ace899673499f396897469720476799Brian Paul * the pixels/texels. 717c6717a86420d7141013165f7acd50b3c3f751756Brian * 718c6717a86420d7141013165f7acd50b3c3f751756Brian * Note: srcY=0=TOP of renderbuffer 719038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian */ 720038cb561eb094af2f2ba06e18e61246fc0c87c3cBrianstatic void 72156b57aa360a8bad0c4b68fbdf7c64ac33f9e7661Brian Paulfallback_copy_texsubimage(struct gl_context *ctx, 722038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian struct st_renderbuffer *strb, 723038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian struct st_texture_image *stImage, 724038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian GLenum baseFormat, 725038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian GLint destX, GLint destY, GLint destZ, 726038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian GLint srcX, GLint srcY, 727038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian GLsizei width, GLsizei height) 728038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian{ 72976c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul struct st_context *st = st_context(ctx); 73076c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul struct pipe_context *pipe = st->pipe; 7314617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzer struct pipe_transfer *src_trans; 7324617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzer GLvoid *texDest; 73371633abafc935c25da9731bab48c228ceb9b4097Michel Dänzer enum pipe_transfer_usage transfer_usage; 7344c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger 735b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell if (ST_DEBUG & DEBUG_FALLBACK) 736b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell debug_printf("%s: fallback processing\n", __FUNCTION__); 7374617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzer 7384617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzer if (st_fb_orientation(ctx->ReadBuffer) == Y_0_TOP) { 7397c8836e9ef49d938aa55a1c385b95c6371c301f1Michel Dänzer srcY = strb->Base.Height - srcY - height; 7404617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzer } 741f3048ad90ed2e4583f0f7aaf35a0f4aa581942ddBrian Paul 7423e06803c2c6cf83009708b23d3ebafc0ea3dc525Brian Paul src_trans = pipe_get_transfer(pipe, 7434c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger strb->texture, 74409e71cf7228232aa203915c9248c79cf26c5b917Brian Paul strb->rtt_level, 74509e71cf7228232aa203915c9248c79cf26c5b917Brian Paul strb->rtt_face + strb->rtt_slice, 7464c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger PIPE_TRANSFER_READ, 7474c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger srcX, srcY, 7484c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger width, height); 749038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian 7500197348641614188c400d7c616573bb7f1eea781Brian Paul if ((baseFormat == GL_DEPTH_COMPONENT || 7510197348641614188c400d7c616573bb7f1eea781Brian Paul baseFormat == GL_DEPTH_STENCIL) && 7520bed834be4a174d20b31a6cbcf066774bf749929Michal Krol util_format_is_depth_and_stencil(stImage->pt->format)) 75371633abafc935c25da9731bab48c228ceb9b4097Michel Dänzer transfer_usage = PIPE_TRANSFER_READ_WRITE; 75471633abafc935c25da9731bab48c228ceb9b4097Michel Dänzer else 75571633abafc935c25da9731bab48c228ceb9b4097Michel Dänzer transfer_usage = PIPE_TRANSFER_WRITE; 75671633abafc935c25da9731bab48c228ceb9b4097Michel Dänzer 7574c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger /* XXX this used to ignore destZ param */ 7584c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger texDest = st_texture_image_map(st, stImage, destZ, transfer_usage, 7594617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzer destX, destY, width, height); 760038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian 761105758105a790dd8466c6be8c232c3f215ca4deeBrian Paul if (baseFormat == GL_DEPTH_COMPONENT || 7620197348641614188c400d7c616573bb7f1eea781Brian Paul baseFormat == GL_DEPTH_STENCIL) { 763cc94863429d8a6cef8dbf861e78701a458d30f5aBrian Paul const GLboolean scaleOrBias = (ctx->Pixel.DepthScale != 1.0F || 764cc94863429d8a6cef8dbf861e78701a458d30f5aBrian Paul ctx->Pixel.DepthBias != 0.0F); 76527858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul GLint row, yStep; 7663e88e432244336518e1bbcf303ee53eae4df2a02Brian Paul uint *data; 767cc94863429d8a6cef8dbf861e78701a458d30f5aBrian Paul 76827858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul /* determine bottom-to-top vs. top-to-bottom order for src buffer */ 76927858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul if (st_fb_orientation(ctx->ReadBuffer) == Y_0_TOP) { 7707c8836e9ef49d938aa55a1c385b95c6371c301f1Michel Dänzer srcY = height - 1; 77127858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul yStep = -1; 77227858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul } 77327858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul else { 7744617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzer srcY = 0; 77527858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul yStep = 1; 77627858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul } 77727858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul 7783e88e432244336518e1bbcf303ee53eae4df2a02Brian Paul data = (uint *) malloc(width * sizeof(uint)); 7793e88e432244336518e1bbcf303ee53eae4df2a02Brian Paul 7803e88e432244336518e1bbcf303ee53eae4df2a02Brian Paul if (data) { 7813e88e432244336518e1bbcf303ee53eae4df2a02Brian Paul /* To avoid a large temp memory allocation, do copy row by row */ 7823e88e432244336518e1bbcf303ee53eae4df2a02Brian Paul for (row = 0; row < height; row++, srcY += yStep) { 7833e88e432244336518e1bbcf303ee53eae4df2a02Brian Paul pipe_get_tile_z(pipe, src_trans, 0, srcY, width, 1, data); 7843e88e432244336518e1bbcf303ee53eae4df2a02Brian Paul if (scaleOrBias) { 7853e88e432244336518e1bbcf303ee53eae4df2a02Brian Paul _mesa_scale_and_bias_depth_uint(ctx, width, data); 7863e88e432244336518e1bbcf303ee53eae4df2a02Brian Paul } 7873e88e432244336518e1bbcf303ee53eae4df2a02Brian Paul pipe_put_tile_z(pipe, stImage->transfer, 0, row, width, 1, data); 788cc94863429d8a6cef8dbf861e78701a458d30f5aBrian Paul } 789cc94863429d8a6cef8dbf861e78701a458d30f5aBrian Paul } 7903e88e432244336518e1bbcf303ee53eae4df2a02Brian Paul else { 7913e88e432244336518e1bbcf303ee53eae4df2a02Brian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "glCopyTexSubImage()"); 7923e88e432244336518e1bbcf303ee53eae4df2a02Brian Paul } 7933e88e432244336518e1bbcf303ee53eae4df2a02Brian Paul 7943e88e432244336518e1bbcf303ee53eae4df2a02Brian Paul free(data); 795cc94863429d8a6cef8dbf861e78701a458d30f5aBrian Paul } 796cc94863429d8a6cef8dbf861e78701a458d30f5aBrian Paul else { 797cc94863429d8a6cef8dbf861e78701a458d30f5aBrian Paul /* RGBA format */ 79827858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul GLfloat *tempSrc = 79932f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg (GLfloat *) malloc(width * height * 4 * sizeof(GLfloat)); 80027858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul 80127858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul if (tempSrc && texDest) { 80227858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul const GLint dims = 2; 8035facd7986ace899673499f396897469720476799Brian Paul const GLint dstRowStride = stImage->transfer->stride; 80427858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul struct gl_texture_image *texImage = &stImage->base; 80527858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul struct gl_pixelstore_attrib unpack = ctx->DefaultPacking; 80627858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul 80727858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul if (st_fb_orientation(ctx->ReadBuffer) == Y_0_TOP) { 80827858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul unpack.Invert = GL_TRUE; 809cc94863429d8a6cef8dbf861e78701a458d30f5aBrian Paul } 81027858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul 81127858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul /* get float/RGBA image from framebuffer */ 81227858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul /* XXX this usually involves a lot of int/float conversion. 81327858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul * try to avoid that someday. 81427858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul */ 8159d380f487a4f2628594821a4fed5fe587ce52031Brian Paul pipe_get_tile_rgba_format(pipe, src_trans, 0, 0, width, height, 8169d380f487a4f2628594821a4fed5fe587ce52031Brian Paul util_format_linear(strb->texture->format), 8179d380f487a4f2628594821a4fed5fe587ce52031Brian Paul tempSrc); 81827858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul 81927858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul /* Store into texture memory. 82027858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul * Note that this does some special things such as pixel transfer 82127858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul * ops and format conversion. In particular, if the dest tex format 82227858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul * is actually RGBA but the user created the texture as GL_RGB we 82327858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul * need to fill-in/override the alpha channel with 1.0. 82427858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul */ 8256480210b89dc8ae0990c450d27870c7b7930f251Brian Paul _mesa_texstore(ctx, dims, 8266480210b89dc8ae0990c450d27870c7b7930f251Brian Paul texImage->_BaseFormat, 8276480210b89dc8ae0990c450d27870c7b7930f251Brian Paul texImage->TexFormat, 8286480210b89dc8ae0990c450d27870c7b7930f251Brian Paul dstRowStride, 8295253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul (GLubyte **) &texDest, 8306480210b89dc8ae0990c450d27870c7b7930f251Brian Paul width, height, 1, 8316480210b89dc8ae0990c450d27870c7b7930f251Brian Paul GL_RGBA, GL_FLOAT, tempSrc, /* src */ 8326480210b89dc8ae0990c450d27870c7b7930f251Brian Paul &unpack); 83327858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul } 83427858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul else { 83527858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexSubImage"); 8365c83f1371978472fbe4bba8f686733c6b519874aBrian } 83727858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul 83827858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul if (tempSrc) 83932f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free(tempSrc); 8405c83f1371978472fbe4bba8f686733c6b519874aBrian } 841d0279fc4b38c72356a341173317bcd45d9093f45Michel Dänzer 84276c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul st_texture_image_unmap(st, stImage); 843287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe->transfer_destroy(pipe, src_trans); 844038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian} 845038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian 846038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian 84765d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul 84865d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul/** 84965d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * If the format of the src renderbuffer and the format of the dest 85065d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * texture are compatible (in terms of blitting), return a TGSI writemask 85165d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * to be used during the blit. 85265d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * If the src/dest are incompatible, return 0. 85365d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul */ 8548fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwellstatic unsigned 855f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergcompatible_src_dst_formats(struct gl_context *ctx, 85665d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul const struct gl_renderbuffer *src, 8578fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell const struct gl_texture_image *dst) 8588fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell{ 85965d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul /* Get logical base formats for the src and dest. 86065d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * That is, use the user-requested formats and not the actual, device- 86165d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * chosen formats. 86265d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * For example, the user may have requested an A8 texture but the 86365d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * driver may actually be using an RGBA texture format. When we 86465d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * copy/blit to that texture, we only want to copy the Alpha channel 86565d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * and not the RGB channels. 86665d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * 86765d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * Similarly, when the src FBO was created an RGB format may have been 86865d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * requested but the driver actually chose an RGBA format. In that case, 86965d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * we don't want to copy the undefined Alpha channel to the dest texture 87065d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * (it should be 1.0). 87165d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul */ 87265d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul const GLenum srcFormat = _mesa_base_fbo_format(ctx, src->InternalFormat); 87365d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul const GLenum dstFormat = _mesa_base_tex_format(ctx, dst->InternalFormat); 8748fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell 87565d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul /** 87665d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * XXX when we have red-only and red/green renderbuffers we'll need 87765d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * to add more cases here (or implement a general-purpose routine that 87865d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * queries the existance of the R,G,B,A channels in the src and dest). 87965d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul */ 88065d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul if (srcFormat == dstFormat) { 8818fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell /* This is the same as matching_base_formats, which should 8828fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell * always pass, as it did previously. 8838fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell */ 8848fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell return TGSI_WRITEMASK_XYZW; 8858fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell } 88665d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul else if (srcFormat == GL_RGB && dstFormat == GL_RGBA) { 88765d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul /* Make sure that A in the dest is 1. The actual src format 88865d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * may be RGBA and have undefined A values. 88965d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul */ 89065d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul return TGSI_WRITEMASK_XYZ; 89165d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul } 89265d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul else if (srcFormat == GL_RGBA && dstFormat == GL_RGB) { 89365d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul /* Make sure that A in the dest is 1. The actual dst format 89465d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * may be RGBA and will need A=1 to provide proper alpha values 89565d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * when sampled later. 8968fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell */ 89765d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul return TGSI_WRITEMASK_XYZ; 8988fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell } 8998fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell else { 900b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell if (ST_DEBUG & DEBUG_FALLBACK) 901b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell debug_printf("%s failed for src %s, dst %s\n", 902b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell __FUNCTION__, 903b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell _mesa_lookup_enum_by_nr(srcFormat), 90465d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul _mesa_lookup_enum_by_nr(dstFormat)); 905b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell 9068fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell /* Otherwise fail. 9078fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell */ 9088fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell return 0; 9098fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell } 9108fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell} 9118fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell 9128fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell 9138fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell 914038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian/** 9154e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul * Do a CopyTex[Sub]Image1/2/3D() using a hardware (blit) path if possible. 9164e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul * Note that the region to copy has already been clipped so we know we 9174e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul * won't read from outside the source renderbuffer's bounds. 918c6717a86420d7141013165f7acd50b3c3f751756Brian * 9194e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul * Note: srcY=0=Bottom of renderbuffer (GL convention) 92024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 921038cb561eb094af2f2ba06e18e61246fc0c87c3cBrianstatic void 922cd9ab2584f5e2a5eb0e96a948e6aedc9a33c886dBrian Paulst_CopyTexSubImage(struct gl_context *ctx, GLuint dims, 923cd9ab2584f5e2a5eb0e96a948e6aedc9a33c886dBrian Paul struct gl_texture_image *texImage, 924cd9ab2584f5e2a5eb0e96a948e6aedc9a33c886dBrian Paul GLint destX, GLint destY, GLint destZ, 925cd9ab2584f5e2a5eb0e96a948e6aedc9a33c886dBrian Paul struct gl_renderbuffer *rb, 926cd9ab2584f5e2a5eb0e96a948e6aedc9a33c886dBrian Paul GLint srcX, GLint srcY, GLsizei width, GLsizei height) 92724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 928038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian struct st_texture_image *stImage = st_texture_image(texImage); 9290197348641614188c400d7c616573bb7f1eea781Brian Paul const GLenum texBaseFormat = texImage->_BaseFormat; 930b27498c7cad7dae4e3b3ef9517b9c0aef58f73f6Brian struct gl_framebuffer *fb = ctx->ReadBuffer; 931b27498c7cad7dae4e3b3ef9517b9c0aef58f73f6Brian struct st_renderbuffer *strb; 93276c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul struct st_context *st = st_context(ctx); 93376c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul struct pipe_context *pipe = st->pipe; 9346f715dcc219071e574e363a9db4365c9c31ebbd3Brian struct pipe_screen *screen = pipe->screen; 93527858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul enum pipe_format dest_format, src_format; 93627858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul GLboolean matching_base_formats; 9375ba15d8d38d98cb7b625fa55e7d818ef9c6629ceMarek Olšák GLuint color_writemask, zs_writemask, sample_count; 9388fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell struct pipe_surface *dest_surface = NULL; 9398fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell GLboolean do_flip = (st_fb_orientation(ctx->ReadBuffer) == Y_0_TOP); 940d9582026631ae3cd667f6cd13040b93e42db3e44Henri Verbeet struct pipe_surface surf_tmpl; 941d9582026631ae3cd667f6cd13040b93e42db3e44Henri Verbeet unsigned int dst_usage; 942d9582026631ae3cd667f6cd13040b93e42db3e44Henri Verbeet GLint srcY0, srcY1; 94324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 944afd16512bc354cf1a7220cb9bf3ce445503c7af4Keith Whitwell /* make sure finalize_textures has been called? 945afd16512bc354cf1a7220cb9bf3ce445503c7af4Keith Whitwell */ 94676c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul if (0) st_validate_state(st); 947afd16512bc354cf1a7220cb9bf3ce445503c7af4Keith Whitwell 948b27498c7cad7dae4e3b3ef9517b9c0aef58f73f6Brian /* determine if copying depth or color data */ 949105758105a790dd8466c6be8c232c3f215ca4deeBrian Paul if (texBaseFormat == GL_DEPTH_COMPONENT || 9500197348641614188c400d7c616573bb7f1eea781Brian Paul texBaseFormat == GL_DEPTH_STENCIL) { 95102d12719e356ee9e3348db67ae55ae790dad058fBrian Paul strb = st_renderbuffer(fb->Attachment[BUFFER_DEPTH].Renderbuffer); 95224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 953b27498c7cad7dae4e3b3ef9517b9c0aef58f73f6Brian else { 9544e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul /* texBaseFormat == GL_RGB, GL_RGBA, GL_ALPHA, etc */ 955b27498c7cad7dae4e3b3ef9517b9c0aef58f73f6Brian strb = st_renderbuffer(fb->_ColorReadBuffer); 956b27498c7cad7dae4e3b3ef9517b9c0aef58f73f6Brian } 957b27498c7cad7dae4e3b3ef9517b9c0aef58f73f6Brian 958afd16512bc354cf1a7220cb9bf3ce445503c7af4Keith Whitwell if (!strb || !strb->surface || !stImage->pt) { 959afd16512bc354cf1a7220cb9bf3ce445503c7af4Keith Whitwell debug_printf("%s: null strb or stImage\n", __FUNCTION__); 960afd16512bc354cf1a7220cb9bf3ce445503c7af4Keith Whitwell return; 961afd16512bc354cf1a7220cb9bf3ce445503c7af4Keith Whitwell } 962afd16512bc354cf1a7220cb9bf3ce445503c7af4Keith Whitwell 963127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger sample_count = strb->surface->texture->nr_samples; 964127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger /* I believe this would be legal, presumably would need to do a resolve 965127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger for color, and for depth/stencil spec says to just use one of the 966127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger depth/stencil samples per pixel? Need some transfer clarifications. */ 967127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger assert(sample_count < 2); 968127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger 969b27498c7cad7dae4e3b3ef9517b9c0aef58f73f6Brian assert(strb); 970b27498c7cad7dae4e3b3ef9517b9c0aef58f73f6Brian assert(strb->surface); 971753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer assert(stImage->pt); 972c6717a86420d7141013165f7acd50b3c3f751756Brian 973b27498c7cad7dae4e3b3ef9517b9c0aef58f73f6Brian src_format = strb->surface->format; 974753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer dest_format = stImage->pt->format; 975b27498c7cad7dae4e3b3ef9517b9c0aef58f73f6Brian 97627858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul /* 97727858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul * Determine if the src framebuffer and dest texture have the same 97827858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul * base format. We need this to detect a case such as the framebuffer 97927858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul * being GL_RGBA but the texture being GL_RGB. If the actual hardware 98027858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul * texture format stores RGBA we need to set A=1 (overriding the 98127858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul * framebuffer's alpha values). We can't do that with the blit or 98227858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul * textured-quad paths. 98327858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul */ 98445e76d2665b38ba3787548310efc59e969124c01Brian Paul matching_base_formats = 98545e76d2665b38ba3787548310efc59e969124c01Brian Paul (_mesa_get_format_base_format(strb->Base.Format) == 98645e76d2665b38ba3787548310efc59e969124c01Brian Paul _mesa_get_format_base_format(texImage->TexFormat)); 987127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger 988d9582026631ae3cd667f6cd13040b93e42db3e44Henri Verbeet if (ctx->_ImageTransferState) { 989d9582026631ae3cd667f6cd13040b93e42db3e44Henri Verbeet goto fallback; 990d9582026631ae3cd667f6cd13040b93e42db3e44Henri Verbeet } 99191e56c88972448079b5aafbc2b876d0ea0e28a39Marek Olšák 992a971476cc7913edde1944f33f164cd507199e1ddBrian Paul if (texImage->TexObject->Target == GL_TEXTURE_1D_ARRAY) { 993a971476cc7913edde1944f33f164cd507199e1ddBrian Paul /* 1D arrays might be thought of as 2D images but the actual layout 994a971476cc7913edde1944f33f164cd507199e1ddBrian Paul * might not be that way. At some points, we convert OpenGL's 1D 995a971476cc7913edde1944f33f164cd507199e1ddBrian Paul * array 'height' into gallium 'layers' and that prevents the blit 996a971476cc7913edde1944f33f164cd507199e1ddBrian Paul * utility code from doing the right thing. Simpy use the memcpy-based 997a971476cc7913edde1944f33f164cd507199e1ddBrian Paul * fallback. 998a971476cc7913edde1944f33f164cd507199e1ddBrian Paul */ 999a971476cc7913edde1944f33f164cd507199e1ddBrian Paul goto fallback; 1000a971476cc7913edde1944f33f164cd507199e1ddBrian Paul } 1001a971476cc7913edde1944f33f164cd507199e1ddBrian Paul 1002d9582026631ae3cd667f6cd13040b93e42db3e44Henri Verbeet if (matching_base_formats && 1003d9582026631ae3cd667f6cd13040b93e42db3e44Henri Verbeet src_format == dest_format && 1004d9582026631ae3cd667f6cd13040b93e42db3e44Henri Verbeet !do_flip) { 1005d9582026631ae3cd667f6cd13040b93e42db3e44Henri Verbeet /* use surface_copy() / blit */ 1006d9582026631ae3cd667f6cd13040b93e42db3e44Henri Verbeet struct pipe_box src_box; 10079b04abe36812a34ba447e5b1f8d8e44a10510820Brian Paul unsigned dstLevel; 10089b04abe36812a34ba447e5b1f8d8e44a10510820Brian Paul 1009d9582026631ae3cd667f6cd13040b93e42db3e44Henri Verbeet u_box_2d_zslice(srcX, srcY, strb->surface->u.tex.first_layer, 1010d9582026631ae3cd667f6cd13040b93e42db3e44Henri Verbeet width, height, &src_box); 1011d9582026631ae3cd667f6cd13040b93e42db3e44Henri Verbeet 10129b04abe36812a34ba447e5b1f8d8e44a10510820Brian Paul /* If stImage->pt is an independent image (not a pointer into a full 10139b04abe36812a34ba447e5b1f8d8e44a10510820Brian Paul * mipmap) stImage->pt.last_level will be zero and we need to use that 10149b04abe36812a34ba447e5b1f8d8e44a10510820Brian Paul * as the dest level. 10159b04abe36812a34ba447e5b1f8d8e44a10510820Brian Paul */ 10169b04abe36812a34ba447e5b1f8d8e44a10510820Brian Paul dstLevel = MIN2(stImage->base.Level, stImage->pt->last_level); 10179b04abe36812a34ba447e5b1f8d8e44a10510820Brian Paul 1018d9582026631ae3cd667f6cd13040b93e42db3e44Henri Verbeet /* for resource_copy_region(), y=0=top, always */ 1019d9582026631ae3cd667f6cd13040b93e42db3e44Henri Verbeet pipe->resource_copy_region(pipe, 1020d9582026631ae3cd667f6cd13040b93e42db3e44Henri Verbeet /* dest */ 1021d9582026631ae3cd667f6cd13040b93e42db3e44Henri Verbeet stImage->pt, 10229b04abe36812a34ba447e5b1f8d8e44a10510820Brian Paul dstLevel, 1023d9582026631ae3cd667f6cd13040b93e42db3e44Henri Verbeet destX, destY, destZ + stImage->base.Face, 1024d9582026631ae3cd667f6cd13040b93e42db3e44Henri Verbeet /* src */ 1025d9582026631ae3cd667f6cd13040b93e42db3e44Henri Verbeet strb->texture, 1026d9582026631ae3cd667f6cd13040b93e42db3e44Henri Verbeet strb->surface->u.tex.level, 1027d9582026631ae3cd667f6cd13040b93e42db3e44Henri Verbeet &src_box); 1028d9582026631ae3cd667f6cd13040b93e42db3e44Henri Verbeet return; 1029d9582026631ae3cd667f6cd13040b93e42db3e44Henri Verbeet } 103091e56c88972448079b5aafbc2b876d0ea0e28a39Marek Olšák 1031d9582026631ae3cd667f6cd13040b93e42db3e44Henri Verbeet if (texBaseFormat == GL_DEPTH_STENCIL) { 1032d9582026631ae3cd667f6cd13040b93e42db3e44Henri Verbeet goto fallback; 1033d9582026631ae3cd667f6cd13040b93e42db3e44Henri Verbeet } 1034d9582026631ae3cd667f6cd13040b93e42db3e44Henri Verbeet 1035d9582026631ae3cd667f6cd13040b93e42db3e44Henri Verbeet if (texBaseFormat == GL_DEPTH_COMPONENT) { 10365ba15d8d38d98cb7b625fa55e7d818ef9c6629ceMarek Olšák color_writemask = 0; 10375ba15d8d38d98cb7b625fa55e7d818ef9c6629ceMarek Olšák zs_writemask = BLIT_WRITEMASK_Z; 1038d9582026631ae3cd667f6cd13040b93e42db3e44Henri Verbeet dst_usage = PIPE_BIND_DEPTH_STENCIL; 1039d9582026631ae3cd667f6cd13040b93e42db3e44Henri Verbeet } 1040d9582026631ae3cd667f6cd13040b93e42db3e44Henri Verbeet else { 10415ba15d8d38d98cb7b625fa55e7d818ef9c6629ceMarek Olšák color_writemask = compatible_src_dst_formats(ctx, &strb->Base, texImage); 10425ba15d8d38d98cb7b625fa55e7d818ef9c6629ceMarek Olšák zs_writemask = 0; 1043d9582026631ae3cd667f6cd13040b93e42db3e44Henri Verbeet dst_usage = PIPE_BIND_RENDER_TARGET; 1044d9582026631ae3cd667f6cd13040b93e42db3e44Henri Verbeet } 104579931e38abc62286151121a3f59127e296144551Michel Dänzer 10465ba15d8d38d98cb7b625fa55e7d818ef9c6629ceMarek Olšák if ((!color_writemask && !zs_writemask) || 1047d9582026631ae3cd667f6cd13040b93e42db3e44Henri Verbeet !screen->is_format_supported(screen, src_format, 1048d9582026631ae3cd667f6cd13040b93e42db3e44Henri Verbeet PIPE_TEXTURE_2D, sample_count, 1049d9582026631ae3cd667f6cd13040b93e42db3e44Henri Verbeet PIPE_BIND_SAMPLER_VIEW) || 1050d9582026631ae3cd667f6cd13040b93e42db3e44Henri Verbeet !screen->is_format_supported(screen, dest_format, 1051d9582026631ae3cd667f6cd13040b93e42db3e44Henri Verbeet PIPE_TEXTURE_2D, 0, 1052d9582026631ae3cd667f6cd13040b93e42db3e44Henri Verbeet dst_usage)) { 1053d9582026631ae3cd667f6cd13040b93e42db3e44Henri Verbeet goto fallback; 1054038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian } 1055cc94863429d8a6cef8dbf861e78701a458d30f5aBrian Paul 1056d9582026631ae3cd667f6cd13040b93e42db3e44Henri Verbeet if (do_flip) { 1057d9582026631ae3cd667f6cd13040b93e42db3e44Henri Verbeet srcY1 = strb->Base.Height - srcY - height; 1058d9582026631ae3cd667f6cd13040b93e42db3e44Henri Verbeet srcY0 = srcY1 + height; 1059d9582026631ae3cd667f6cd13040b93e42db3e44Henri Verbeet } 1060d9582026631ae3cd667f6cd13040b93e42db3e44Henri Verbeet else { 1061d9582026631ae3cd667f6cd13040b93e42db3e44Henri Verbeet srcY0 = srcY; 1062d9582026631ae3cd667f6cd13040b93e42db3e44Henri Verbeet srcY1 = srcY0 + height; 1063d9582026631ae3cd667f6cd13040b93e42db3e44Henri Verbeet } 1064d9582026631ae3cd667f6cd13040b93e42db3e44Henri Verbeet 1065d9582026631ae3cd667f6cd13040b93e42db3e44Henri Verbeet /* Disable conditional rendering. */ 1066d9582026631ae3cd667f6cd13040b93e42db3e44Henri Verbeet if (st->render_condition) { 1067d9582026631ae3cd667f6cd13040b93e42db3e44Henri Verbeet pipe->render_condition(pipe, NULL, 0); 1068d9582026631ae3cd667f6cd13040b93e42db3e44Henri Verbeet } 1069d9582026631ae3cd667f6cd13040b93e42db3e44Henri Verbeet 1070d9582026631ae3cd667f6cd13040b93e42db3e44Henri Verbeet memset(&surf_tmpl, 0, sizeof(surf_tmpl)); 1071d9582026631ae3cd667f6cd13040b93e42db3e44Henri Verbeet surf_tmpl.format = util_format_linear(stImage->pt->format); 1072d9582026631ae3cd667f6cd13040b93e42db3e44Henri Verbeet surf_tmpl.usage = dst_usage; 1073d9582026631ae3cd667f6cd13040b93e42db3e44Henri Verbeet surf_tmpl.u.tex.level = stImage->base.Level; 1074d9582026631ae3cd667f6cd13040b93e42db3e44Henri Verbeet surf_tmpl.u.tex.first_layer = stImage->base.Face + destZ; 1075d9582026631ae3cd667f6cd13040b93e42db3e44Henri Verbeet surf_tmpl.u.tex.last_layer = stImage->base.Face + destZ; 1076d9582026631ae3cd667f6cd13040b93e42db3e44Henri Verbeet 1077d9582026631ae3cd667f6cd13040b93e42db3e44Henri Verbeet dest_surface = pipe->create_surface(pipe, stImage->pt, 1078d9582026631ae3cd667f6cd13040b93e42db3e44Henri Verbeet &surf_tmpl); 107924e0a2633512afa3208969520b9e29a8b974275dMarek Olšák util_blit_pixels(st->blit, 108024e0a2633512afa3208969520b9e29a8b974275dMarek Olšák strb->texture, 108124e0a2633512afa3208969520b9e29a8b974275dMarek Olšák strb->surface->u.tex.level, 108224e0a2633512afa3208969520b9e29a8b974275dMarek Olšák srcX, srcY0, 108324e0a2633512afa3208969520b9e29a8b974275dMarek Olšák srcX + width, srcY1, 108424e0a2633512afa3208969520b9e29a8b974275dMarek Olšák strb->surface->u.tex.first_layer, 108524e0a2633512afa3208969520b9e29a8b974275dMarek Olšák dest_surface, 108624e0a2633512afa3208969520b9e29a8b974275dMarek Olšák destX, destY, 108724e0a2633512afa3208969520b9e29a8b974275dMarek Olšák destX + width, destY + height, 108824e0a2633512afa3208969520b9e29a8b974275dMarek Olšák 0.0, PIPE_TEX_MIPFILTER_NEAREST, 10895ba15d8d38d98cb7b625fa55e7d818ef9c6629ceMarek Olšák color_writemask, zs_writemask); 1090d9582026631ae3cd667f6cd13040b93e42db3e44Henri Verbeet pipe_surface_reference(&dest_surface, NULL); 1091d9582026631ae3cd667f6cd13040b93e42db3e44Henri Verbeet 1092d9582026631ae3cd667f6cd13040b93e42db3e44Henri Verbeet /* Restore conditional rendering state. */ 1093d9582026631ae3cd667f6cd13040b93e42db3e44Henri Verbeet if (st->render_condition) { 1094d9582026631ae3cd667f6cd13040b93e42db3e44Henri Verbeet pipe->render_condition(pipe, st->render_condition, 1095d9582026631ae3cd667f6cd13040b93e42db3e44Henri Verbeet st->condition_mode); 1096d9582026631ae3cd667f6cd13040b93e42db3e44Henri Verbeet } 1097d9582026631ae3cd667f6cd13040b93e42db3e44Henri Verbeet 1098d9582026631ae3cd667f6cd13040b93e42db3e44Henri Verbeet return; 1099d9582026631ae3cd667f6cd13040b93e42db3e44Henri Verbeet 1100d9582026631ae3cd667f6cd13040b93e42db3e44Henri Verbeetfallback: 110129725470478ecc8efa9f74fd9f7bee33d34058dfBrian Paul /* software fallback */ 110256b57aa360a8bad0c4b68fbdf7c64ac33f9e7661Brian Paul fallback_copy_texsubimage(ctx, 110329725470478ecc8efa9f74fd9f7bee33d34058dfBrian Paul strb, stImage, texBaseFormat, 110429725470478ecc8efa9f74fd9f7bee33d34058dfBrian Paul destX, destY, destZ, 110529725470478ecc8efa9f74fd9f7bee33d34058dfBrian Paul srcX, srcY, width, height); 110624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 110724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 110824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1109e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul/** 1110e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul * Copy image data from stImage into the texture object 'stObj' at level 1111e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul * 'dstLevel'. 1112e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul */ 111324df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 1114753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzercopy_image_data_to_texture(struct st_context *st, 1115753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer struct st_texture_object *stObj, 11164da1cdf78fa3b954840650fa46cf72da5daf149fBrian GLuint dstLevel, 1117753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer struct st_texture_image *stImage) 111824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 1119e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul /* debug checks */ 1120e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul { 1121e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul const struct gl_texture_image *dstImage = 11226dbad425bc423eb7db7c99aab161955c7b4cdc4cBrian Paul stObj->base.Image[stImage->base.Face][dstLevel]; 1123e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul assert(dstImage); 1124e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul assert(dstImage->Width == stImage->base.Width); 1125e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul assert(dstImage->Height == stImage->base.Height); 1126e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul assert(dstImage->Depth == stImage->base.Depth); 1127e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul } 1128e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul 1129753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer if (stImage->pt) { 113024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian /* Copy potentially with the blitter: 113124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 11325d67d4fbebb7c7d6582c4c92fc5cea4a8e6a60abBrian Paul GLuint src_level; 11335d67d4fbebb7c7d6582c4c92fc5cea4a8e6a60abBrian Paul if (stImage->pt != stObj->pt) 11345d67d4fbebb7c7d6582c4c92fc5cea4a8e6a60abBrian Paul src_level = 0; 11355d67d4fbebb7c7d6582c4c92fc5cea4a8e6a60abBrian Paul else 11365d67d4fbebb7c7d6582c4c92fc5cea4a8e6a60abBrian Paul src_level = stImage->base.Level; 11375d67d4fbebb7c7d6582c4c92fc5cea4a8e6a60abBrian Paul 1138753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer st_texture_image_copy(st->pipe, 11394da1cdf78fa3b954840650fa46cf72da5daf149fBrian stObj->pt, dstLevel, /* dest texture, level */ 11405d67d4fbebb7c7d6582c4c92fc5cea4a8e6a60abBrian Paul stImage->pt, src_level, /* src texture, level */ 11416dbad425bc423eb7db7c99aab161955c7b4cdc4cBrian Paul stImage->base.Face); 114224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1143287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(&stImage->pt, NULL); 114424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 1145aff65241c8bf6206c6dfcbe774b87991f965d46fBrian Paul else if (stImage->TexData) { 1146cf2439e2463ce925e3e256a25a505cf0586963f0Brian Paul /* Copy from malloc'd memory */ 1147cf2439e2463ce925e3e256a25a505cf0586963f0Brian Paul /* XXX this should be re-examined/tested with a compressed format */ 1148cf2439e2463ce925e3e256a25a505cf0586963f0Brian Paul GLuint blockSize = util_format_get_blocksize(stObj->pt->format); 1149cf2439e2463ce925e3e256a25a505cf0586963f0Brian Paul GLuint srcRowStride = stImage->base.Width * blockSize; 1150cf2439e2463ce925e3e256a25a505cf0586963f0Brian Paul GLuint srcSliceStride = stImage->base.Height * srcRowStride; 1151e50dd26ca6d0eb0d0f97c2780020ea16e3d4a687Thomas Hellstrom st_texture_image_data(st, 11525facd7986ace899673499f396897469720476799Brian Paul stObj->pt, 11536dbad425bc423eb7db7c99aab161955c7b4cdc4cBrian Paul stImage->base.Face, 11545facd7986ace899673499f396897469720476799Brian Paul dstLevel, 1155aff65241c8bf6206c6dfcbe774b87991f965d46fBrian Paul stImage->TexData, 1156cf2439e2463ce925e3e256a25a505cf0586963f0Brian Paul srcRowStride, 1157cf2439e2463ce925e3e256a25a505cf0586963f0Brian Paul srcSliceStride); 1158aff65241c8bf6206c6dfcbe774b87991f965d46fBrian Paul _mesa_align_free(stImage->TexData); 1159aff65241c8bf6206c6dfcbe774b87991f965d46fBrian Paul stImage->TexData = NULL; 116024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 116124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1162287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(&stImage->pt, stObj->pt); 116324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 116424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 116524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1166afc54983370033b65e3a7cbb29bd9c87156f0881Brian/** 1167afc54983370033b65e3a7cbb29bd9c87156f0881Brian * Called during state validation. When this function is finished, 1168afc54983370033b65e3a7cbb29bd9c87156f0881Brian * the texture object should be ready for rendering. 11693b3774b1227743147159676795b542c0eb7c2bdfBrian Paul * \return GL_TRUE for success, GL_FALSE for failure (out of mem) 117024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 117114b98343309fdcff3514f05020303f7b40e83a4aBrianGLboolean 1172f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergst_finalize_texture(struct gl_context *ctx, 1173c3af68dc5022715cc8f126b7df12f3f5248aefe7Keith Whitwell struct pipe_context *pipe, 1174295a87f6c211322faefc4ef7f88f02722973f5b6Brian Paul struct gl_texture_object *tObj) 117524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 117676c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul struct st_context *st = st_context(ctx); 117714b98343309fdcff3514f05020303f7b40e83a4aBrian struct st_texture_object *stObj = st_texture_object(tObj); 1178afc54983370033b65e3a7cbb29bd9c87156f0881Brian const GLuint nr_faces = (stObj->base.Target == GL_TEXTURE_CUBE_MAP) ? 6 : 1; 1179e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul GLuint face; 118024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct st_texture_image *firstImage; 1181e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul enum pipe_format firstImageFormat; 11821dd8e2757852682af44b63193c89dff3c09c7703Brian Paul GLuint ptWidth, ptHeight, ptDepth, ptLayers; 118324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1184f4a93e0665881dd58a95abb6525676bd1cc2e6afBrian Paul if (_mesa_is_texture_complete(tObj, &tObj->Sampler)) { 1185e3a6f57ad6c0e7bda5d45eb146194ed39f45abddBrian Paul /* The texture is complete and we know exactly how many mipmap levels 1186e3a6f57ad6c0e7bda5d45eb146194ed39f45abddBrian Paul * are present/needed. This is conditional because we may be called 1187e3a6f57ad6c0e7bda5d45eb146194ed39f45abddBrian Paul * from the st_generate_mipmap() function when the texture object is 1188e3a6f57ad6c0e7bda5d45eb146194ed39f45abddBrian Paul * incomplete. In that case, we'll have set stObj->lastLevel before 1189e3a6f57ad6c0e7bda5d45eb146194ed39f45abddBrian Paul * we get here. 1190e3a6f57ad6c0e7bda5d45eb146194ed39f45abddBrian Paul */ 1191ecfaab88b2577bd0395bc05d75a036126806a9c4Brian Paul if (stObj->base.Sampler.MinFilter == GL_LINEAR || 1192ecfaab88b2577bd0395bc05d75a036126806a9c4Brian Paul stObj->base.Sampler.MinFilter == GL_NEAREST) 1193ae2daacbac7242938cffe0e2409071e030e00863Cooper Yuan stObj->lastLevel = stObj->base.BaseLevel; 1194ae2daacbac7242938cffe0e2409071e030e00863Cooper Yuan else 1195e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul stObj->lastLevel = stObj->base._MaxLevel; 1196e3a6f57ad6c0e7bda5d45eb146194ed39f45abddBrian Paul } 119724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 11984da1cdf78fa3b954840650fa46cf72da5daf149fBrian firstImage = st_texture_image(stObj->base.Image[0][stObj->base.BaseLevel]); 1199e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul assert(firstImage); 120024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1201753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer /* If both firstImage and stObj point to a texture which can contain 120224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * all active images, favour firstImage. Note that because of the 120324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * completeness requirement, we know that the image dimensions 120424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * will match. 120524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 1206753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer if (firstImage->pt && 1207753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer firstImage->pt != stObj->pt && 120871b889f904fcba4fbc5aafff4cb62a7201f38075Fredrik Höglund (!stObj->pt || firstImage->pt->last_level >= stObj->pt->last_level)) { 1209287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(&stObj->pt, firstImage->pt); 12106835103878afd27a1d66d29d16cbfb0b1e894a94Brian Paul pipe_sampler_view_release(st->pipe, &stObj->sampler_view); 121124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 121224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1213e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul /* Find gallium format for the Mesa texture */ 1214e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul firstImageFormat = st_mesa_format_to_pipe_format(firstImage->base.TexFormat); 12157dbafea860dace9bfad29760f8b756122bc9937aBrian Paul 12167dbafea860dace9bfad29760f8b756122bc9937aBrian Paul /* Find size of level=0 Gallium mipmap image, plus number of texture layers */ 12177dbafea860dace9bfad29760f8b756122bc9937aBrian Paul { 12187dbafea860dace9bfad29760f8b756122bc9937aBrian Paul GLuint width, height, depth; 12197dbafea860dace9bfad29760f8b756122bc9937aBrian Paul if (!guess_base_level_size(stObj->base.Target, 12207dbafea860dace9bfad29760f8b756122bc9937aBrian Paul firstImage->base.Width2, 12217dbafea860dace9bfad29760f8b756122bc9937aBrian Paul firstImage->base.Height2, 12227dbafea860dace9bfad29760f8b756122bc9937aBrian Paul firstImage->base.Depth2, 1223124fc96ddf2695b4eca1a9b373f33cb993de9f6aBrian Paul firstImage->base.Level, 12247dbafea860dace9bfad29760f8b756122bc9937aBrian Paul &width, &height, &depth)) { 12257dbafea860dace9bfad29760f8b756122bc9937aBrian Paul width = stObj->width0; 12267dbafea860dace9bfad29760f8b756122bc9937aBrian Paul height = stObj->height0; 12277dbafea860dace9bfad29760f8b756122bc9937aBrian Paul depth = stObj->depth0; 12287dbafea860dace9bfad29760f8b756122bc9937aBrian Paul } 12297dbafea860dace9bfad29760f8b756122bc9937aBrian Paul /* convert GL dims to Gallium dims */ 12307dbafea860dace9bfad29760f8b756122bc9937aBrian Paul st_gl_texture_dims_to_pipe_dims(stObj->base.Target, width, height, depth, 12317dbafea860dace9bfad29760f8b756122bc9937aBrian Paul &ptWidth, &ptHeight, &ptDepth, &ptLayers); 12327dbafea860dace9bfad29760f8b756122bc9937aBrian Paul } 123324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1234ce509401738e7073de94a2b7fc41461c52a73da0Brian Paul /* If we already have a gallium texture, check that it matches the texture 1235ce509401738e7073de94a2b7fc41461c52a73da0Brian Paul * object's format, target, size, num_levels, etc. 123624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 1237809dd9089bae70cf35cea6a75258e700e7455738Brian Paul if (stObj->pt) { 1238809dd9089bae70cf35cea6a75258e700e7455738Brian Paul if (stObj->pt->target != gl_target_to_pipe(stObj->base.Target) || 1239a2817f6ae566b672f195cff22e14e2058d3617eaDave Airlie !st_sampler_compat_formats(stObj->pt->format, firstImageFormat) || 1240529b7b355d392b1534ccd8ff7b428dc21cbfdc21Brian Paul stObj->pt->last_level < stObj->lastLevel || 12411dd8e2757852682af44b63193c89dff3c09c7703Brian Paul stObj->pt->width0 != ptWidth || 12421dd8e2757852682af44b63193c89dff3c09c7703Brian Paul stObj->pt->height0 != ptHeight || 12431dd8e2757852682af44b63193c89dff3c09c7703Brian Paul stObj->pt->depth0 != ptDepth || 12441dd8e2757852682af44b63193c89dff3c09c7703Brian Paul stObj->pt->array_size != ptLayers) 1245311f77198e171e9ce8ddcce91fd6a894fff1f14fBrian Paul { 1246e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul /* The gallium texture does not match the Mesa texture so delete the 1247e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul * gallium texture now. We'll make a new one below. 1248e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul */ 1249287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(&stObj->pt, NULL); 12506835103878afd27a1d66d29d16cbfb0b1e894a94Brian Paul pipe_sampler_view_release(st->pipe, &stObj->sampler_view); 125176c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul st->dirty.st |= ST_NEW_FRAMEBUFFER; 1252809dd9089bae70cf35cea6a75258e700e7455738Brian Paul } 125324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 125424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1255ce509401738e7073de94a2b7fc41461c52a73da0Brian Paul /* May need to create a new gallium texture: 125624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 1257753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer if (!stObj->pt) { 1258e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul GLuint bindings = default_bindings(st, firstImageFormat); 12591ad2484f03cbe9ae6bd4ebe50d6894e570d65952Brian Paul 126076c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul stObj->pt = st_texture_create(st, 12615390a43ce06b27f6d54bc5f237aa305b6948f2afBrian gl_target_to_pipe(stObj->base.Target), 1262e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul firstImageFormat, 1263b245840b86cf877c9b8d666edf229364a84f1deaBrian stObj->lastLevel, 12641dd8e2757852682af44b63193c89dff3c09c7703Brian Paul ptWidth, 12651dd8e2757852682af44b63193c89dff3c09c7703Brian Paul ptHeight, 12661dd8e2757852682af44b63193c89dff3c09c7703Brian Paul ptDepth, 12671dd8e2757852682af44b63193c89dff3c09c7703Brian Paul ptLayers, 12688283db88414f600e66510de713382c36899d4b03Brian Paul bindings); 1269a73ae3d5eb8419feab5aea26573aa41b72f941ebKeith Whitwell 12703b3774b1227743147159676795b542c0eb7c2bdfBrian Paul if (!stObj->pt) { 12713b3774b1227743147159676795b542c0eb7c2bdfBrian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage"); 12723b3774b1227743147159676795b542c0eb7c2bdfBrian Paul return GL_FALSE; 12733b3774b1227743147159676795b542c0eb7c2bdfBrian Paul } 127424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 127524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1276753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer /* Pull in any images not in the object's texture: 127724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 127824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian for (face = 0; face < nr_faces; face++) { 12794da1cdf78fa3b954840650fa46cf72da5daf149fBrian GLuint level; 12809adebe172df9fbf9ba359d949e64ce07bbef77b7Brian Paul for (level = stObj->base.BaseLevel; level <= stObj->lastLevel; level++) { 128124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct st_texture_image *stImage = 1282e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul st_texture_image(stObj->base.Image[face][level]); 128324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1284753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer /* Need to import images in main memory or held in other textures. 128524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 1286a34b43b3f4817268ef4b3f186203b5fbafc7214eBrian if (stImage && stObj->pt != stImage->pt) { 1287b0524e49fc555ec8e5505e88c03e1993cdf3666bBrian Paul if (level == 0 || 1288b0524e49fc555ec8e5505e88c03e1993cdf3666bBrian Paul (stImage->base.Width == u_minify(stObj->width0, level) && 1289b0524e49fc555ec8e5505e88c03e1993cdf3666bBrian Paul stImage->base.Height == u_minify(stObj->height0, level) && 1290b0524e49fc555ec8e5505e88c03e1993cdf3666bBrian Paul stImage->base.Depth == u_minify(stObj->depth0, level))) { 1291a22aba4eae9b29db731487bce90e8292f7e82c72Brian Paul /* src image fits expected dest mipmap level size */ 1292a22aba4eae9b29db731487bce90e8292f7e82c72Brian Paul copy_image_data_to_texture(st, stObj, level, stImage); 1293a22aba4eae9b29db731487bce90e8292f7e82c72Brian Paul } 129424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 129524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 129624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 129724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 129824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian return GL_TRUE; 129924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 130024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 130124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 13028f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul/** 1303e0a0496971dfd6c0f22b3870e6320128fa895d4dBrian Paul * Called via ctx->Driver.AllocTextureStorage() to allocate texture memory 1304e0a0496971dfd6c0f22b3870e6320128fa895d4dBrian Paul * for a whole mipmap stack. 1305e0a0496971dfd6c0f22b3870e6320128fa895d4dBrian Paul */ 1306e0a0496971dfd6c0f22b3870e6320128fa895d4dBrian Paulstatic GLboolean 1307e0a0496971dfd6c0f22b3870e6320128fa895d4dBrian Paulst_AllocTextureStorage(struct gl_context *ctx, 1308e0a0496971dfd6c0f22b3870e6320128fa895d4dBrian Paul struct gl_texture_object *texObj, 1309e0a0496971dfd6c0f22b3870e6320128fa895d4dBrian Paul GLsizei levels, GLsizei width, 1310e0a0496971dfd6c0f22b3870e6320128fa895d4dBrian Paul GLsizei height, GLsizei depth) 1311e0a0496971dfd6c0f22b3870e6320128fa895d4dBrian Paul{ 131246751edca9a95baff81771aa69986fa6e2422ed6Brian Paul const GLuint numFaces = _mesa_num_tex_faces(texObj->Target); 1313e0a0496971dfd6c0f22b3870e6320128fa895d4dBrian Paul struct st_context *st = st_context(ctx); 1314e0a0496971dfd6c0f22b3870e6320128fa895d4dBrian Paul struct st_texture_object *stObj = st_texture_object(texObj); 1315e0a0496971dfd6c0f22b3870e6320128fa895d4dBrian Paul GLuint ptWidth, ptHeight, ptDepth, ptLayers, bindings; 1316e0a0496971dfd6c0f22b3870e6320128fa895d4dBrian Paul enum pipe_format fmt; 1317e0a0496971dfd6c0f22b3870e6320128fa895d4dBrian Paul GLint level; 1318e0a0496971dfd6c0f22b3870e6320128fa895d4dBrian Paul 1319e0a0496971dfd6c0f22b3870e6320128fa895d4dBrian Paul assert(levels > 0); 1320e0a0496971dfd6c0f22b3870e6320128fa895d4dBrian Paul 1321e0a0496971dfd6c0f22b3870e6320128fa895d4dBrian Paul /* Save the level=0 dimensions */ 1322e0a0496971dfd6c0f22b3870e6320128fa895d4dBrian Paul stObj->width0 = width; 1323e0a0496971dfd6c0f22b3870e6320128fa895d4dBrian Paul stObj->height0 = height; 1324e0a0496971dfd6c0f22b3870e6320128fa895d4dBrian Paul stObj->depth0 = depth; 1325e0a0496971dfd6c0f22b3870e6320128fa895d4dBrian Paul stObj->lastLevel = levels - 1; 1326e0a0496971dfd6c0f22b3870e6320128fa895d4dBrian Paul 1327e0a0496971dfd6c0f22b3870e6320128fa895d4dBrian Paul fmt = st_mesa_format_to_pipe_format(texObj->Image[0][0]->TexFormat); 1328e0a0496971dfd6c0f22b3870e6320128fa895d4dBrian Paul 1329e0a0496971dfd6c0f22b3870e6320128fa895d4dBrian Paul bindings = default_bindings(st, fmt); 1330e0a0496971dfd6c0f22b3870e6320128fa895d4dBrian Paul 1331e0a0496971dfd6c0f22b3870e6320128fa895d4dBrian Paul st_gl_texture_dims_to_pipe_dims(texObj->Target, 1332e0a0496971dfd6c0f22b3870e6320128fa895d4dBrian Paul width, height, depth, 1333e0a0496971dfd6c0f22b3870e6320128fa895d4dBrian Paul &ptWidth, &ptHeight, &ptDepth, &ptLayers); 1334e0a0496971dfd6c0f22b3870e6320128fa895d4dBrian Paul 1335e0a0496971dfd6c0f22b3870e6320128fa895d4dBrian Paul stObj->pt = st_texture_create(st, 1336e0a0496971dfd6c0f22b3870e6320128fa895d4dBrian Paul gl_target_to_pipe(texObj->Target), 1337e0a0496971dfd6c0f22b3870e6320128fa895d4dBrian Paul fmt, 1338e0a0496971dfd6c0f22b3870e6320128fa895d4dBrian Paul levels, 1339e0a0496971dfd6c0f22b3870e6320128fa895d4dBrian Paul ptWidth, 1340e0a0496971dfd6c0f22b3870e6320128fa895d4dBrian Paul ptHeight, 1341e0a0496971dfd6c0f22b3870e6320128fa895d4dBrian Paul ptDepth, 1342e0a0496971dfd6c0f22b3870e6320128fa895d4dBrian Paul ptLayers, 1343e0a0496971dfd6c0f22b3870e6320128fa895d4dBrian Paul bindings); 1344e0a0496971dfd6c0f22b3870e6320128fa895d4dBrian Paul if (!stObj->pt) 1345e0a0496971dfd6c0f22b3870e6320128fa895d4dBrian Paul return GL_FALSE; 1346e0a0496971dfd6c0f22b3870e6320128fa895d4dBrian Paul 1347e0a0496971dfd6c0f22b3870e6320128fa895d4dBrian Paul /* Set image resource pointers */ 1348e0a0496971dfd6c0f22b3870e6320128fa895d4dBrian Paul for (level = 0; level < levels; level++) { 1349e0a0496971dfd6c0f22b3870e6320128fa895d4dBrian Paul GLuint face; 1350e0a0496971dfd6c0f22b3870e6320128fa895d4dBrian Paul for (face = 0; face < numFaces; face++) { 1351e0a0496971dfd6c0f22b3870e6320128fa895d4dBrian Paul struct st_texture_image *stImage = 1352e0a0496971dfd6c0f22b3870e6320128fa895d4dBrian Paul st_texture_image(texObj->Image[face][level]); 1353e0a0496971dfd6c0f22b3870e6320128fa895d4dBrian Paul pipe_resource_reference(&stImage->pt, stObj->pt); 1354e0a0496971dfd6c0f22b3870e6320128fa895d4dBrian Paul } 1355e0a0496971dfd6c0f22b3870e6320128fa895d4dBrian Paul } 1356e0a0496971dfd6c0f22b3870e6320128fa895d4dBrian Paul 1357e0a0496971dfd6c0f22b3870e6320128fa895d4dBrian Paul return GL_TRUE; 1358e0a0496971dfd6c0f22b3870e6320128fa895d4dBrian Paul} 1359e0a0496971dfd6c0f22b3870e6320128fa895d4dBrian Paul 1360e0a0496971dfd6c0f22b3870e6320128fa895d4dBrian Paul 1361e0a0496971dfd6c0f22b3870e6320128fa895d4dBrian Paul 13626da9234fd437f97267e7831f034c78b31156d939Brianvoid 13636da9234fd437f97267e7831f034c78b31156d939Brianst_init_texture_functions(struct dd_function_table *functions) 136424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 136524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->ChooseTextureFormat = st_ChooseTextureFormat; 13668f5fffe75d2f8ae7c7ee706b53379a25bc673ae4Brian Paul functions->TexImage = st_TexImage; 1367e42d00b3f4503a0840575c8e5f4517a66c8af613Brian Paul functions->TexSubImage = _mesa_store_texsubimage; 1368ec19bdd16c3d4070af69fd865042babe0a627595Brian Paul functions->CompressedTexSubImage = _mesa_store_compressed_texsubimage; 1369cd9ab2584f5e2a5eb0e96a948e6aedc9a33c886dBrian Paul functions->CopyTexSubImage = st_CopyTexSubImage; 137062abcb9aacc33218d0143a743c738435794b32a9Brian functions->GenerateMipmap = st_generate_mipmap; 1371038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian 137224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->GetTexImage = st_GetTexImage; 137324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 137424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian /* compressed texture functions */ 1375e8fdd0e0d5286f4a9c763ffde44decec51124ebcBrian Paul functions->CompressedTexImage = st_CompressedTexImage; 13768df7ca71125ee0ad74260378ff7e185dcf66f3bcBrian Paul functions->GetCompressedTexImage = _mesa_get_compressed_teximage; 137724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 137824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->NewTextureObject = st_NewTextureObject; 137924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->NewTextureImage = st_NewTextureImage; 1380146f536b3332b7a2022bb4ba5e2d1d2ec4bedd98Brian Paul functions->DeleteTextureImage = st_DeleteTextureImage; 138124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->DeleteTexture = st_DeleteTextureObject; 13824e6bb0774ffa93141a3a8ec7bb47b190810b2a4bBrian Paul functions->AllocTextureImageBuffer = st_AllocTextureImageBuffer; 13835401590815b0ef095e7881bbabce233bab07c1e6Eric Anholt functions->FreeTextureImageBuffer = st_FreeTextureImageBuffer; 13840abb2659dda3ac7828cade6f9a999c511e33e905Brian Paul functions->MapTextureImage = st_MapTextureImage; 13850abb2659dda3ac7828cade6f9a999c511e33e905Brian Paul functions->UnmapTextureImage = st_UnmapTextureImage; 138624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1387f8549e8f4f8bdfebcb4e0a2754df59b3fe4fdff7Brian /* XXX Temporary until we can query pipe's texture sizes */ 1388f8549e8f4f8bdfebcb4e0a2754df59b3fe4fdff7Brian functions->TestProxyTexImage = _mesa_test_proxy_teximage; 1389e0a0496971dfd6c0f22b3870e6320128fa895d4dBrian Paul 1390e0a0496971dfd6c0f22b3870e6320128fa895d4dBrian Paul functions->AllocTextureStorage = st_AllocTextureStorage; 139124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 1392