st_cb_texture.c revision 013b332cbcad2b9d113e00c467a65d072eb61cec
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" 3724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#include "main/texcompress.h" 384ca9ba254462b9be55b78df1d50519e10b2f4d73Brian Paul#include "main/texfetch.h" 39a4bec69e7271eda0137874973aa8c7d44175fedfBrian Paul#include "main/texgetimage.h" 4024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#include "main/teximage.h" 4124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#include "main/texobj.h" 4224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#include "main/texstore.h" 4324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 44b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell#include "state_tracker/st_debug.h" 4524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#include "state_tracker/st_context.h" 46b27498c7cad7dae4e3b3ef9517b9c0aef58f73f6Brian#include "state_tracker/st_cb_fbo.h" 4724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#include "state_tracker/st_cb_texture.h" 48f8ab24760d0d3f07e9ee81c98207ddf92dfe74daBrian#include "state_tracker/st_format.h" 49753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer#include "state_tracker/st_texture.h" 5062abcb9aacc33218d0143a743c738435794b32a9Brian#include "state_tracker/st_gen_mipmap.h" 51e50dd26ca6d0eb0d0f97c2780020ea16e3d4a687Thomas Hellstrom#include "state_tracker/st_inlines.h" 52afd16512bc354cf1a7220cb9bf3ce445503c7af4Keith Whitwell#include "state_tracker/st_atom.h" 5324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 5424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#include "pipe/p_context.h" 55b245840b86cf877c9b8d666edf229364a84f1deaBrian#include "pipe/p_defines.h" 5628486880ca3ec39419ccee0cb1a3bedc9ef7117cJosé Fonseca#include "util/u_inlines.h" 578fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell#include "pipe/p_shader_tokens.h" 584f25420bdd834e81a3e22733304efc5261c2998aBrian Paul#include "util/u_tile.h" 593c0dc8242b64518d5635263ba65b39afa919dd86Michel Dänzer#include "util/u_blit.h" 603400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol#include "util/u_format.h" 6151b339af2e8b80575a24bb9146f031c9605180bbBrian Paul#include "util/u_surface.h" 628f55a95178069d5e8b18647e6b675fc403d68073Roland Scheidegger#include "util/u_sampler.h" 63c1785c19ca0716a7e85777242949a0c33e28988fPatrice Mandin#include "util/u_math.h" 6424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 6524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 6624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#define DBG if (0) printf 6724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 6824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 691c5f27a18b775b3784fcd265d60e0affa0b31581Michel Dänzerstatic enum pipe_texture_target 705390a43ce06b27f6d54bc5f237aa305b6948f2afBriangl_target_to_pipe(GLenum target) 715390a43ce06b27f6d54bc5f237aa305b6948f2afBrian{ 725390a43ce06b27f6d54bc5f237aa305b6948f2afBrian switch (target) { 735390a43ce06b27f6d54bc5f237aa305b6948f2afBrian case GL_TEXTURE_1D: 745390a43ce06b27f6d54bc5f237aa305b6948f2afBrian return PIPE_TEXTURE_1D; 755390a43ce06b27f6d54bc5f237aa305b6948f2afBrian 765390a43ce06b27f6d54bc5f237aa305b6948f2afBrian case GL_TEXTURE_2D: 775390a43ce06b27f6d54bc5f237aa305b6948f2afBrian case GL_TEXTURE_RECTANGLE_NV: 785390a43ce06b27f6d54bc5f237aa305b6948f2afBrian return PIPE_TEXTURE_2D; 795390a43ce06b27f6d54bc5f237aa305b6948f2afBrian 805390a43ce06b27f6d54bc5f237aa305b6948f2afBrian case GL_TEXTURE_3D: 815390a43ce06b27f6d54bc5f237aa305b6948f2afBrian return PIPE_TEXTURE_3D; 825390a43ce06b27f6d54bc5f237aa305b6948f2afBrian 835390a43ce06b27f6d54bc5f237aa305b6948f2afBrian case GL_TEXTURE_CUBE_MAP_ARB: 845390a43ce06b27f6d54bc5f237aa305b6948f2afBrian return PIPE_TEXTURE_CUBE; 855390a43ce06b27f6d54bc5f237aa305b6948f2afBrian 865390a43ce06b27f6d54bc5f237aa305b6948f2afBrian default: 875390a43ce06b27f6d54bc5f237aa305b6948f2afBrian assert(0); 885390a43ce06b27f6d54bc5f237aa305b6948f2afBrian return 0; 895390a43ce06b27f6d54bc5f237aa305b6948f2afBrian } 905390a43ce06b27f6d54bc5f237aa305b6948f2afBrian} 915390a43ce06b27f6d54bc5f237aa305b6948f2afBrian 925390a43ce06b27f6d54bc5f237aa305b6948f2afBrian 934e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul/** called via ctx->Driver.NewTextureImage() */ 9424df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic struct gl_texture_image * 9524df8f895fe8807aa2ba058e71bd40adfc01d21eBrianst_NewTextureImage(GLcontext * ctx) 9624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 9724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian DBG("%s\n", __FUNCTION__); 9824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian (void) ctx; 99f1a59a6dd7b7b0523db191d82b3af1a841c6475dBrian Paul return (struct gl_texture_image *) ST_CALLOC_STRUCT(st_texture_image); 10024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 10124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 10224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1034e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul/** called via ctx->Driver.NewTextureObject() */ 10424df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic struct gl_texture_object * 10524df8f895fe8807aa2ba058e71bd40adfc01d21eBrianst_NewTextureObject(GLcontext * ctx, GLuint name, GLenum target) 10624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 107f1a59a6dd7b7b0523db191d82b3af1a841c6475dBrian Paul struct st_texture_object *obj = ST_CALLOC_STRUCT(st_texture_object); 10824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 10924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian DBG("%s\n", __FUNCTION__); 11024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian _mesa_initialize_texture_object(&obj->base, name, target); 11124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 11224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian return &obj->base; 11324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 11424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1154e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul/** called via ctx->Driver.DeleteTextureImage() */ 11624df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 11724df8f895fe8807aa2ba058e71bd40adfc01d21eBrianst_DeleteTextureObject(GLcontext *ctx, 1186f715dcc219071e574e363a9db4365c9c31ebbd3Brian struct gl_texture_object *texObj) 11924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 12076c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul struct st_context *st = st_context(ctx); 12124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct st_texture_object *stObj = st_texture_object(texObj); 122753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer if (stObj->pt) 123287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(&stObj->pt, NULL); 1242d6befd9d1e8dcf6495fe1b9cef12224046f3095Brian Paul if (stObj->sampler_view) { 12576c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul if (stObj->sampler_view->context != st->pipe) { 1262d6befd9d1e8dcf6495fe1b9cef12224046f3095Brian Paul /* Take "ownership" of this texture sampler view by setting 1272d6befd9d1e8dcf6495fe1b9cef12224046f3095Brian Paul * its context pointer to this context. This avoids potential 1282d6befd9d1e8dcf6495fe1b9cef12224046f3095Brian Paul * crashes when the texture object is shared among contexts 1292d6befd9d1e8dcf6495fe1b9cef12224046f3095Brian Paul * and the original/owner context has already been destroyed. 1302d6befd9d1e8dcf6495fe1b9cef12224046f3095Brian Paul */ 13176c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul stObj->sampler_view->context = st->pipe; 1322d6befd9d1e8dcf6495fe1b9cef12224046f3095Brian Paul } 133b8030c6561e019e079b5be2fe64ec804df4bfa03Michal Krol pipe_sampler_view_reference(&stObj->sampler_view, NULL); 1342d6befd9d1e8dcf6495fe1b9cef12224046f3095Brian Paul } 13524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian _mesa_delete_texture_object(ctx, texObj); 13624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 13724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 13824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1394e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul/** called via ctx->Driver.FreeTexImageData() */ 14024df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 14124df8f895fe8807aa2ba058e71bd40adfc01d21eBrianst_FreeTextureImageData(GLcontext * ctx, struct gl_texture_image *texImage) 14224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 14324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct st_texture_image *stImage = st_texture_image(texImage); 14424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 14524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian DBG("%s\n", __FUNCTION__); 14624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 147753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer if (stImage->pt) { 148287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(&stImage->pt, NULL); 14924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 15024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 15124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian if (texImage->Data) { 1528d6ef125ac6044438db5b89d6d310ccfc4b8140aBrian Paul _mesa_align_free(texImage->Data); 15324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian texImage->Data = NULL; 15424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 15524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 15624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 15724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1584e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul/** 15924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * From linux kernel i386 header files, copes with odd sizes better 16024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * than COPY_DWORDS would: 16124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * XXX Put this in src/mesa/main/imports.h ??? 16224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 1631ea7f0fef055245fa18c0fbc3e54a866956c2507José Fonseca#if defined(PIPE_CC_GCC) && defined(PIPE_ARCH_X86) 16424df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic INLINE void * 16524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian__memcpy(void *to, const void *from, size_t n) 16624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 16724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian int d0, d1, d2; 16824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian __asm__ __volatile__("rep ; movsl\n\t" 16924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian "testb $2,%b4\n\t" 17024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian "je 1f\n\t" 17124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian "movsw\n" 17224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian "1:\ttestb $1,%b4\n\t" 17324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian "je 2f\n\t" 17424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian "movsb\n" "2:":"=&c"(d0), "=&D"(d1), "=&S"(d2) 17524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian :"0"(n / 4), "q"(n), "1"((long) to), "2"((long) from) 17624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian :"memory"); 17724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian return (to); 17824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 17924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#else 18024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#define __memcpy(a,b,c) memcpy(a,b,c) 18124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#endif 18224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 18324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1844e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul/** 1854e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul * The system memcpy (at least on ubuntu 5.10) has problems copying 18624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * to agp (writecombined) memory from a source which isn't 64-byte 18724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * aligned - there is a 4x performance falloff. 18824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * 18924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * The x86 __memcpy is immune to this but is slightly slower 19024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * (10%-ish) than the system memcpy. 19124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * 19224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * The sse_memcpy seems to have a slight cliff at 64/32 bytes, but 19324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * isn't much faster than x86_memcpy for agp copies. 19424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * 19524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * TODO: switch dynamically. 19624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 19724df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void * 19824df8f895fe8807aa2ba058e71bd40adfc01d21eBriando_memcpy(void *dest, const void *src, size_t n) 19924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 200799f55803d15602b10d2bb97ff62792f05ce4de3Brian Paul if ((((unsigned long) src) & 63) || (((unsigned long) dest) & 63)) { 20124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian return __memcpy(dest, src, n); 20224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 20324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian else 20424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian return memcpy(dest, src, n); 20524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 20624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 20724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 208f52f5136e6eed23e55098681e5b082cc452136d6Brian/** 2098283db88414f600e66510de713382c36899d4b03Brian Paul * Return default texture resource binding bitmask for the given format. 2101ad2484f03cbe9ae6bd4ebe50d6894e570d65952Brian Paul */ 2111ad2484f03cbe9ae6bd4ebe50d6894e570d65952Brian Paulstatic GLuint 2128283db88414f600e66510de713382c36899d4b03Brian Pauldefault_bindings(struct st_context *st, enum pipe_format format) 2131ad2484f03cbe9ae6bd4ebe50d6894e570d65952Brian Paul{ 2148283db88414f600e66510de713382c36899d4b03Brian Paul struct pipe_screen *screen = st->pipe->screen; 2158283db88414f600e66510de713382c36899d4b03Brian Paul const unsigned target = PIPE_TEXTURE_2D; 2168283db88414f600e66510de713382c36899d4b03Brian Paul const unsigned geom = 0x0; 2178283db88414f600e66510de713382c36899d4b03Brian Paul unsigned bindings; 2188283db88414f600e66510de713382c36899d4b03Brian Paul 2198283db88414f600e66510de713382c36899d4b03Brian Paul if (util_format_is_depth_or_stencil(format)) 2208283db88414f600e66510de713382c36899d4b03Brian Paul bindings = PIPE_BIND_SAMPLER_VIEW | PIPE_BIND_DEPTH_STENCIL; 2218283db88414f600e66510de713382c36899d4b03Brian Paul else 2228283db88414f600e66510de713382c36899d4b03Brian Paul bindings = PIPE_BIND_SAMPLER_VIEW | PIPE_BIND_RENDER_TARGET; 2238283db88414f600e66510de713382c36899d4b03Brian Paul 2248283db88414f600e66510de713382c36899d4b03Brian Paul if (screen->is_format_supported(screen, format, target, bindings, geom)) 2258283db88414f600e66510de713382c36899d4b03Brian Paul return bindings; 2261ad2484f03cbe9ae6bd4ebe50d6894e570d65952Brian Paul else 2278283db88414f600e66510de713382c36899d4b03Brian Paul return PIPE_BIND_SAMPLER_VIEW; 2281ad2484f03cbe9ae6bd4ebe50d6894e570d65952Brian Paul} 2291ad2484f03cbe9ae6bd4ebe50d6894e570d65952Brian Paul 2301ad2484f03cbe9ae6bd4ebe50d6894e570d65952Brian Paul 231e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul/** Return number of image dimensions (1, 2 or 3) for a texture target. */ 232e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paulstatic GLuint 233e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paulget_texture_dims(GLenum target) 234e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul{ 235e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul switch (target) { 236e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul case GL_TEXTURE_1D: 237e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul case GL_TEXTURE_1D_ARRAY_EXT: 238e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul return 1; 239e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul case GL_TEXTURE_2D: 240e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul case GL_TEXTURE_CUBE_MAP_ARB: 241e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul case GL_TEXTURE_RECTANGLE_NV: 242e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul case GL_TEXTURE_2D_ARRAY_EXT: 243e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul return 2; 244e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul case GL_TEXTURE_3D: 245e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul return 3; 246e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul default: 247e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul assert(0 && "invalid texture target in get_texture_dims()"); 248e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul return 1; 249e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul } 250e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul} 251e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul 252e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul 2531ad2484f03cbe9ae6bd4ebe50d6894e570d65952Brian Paul/** 254e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul * Try to allocate a pipe_resource object for the given st_texture_object. 255f52f5136e6eed23e55098681e5b082cc452136d6Brian * 256e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul * We use the given st_texture_image as a clue to determine the size of the 257e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul * mipmap image at level=0. 25824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 25924df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 260753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzerguess_and_alloc_texture(struct st_context *st, 261753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer struct st_texture_object *stObj, 262afc54983370033b65e3a7cbb29bd9c87156f0881Brian const struct st_texture_image *stImage) 26324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 264e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul const GLuint dims = get_texture_dims(stObj->base.Target); 265e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul GLuint level, lastLevel, width, height, depth; 266e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul GLuint bindings; 267a1f95a8bf64f863289b6759caeec76d7e054400eRoland Scheidegger enum pipe_format fmt; 26824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 26924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian DBG("%s\n", __FUNCTION__); 27024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 271f52f5136e6eed23e55098681e5b082cc452136d6Brian assert(!stObj->pt); 272f52f5136e6eed23e55098681e5b082cc452136d6Brian 273e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul level = stImage->level; 274e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul width = stImage->base.Width2; /* size w/out border */ 275e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul height = stImage->base.Height2; 276e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul depth = stImage->base.Depth2; 27724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 278e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul assert(width > 0); 279e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul assert(height > 0); 280e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul assert(depth > 0); 28124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 282e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul /* Depending on the image's size, we can't always make a guess here. 28324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 284e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul if (level > 0) { 285e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul if ( (dims >= 1 && width == 1) || 286e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul (dims >= 2 && height == 1) || 287e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul (dims >= 3 && depth == 1) ) { 288e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul /* we can't determine the image size at level=0 */ 289e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul stObj->width0 = stObj->height0 = stObj->depth0 = 0; 290e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul return; 291e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul } 292e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul } 293e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul 294e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul /* grow the image size until we hit level = 0 */ 295e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul while (level > 0) { 29645cc35e77600af8628393475405160e26d56d421Brian Paul if (width != 1) 29745cc35e77600af8628393475405160e26d56d421Brian Paul width <<= 1; 29824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian if (height != 1) 29924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian height <<= 1; 30024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian if (depth != 1) 30124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian depth <<= 1; 302e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul level--; 303e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul } 30424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 305e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul assert(level == 0); 306e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul 307e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul /* At this point, (width x height x depth) is the expected size of 308e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul * the level=0 mipmap image. 309e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul */ 310296378b6c8b205048244746e260739448c4ee590Brian Paul 3114b7812919a5db2f72bd3b9f6d760ffeb469ee3e4Brian Paul /* Guess a reasonable value for lastLevel. With OpenGL we have no 3124b7812919a5db2f72bd3b9f6d760ffeb469ee3e4Brian Paul * idea how many mipmap levels will be in a texture until we start 3134b7812919a5db2f72bd3b9f6d760ffeb469ee3e4Brian Paul * to render with it. Make an educated guess here but be prepared 3144b7812919a5db2f72bd3b9f6d760ffeb469ee3e4Brian Paul * to re-allocating a texture buffer with space for more (or fewer) 3154b7812919a5db2f72bd3b9f6d760ffeb469ee3e4Brian Paul * mipmap levels later. 31624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 31714b98343309fdcff3514f05020303f7b40e83a4aBrian if ((stObj->base.MinFilter == GL_NEAREST || 3182a2236606fd6ae473a2f4db6ef6d3d5030261316José Fonseca stObj->base.MinFilter == GL_LINEAR || 3192a2236606fd6ae473a2f4db6ef6d3d5030261316José Fonseca stImage->base._BaseFormat == GL_DEPTH_COMPONENT || 3202a2236606fd6ae473a2f4db6ef6d3d5030261316José Fonseca stImage->base._BaseFormat == GL_DEPTH_STENCIL_EXT) && 32105bad193f56d48384097e37e47fae3fdda85f144Brian Paul !stObj->base.GenerateMipmap && 322e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul stImage->level == 0) { 32305bad193f56d48384097e37e47fae3fdda85f144Brian Paul /* only alloc space for a single mipmap level */ 324e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul lastLevel = 0; 32524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 32624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian else { 32705bad193f56d48384097e37e47fae3fdda85f144Brian Paul /* alloc space for a full mipmap */ 328c1785c19ca0716a7e85777242949a0c33e28988fPatrice Mandin GLuint l2width = util_logbase2(width); 329c1785c19ca0716a7e85777242949a0c33e28988fPatrice Mandin GLuint l2height = util_logbase2(height); 330c1785c19ca0716a7e85777242949a0c33e28988fPatrice Mandin GLuint l2depth = util_logbase2(depth); 331e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul lastLevel = MAX2(MAX2(l2width, l2height), l2depth); 33224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 33324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 334e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul /* Save the level=0 dimensions */ 335e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul stObj->width0 = width; 336e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul stObj->height0 = height; 337e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul stObj->depth0 = depth; 338e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul 3391f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul fmt = st_mesa_format_to_pipe_format(stImage->base.TexFormat); 3401ad2484f03cbe9ae6bd4ebe50d6894e570d65952Brian Paul 3418283db88414f600e66510de713382c36899d4b03Brian Paul bindings = default_bindings(st, fmt); 3421ad2484f03cbe9ae6bd4ebe50d6894e570d65952Brian Paul 343753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer stObj->pt = st_texture_create(st, 3445390a43ce06b27f6d54bc5f237aa305b6948f2afBrian gl_target_to_pipe(stObj->base.Target), 345a1f95a8bf64f863289b6759caeec76d7e054400eRoland Scheidegger fmt, 3465390a43ce06b27f6d54bc5f237aa305b6948f2afBrian lastLevel, 3475390a43ce06b27f6d54bc5f237aa305b6948f2afBrian width, 3485390a43ce06b27f6d54bc5f237aa305b6948f2afBrian height, 3495390a43ce06b27f6d54bc5f237aa305b6948f2afBrian depth, 3508283db88414f600e66510de713382c36899d4b03Brian Paul bindings); 35124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 35224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian DBG("%s - success\n", __FUNCTION__); 35324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 35424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 35524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 356212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian/** 357212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian * Adjust pixel unpack params and image dimensions to strip off the 358212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian * texture border. 359212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian * Gallium doesn't support texture borders. They've seldem been used 360212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian * and seldom been implemented correctly anyway. 361212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian * \param unpackNew returns the new pixel unpack parameters 362212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian */ 363212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brianstatic void 364212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brianstrip_texture_border(GLint border, 365212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian GLint *width, GLint *height, GLint *depth, 366212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian const struct gl_pixelstore_attrib *unpack, 367212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian struct gl_pixelstore_attrib *unpackNew) 368212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian{ 369212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian assert(border > 0); /* sanity check */ 370212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian 371212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian *unpackNew = *unpack; 372212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian 373212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian if (unpackNew->RowLength == 0) 374212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian unpackNew->RowLength = *width; 375212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian 376212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian if (depth && unpackNew->ImageHeight == 0) 377212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian unpackNew->ImageHeight = *height; 378212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian 379212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian unpackNew->SkipPixels += border; 380212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian if (height) 381212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian unpackNew->SkipRows += border; 382212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian if (depth) 383212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian unpackNew->SkipImages += border; 384212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian 385212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian assert(*width >= 3); 386212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian *width = *width - 2 * border; 387212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian if (height && *height >= 3) 388212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian *height = *height - 2 * border; 389212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian if (depth && *depth >= 3) 390212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian *depth = *depth - 2 * border; 391212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian} 392212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian 39324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 3944e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul/** 39555ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz * Try to do texture compression via rendering. If the Gallium driver 39655ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz * can render into a compressed surface this will allow us to do texture 39755ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz * compression. 39855ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz * \return GL_TRUE for success, GL_FALSE for failure 39955ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz */ 40055ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantzstatic GLboolean 40155ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantzcompress_with_blit(GLcontext * ctx, 40255ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz GLenum target, GLint level, 40355ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz GLint xoffset, GLint yoffset, GLint zoffset, 40455ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz GLint width, GLint height, GLint depth, 40555ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz GLenum format, GLenum type, const void *pixels, 40655ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz const struct gl_pixelstore_attrib *unpack, 40755ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz struct gl_texture_image *texImage) 40855ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz{ 40955ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz const GLuint dstImageOffsets[1] = {0}; 41055ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz struct st_texture_image *stImage = st_texture_image(texImage); 41176c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul struct st_context *st = st_context(ctx); 41276c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul struct pipe_context *pipe = st->pipe; 413b43c182f19c6291c88420fa12714f952c2b461fbKeith Whitwell struct pipe_screen *screen = pipe->screen; 4141f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul gl_format mesa_format; 415287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct pipe_resource templ; 416287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct pipe_resource *src_tex; 4178f55a95178069d5e8b18647e6b675fc403d68073Roland Scheidegger struct pipe_sampler_view view_templ; 4188f55a95178069d5e8b18647e6b675fc403d68073Roland Scheidegger struct pipe_sampler_view *src_view; 41955ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz struct pipe_surface *dst_surface; 42055ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz struct pipe_transfer *tex_xfer; 42155ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz void *map; 42255ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz 42355ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz if (!stImage->pt) { 42455ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz /* XXX: Can this happen? Should we assert? */ 42555ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz return GL_FALSE; 42655ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz } 42755ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz 42855ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz /* get destination surface (in the compressed texture) */ 42955ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz dst_surface = screen->get_tex_surface(screen, stImage->pt, 43055ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz stImage->face, stImage->level, 0, 431287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell PIPE_BIND_BLIT_DESTINATION); 43255ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz if (!dst_surface) { 43355ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz /* can't render into this format (or other problem) */ 43455ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz return GL_FALSE; 43555ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz } 43655ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz 43755ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz /* Choose format for the temporary RGBA texture image. 43855ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz */ 43955ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz mesa_format = st_ChooseTextureFormat(ctx, GL_RGBA, format, type); 44055ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz assert(mesa_format); 44155ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz if (!mesa_format) 44255ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz return GL_FALSE; 44355ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz 44455ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz /* Create the temporary source texture 44555ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz */ 44655ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz memset(&templ, 0, sizeof(templ)); 44755ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz templ.target = PIPE_TEXTURE_2D; 4481f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul templ.format = st_mesa_format_to_pipe_format(mesa_format); 449683e35f726a182ed9fc6b6d5cb07146eebe14deaKeith Whitwell templ.width0 = width; 450683e35f726a182ed9fc6b6d5cb07146eebe14deaKeith Whitwell templ.height0 = height; 451683e35f726a182ed9fc6b6d5cb07146eebe14deaKeith Whitwell templ.depth0 = 1; 45255ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz templ.last_level = 0; 453a2a01853f3f40b4ef8b3f01503391877960bdaeeBrian Paul templ.usage = PIPE_USAGE_DEFAULT; 454287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell templ.bind = PIPE_BIND_SAMPLER_VIEW; 455287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell src_tex = screen->resource_create(screen, &templ); 45655ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz 45755ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz if (!src_tex) 45855ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz return GL_FALSE; 45955ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz 46055ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz /* Put user's tex data into the temporary texture 46155ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz */ 462e50dd26ca6d0eb0d0f97c2780020ea16e3d4a687Thomas Hellstrom tex_xfer = st_cond_flush_get_tex_transfer(st_context(ctx), src_tex, 4635ed7764fd6354da8e2be15d6fb724c2d6be9be4aKeith Whitwell 0, 0, 0, /* face, level are zero */ 464e50dd26ca6d0eb0d0f97c2780020ea16e3d4a687Thomas Hellstrom PIPE_TRANSFER_WRITE, 465e50dd26ca6d0eb0d0f97c2780020ea16e3d4a687Thomas Hellstrom 0, 0, width, height); /* x, y, w, h */ 466287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell map = pipe_transfer_map(pipe, tex_xfer); 46755ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz 4686480210b89dc8ae0990c450d27870c7b7930f251Brian Paul _mesa_texstore(ctx, 2, GL_RGBA, mesa_format, 4696480210b89dc8ae0990c450d27870c7b7930f251Brian Paul map, /* dest ptr */ 4706480210b89dc8ae0990c450d27870c7b7930f251Brian Paul 0, 0, 0, /* dest x/y/z offset */ 4716480210b89dc8ae0990c450d27870c7b7930f251Brian Paul tex_xfer->stride, /* dest row stride (bytes) */ 4726480210b89dc8ae0990c450d27870c7b7930f251Brian Paul dstImageOffsets, /* image offsets (for 3D only) */ 4736480210b89dc8ae0990c450d27870c7b7930f251Brian Paul width, height, 1, /* size */ 4746480210b89dc8ae0990c450d27870c7b7930f251Brian Paul format, type, /* source format/type */ 4756480210b89dc8ae0990c450d27870c7b7930f251Brian Paul pixels, /* source data */ 4766480210b89dc8ae0990c450d27870c7b7930f251Brian Paul unpack); /* source data packing */ 47755ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz 478287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_transfer_unmap(pipe, tex_xfer); 479287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe->transfer_destroy(pipe, tex_xfer); 48055ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz 4818f55a95178069d5e8b18647e6b675fc403d68073Roland Scheidegger /* Create temporary sampler view */ 4828f55a95178069d5e8b18647e6b675fc403d68073Roland Scheidegger u_sampler_view_default_template(&view_templ, 4838f55a95178069d5e8b18647e6b675fc403d68073Roland Scheidegger src_tex, 4848f55a95178069d5e8b18647e6b675fc403d68073Roland Scheidegger src_tex->format); 4858f55a95178069d5e8b18647e6b675fc403d68073Roland Scheidegger src_view = pipe->create_sampler_view(pipe, src_tex, &view_templ); 4868f55a95178069d5e8b18647e6b675fc403d68073Roland Scheidegger 4878f55a95178069d5e8b18647e6b675fc403d68073Roland Scheidegger 48855ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz /* copy / compress image */ 48976c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul util_blit_pixels_tex(st->blit, 4908f55a95178069d5e8b18647e6b675fc403d68073Roland Scheidegger src_view, /* sampler view (src) */ 49155ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz 0, 0, /* src x0, y0 */ 49255ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz width, height, /* src x1, y1 */ 49355ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz dst_surface, /* pipe_surface (dst) */ 49455ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz xoffset, yoffset, /* dst x0, y0 */ 49555ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz xoffset + width, /* dst x1 */ 49655ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz yoffset + height, /* dst y1 */ 49755ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz 0.0, /* z */ 49855ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz PIPE_TEX_MIPFILTER_NEAREST); 49955ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz 50055ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz pipe_surface_reference(&dst_surface, NULL); 501287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(&src_tex, NULL); 5028f55a95178069d5e8b18647e6b675fc403d68073Roland Scheidegger pipe_sampler_view_reference(&src_view, NULL); 50355ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz 50455ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz return GL_TRUE; 50555ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz} 50655ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz 50755ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz 50855ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz/** 5094e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul * Do glTexImage1/2/3D(). 5104e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul */ 51124df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 51224df8f895fe8807aa2ba058e71bd40adfc01d21eBrianst_TexImage(GLcontext * ctx, 513afc54983370033b65e3a7cbb29bd9c87156f0881Brian GLint dims, 514afc54983370033b65e3a7cbb29bd9c87156f0881Brian GLenum target, GLint level, 515afc54983370033b65e3a7cbb29bd9c87156f0881Brian GLint internalFormat, 516afc54983370033b65e3a7cbb29bd9c87156f0881Brian GLint width, GLint height, GLint depth, 517afc54983370033b65e3a7cbb29bd9c87156f0881Brian GLint border, 518afc54983370033b65e3a7cbb29bd9c87156f0881Brian GLenum format, GLenum type, const void *pixels, 519afc54983370033b65e3a7cbb29bd9c87156f0881Brian const struct gl_pixelstore_attrib *unpack, 520afc54983370033b65e3a7cbb29bd9c87156f0881Brian struct gl_texture_object *texObj, 521afc54983370033b65e3a7cbb29bd9c87156f0881Brian struct gl_texture_image *texImage, 52255ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz GLsizei imageSize, GLboolean compressed_src) 52324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 52476c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul struct st_context *st = st_context(ctx); 52576c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul struct pipe_screen *screen = st->pipe->screen; 52614b98343309fdcff3514f05020303f7b40e83a4aBrian struct st_texture_object *stObj = st_texture_object(texObj); 52714b98343309fdcff3514f05020303f7b40e83a4aBrian struct st_texture_image *stImage = st_texture_image(texImage); 5285a8e1ddf193bb25c5cf05b70088c64ede772d7e9Brian Paul GLuint dstRowStride = 0; 529212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian struct gl_pixelstore_attrib unpackNB; 5305a8e1ddf193bb25c5cf05b70088c64ede772d7e9Brian Paul enum pipe_transfer_usage transfer_usage = 0; 53124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 53224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian DBG("%s target %s level %d %dx%dx%d border %d\n", __FUNCTION__, 53324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian _mesa_lookup_enum_by_nr(target), level, width, height, depth, border); 53424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 535b02619914eed4bdb5c8bb2239c6e3b9639ed00f6Brian Paul /* The Mesa/Gallium state tracker does not implement the imaging extensions 536b02619914eed4bdb5c8bb2239c6e3b9639ed00f6Brian Paul * such as convolution. 537b02619914eed4bdb5c8bb2239c6e3b9639ed00f6Brian Paul */ 538b02619914eed4bdb5c8bb2239c6e3b9639ed00f6Brian Paul assert(!ctx->Extensions.ARB_imaging); 539b02619914eed4bdb5c8bb2239c6e3b9639ed00f6Brian Paul assert(!ctx->Extensions.EXT_convolution); 540b02619914eed4bdb5c8bb2239c6e3b9639ed00f6Brian Paul 54154a7115fc27c640e2b3f1a362e8e07aac220556dChia-I Wu /* switch to "normal" */ 54254a7115fc27c640e2b3f1a362e8e07aac220556dChia-I Wu if (stObj->surface_based) { 54354a7115fc27c640e2b3f1a362e8e07aac220556dChia-I Wu _mesa_clear_texture_object(ctx, texObj); 54454a7115fc27c640e2b3f1a362e8e07aac220556dChia-I Wu stObj->surface_based = GL_FALSE; 54554a7115fc27c640e2b3f1a362e8e07aac220556dChia-I Wu } 54654a7115fc27c640e2b3f1a362e8e07aac220556dChia-I Wu 547212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian /* gallium does not support texture borders, strip it off */ 548212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian if (border) { 5495facd7986ace899673499f396897469720476799Brian Paul strip_texture_border(border, &width, &height, &depth, unpack, &unpackNB); 550212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian unpack = &unpackNB; 55121989edd55409d72ee55187f4f9062496ca3fbf8Brian Paul texImage->Width = width; 55221989edd55409d72ee55187f4f9062496ca3fbf8Brian Paul texImage->Height = height; 55321989edd55409d72ee55187f4f9062496ca3fbf8Brian Paul texImage->Depth = depth; 55421989edd55409d72ee55187f4f9062496ca3fbf8Brian Paul texImage->Border = 0; 555212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian border = 0; 556212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian } 557c7d1d34c580e8c76bf2f3f8687223e648e7ec5f1Brian Paul else { 558c7d1d34c580e8c76bf2f3f8687223e648e7ec5f1Brian Paul assert(texImage->Width == width); 559c7d1d34c580e8c76bf2f3f8687223e648e7ec5f1Brian Paul assert(texImage->Height == height); 560c7d1d34c580e8c76bf2f3f8687223e648e7ec5f1Brian Paul assert(texImage->Depth == depth); 561c7d1d34c580e8c76bf2f3f8687223e648e7ec5f1Brian Paul } 562212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian 563cfe9e66f2bc596c43760911e7c1604bb32cdee28Brian stImage->face = _mesa_tex_target_to_face(target); 56414b98343309fdcff3514f05020303f7b40e83a4aBrian stImage->level = level; 56524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 56624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian _mesa_set_fetch_functions(texImage, dims); 56724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 56824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian /* Release the reference to a potentially orphaned buffer. 56924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * Release any old malloced memory. 57024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 571753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer if (stImage->pt) { 572287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(&stImage->pt, NULL); 57324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian assert(!texImage->Data); 57424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 57524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian else if (texImage->Data) { 57624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian _mesa_align_free(texImage->Data); 57724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 57824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 579bdf975e9ad25ee65d796a3c1ce3f2afbd2889c4eBrian Paul /* 580bdf975e9ad25ee65d796a3c1ce3f2afbd2889c4eBrian Paul * See if the new image is somehow incompatible with the existing 581bdf975e9ad25ee65d796a3c1ce3f2afbd2889c4eBrian Paul * mipmap. If so, free the old mipmap. 58224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 583a0509f7d28765c6ef8546eafba94aec46d9e7ed3Brian Paul if (stObj->pt) { 584e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul if (level > (GLint) stObj->pt->last_level || 585bdf975e9ad25ee65d796a3c1ce3f2afbd2889c4eBrian Paul !st_texture_match_image(stObj->pt, &stImage->base, 586bdf975e9ad25ee65d796a3c1ce3f2afbd2889c4eBrian Paul stImage->face, stImage->level)) { 587a0509f7d28765c6ef8546eafba94aec46d9e7ed3Brian Paul DBG("release it\n"); 588287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(&stObj->pt, NULL); 589a0509f7d28765c6ef8546eafba94aec46d9e7ed3Brian Paul assert(!stObj->pt); 59040c3861e1e98116c573027b054a6a05208c53b6aMichal Krol pipe_sampler_view_reference(&stObj->sampler_view, NULL); 591a0509f7d28765c6ef8546eafba94aec46d9e7ed3Brian Paul } 59224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 59324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 594bdf975e9ad25ee65d796a3c1ce3f2afbd2889c4eBrian Paul if (width == 0 || height == 0 || depth == 0) { 595bdf975e9ad25ee65d796a3c1ce3f2afbd2889c4eBrian Paul /* stop after freeing old image */ 596bdf975e9ad25ee65d796a3c1ce3f2afbd2889c4eBrian Paul return; 597bdf975e9ad25ee65d796a3c1ce3f2afbd2889c4eBrian Paul } 598bdf975e9ad25ee65d796a3c1ce3f2afbd2889c4eBrian Paul 599753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer if (!stObj->pt) { 60076c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul guess_and_alloc_texture(st, stObj, stImage); 601753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer if (!stObj->pt) { 6028d249ca620f6995cc5824d95c29bda7043bbdf8cBrian Paul /* Probably out of memory. 6038d249ca620f6995cc5824d95c29bda7043bbdf8cBrian Paul * Try flushing any pending rendering, then retry. 6048d249ca620f6995cc5824d95c29bda7043bbdf8cBrian Paul */ 60576c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul st_finish(st); 60676c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul guess_and_alloc_texture(st, stObj, stImage); 6078d249ca620f6995cc5824d95c29bda7043bbdf8cBrian Paul if (!stObj->pt) { 6088d249ca620f6995cc5824d95c29bda7043bbdf8cBrian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage"); 6098d249ca620f6995cc5824d95c29bda7043bbdf8cBrian Paul return; 6108d249ca620f6995cc5824d95c29bda7043bbdf8cBrian Paul } 61124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 61224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 61324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 614753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer assert(!stImage->pt); 61524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 616013b332cbcad2b9d113e00c467a65d072eb61cecBrian Paul /* Check if this texture image can live inside the texture object's buffer. 617013b332cbcad2b9d113e00c467a65d072eb61cecBrian Paul * If so, store the image there. Otherwise the image will temporarily live 618013b332cbcad2b9d113e00c467a65d072eb61cecBrian Paul * in its own buffer. 619013b332cbcad2b9d113e00c467a65d072eb61cecBrian Paul */ 620753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer if (stObj->pt && 621753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer st_texture_match_image(stObj->pt, &stImage->base, 622013b332cbcad2b9d113e00c467a65d072eb61cecBrian Paul stImage->face, stImage->level)) { 62324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 624287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(&stImage->pt, stObj->pt); 625753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer assert(stImage->pt); 62624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 62724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 628753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer if (!stImage->pt) 629753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer DBG("XXX: Image did not fit into texture - storing in local memory!\n"); 63024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 631013b332cbcad2b9d113e00c467a65d072eb61cecBrian Paul /* Pixel data may come from regular user memory or a PBO. For the later, 632013b332cbcad2b9d113e00c467a65d072eb61cecBrian Paul * do bounds checking and map the PBO to read pixels data from it. 633013b332cbcad2b9d113e00c467a65d072eb61cecBrian Paul * 634013b332cbcad2b9d113e00c467a65d072eb61cecBrian Paul * XXX we should try to use a GPU-accelerated path to copy the image data 635013b332cbcad2b9d113e00c467a65d072eb61cecBrian Paul * from the PBO to the texture. 63624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 63755ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz if (compressed_src) { 63824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian pixels = _mesa_validate_pbo_compressed_teximage(ctx, imageSize, pixels, 63924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian unpack, 64024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian "glCompressedTexImage"); 6415facd7986ace899673499f396897469720476799Brian Paul } 6425facd7986ace899673499f396897469720476799Brian Paul else { 64324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian pixels = _mesa_validate_pbo_teximage(ctx, dims, width, height, 1, 64424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian format, type, 64524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian pixels, unpack, "glTexImage"); 64624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 647cfa1a0a609daefffc6f8c4087ed0bc34c2665ef4Brian Paul 64855ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz /* See if we can do texture compression with a blit/render. 64955ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz */ 65055ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz if (!compressed_src && 65155ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz !ctx->Mesa_DXTn && 65292863109af05acdb4ee5e42141c83ab0f18b7f88Brian Paul _mesa_is_format_compressed(texImage->TexFormat) && 65355ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz screen->is_format_supported(screen, 65455ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz stImage->pt->format, 65555ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz stImage->pt->target, 656287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell PIPE_BIND_RENDER_TARGET, 0)) { 657cfa1a0a609daefffc6f8c4087ed0bc34c2665ef4Brian Paul if (!pixels) 658cfa1a0a609daefffc6f8c4087ed0bc34c2665ef4Brian Paul goto done; 659cfa1a0a609daefffc6f8c4087ed0bc34c2665ef4Brian Paul 66055ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz if (compress_with_blit(ctx, target, level, 0, 0, 0, width, height, depth, 66155ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz format, type, pixels, unpack, texImage)) { 662f989390af6f827d1ea36560381340148811836f3Jakob Bornecrantz goto done; 66355ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz } 66455ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz } 66555ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz 666013b332cbcad2b9d113e00c467a65d072eb61cecBrian Paul /* 667013b332cbcad2b9d113e00c467a65d072eb61cecBrian Paul * Prepare to store the texture data. Either map the gallium texture buffer 668013b332cbcad2b9d113e00c467a65d072eb61cecBrian Paul * memory or malloc space for it. 669013b332cbcad2b9d113e00c467a65d072eb61cecBrian Paul */ 670753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer if (stImage->pt) { 67141b8a2e9391cd85a65ba30a7e5f5068b5767d58aBrian Paul /* Store the image in the gallium texture memory buffer */ 67271633abafc935c25da9731bab48c228ceb9b4097Michel Dänzer if (format == GL_DEPTH_COMPONENT && 6730bed834be4a174d20b31a6cbcf066774bf749929Michal Krol util_format_is_depth_and_stencil(stImage->pt->format)) 67471633abafc935c25da9731bab48c228ceb9b4097Michel Dänzer transfer_usage = PIPE_TRANSFER_READ_WRITE; 67571633abafc935c25da9731bab48c228ceb9b4097Michel Dänzer else 67671633abafc935c25da9731bab48c228ceb9b4097Michel Dänzer transfer_usage = PIPE_TRANSFER_WRITE; 67771633abafc935c25da9731bab48c228ceb9b4097Michel Dänzer 67876c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul texImage->Data = st_texture_image_map(st, stImage, 0, 679c7d1d34c580e8c76bf2f3f8687223e648e7ec5f1Brian Paul transfer_usage, 0, 0, width, height); 68001397a66c77f8ebfe78b90ace59c095194a290cfJosé Fonseca if(stImage->transfer) 68101397a66c77f8ebfe78b90ace59c095194a290cfJosé Fonseca dstRowStride = stImage->transfer->stride; 68224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 68324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian else { 68424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian /* Allocate regular memory and store the image there temporarily. */ 685c7d1d34c580e8c76bf2f3f8687223e648e7ec5f1Brian Paul GLuint imageSize = _mesa_format_image_size(texImage->TexFormat, 686c7d1d34c580e8c76bf2f3f8687223e648e7ec5f1Brian Paul width, height, depth); 687c7d1d34c580e8c76bf2f3f8687223e648e7ec5f1Brian Paul dstRowStride = _mesa_format_row_stride(texImage->TexFormat, width); 68824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 689c7d1d34c580e8c76bf2f3f8687223e648e7ec5f1Brian Paul texImage->Data = _mesa_align_malloc(imageSize, 16); 69024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 69124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 6922a39dbe7364af5444b1eb43650dfc31ed09257dcBrian Paul if (!texImage->Data) { 6932a39dbe7364af5444b1eb43650dfc31ed09257dcBrian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage"); 6942a39dbe7364af5444b1eb43650dfc31ed09257dcBrian Paul return; 6952a39dbe7364af5444b1eb43650dfc31ed09257dcBrian Paul } 6962a39dbe7364af5444b1eb43650dfc31ed09257dcBrian Paul 697013b332cbcad2b9d113e00c467a65d072eb61cecBrian Paul if (!pixels) { 698013b332cbcad2b9d113e00c467a65d072eb61cecBrian Paul /* We've allocated texture memory, but have no pixel data - all done. */ 699cfa1a0a609daefffc6f8c4087ed0bc34c2665ef4Brian Paul goto done; 700013b332cbcad2b9d113e00c467a65d072eb61cecBrian Paul } 701cfa1a0a609daefffc6f8c4087ed0bc34c2665ef4Brian Paul 70224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian DBG("Upload image %dx%dx%d row_len %x pitch %x\n", 70341b8a2e9391cd85a65ba30a7e5f5068b5767d58aBrian Paul width, height, depth, width, dstRowStride); 70424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 705013b332cbcad2b9d113e00c467a65d072eb61cecBrian Paul /* Copy user texture image into the texture buffer. 70624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 70755ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz if (compressed_src) { 708e79086865bd67f860dfd0d5951395495530022bcBrian Paul const GLuint srcRowStride = 709e79086865bd67f860dfd0d5951395495530022bcBrian Paul _mesa_format_row_stride(texImage->TexFormat, width); 710e79086865bd67f860dfd0d5951395495530022bcBrian Paul if (dstRowStride == srcRowStride) { 711eea6a7639f767b1d30b6ef1f91a9c49e3f3b78f0Luca Barbieri memcpy(texImage->Data, pixels, imageSize); 712e79086865bd67f860dfd0d5951395495530022bcBrian Paul } 713e79086865bd67f860dfd0d5951395495530022bcBrian Paul else { 714eea6a7639f767b1d30b6ef1f91a9c49e3f3b78f0Luca Barbieri char *dst = texImage->Data; 715eea6a7639f767b1d30b6ef1f91a9c49e3f3b78f0Luca Barbieri const char *src = pixels; 7169328f3a670993167d7fb9a590f9e712467e77c7cLuca Barbieri GLuint i, bw, bh, lines; 7179328f3a670993167d7fb9a590f9e712467e77c7cLuca Barbieri _mesa_get_format_block_size(texImage->TexFormat, &bw, &bh); 7189328f3a670993167d7fb9a590f9e712467e77c7cLuca Barbieri lines = (height + bh - 1) / bh; 719eea6a7639f767b1d30b6ef1f91a9c49e3f3b78f0Luca Barbieri 720e79086865bd67f860dfd0d5951395495530022bcBrian Paul for (i = 0; i < lines; ++i) { 721e79086865bd67f860dfd0d5951395495530022bcBrian Paul memcpy(dst, src, srcRowStride); 722eea6a7639f767b1d30b6ef1f91a9c49e3f3b78f0Luca Barbieri dst += dstRowStride; 723e79086865bd67f860dfd0d5951395495530022bcBrian Paul src += srcRowStride; 724eea6a7639f767b1d30b6ef1f91a9c49e3f3b78f0Luca Barbieri } 725eea6a7639f767b1d30b6ef1f91a9c49e3f3b78f0Luca Barbieri } 72624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 727753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer else { 728eaca19edbbe7876079aa33d7f75d93601677081bBrian Paul const GLuint srcImageStride = 729eaca19edbbe7876079aa33d7f75d93601677081bBrian Paul _mesa_image_image_stride(unpack, width, height, format, type); 7305facd7986ace899673499f396897469720476799Brian Paul GLint i; 7315823f99d0fbc054b87aeb1bc15d413d3eadd27a8Brian const GLubyte *src = (const GLubyte *) pixels; 732753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer 733d11d903c1b81000d04f859dcc2da41dae024f146Brian Paul for (i = 0; i < depth; i++) { 7346480210b89dc8ae0990c450d27870c7b7930f251Brian Paul if (!_mesa_texstore(ctx, dims, 7356480210b89dc8ae0990c450d27870c7b7930f251Brian Paul texImage->_BaseFormat, 7366480210b89dc8ae0990c450d27870c7b7930f251Brian Paul texImage->TexFormat, 7376480210b89dc8ae0990c450d27870c7b7930f251Brian Paul texImage->Data, 7386480210b89dc8ae0990c450d27870c7b7930f251Brian Paul 0, 0, 0, /* dstX/Y/Zoffset */ 7396480210b89dc8ae0990c450d27870c7b7930f251Brian Paul dstRowStride, 7406480210b89dc8ae0990c450d27870c7b7930f251Brian Paul texImage->ImageOffsets, 7416480210b89dc8ae0990c450d27870c7b7930f251Brian Paul width, height, 1, 7426480210b89dc8ae0990c450d27870c7b7930f251Brian Paul format, type, src, unpack)) { 743753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage"); 744753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer } 745753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer 746d11d903c1b81000d04f859dcc2da41dae024f146Brian Paul if (stImage->pt && i + 1 < depth) { 747d11d903c1b81000d04f859dcc2da41dae024f146Brian Paul /* unmap this slice */ 74876c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul st_texture_image_unmap(st, stImage); 749d11d903c1b81000d04f859dcc2da41dae024f146Brian Paul /* map next slice of 3D texture */ 75076c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul texImage->Data = st_texture_image_map(st, stImage, i + 1, 75171633abafc935c25da9731bab48c228ceb9b4097Michel Dänzer transfer_usage, 0, 0, 752c7d1d34c580e8c76bf2f3f8687223e648e7ec5f1Brian Paul width, height); 7535823f99d0fbc054b87aeb1bc15d413d3eadd27a8Brian src += srcImageStride; 754753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer } 755753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer } 75624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 75724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 75808d39251a79a964e4a3ac0d7d8a397c2b66a0808Brian Pauldone: 75924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian _mesa_unmap_teximage_pbo(ctx, unpack); 76024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 76155ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz if (stImage->pt && texImage->Data) { 76276c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul st_texture_image_unmap(st, stImage); 76324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian texImage->Data = NULL; 76424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 76524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 76624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 76724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 76824df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 76924df8f895fe8807aa2ba058e71bd40adfc01d21eBrianst_TexImage3D(GLcontext * ctx, 7704e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul GLenum target, GLint level, 7714e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul GLint internalFormat, 7724e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul GLint width, GLint height, GLint depth, 7734e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul GLint border, 7744e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul GLenum format, GLenum type, const void *pixels, 7754e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul const struct gl_pixelstore_attrib *unpack, 7764e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul struct gl_texture_object *texObj, 7774e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul struct gl_texture_image *texImage) 77824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 7795facd7986ace899673499f396897469720476799Brian Paul st_TexImage(ctx, 3, target, level, internalFormat, width, height, depth, 7805facd7986ace899673499f396897469720476799Brian Paul border, format, type, pixels, unpack, texObj, texImage, 7815facd7986ace899673499f396897469720476799Brian Paul 0, GL_FALSE); 78224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 78324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 78424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 78524df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 78624df8f895fe8807aa2ba058e71bd40adfc01d21eBrianst_TexImage2D(GLcontext * ctx, 7874e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul GLenum target, GLint level, 7884e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul GLint internalFormat, 7894e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul GLint width, GLint height, GLint border, 7904e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul GLenum format, GLenum type, const void *pixels, 7914e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul const struct gl_pixelstore_attrib *unpack, 7924e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul struct gl_texture_object *texObj, 7934e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul struct gl_texture_image *texImage) 79424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 7955facd7986ace899673499f396897469720476799Brian Paul st_TexImage(ctx, 2, target, level, internalFormat, width, height, 1, border, 7965facd7986ace899673499f396897469720476799Brian Paul format, type, pixels, unpack, texObj, texImage, 0, GL_FALSE); 79724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 79824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 79924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 80024df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 80124df8f895fe8807aa2ba058e71bd40adfc01d21eBrianst_TexImage1D(GLcontext * ctx, 8024e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul GLenum target, GLint level, 8034e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul GLint internalFormat, 8044e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul GLint width, GLint border, 8054e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul GLenum format, GLenum type, const void *pixels, 8064e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul const struct gl_pixelstore_attrib *unpack, 8074e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul struct gl_texture_object *texObj, 8084e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul struct gl_texture_image *texImage) 80924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 8105facd7986ace899673499f396897469720476799Brian Paul st_TexImage(ctx, 1, target, level, internalFormat, width, 1, 1, border, 8115facd7986ace899673499f396897469720476799Brian Paul format, type, pixels, unpack, texObj, texImage, 0, GL_FALSE); 81224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 81324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 81424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 81524df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 8164e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paulst_CompressedTexImage2D(GLcontext *ctx, GLenum target, GLint level, 8174e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul GLint internalFormat, 8184e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul GLint width, GLint height, GLint border, 8194e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul GLsizei imageSize, const GLvoid *data, 8204e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul struct gl_texture_object *texObj, 8214e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul struct gl_texture_image *texImage) 82224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 8235facd7986ace899673499f396897469720476799Brian Paul st_TexImage(ctx, 2, target, level, internalFormat, width, height, 1, border, 8245facd7986ace899673499f396897469720476799Brian Paul 0, 0, data, &ctx->Unpack, texObj, texImage, imageSize, GL_TRUE); 82524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 82624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 82724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 82851b339af2e8b80575a24bb9146f031c9605180bbBrian Paul 82951b339af2e8b80575a24bb9146f031c9605180bbBrian Paul/** 83051b339af2e8b80575a24bb9146f031c9605180bbBrian Paul * glGetTexImage() helper: decompress a compressed texture by rendering 83151b339af2e8b80575a24bb9146f031c9605180bbBrian Paul * a textured quad. Store the results in the user's buffer. 83251b339af2e8b80575a24bb9146f031c9605180bbBrian Paul */ 83351b339af2e8b80575a24bb9146f031c9605180bbBrian Paulstatic void 83451b339af2e8b80575a24bb9146f031c9605180bbBrian Pauldecompress_with_blit(GLcontext * ctx, GLenum target, GLint level, 83551b339af2e8b80575a24bb9146f031c9605180bbBrian Paul GLenum format, GLenum type, GLvoid *pixels, 83651b339af2e8b80575a24bb9146f031c9605180bbBrian Paul struct gl_texture_object *texObj, 83751b339af2e8b80575a24bb9146f031c9605180bbBrian Paul struct gl_texture_image *texImage) 83851b339af2e8b80575a24bb9146f031c9605180bbBrian Paul{ 83976c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul struct st_context *st = st_context(ctx); 84076c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul struct pipe_context *pipe = st->pipe; 841b43c182f19c6291c88420fa12714f952c2b461fbKeith Whitwell struct pipe_screen *screen = pipe->screen; 84251b339af2e8b80575a24bb9146f031c9605180bbBrian Paul struct st_texture_image *stImage = st_texture_image(texImage); 8438f55a95178069d5e8b18647e6b675fc403d68073Roland Scheidegger struct st_texture_object *stObj = st_texture_object(texObj); 8445d3d63d45a037fdf603ddcff88da635c3ce8075eBrian Paul struct pipe_sampler_view *src_view = 8455d3d63d45a037fdf603ddcff88da635c3ce8075eBrian Paul st_get_texture_sampler_view(stObj, pipe); 84651b339af2e8b80575a24bb9146f031c9605180bbBrian Paul const GLuint width = texImage->Width; 84751b339af2e8b80575a24bb9146f031c9605180bbBrian Paul const GLuint height = texImage->Height; 84851b339af2e8b80575a24bb9146f031c9605180bbBrian Paul struct pipe_surface *dst_surface; 849287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct pipe_resource *dst_texture; 85051b339af2e8b80575a24bb9146f031c9605180bbBrian Paul struct pipe_transfer *tex_xfer; 851287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell unsigned bind = (PIPE_BIND_BLIT_DESTINATION | 852287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell PIPE_BIND_RENDER_TARGET | /* util_blit may choose to render */ 853287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell PIPE_BIND_TRANSFER_READ); 85451b339af2e8b80575a24bb9146f031c9605180bbBrian Paul 85551b339af2e8b80575a24bb9146f031c9605180bbBrian Paul /* create temp / dest surface */ 856287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell if (!util_create_rgba_surface(screen, width, height, bind, 85751b339af2e8b80575a24bb9146f031c9605180bbBrian Paul &dst_texture, &dst_surface)) { 85851b339af2e8b80575a24bb9146f031c9605180bbBrian Paul _mesa_problem(ctx, "util_create_rgba_surface() failed " 85951b339af2e8b80575a24bb9146f031c9605180bbBrian Paul "in decompress_with_blit()"); 86051b339af2e8b80575a24bb9146f031c9605180bbBrian Paul return; 86151b339af2e8b80575a24bb9146f031c9605180bbBrian Paul } 86251b339af2e8b80575a24bb9146f031c9605180bbBrian Paul 86351b339af2e8b80575a24bb9146f031c9605180bbBrian Paul /* blit/render/decompress */ 86476c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul util_blit_pixels_tex(st->blit, 865287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell src_view, /* pipe_resource (src) */ 86651b339af2e8b80575a24bb9146f031c9605180bbBrian Paul 0, 0, /* src x0, y0 */ 86751b339af2e8b80575a24bb9146f031c9605180bbBrian Paul width, height, /* src x1, y1 */ 86851b339af2e8b80575a24bb9146f031c9605180bbBrian Paul dst_surface, /* pipe_surface (dst) */ 86951b339af2e8b80575a24bb9146f031c9605180bbBrian Paul 0, 0, /* dst x0, y0 */ 87051b339af2e8b80575a24bb9146f031c9605180bbBrian Paul width, height, /* dst x1, y1 */ 87151b339af2e8b80575a24bb9146f031c9605180bbBrian Paul 0.0, /* z */ 87251b339af2e8b80575a24bb9146f031c9605180bbBrian Paul PIPE_TEX_MIPFILTER_NEAREST); 87351b339af2e8b80575a24bb9146f031c9605180bbBrian Paul 87451b339af2e8b80575a24bb9146f031c9605180bbBrian Paul /* map the dst_surface so we can read from it */ 875e50dd26ca6d0eb0d0f97c2780020ea16e3d4a687Thomas Hellstrom tex_xfer = st_cond_flush_get_tex_transfer(st_context(ctx), 876e50dd26ca6d0eb0d0f97c2780020ea16e3d4a687Thomas Hellstrom dst_texture, 0, 0, 0, 877e50dd26ca6d0eb0d0f97c2780020ea16e3d4a687Thomas Hellstrom PIPE_TRANSFER_READ, 878e50dd26ca6d0eb0d0f97c2780020ea16e3d4a687Thomas Hellstrom 0, 0, width, height); 87951b339af2e8b80575a24bb9146f031c9605180bbBrian Paul 8801b448c7a5cafa68eeead2a4c45f4362a9883383bBrian Paul pixels = _mesa_map_pbo_dest(ctx, &ctx->Pack, pixels); 88151b339af2e8b80575a24bb9146f031c9605180bbBrian Paul 8827b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul /* copy/pack data into user buffer */ 8837b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul if (st_equal_formats(stImage->pt->format, format, type)) { 8847b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul /* memcpy */ 885b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol const uint bytesPerRow = width * util_format_get_blocksize(stImage->pt->format); 886287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell ubyte *map = pipe_transfer_map(pipe, tex_xfer); 8877b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul GLuint row; 8887b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul for (row = 0; row < height; row++) { 8897b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul GLvoid *dest = _mesa_image_address2d(&ctx->Pack, pixels, width, 8907b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul height, format, type, row, 0); 8917b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul memcpy(dest, map, bytesPerRow); 8927b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul map += tex_xfer->stride; 8937b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul } 894287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_transfer_unmap(pipe, tex_xfer); 89551b339af2e8b80575a24bb9146f031c9605180bbBrian Paul } 8967b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul else { 8977b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul /* format translation via floats */ 8987b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul GLuint row; 8997b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul for (row = 0; row < height; row++) { 9007b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul const GLbitfield transferOps = 0x0; /* bypassed for glGetTexImage() */ 9017b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul GLfloat rgba[4 * MAX_WIDTH]; 9027b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul GLvoid *dest = _mesa_image_address2d(&ctx->Pack, pixels, width, 9037b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul height, format, type, row, 0); 9047b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul 905b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell if (ST_DEBUG & DEBUG_FALLBACK) 906b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell debug_printf("%s: fallback format translation\n", __FUNCTION__); 907b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell 9087b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul /* get float[4] rgba row from surface */ 909d35ecca5ee231c072687578642e0c22c6c0590b1Keith Whitwell pipe_get_tile_rgba(pipe, tex_xfer, 0, row, width, 1, rgba); 9107b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul 9117b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul _mesa_pack_rgba_span_float(ctx, width, (GLfloat (*)[4]) rgba, format, 9127b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul type, dest, &ctx->Pack, transferOps); 9137b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul } 9147b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul } 9157b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul 9161b448c7a5cafa68eeead2a4c45f4362a9883383bBrian Paul _mesa_unmap_pbo_dest(ctx, &ctx->Pack); 91751b339af2e8b80575a24bb9146f031c9605180bbBrian Paul 918287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe->transfer_destroy(pipe, tex_xfer); 91963af29bfbe265318bcf5be69e420de361b900321Keith Whitwell 92051b339af2e8b80575a24bb9146f031c9605180bbBrian Paul /* destroy the temp / dest surface */ 92151b339af2e8b80575a24bb9146f031c9605180bbBrian Paul util_destroy_rgba_surface(dst_texture, dst_surface); 92251b339af2e8b80575a24bb9146f031c9605180bbBrian Paul} 92351b339af2e8b80575a24bb9146f031c9605180bbBrian Paul 92451b339af2e8b80575a24bb9146f031c9605180bbBrian Paul 92551b339af2e8b80575a24bb9146f031c9605180bbBrian Paul 92624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian/** 92724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * Need to map texture image into memory before copying image data, 92824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * then unmap it. 92924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 93024df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 93124df8f895fe8807aa2ba058e71bd40adfc01d21eBrianst_get_tex_image(GLcontext * ctx, GLenum target, GLint level, 93224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLenum format, GLenum type, GLvoid * pixels, 93324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct gl_texture_object *texObj, 93451b339af2e8b80575a24bb9146f031c9605180bbBrian Paul struct gl_texture_image *texImage, GLboolean compressed_dst) 93524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 93676c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul struct st_context *st = st_context(ctx); 93724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct st_texture_image *stImage = st_texture_image(texImage); 938eaca19edbbe7876079aa33d7f75d93601677081bBrian Paul const GLuint dstImageStride = 939eaca19edbbe7876079aa33d7f75d93601677081bBrian Paul _mesa_image_image_stride(&ctx->Pack, texImage->Width, texImage->Height, 940eaca19edbbe7876079aa33d7f75d93601677081bBrian Paul format, type); 9415facd7986ace899673499f396897469720476799Brian Paul GLuint depth, i; 9425823f99d0fbc054b87aeb1bc15d413d3eadd27a8Brian GLubyte *dest; 94324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 94451b339af2e8b80575a24bb9146f031c9605180bbBrian Paul if (stImage->pt && 945cfbbe244d7438a60d389ae9d996dd430f79f362fJosé Fonseca util_format_is_s3tc(stImage->pt->format) && 94651b339af2e8b80575a24bb9146f031c9605180bbBrian Paul !compressed_dst) { 94751b339af2e8b80575a24bb9146f031c9605180bbBrian Paul /* Need to decompress the texture. 94851b339af2e8b80575a24bb9146f031c9605180bbBrian Paul * We'll do this by rendering a textured quad. 94951b339af2e8b80575a24bb9146f031c9605180bbBrian Paul * Note that we only expect RGBA formats (no Z/depth formats). 95051b339af2e8b80575a24bb9146f031c9605180bbBrian Paul */ 95151b339af2e8b80575a24bb9146f031c9605180bbBrian Paul decompress_with_blit(ctx, target, level, format, type, pixels, 95251b339af2e8b80575a24bb9146f031c9605180bbBrian Paul texObj, texImage); 95351b339af2e8b80575a24bb9146f031c9605180bbBrian Paul return; 95451b339af2e8b80575a24bb9146f031c9605180bbBrian Paul } 95551b339af2e8b80575a24bb9146f031c9605180bbBrian Paul 95624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian /* Map */ 957753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer if (stImage->pt) { 95824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian /* Image is stored in hardware format in a buffer managed by the 95924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * kernel. Need to explicitly map and unmap it. 96024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 9614ed1de8b84b587d2be0c0e4ecb6b5f421195f562José Fonseca unsigned face = _mesa_tex_target_to_face(target); 9629b75627fab5bf2ea90f27ddd31b60c54895f6de6Thomas Hellstrom 96376c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul st_teximage_flush_before_map(st, stImage->pt, face, level, 9649b75627fab5bf2ea90f27ddd31b60c54895f6de6Thomas Hellstrom PIPE_TRANSFER_READ); 9659b75627fab5bf2ea90f27ddd31b60c54895f6de6Thomas Hellstrom 96676c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul texImage->Data = st_texture_image_map(st, stImage, 0, 9674617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzer PIPE_TRANSFER_READ, 0, 0, 9684617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzer stImage->base.Width, 9694617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzer stImage->base.Height); 9707b640f9f708306b3e8c661771f29bf24bf8687fbBrian Paul /* compute stride in texels from stride in bytes */ 9717b640f9f708306b3e8c661771f29bf24bf8687fbBrian Paul texImage->RowStride = stImage->transfer->stride 9727b640f9f708306b3e8c661771f29bf24bf8687fbBrian Paul * util_format_get_blockwidth(stImage->pt->format) 9737b640f9f708306b3e8c661771f29bf24bf8687fbBrian Paul / util_format_get_blocksize(stImage->pt->format); 97424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 97524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian else { 97624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian /* Otherwise, the image should actually be stored in 977753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer * texImage->Data. This is pretty confusing for 97824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * everybody, I'd much prefer to separate the two functions of 97924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * texImage->Data - storage for texture images in main memory 98024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * and access (ie mappings) of images. In other words, we'd 98124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * create a new texImage->Map field and leave Data simply for 98224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * storage. 98324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 984753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer assert(texImage->Data); 98524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 98624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 987753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer depth = texImage->Depth; 988753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer texImage->Depth = 1; 98924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 9905823f99d0fbc054b87aeb1bc15d413d3eadd27a8Brian dest = (GLubyte *) pixels; 9915823f99d0fbc054b87aeb1bc15d413d3eadd27a8Brian 992d11d903c1b81000d04f859dcc2da41dae024f146Brian Paul for (i = 0; i < depth; i++) { 99351b339af2e8b80575a24bb9146f031c9605180bbBrian Paul if (compressed_dst) { 9945823f99d0fbc054b87aeb1bc15d413d3eadd27a8Brian _mesa_get_compressed_teximage(ctx, target, level, dest, 995753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer texObj, texImage); 9965facd7986ace899673499f396897469720476799Brian Paul } 9975facd7986ace899673499f396897469720476799Brian Paul else { 9985823f99d0fbc054b87aeb1bc15d413d3eadd27a8Brian _mesa_get_teximage(ctx, target, level, format, type, dest, 999753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer texObj, texImage); 1000753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer } 1001753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer 1002d11d903c1b81000d04f859dcc2da41dae024f146Brian Paul if (stImage->pt && i + 1 < depth) { 1003d11d903c1b81000d04f859dcc2da41dae024f146Brian Paul /* unmap this slice */ 100476c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul st_texture_image_unmap(st, stImage); 1005d11d903c1b81000d04f859dcc2da41dae024f146Brian Paul /* map next slice of 3D texture */ 100676c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul texImage->Data = st_texture_image_map(st, stImage, i + 1, 10074617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzer PIPE_TRANSFER_READ, 0, 0, 10084617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzer stImage->base.Width, 10094617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzer stImage->base.Height); 10105823f99d0fbc054b87aeb1bc15d413d3eadd27a8Brian dest += dstImageStride; 1011753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer } 101224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 1013753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer 1014753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer texImage->Depth = depth; 101524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 101624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian /* Unmap */ 1017753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer if (stImage->pt) { 101876c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul st_texture_image_unmap(st, stImage); 1019753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer texImage->Data = NULL; 102024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 102124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 102224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 102324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 102424df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 102524df8f895fe8807aa2ba058e71bd40adfc01d21eBrianst_GetTexImage(GLcontext * ctx, GLenum target, GLint level, 10264e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul GLenum format, GLenum type, GLvoid * pixels, 10274e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul struct gl_texture_object *texObj, 10284e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul struct gl_texture_image *texImage) 102924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 10305facd7986ace899673499f396897469720476799Brian Paul st_get_tex_image(ctx, target, level, format, type, pixels, texObj, texImage, 10315facd7986ace899673499f396897469720476799Brian Paul GL_FALSE); 103224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 103324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 103424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 103524df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 103624df8f895fe8807aa2ba058e71bd40adfc01d21eBrianst_GetCompressedTexImage(GLcontext *ctx, GLenum target, GLint level, 10374e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul GLvoid *pixels, 103847bf26845712bea756526fc159bdb355ceaef9c2Brian Paul struct gl_texture_object *texObj, 103947bf26845712bea756526fc159bdb355ceaef9c2Brian Paul struct gl_texture_image *texImage) 104024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 10415facd7986ace899673499f396897469720476799Brian Paul st_get_tex_image(ctx, target, level, 0, 0, pixels, texObj, texImage, 10425facd7986ace899673499f396897469720476799Brian Paul GL_TRUE); 104324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 104424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 104524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 104624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 104724df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 10485facd7986ace899673499f396897469720476799Brian Paulst_TexSubimage(GLcontext *ctx, GLint dims, GLenum target, GLint level, 10494e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul GLint xoffset, GLint yoffset, GLint zoffset, 10504e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul GLint width, GLint height, GLint depth, 10514e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul GLenum format, GLenum type, const void *pixels, 10524e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul const struct gl_pixelstore_attrib *packing, 10534e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul struct gl_texture_object *texObj, 10544e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul struct gl_texture_image *texImage) 105524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 105676c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul struct st_context *st = st_context(ctx); 105776c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul struct pipe_screen *screen = st->pipe->screen; 105824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct st_texture_image *stImage = st_texture_image(texImage); 105924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLuint dstRowStride; 1060eaca19edbbe7876079aa33d7f75d93601677081bBrian Paul const GLuint srcImageStride = 1061eaca19edbbe7876079aa33d7f75d93601677081bBrian Paul _mesa_image_image_stride(packing, width, height, format, type); 10625facd7986ace899673499f396897469720476799Brian Paul GLint i; 10635823f99d0fbc054b87aeb1bc15d413d3eadd27a8Brian const GLubyte *src; 1064a7427b0f7b2325b8dcc560d57cb894df25ebef93Brian Paul /* init to silence warning only: */ 1065a7427b0f7b2325b8dcc560d57cb894df25ebef93Brian Paul enum pipe_transfer_usage transfer_usage = PIPE_TRANSFER_WRITE; 106624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 106724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian DBG("%s target %s level %d offset %d,%d %dx%d\n", __FUNCTION__, 106824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian _mesa_lookup_enum_by_nr(target), 106924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian level, xoffset, yoffset, width, height); 107024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 107124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian pixels = 107224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian _mesa_validate_pbo_teximage(ctx, dims, width, height, depth, format, 107324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian type, pixels, packing, "glTexSubImage2D"); 107424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian if (!pixels) 107524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian return; 107624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 107755ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz /* See if we can do texture compression with a blit/render. 107855ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz */ 107955ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz if (!ctx->Mesa_DXTn && 108092863109af05acdb4ee5e42141c83ab0f18b7f88Brian Paul _mesa_is_format_compressed(texImage->TexFormat) && 108155ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz screen->is_format_supported(screen, 108255ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz stImage->pt->format, 108355ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz stImage->pt->target, 1084287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell PIPE_BIND_RENDER_TARGET, 0)) { 108555ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz if (compress_with_blit(ctx, target, level, 108655ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz xoffset, yoffset, zoffset, 108755ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz width, height, depth, 108855ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz format, type, pixels, packing, texImage)) { 1089f989390af6f827d1ea36560381340148811836f3Jakob Bornecrantz goto done; 109055ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz } 109155ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz } 109255ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz 109324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian /* Map buffer if necessary. Need to lock to prevent other contexts 109424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * from uploading the buffer under us. 109524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 1096753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer if (stImage->pt) { 10974ed1de8b84b587d2be0c0e4ecb6b5f421195f562José Fonseca unsigned face = _mesa_tex_target_to_face(target); 10984ed1de8b84b587d2be0c0e4ecb6b5f421195f562José Fonseca 109971633abafc935c25da9731bab48c228ceb9b4097Michel Dänzer if (format == GL_DEPTH_COMPONENT && 11000bed834be4a174d20b31a6cbcf066774bf749929Michal Krol util_format_is_depth_and_stencil(stImage->pt->format)) 110171633abafc935c25da9731bab48c228ceb9b4097Michel Dänzer transfer_usage = PIPE_TRANSFER_READ_WRITE; 110271633abafc935c25da9731bab48c228ceb9b4097Michel Dänzer else 110371633abafc935c25da9731bab48c228ceb9b4097Michel Dänzer transfer_usage = PIPE_TRANSFER_WRITE; 110471633abafc935c25da9731bab48c228ceb9b4097Michel Dänzer 110576c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul st_teximage_flush_before_map(st, stImage->pt, face, level, 110671633abafc935c25da9731bab48c228ceb9b4097Michel Dänzer transfer_usage); 110776c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul texImage->Data = st_texture_image_map(st, stImage, zoffset, 110871633abafc935c25da9731bab48c228ceb9b4097Michel Dänzer transfer_usage, 11094617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzer xoffset, yoffset, 11109e84e7def152aa8080da59a78795d6434e687403Jakob Bornecrantz width, height); 1111753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer } 1112753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer 11139b44f5a7550d8ede2eda763770e927df4c15cc8eBrian Paul if (!texImage->Data) { 11149b44f5a7550d8ede2eda763770e927df4c15cc8eBrian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexSubImage"); 111508d39251a79a964e4a3ac0d7d8a397c2b66a0808Brian Paul goto done; 11169b44f5a7550d8ede2eda763770e927df4c15cc8eBrian Paul } 11179b44f5a7550d8ede2eda763770e927df4c15cc8eBrian Paul 11185823f99d0fbc054b87aeb1bc15d413d3eadd27a8Brian src = (const GLubyte *) pixels; 1119d7b7b63bd7cca80e99ad9701f8b56ee365053647Michal Krol dstRowStride = stImage->transfer->stride; 11205823f99d0fbc054b87aeb1bc15d413d3eadd27a8Brian 1121d11d903c1b81000d04f859dcc2da41dae024f146Brian Paul for (i = 0; i < depth; i++) { 11226480210b89dc8ae0990c450d27870c7b7930f251Brian Paul if (!_mesa_texstore(ctx, dims, texImage->_BaseFormat, 11236480210b89dc8ae0990c450d27870c7b7930f251Brian Paul texImage->TexFormat, 11246480210b89dc8ae0990c450d27870c7b7930f251Brian Paul texImage->Data, 11256480210b89dc8ae0990c450d27870c7b7930f251Brian Paul 0, 0, 0, 11266480210b89dc8ae0990c450d27870c7b7930f251Brian Paul dstRowStride, 11276480210b89dc8ae0990c450d27870c7b7930f251Brian Paul texImage->ImageOffsets, 11286480210b89dc8ae0990c450d27870c7b7930f251Brian Paul width, height, 1, 11296480210b89dc8ae0990c450d27870c7b7930f251Brian Paul format, type, src, packing)) { 11309b44f5a7550d8ede2eda763770e927df4c15cc8eBrian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexSubImage"); 1131753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer } 1132753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer 1133d11d903c1b81000d04f859dcc2da41dae024f146Brian Paul if (stImage->pt && i + 1 < depth) { 1134d11d903c1b81000d04f859dcc2da41dae024f146Brian Paul /* unmap this slice */ 113576c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul st_texture_image_unmap(st, stImage); 1136d11d903c1b81000d04f859dcc2da41dae024f146Brian Paul /* map next slice of 3D texture */ 113776c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul texImage->Data = st_texture_image_map(st, stImage, 1138d11d903c1b81000d04f859dcc2da41dae024f146Brian Paul zoffset + i + 1, 113971633abafc935c25da9731bab48c228ceb9b4097Michel Dänzer transfer_usage, 11404617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzer xoffset, yoffset, 11419e84e7def152aa8080da59a78795d6434e687403Jakob Bornecrantz width, height); 11425823f99d0fbc054b87aeb1bc15d413d3eadd27a8Brian src += srcImageStride; 1143753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer } 114424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 114524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 114608d39251a79a964e4a3ac0d7d8a397c2b66a0808Brian Pauldone: 114724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian _mesa_unmap_teximage_pbo(ctx, packing); 114824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 11491e414df894fc70b7024eb38c812e582336014974Michel Dänzer if (stImage->pt && texImage->Data) { 115076c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul st_texture_image_unmap(st, stImage); 115124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian texImage->Data = NULL; 115224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 115324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 115424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 115524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 115624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 115724df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 11585facd7986ace899673499f396897469720476799Brian Paulst_TexSubImage3D(GLcontext *ctx, GLenum target, GLint level, 11595facd7986ace899673499f396897469720476799Brian Paul GLint xoffset, GLint yoffset, GLint zoffset, 11605facd7986ace899673499f396897469720476799Brian Paul GLsizei width, GLsizei height, GLsizei depth, 11615facd7986ace899673499f396897469720476799Brian Paul GLenum format, GLenum type, const GLvoid *pixels, 11625facd7986ace899673499f396897469720476799Brian Paul const struct gl_pixelstore_attrib *packing, 11635facd7986ace899673499f396897469720476799Brian Paul struct gl_texture_object *texObj, 11645facd7986ace899673499f396897469720476799Brian Paul struct gl_texture_image *texImage) 116524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 11665facd7986ace899673499f396897469720476799Brian Paul st_TexSubimage(ctx, 3, target, level, xoffset, yoffset, zoffset, 11675facd7986ace899673499f396897469720476799Brian Paul width, height, depth, format, type, 11685facd7986ace899673499f396897469720476799Brian Paul pixels, packing, texObj, texImage); 116924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 117024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 117124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 117224df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 11735facd7986ace899673499f396897469720476799Brian Paulst_TexSubImage2D(GLcontext *ctx, GLenum target, GLint level, 11745facd7986ace899673499f396897469720476799Brian Paul GLint xoffset, GLint yoffset, 11755facd7986ace899673499f396897469720476799Brian Paul GLsizei width, GLsizei height, 11765facd7986ace899673499f396897469720476799Brian Paul GLenum format, GLenum type, const GLvoid * pixels, 11775facd7986ace899673499f396897469720476799Brian Paul const struct gl_pixelstore_attrib *packing, 11785facd7986ace899673499f396897469720476799Brian Paul struct gl_texture_object *texObj, 11795facd7986ace899673499f396897469720476799Brian Paul struct gl_texture_image *texImage) 118024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 11815facd7986ace899673499f396897469720476799Brian Paul st_TexSubimage(ctx, 2, target, level, xoffset, yoffset, 0, 11825facd7986ace899673499f396897469720476799Brian Paul width, height, 1, format, type, 11835facd7986ace899673499f396897469720476799Brian Paul pixels, packing, texObj, texImage); 118424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 118524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 118624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 118724df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 11885facd7986ace899673499f396897469720476799Brian Paulst_TexSubImage1D(GLcontext *ctx, GLenum target, GLint level, 11895facd7986ace899673499f396897469720476799Brian Paul GLint xoffset, GLsizei width, GLenum format, GLenum type, 11905facd7986ace899673499f396897469720476799Brian Paul const GLvoid * pixels, 11915facd7986ace899673499f396897469720476799Brian Paul const struct gl_pixelstore_attrib *packing, 11925facd7986ace899673499f396897469720476799Brian Paul struct gl_texture_object *texObj, 11935facd7986ace899673499f396897469720476799Brian Paul struct gl_texture_image *texImage) 119424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 11955facd7986ace899673499f396897469720476799Brian Paul st_TexSubimage(ctx, 1, target, level, xoffset, 0, 0, width, 1, 1, 1196b245840b86cf877c9b8d666edf229364a84f1deaBrian format, type, pixels, packing, texObj, texImage); 119724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 119824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 119924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1200a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantzstatic void 1201578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantzst_CompressedTexSubImage1D(GLcontext *ctx, GLenum target, GLint level, 1202578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz GLint xoffset, GLsizei width, 1203578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz GLenum format, 1204578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz GLsizei imageSize, const GLvoid *data, 1205578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz struct gl_texture_object *texObj, 1206578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz struct gl_texture_image *texImage) 1207578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz{ 1208578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz assert(0); 1209578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz} 1210578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz 1211578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz 1212578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantzstatic void 1213a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantzst_CompressedTexSubImage2D(GLcontext *ctx, GLenum target, GLint level, 1214a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz GLint xoffset, GLint yoffset, 1215a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz GLsizei width, GLint height, 1216a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz GLenum format, 1217a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz GLsizei imageSize, const GLvoid *data, 1218a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz struct gl_texture_object *texObj, 1219a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz struct gl_texture_image *texImage) 1220a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz{ 122176c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul struct st_context *st = st_context(ctx); 1222a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz struct st_texture_image *stImage = st_texture_image(texImage); 1223a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz int srcBlockStride; 1224a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz int dstBlockStride; 1225a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz int y; 12267b8c4f22d4fd78829dd5843db92321ec0665932eVinson Lee enum pipe_format pformat; 1227a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz 1228a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz if (stImage->pt) { 12294ed1de8b84b587d2be0c0e4ecb6b5f421195f562José Fonseca unsigned face = _mesa_tex_target_to_face(target); 12307b8c4f22d4fd78829dd5843db92321ec0665932eVinson Lee pformat = stImage->pt->format; 12314ed1de8b84b587d2be0c0e4ecb6b5f421195f562José Fonseca 123276c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul st_teximage_flush_before_map(st, stImage->pt, face, level, 1233a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz PIPE_TRANSFER_WRITE); 123476c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul texImage->Data = st_texture_image_map(st, stImage, 0, 1235a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz PIPE_TRANSFER_WRITE, 1236a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz xoffset, yoffset, 1237a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz width, height); 1238a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz 1239b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol srcBlockStride = util_format_get_stride(pformat, width); 1240a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz dstBlockStride = stImage->transfer->stride; 1241a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz } else { 1242a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz assert(stImage->pt); 1243a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz /* TODO find good values for block and strides */ 1244a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz /* TODO also adjust texImage->data for yoffset/xoffset */ 1245a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz return; 1246a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz } 1247a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz 1248a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz if (!texImage->Data) { 1249a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz _mesa_error(ctx, GL_OUT_OF_MEMORY, "glCompressedTexSubImage"); 1250a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz return; 1251a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz } 1252a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz 1253b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol assert(xoffset % util_format_get_blockwidth(pformat) == 0); 1254b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol assert(yoffset % util_format_get_blockheight(pformat) == 0); 1255b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol assert(width % util_format_get_blockwidth(pformat) == 0); 1256b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol assert(height % util_format_get_blockheight(pformat) == 0); 1257a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz 1258b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol for (y = 0; y < height; y += util_format_get_blockheight(pformat)) { 1259a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz /* don't need to adjust for xoffset and yoffset as st_texture_image_map does that */ 1260b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol const char *src = (const char*)data + srcBlockStride * util_format_get_nblocksy(pformat, y); 1261b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol char *dst = (char*)texImage->Data + dstBlockStride * util_format_get_nblocksy(pformat, y); 1262b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol memcpy(dst, src, util_format_get_stride(pformat, width)); 1263a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz } 1264a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz 1265a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz if (stImage->pt) { 126676c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul st_texture_image_unmap(st, stImage); 1267a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz texImage->Data = NULL; 1268a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz } 1269a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz} 1270a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz 1271a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz 1272578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantzstatic void 1273578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantzst_CompressedTexSubImage3D(GLcontext *ctx, GLenum target, GLint level, 1274578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz GLint xoffset, GLint yoffset, GLint zoffset, 1275578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz GLsizei width, GLint height, GLint depth, 1276578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz GLenum format, 1277578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz GLsizei imageSize, const GLvoid *data, 1278578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz struct gl_texture_object *texObj, 1279578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz struct gl_texture_image *texImage) 1280578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz{ 1281578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz assert(0); 1282578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz} 1283578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz 1284578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz 128524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 128624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian/** 12875facd7986ace899673499f396897469720476799Brian Paul * Do a CopyTexSubImage operation using a read transfer from the source, 12885facd7986ace899673499f396897469720476799Brian Paul * a write transfer to the destination and get_tile()/put_tile() to access 12895facd7986ace899673499f396897469720476799Brian Paul * the pixels/texels. 1290c6717a86420d7141013165f7acd50b3c3f751756Brian * 1291c6717a86420d7141013165f7acd50b3c3f751756Brian * Note: srcY=0=TOP of renderbuffer 1292038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian */ 1293038cb561eb094af2f2ba06e18e61246fc0c87c3cBrianstatic void 12945facd7986ace899673499f396897469720476799Brian Paulfallback_copy_texsubimage(GLcontext *ctx, GLenum target, GLint level, 1295038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian struct st_renderbuffer *strb, 1296038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian struct st_texture_image *stImage, 1297038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian GLenum baseFormat, 1298038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian GLint destX, GLint destY, GLint destZ, 1299038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian GLint srcX, GLint srcY, 1300038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian GLsizei width, GLsizei height) 1301038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian{ 130276c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul struct st_context *st = st_context(ctx); 130376c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul struct pipe_context *pipe = st->pipe; 13044617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzer struct pipe_transfer *src_trans; 13054617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzer GLvoid *texDest; 130671633abafc935c25da9731bab48c228ceb9b4097Michel Dänzer enum pipe_transfer_usage transfer_usage; 1307b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell 1308b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell if (ST_DEBUG & DEBUG_FALLBACK) 1309b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell debug_printf("%s: fallback processing\n", __FUNCTION__); 13104617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzer 13114617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzer assert(width <= MAX_WIDTH); 1312038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian 13134617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzer if (st_fb_orientation(ctx->ReadBuffer) == Y_0_TOP) { 13147c8836e9ef49d938aa55a1c385b95c6371c301f1Michel Dänzer srcY = strb->Base.Height - srcY - height; 13154617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzer } 1316f3048ad90ed2e4583f0f7aaf35a0f4aa581942ddBrian Paul 1317e50dd26ca6d0eb0d0f97c2780020ea16e3d4a687Thomas Hellstrom src_trans = st_cond_flush_get_tex_transfer( st_context(ctx), 1318e50dd26ca6d0eb0d0f97c2780020ea16e3d4a687Thomas Hellstrom strb->texture, 1319e50dd26ca6d0eb0d0f97c2780020ea16e3d4a687Thomas Hellstrom 0, 0, 0, 1320e50dd26ca6d0eb0d0f97c2780020ea16e3d4a687Thomas Hellstrom PIPE_TRANSFER_READ, 1321e50dd26ca6d0eb0d0f97c2780020ea16e3d4a687Thomas Hellstrom srcX, srcY, 1322e50dd26ca6d0eb0d0f97c2780020ea16e3d4a687Thomas Hellstrom width, height); 1323038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian 13240197348641614188c400d7c616573bb7f1eea781Brian Paul if ((baseFormat == GL_DEPTH_COMPONENT || 13250197348641614188c400d7c616573bb7f1eea781Brian Paul baseFormat == GL_DEPTH_STENCIL) && 13260bed834be4a174d20b31a6cbcf066774bf749929Michal Krol util_format_is_depth_and_stencil(stImage->pt->format)) 132771633abafc935c25da9731bab48c228ceb9b4097Michel Dänzer transfer_usage = PIPE_TRANSFER_READ_WRITE; 132871633abafc935c25da9731bab48c228ceb9b4097Michel Dänzer else 132971633abafc935c25da9731bab48c228ceb9b4097Michel Dänzer transfer_usage = PIPE_TRANSFER_WRITE; 133071633abafc935c25da9731bab48c228ceb9b4097Michel Dänzer 133176c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul st_teximage_flush_before_map(st, stImage->pt, 0, 0, 133271633abafc935c25da9731bab48c228ceb9b4097Michel Dänzer transfer_usage); 13339b75627fab5bf2ea90f27ddd31b60c54895f6de6Thomas Hellstrom 133476c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul texDest = st_texture_image_map(st, stImage, 0, transfer_usage, 13354617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzer destX, destY, width, height); 1336038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian 1337105758105a790dd8466c6be8c232c3f215ca4deeBrian Paul if (baseFormat == GL_DEPTH_COMPONENT || 13380197348641614188c400d7c616573bb7f1eea781Brian Paul baseFormat == GL_DEPTH_STENCIL) { 1339cc94863429d8a6cef8dbf861e78701a458d30f5aBrian Paul const GLboolean scaleOrBias = (ctx->Pixel.DepthScale != 1.0F || 1340cc94863429d8a6cef8dbf861e78701a458d30f5aBrian Paul ctx->Pixel.DepthBias != 0.0F); 134127858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul GLint row, yStep; 1342cc94863429d8a6cef8dbf861e78701a458d30f5aBrian Paul 134327858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul /* determine bottom-to-top vs. top-to-bottom order for src buffer */ 134427858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul if (st_fb_orientation(ctx->ReadBuffer) == Y_0_TOP) { 13457c8836e9ef49d938aa55a1c385b95c6371c301f1Michel Dänzer srcY = height - 1; 134627858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul yStep = -1; 134727858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul } 134827858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul else { 13494617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzer srcY = 0; 135027858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul yStep = 1; 135127858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul } 135227858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul 135327858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul /* To avoid a large temp memory allocation, do copy row by row */ 13544617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzer for (row = 0; row < height; row++, srcY += yStep) { 1355cc94863429d8a6cef8dbf861e78701a458d30f5aBrian Paul uint data[MAX_WIDTH]; 1356d35ecca5ee231c072687578642e0c22c6c0590b1Keith Whitwell pipe_get_tile_z(pipe, src_trans, 0, srcY, width, 1, data); 1357cc94863429d8a6cef8dbf861e78701a458d30f5aBrian Paul if (scaleOrBias) { 1358cc94863429d8a6cef8dbf861e78701a458d30f5aBrian Paul _mesa_scale_and_bias_depth_uint(ctx, width, data); 1359cc94863429d8a6cef8dbf861e78701a458d30f5aBrian Paul } 1360d35ecca5ee231c072687578642e0c22c6c0590b1Keith Whitwell pipe_put_tile_z(pipe, stImage->transfer, 0, row, width, 1, data); 1361cc94863429d8a6cef8dbf861e78701a458d30f5aBrian Paul } 1362cc94863429d8a6cef8dbf861e78701a458d30f5aBrian Paul } 1363cc94863429d8a6cef8dbf861e78701a458d30f5aBrian Paul else { 1364cc94863429d8a6cef8dbf861e78701a458d30f5aBrian Paul /* RGBA format */ 136527858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul GLfloat *tempSrc = 136632f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg (GLfloat *) malloc(width * height * 4 * sizeof(GLfloat)); 136727858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul 136827858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul if (tempSrc && texDest) { 136927858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul const GLint dims = 2; 13705facd7986ace899673499f396897469720476799Brian Paul const GLint dstRowStride = stImage->transfer->stride; 137127858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul struct gl_texture_image *texImage = &stImage->base; 137227858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul struct gl_pixelstore_attrib unpack = ctx->DefaultPacking; 137327858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul 137427858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul if (st_fb_orientation(ctx->ReadBuffer) == Y_0_TOP) { 137527858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul unpack.Invert = GL_TRUE; 1376cc94863429d8a6cef8dbf861e78701a458d30f5aBrian Paul } 137727858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul 137827858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul /* get float/RGBA image from framebuffer */ 137927858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul /* XXX this usually involves a lot of int/float conversion. 138027858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul * try to avoid that someday. 138127858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul */ 1382d35ecca5ee231c072687578642e0c22c6c0590b1Keith Whitwell pipe_get_tile_rgba(pipe, src_trans, 0, 0, width, height, tempSrc); 138327858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul 138427858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul /* Store into texture memory. 138527858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul * Note that this does some special things such as pixel transfer 138627858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul * ops and format conversion. In particular, if the dest tex format 138727858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul * is actually RGBA but the user created the texture as GL_RGB we 138827858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul * need to fill-in/override the alpha channel with 1.0. 138927858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul */ 13906480210b89dc8ae0990c450d27870c7b7930f251Brian Paul _mesa_texstore(ctx, dims, 13916480210b89dc8ae0990c450d27870c7b7930f251Brian Paul texImage->_BaseFormat, 13926480210b89dc8ae0990c450d27870c7b7930f251Brian Paul texImage->TexFormat, 13936480210b89dc8ae0990c450d27870c7b7930f251Brian Paul texDest, 13946480210b89dc8ae0990c450d27870c7b7930f251Brian Paul 0, 0, 0, 13956480210b89dc8ae0990c450d27870c7b7930f251Brian Paul dstRowStride, 13966480210b89dc8ae0990c450d27870c7b7930f251Brian Paul texImage->ImageOffsets, 13976480210b89dc8ae0990c450d27870c7b7930f251Brian Paul width, height, 1, 13986480210b89dc8ae0990c450d27870c7b7930f251Brian Paul GL_RGBA, GL_FLOAT, tempSrc, /* src */ 13996480210b89dc8ae0990c450d27870c7b7930f251Brian Paul &unpack); 140027858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul } 140127858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul else { 140227858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexSubImage"); 14035c83f1371978472fbe4bba8f686733c6b519874aBrian } 140427858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul 140527858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul if (tempSrc) 140632f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free(tempSrc); 14075c83f1371978472fbe4bba8f686733c6b519874aBrian } 1408d0279fc4b38c72356a341173317bcd45d9093f45Michel Dänzer 140976c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul st_texture_image_unmap(st, stImage); 1410287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe->transfer_destroy(pipe, src_trans); 1411038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian} 1412038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian 1413038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian 141465d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul 141565d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul/** 141665d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * If the format of the src renderbuffer and the format of the dest 141765d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * texture are compatible (in terms of blitting), return a TGSI writemask 141865d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * to be used during the blit. 141965d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * If the src/dest are incompatible, return 0. 142065d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul */ 14218fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwellstatic unsigned 142265d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paulcompatible_src_dst_formats(GLcontext *ctx, 142365d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul const struct gl_renderbuffer *src, 14248fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell const struct gl_texture_image *dst) 14258fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell{ 142665d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul /* Get logical base formats for the src and dest. 142765d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * That is, use the user-requested formats and not the actual, device- 142865d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * chosen formats. 142965d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * For example, the user may have requested an A8 texture but the 143065d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * driver may actually be using an RGBA texture format. When we 143165d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * copy/blit to that texture, we only want to copy the Alpha channel 143265d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * and not the RGB channels. 143365d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * 143465d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * Similarly, when the src FBO was created an RGB format may have been 143565d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * requested but the driver actually chose an RGBA format. In that case, 143665d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * we don't want to copy the undefined Alpha channel to the dest texture 143765d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * (it should be 1.0). 143865d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul */ 143965d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul const GLenum srcFormat = _mesa_base_fbo_format(ctx, src->InternalFormat); 144065d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul const GLenum dstFormat = _mesa_base_tex_format(ctx, dst->InternalFormat); 14418fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell 144265d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul /** 144365d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * XXX when we have red-only and red/green renderbuffers we'll need 144465d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * to add more cases here (or implement a general-purpose routine that 144565d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * queries the existance of the R,G,B,A channels in the src and dest). 144665d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul */ 144765d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul if (srcFormat == dstFormat) { 14488fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell /* This is the same as matching_base_formats, which should 14498fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell * always pass, as it did previously. 14508fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell */ 14518fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell return TGSI_WRITEMASK_XYZW; 14528fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell } 145365d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul else if (srcFormat == GL_RGB && dstFormat == GL_RGBA) { 145465d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul /* Make sure that A in the dest is 1. The actual src format 145565d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * may be RGBA and have undefined A values. 145665d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul */ 145765d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul return TGSI_WRITEMASK_XYZ; 145865d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul } 145965d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul else if (srcFormat == GL_RGBA && dstFormat == GL_RGB) { 146065d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul /* Make sure that A in the dest is 1. The actual dst format 146165d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * may be RGBA and will need A=1 to provide proper alpha values 146265d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * when sampled later. 14638fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell */ 146465d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul return TGSI_WRITEMASK_XYZ; 14658fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell } 14668fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell else { 1467b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell if (ST_DEBUG & DEBUG_FALLBACK) 1468b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell debug_printf("%s failed for src %s, dst %s\n", 1469b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell __FUNCTION__, 1470b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell _mesa_lookup_enum_by_nr(srcFormat), 147165d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul _mesa_lookup_enum_by_nr(dstFormat)); 1472b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell 14738fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell /* Otherwise fail. 14748fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell */ 14758fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell return 0; 14768fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell } 14778fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell} 14788fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell 14798fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell 14808fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell 1481038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian/** 14824e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul * Do a CopyTex[Sub]Image1/2/3D() using a hardware (blit) path if possible. 14834e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul * Note that the region to copy has already been clipped so we know we 14844e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul * won't read from outside the source renderbuffer's bounds. 1485c6717a86420d7141013165f7acd50b3c3f751756Brian * 14864e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul * Note: srcY=0=Bottom of renderbuffer (GL convention) 148724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 1488038cb561eb094af2f2ba06e18e61246fc0c87c3cBrianstatic void 14894e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paulst_copy_texsubimage(GLcontext *ctx, 1490038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian GLenum target, GLint level, 1491038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian GLint destX, GLint destY, GLint destZ, 1492038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian GLint srcX, GLint srcY, 1493038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian GLsizei width, GLsizei height) 149424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 1495038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian struct gl_texture_unit *texUnit = 1496038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian &ctx->Texture.Unit[ctx->Texture.CurrentUnit]; 1497038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian struct gl_texture_object *texObj = 1498038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian _mesa_select_tex_object(ctx, texUnit, target); 1499038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian struct gl_texture_image *texImage = 1500038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian _mesa_select_tex_image(ctx, texObj, target, level); 1501038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian struct st_texture_image *stImage = st_texture_image(texImage); 15020197348641614188c400d7c616573bb7f1eea781Brian Paul const GLenum texBaseFormat = texImage->_BaseFormat; 1503b27498c7cad7dae4e3b3ef9517b9c0aef58f73f6Brian struct gl_framebuffer *fb = ctx->ReadBuffer; 1504b27498c7cad7dae4e3b3ef9517b9c0aef58f73f6Brian struct st_renderbuffer *strb; 150576c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul struct st_context *st = st_context(ctx); 150676c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul struct pipe_context *pipe = st->pipe; 15076f715dcc219071e574e363a9db4365c9c31ebbd3Brian struct pipe_screen *screen = pipe->screen; 150827858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul enum pipe_format dest_format, src_format; 1509cc94863429d8a6cef8dbf861e78701a458d30f5aBrian Paul GLboolean use_fallback = GL_TRUE; 151027858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul GLboolean matching_base_formats; 15118fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell GLuint format_writemask; 15128fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell struct pipe_surface *dest_surface = NULL; 15138fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell GLboolean do_flip = (st_fb_orientation(ctx->ReadBuffer) == Y_0_TOP); 151424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1515503632557e8904b775e1b6f3f84eb41bda3af122Keith Whitwell /* any rendering in progress must flushed before we grab the fb image */ 151676c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul st_flush(st, PIPE_FLUSH_RENDER_CACHE, NULL); 1517503632557e8904b775e1b6f3f84eb41bda3af122Keith Whitwell 1518afd16512bc354cf1a7220cb9bf3ce445503c7af4Keith Whitwell /* make sure finalize_textures has been called? 1519afd16512bc354cf1a7220cb9bf3ce445503c7af4Keith Whitwell */ 152076c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul if (0) st_validate_state(st); 1521afd16512bc354cf1a7220cb9bf3ce445503c7af4Keith Whitwell 1522b27498c7cad7dae4e3b3ef9517b9c0aef58f73f6Brian /* determine if copying depth or color data */ 1523105758105a790dd8466c6be8c232c3f215ca4deeBrian Paul if (texBaseFormat == GL_DEPTH_COMPONENT || 15240197348641614188c400d7c616573bb7f1eea781Brian Paul texBaseFormat == GL_DEPTH_STENCIL) { 1525b27498c7cad7dae4e3b3ef9517b9c0aef58f73f6Brian strb = st_renderbuffer(fb->_DepthBuffer); 152624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 1527b27498c7cad7dae4e3b3ef9517b9c0aef58f73f6Brian else { 15284e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul /* texBaseFormat == GL_RGB, GL_RGBA, GL_ALPHA, etc */ 1529b27498c7cad7dae4e3b3ef9517b9c0aef58f73f6Brian strb = st_renderbuffer(fb->_ColorReadBuffer); 1530b27498c7cad7dae4e3b3ef9517b9c0aef58f73f6Brian } 1531b27498c7cad7dae4e3b3ef9517b9c0aef58f73f6Brian 1532afd16512bc354cf1a7220cb9bf3ce445503c7af4Keith Whitwell if (!strb || !strb->surface || !stImage->pt) { 1533afd16512bc354cf1a7220cb9bf3ce445503c7af4Keith Whitwell debug_printf("%s: null strb or stImage\n", __FUNCTION__); 1534afd16512bc354cf1a7220cb9bf3ce445503c7af4Keith Whitwell return; 1535afd16512bc354cf1a7220cb9bf3ce445503c7af4Keith Whitwell } 1536afd16512bc354cf1a7220cb9bf3ce445503c7af4Keith Whitwell 1537e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell if (srcX < 0) { 1538e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell width -= -srcX; 1539e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell destX += -srcX; 1540e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell srcX = 0; 1541e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell } 1542e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell 1543e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell if (srcY < 0) { 1544e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell height -= -srcY; 1545e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell destY += -srcY; 1546e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell srcY = 0; 1547e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell } 1548e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell 1549e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell if (destX < 0) { 1550e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell width -= -destX; 1551e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell srcX += -destX; 1552e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell destX = 0; 1553e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell } 1554e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell 1555e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell if (destY < 0) { 1556e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell height -= -destY; 1557e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell srcY += -destY; 1558e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell destY = 0; 1559e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell } 1560e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell 1561e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell if (width < 0 || height < 0) 1562e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell return; 1563e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell 1564e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell 1565b27498c7cad7dae4e3b3ef9517b9c0aef58f73f6Brian assert(strb); 1566b27498c7cad7dae4e3b3ef9517b9c0aef58f73f6Brian assert(strb->surface); 1567753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer assert(stImage->pt); 1568c6717a86420d7141013165f7acd50b3c3f751756Brian 1569b27498c7cad7dae4e3b3ef9517b9c0aef58f73f6Brian src_format = strb->surface->format; 1570753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer dest_format = stImage->pt->format; 1571b27498c7cad7dae4e3b3ef9517b9c0aef58f73f6Brian 157227858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul /* 157327858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul * Determine if the src framebuffer and dest texture have the same 157427858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul * base format. We need this to detect a case such as the framebuffer 157527858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul * being GL_RGBA but the texture being GL_RGB. If the actual hardware 157627858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul * texture format stores RGBA we need to set A=1 (overriding the 157727858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul * framebuffer's alpha values). We can't do that with the blit or 157827858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul * textured-quad paths. 157927858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul */ 158045e76d2665b38ba3787548310efc59e969124c01Brian Paul matching_base_formats = 158145e76d2665b38ba3787548310efc59e969124c01Brian Paul (_mesa_get_format_base_format(strb->Base.Format) == 158245e76d2665b38ba3787548310efc59e969124c01Brian Paul _mesa_get_format_base_format(texImage->TexFormat)); 158365d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul format_writemask = compatible_src_dst_formats(ctx, &strb->Base, texImage); 158479931e38abc62286151121a3f59127e296144551Michel Dänzer 15858fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell if (ctx->_ImageTransferState == 0x0) { 1586b27498c7cad7dae4e3b3ef9517b9c0aef58f73f6Brian 1587c11d582411a999ed40db4c02143dd380113e0ffdBrian Paul if (matching_base_formats && 15888fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell src_format == dest_format && 15898fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell !do_flip) 15908fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell { 15914e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul /* use surface_copy() / blit */ 1592f500f3a72c6be61ff9b8e1166f734e408d00adedJakob Bornecrantz 159327858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul dest_surface = screen->get_tex_surface(screen, stImage->pt, 159427858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul stImage->face, stImage->level, 159527858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul destZ, 1596287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell PIPE_BIND_BLIT_DESTINATION); 1597145a45e9d6807add8229f1fc9c63fbb6951b1b88Brian Paul 1598145a45e9d6807add8229f1fc9c63fbb6951b1b88Brian Paul /* for surface_copy(), y=0=top, always */ 1599a479bf62353b6517841e620122112e7565d2391cBrian Paul pipe->surface_copy(pipe, 1600a479bf62353b6517841e620122112e7565d2391cBrian Paul /* dest */ 1601a479bf62353b6517841e620122112e7565d2391cBrian Paul dest_surface, 1602a479bf62353b6517841e620122112e7565d2391cBrian Paul destX, destY, 1603a479bf62353b6517841e620122112e7565d2391cBrian Paul /* src */ 1604a479bf62353b6517841e620122112e7565d2391cBrian Paul strb->surface, 1605a479bf62353b6517841e620122112e7565d2391cBrian Paul srcX, srcY, 1606a479bf62353b6517841e620122112e7565d2391cBrian Paul /* size */ 1607a479bf62353b6517841e620122112e7565d2391cBrian Paul width, height); 1608a479bf62353b6517841e620122112e7565d2391cBrian Paul use_fallback = GL_FALSE; 1609cc94863429d8a6cef8dbf861e78701a458d30f5aBrian Paul } 16108fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell else if (format_writemask && 1611e60ebebb392d1d4c47541766737b5a79685a24d5Brian Paul texBaseFormat != GL_DEPTH_COMPONENT && 1612e60ebebb392d1d4c47541766737b5a79685a24d5Brian Paul texBaseFormat != GL_DEPTH_STENCIL && 16138fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell screen->is_format_supported(screen, src_format, 16148aafc03b260ab8923f1b373f7effa75bcdb40a72José Fonseca PIPE_TEXTURE_2D, 1615287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell PIPE_BIND_SAMPLER_VIEW, 16168aafc03b260ab8923f1b373f7effa75bcdb40a72José Fonseca 0) && 16174e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul screen->is_format_supported(screen, dest_format, 16188aafc03b260ab8923f1b373f7effa75bcdb40a72José Fonseca PIPE_TEXTURE_2D, 1619287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell PIPE_BIND_RENDER_TARGET, 16208aafc03b260ab8923f1b373f7effa75bcdb40a72José Fonseca 0)) { 16214e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul /* draw textured quad to do the copy */ 1622eaca19edbbe7876079aa33d7f75d93601677081bBrian Paul GLint srcY0, srcY1; 162327858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul 162427858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul dest_surface = screen->get_tex_surface(screen, stImage->pt, 162527858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul stImage->face, stImage->level, 162627858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul destZ, 1627287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell PIPE_BIND_BLIT_DESTINATION); 162827858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul 1629a479bf62353b6517841e620122112e7565d2391cBrian Paul if (do_flip) { 1630a479bf62353b6517841e620122112e7565d2391cBrian Paul srcY1 = strb->Base.Height - srcY - height; 1631a479bf62353b6517841e620122112e7565d2391cBrian Paul srcY0 = srcY1 + height; 1632a479bf62353b6517841e620122112e7565d2391cBrian Paul } 1633a479bf62353b6517841e620122112e7565d2391cBrian Paul else { 1634a479bf62353b6517841e620122112e7565d2391cBrian Paul srcY0 = srcY; 1635a479bf62353b6517841e620122112e7565d2391cBrian Paul srcY1 = srcY0 + height; 1636a479bf62353b6517841e620122112e7565d2391cBrian Paul } 163776c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul util_blit_pixels_writemask(st->blit, 16388fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell strb->surface, 1639073048c872ea5893ad0c39b32ca171893c17148bBrian Paul st_get_renderbuffer_sampler_view(strb, pipe), 16408fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell srcX, srcY0, 16418fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell srcX + width, srcY1, 16428fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell dest_surface, 16438fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell destX, destY, 16448fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell destX + width, destY + height, 16458fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell 0.0, PIPE_TEX_MIPFILTER_NEAREST, 16468fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell format_writemask); 1647cc94863429d8a6cef8dbf861e78701a458d30f5aBrian Paul use_fallback = GL_FALSE; 16483c0dc8242b64518d5635263ba65b39afa919dd86Michel Dänzer } 164979931e38abc62286151121a3f59127e296144551Michel Dänzer 165027858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul if (dest_surface) 165127858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul pipe_surface_reference(&dest_surface, NULL); 1652038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian } 1653cc94863429d8a6cef8dbf861e78701a458d30f5aBrian Paul 1654cc94863429d8a6cef8dbf861e78701a458d30f5aBrian Paul if (use_fallback) { 16554e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul /* software fallback */ 1656038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian fallback_copy_texsubimage(ctx, target, level, 16574e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul strb, stImage, texBaseFormat, 1658038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian destX, destY, destZ, 1659038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian srcX, srcY, width, height); 1660038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian } 166124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 166224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 166324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1664038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian 166524df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 166624df8f895fe8807aa2ba058e71bd40adfc01d21eBrianst_CopyTexImage1D(GLcontext * ctx, GLenum target, GLint level, 166724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLenum internalFormat, 166824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLint x, GLint y, GLsizei width, GLint border) 166924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 167024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct gl_texture_unit *texUnit = 167124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian &ctx->Texture.Unit[ctx->Texture.CurrentUnit]; 167224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct gl_texture_object *texObj = 167324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian _mesa_select_tex_object(ctx, texUnit, target); 167424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct gl_texture_image *texImage = 167524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian _mesa_select_tex_image(ctx, texObj, target, level); 167624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1677753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer /* Setup or redefine the texture object, texture and texture 167824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * image. Don't populate yet. 167924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 168024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian ctx->Driver.TexImage1D(ctx, target, level, internalFormat, 168124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian width, border, 168224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GL_RGBA, CHAN_TYPE, NULL, 168324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian &ctx->DefaultPacking, texObj, texImage); 168424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 16854e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul st_copy_texsubimage(ctx, target, level, 16864e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul 0, 0, 0, /* destX,Y,Z */ 16874e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul x, y, width, 1); /* src X, Y, size */ 168824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 168924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 169024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 169124df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 169224df8f895fe8807aa2ba058e71bd40adfc01d21eBrianst_CopyTexImage2D(GLcontext * ctx, GLenum target, GLint level, 169324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLenum internalFormat, 169424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLint x, GLint y, GLsizei width, GLsizei height, 169524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLint border) 169624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 169724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct gl_texture_unit *texUnit = 169824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian &ctx->Texture.Unit[ctx->Texture.CurrentUnit]; 169924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct gl_texture_object *texObj = 170024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian _mesa_select_tex_object(ctx, texUnit, target); 170124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct gl_texture_image *texImage = 170224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian _mesa_select_tex_image(ctx, texObj, target, level); 170324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1704753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer /* Setup or redefine the texture object, texture and texture 170524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * image. Don't populate yet. 170624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 170724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian ctx->Driver.TexImage2D(ctx, target, level, internalFormat, 170824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian width, height, border, 170924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GL_RGBA, CHAN_TYPE, NULL, 171024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian &ctx->DefaultPacking, texObj, texImage); 171124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 17124e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul st_copy_texsubimage(ctx, target, level, 17134e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul 0, 0, 0, /* destX,Y,Z */ 17144e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul x, y, width, height); /* src X, Y, size */ 171524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 171624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 171724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 171824df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 171924df8f895fe8807aa2ba058e71bd40adfc01d21eBrianst_CopyTexSubImage1D(GLcontext * ctx, GLenum target, GLint level, 172024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLint xoffset, GLint x, GLint y, GLsizei width) 172124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 1722038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian const GLint yoffset = 0, zoffset = 0; 1723038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian const GLsizei height = 1; 17244e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul st_copy_texsubimage(ctx, target, level, 17254e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul xoffset, yoffset, zoffset, /* destX,Y,Z */ 17264e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul x, y, width, height); /* src X, Y, size */ 172724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 172824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 172924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 173024df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 173124df8f895fe8807aa2ba058e71bd40adfc01d21eBrianst_CopyTexSubImage2D(GLcontext * ctx, GLenum target, GLint level, 173224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLint xoffset, GLint yoffset, 173324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLint x, GLint y, GLsizei width, GLsizei height) 173424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 1735038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian const GLint zoffset = 0; 17364e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul st_copy_texsubimage(ctx, target, level, 17374e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul xoffset, yoffset, zoffset, /* destX,Y,Z */ 17384e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul x, y, width, height); /* src X, Y, size */ 1739038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian} 174024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 174124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1742038cb561eb094af2f2ba06e18e61246fc0c87c3cBrianstatic void 1743038cb561eb094af2f2ba06e18e61246fc0c87c3cBrianst_CopyTexSubImage3D(GLcontext * ctx, GLenum target, GLint level, 1744038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian GLint xoffset, GLint yoffset, GLint zoffset, 1745038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian GLint x, GLint y, GLsizei width, GLsizei height) 1746038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian{ 17474e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul st_copy_texsubimage(ctx, target, level, 17484e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul xoffset, yoffset, zoffset, /* destX,Y,Z */ 17494e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul x, y, width, height); /* src X, Y, size */ 175024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 175124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 175224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1753e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul/** 1754e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul * Copy image data from stImage into the texture object 'stObj' at level 1755e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul * 'dstLevel'. 1756e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul */ 175724df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 1758753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzercopy_image_data_to_texture(struct st_context *st, 1759753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer struct st_texture_object *stObj, 17604da1cdf78fa3b954840650fa46cf72da5daf149fBrian GLuint dstLevel, 1761753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer struct st_texture_image *stImage) 176224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 1763e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul /* debug checks */ 1764e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul { 1765e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul const struct gl_texture_image *dstImage = 1766e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul stObj->base.Image[stImage->face][stImage->level]; 1767e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul assert(dstImage); 1768e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul assert(dstImage->Width == stImage->base.Width); 1769e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul assert(dstImage->Height == stImage->base.Height); 1770e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul assert(dstImage->Depth == stImage->base.Depth); 1771e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul } 1772e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul 1773753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer if (stImage->pt) { 177424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian /* Copy potentially with the blitter: 177524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 1776753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer st_texture_image_copy(st->pipe, 17774da1cdf78fa3b954840650fa46cf72da5daf149fBrian stObj->pt, dstLevel, /* dest texture, level */ 17784da1cdf78fa3b954840650fa46cf72da5daf149fBrian stImage->pt, /* src texture */ 1779b628950662a97452e539bcc704bd2acee70f8355Brian Paul stImage->face); 178024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1781287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(&stImage->pt, NULL); 178224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 17834c50969334844bc9aa622176c3ebcbc733394f78Brian Paul else if (stImage->base.Data) { 178424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian /* More straightforward upload. 178524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 17869b75627fab5bf2ea90f27ddd31b60c54895f6de6Thomas Hellstrom st_teximage_flush_before_map(st, stObj->pt, stImage->face, dstLevel, 17879b75627fab5bf2ea90f27ddd31b60c54895f6de6Thomas Hellstrom PIPE_TRANSFER_WRITE); 17889b75627fab5bf2ea90f27ddd31b60c54895f6de6Thomas Hellstrom 1789e50dd26ca6d0eb0d0f97c2780020ea16e3d4a687Thomas Hellstrom st_texture_image_data(st, 17905facd7986ace899673499f396897469720476799Brian Paul stObj->pt, 17915facd7986ace899673499f396897469720476799Brian Paul stImage->face, 17925facd7986ace899673499f396897469720476799Brian Paul dstLevel, 17935facd7986ace899673499f396897469720476799Brian Paul stImage->base.Data, 17945facd7986ace899673499f396897469720476799Brian Paul stImage->base.RowStride * 1795b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol util_format_get_blocksize(stObj->pt->format), 17965facd7986ace899673499f396897469720476799Brian Paul stImage->base.RowStride * 17975facd7986ace899673499f396897469720476799Brian Paul stImage->base.Height * 1798b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol util_format_get_blocksize(stObj->pt->format)); 179924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian _mesa_align_free(stImage->base.Data); 180024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian stImage->base.Data = NULL; 180124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 180224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1803287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(&stImage->pt, stObj->pt); 180424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 180524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 180624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1807afc54983370033b65e3a7cbb29bd9c87156f0881Brian/** 1808afc54983370033b65e3a7cbb29bd9c87156f0881Brian * Called during state validation. When this function is finished, 1809afc54983370033b65e3a7cbb29bd9c87156f0881Brian * the texture object should be ready for rendering. 18103b3774b1227743147159676795b542c0eb7c2bdfBrian Paul * \return GL_TRUE for success, GL_FALSE for failure (out of mem) 181124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 181214b98343309fdcff3514f05020303f7b40e83a4aBrianGLboolean 1813753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzerst_finalize_texture(GLcontext *ctx, 1814c3af68dc5022715cc8f126b7df12f3f5248aefe7Keith Whitwell struct pipe_context *pipe, 1815c3af68dc5022715cc8f126b7df12f3f5248aefe7Keith Whitwell struct gl_texture_object *tObj, 1816753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer GLboolean *needFlush) 181724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 181876c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul struct st_context *st = st_context(ctx); 181914b98343309fdcff3514f05020303f7b40e83a4aBrian struct st_texture_object *stObj = st_texture_object(tObj); 1820afc54983370033b65e3a7cbb29bd9c87156f0881Brian const GLuint nr_faces = (stObj->base.Target == GL_TEXTURE_CUBE_MAP) ? 6 : 1; 1821e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul GLuint face; 182224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct st_texture_image *firstImage; 1823e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul enum pipe_format firstImageFormat; 182424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 182524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian *needFlush = GL_FALSE; 182624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1827e3a6f57ad6c0e7bda5d45eb146194ed39f45abddBrian Paul if (stObj->base._Complete) { 1828e3a6f57ad6c0e7bda5d45eb146194ed39f45abddBrian Paul /* The texture is complete and we know exactly how many mipmap levels 1829e3a6f57ad6c0e7bda5d45eb146194ed39f45abddBrian Paul * are present/needed. This is conditional because we may be called 1830e3a6f57ad6c0e7bda5d45eb146194ed39f45abddBrian Paul * from the st_generate_mipmap() function when the texture object is 1831e3a6f57ad6c0e7bda5d45eb146194ed39f45abddBrian Paul * incomplete. In that case, we'll have set stObj->lastLevel before 1832e3a6f57ad6c0e7bda5d45eb146194ed39f45abddBrian Paul * we get here. 1833e3a6f57ad6c0e7bda5d45eb146194ed39f45abddBrian Paul */ 1834ae2daacbac7242938cffe0e2409071e030e00863Cooper Yuan if (stObj->base.MinFilter == GL_LINEAR || 1835ae2daacbac7242938cffe0e2409071e030e00863Cooper Yuan stObj->base.MinFilter == GL_NEAREST) 1836ae2daacbac7242938cffe0e2409071e030e00863Cooper Yuan stObj->lastLevel = stObj->base.BaseLevel; 1837ae2daacbac7242938cffe0e2409071e030e00863Cooper Yuan else 1838e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul stObj->lastLevel = stObj->base._MaxLevel; 1839e3a6f57ad6c0e7bda5d45eb146194ed39f45abddBrian Paul } 184024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 18414da1cdf78fa3b954840650fa46cf72da5daf149fBrian firstImage = st_texture_image(stObj->base.Image[0][stObj->base.BaseLevel]); 1842e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul assert(firstImage); 184324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1844753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer /* If both firstImage and stObj point to a texture which can contain 184524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * all active images, favour firstImage. Note that because of the 184624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * completeness requirement, we know that the image dimensions 184724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * will match. 184824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 1849753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer if (firstImage->pt && 1850753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer firstImage->pt != stObj->pt && 1851753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer firstImage->pt->last_level >= stObj->lastLevel) { 1852287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(&stObj->pt, firstImage->pt); 185340c3861e1e98116c573027b054a6a05208c53b6aMichal Krol pipe_sampler_view_reference(&stObj->sampler_view, NULL); 185424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 185524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1856e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul /* Find gallium format for the Mesa texture */ 1857e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul firstImageFormat = st_mesa_format_to_pipe_format(firstImage->base.TexFormat); 185824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1859ce509401738e7073de94a2b7fc41461c52a73da0Brian Paul /* If we already have a gallium texture, check that it matches the texture 1860ce509401738e7073de94a2b7fc41461c52a73da0Brian Paul * object's format, target, size, num_levels, etc. 186124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 1862809dd9089bae70cf35cea6a75258e700e7455738Brian Paul if (stObj->pt) { 1863809dd9089bae70cf35cea6a75258e700e7455738Brian Paul if (stObj->pt->target != gl_target_to_pipe(stObj->base.Target) || 1864e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul stObj->pt->format != firstImageFormat || 1865529b7b355d392b1534ccd8ff7b428dc21cbfdc21Brian Paul stObj->pt->last_level < stObj->lastLevel || 1866e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul stObj->pt->width0 != stObj->width0 || 1867e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul stObj->pt->height0 != stObj->height0 || 1868e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul stObj->pt->depth0 != stObj->depth0) 1869311f77198e171e9ce8ddcce91fd6a894fff1f14fBrian Paul { 1870e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul /* The gallium texture does not match the Mesa texture so delete the 1871e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul * gallium texture now. We'll make a new one below. 1872e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul */ 1873287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(&stObj->pt, NULL); 187440c3861e1e98116c573027b054a6a05208c53b6aMichal Krol pipe_sampler_view_reference(&stObj->sampler_view, NULL); 187576c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul st->dirty.st |= ST_NEW_FRAMEBUFFER; 1876809dd9089bae70cf35cea6a75258e700e7455738Brian Paul } 187724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 187824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1879ce509401738e7073de94a2b7fc41461c52a73da0Brian Paul /* May need to create a new gallium texture: 188024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 1881753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer if (!stObj->pt) { 1882e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul GLuint bindings = default_bindings(st, firstImageFormat); 18831ad2484f03cbe9ae6bd4ebe50d6894e570d65952Brian Paul 188476c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul stObj->pt = st_texture_create(st, 18855390a43ce06b27f6d54bc5f237aa305b6948f2afBrian gl_target_to_pipe(stObj->base.Target), 1886e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul firstImageFormat, 1887b245840b86cf877c9b8d666edf229364a84f1deaBrian stObj->lastLevel, 1888e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul stObj->width0, 1889e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul stObj->height0, 1890e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul stObj->depth0, 18918283db88414f600e66510de713382c36899d4b03Brian Paul bindings); 1892a73ae3d5eb8419feab5aea26573aa41b72f941ebKeith Whitwell 18933b3774b1227743147159676795b542c0eb7c2bdfBrian Paul if (!stObj->pt) { 18943b3774b1227743147159676795b542c0eb7c2bdfBrian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage"); 18953b3774b1227743147159676795b542c0eb7c2bdfBrian Paul return GL_FALSE; 18963b3774b1227743147159676795b542c0eb7c2bdfBrian Paul } 189724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 189824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1899753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer /* Pull in any images not in the object's texture: 190024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 190124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian for (face = 0; face < nr_faces; face++) { 19024da1cdf78fa3b954840650fa46cf72da5daf149fBrian GLuint level; 19034da1cdf78fa3b954840650fa46cf72da5daf149fBrian for (level = 0; level <= stObj->lastLevel; level++) { 190424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct st_texture_image *stImage = 1905e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul st_texture_image(stObj->base.Image[face][level]); 190624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1907753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer /* Need to import images in main memory or held in other textures. 190824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 1909a34b43b3f4817268ef4b3f186203b5fbafc7214eBrian if (stImage && stObj->pt != stImage->pt) { 191076c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul copy_image_data_to_texture(st, stObj, level, stImage); 191124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian *needFlush = GL_TRUE; 191224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 191324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 191424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 191524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 191624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian return GL_TRUE; 191724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 191824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 191924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 19208f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul/** 19218f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul * Returns pointer to a default/dummy texture. 19228f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul * This is typically used when the current shader has tex/sample instructions 19238f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul * but the user has not provided a (any) texture(s). 19248f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul */ 19258f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paulstruct gl_texture_object * 19268f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paulst_get_default_texture(struct st_context *st) 19278f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul{ 19288f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul if (!st->default_texture) { 19298f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul static const GLenum target = GL_TEXTURE_2D; 19308f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul GLubyte pixels[16][16][4]; 19318f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul struct gl_texture_object *texObj; 19328f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul struct gl_texture_image *texImg; 19332002e03a5232c54988161cb629966bdce19d35deBrian Paul GLuint i, j; 19348f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul 19352002e03a5232c54988161cb629966bdce19d35deBrian Paul /* The ARB_fragment_program spec says (0,0,0,1) should be returned 19362002e03a5232c54988161cb629966bdce19d35deBrian Paul * when attempting to sample incomplete textures. 19372002e03a5232c54988161cb629966bdce19d35deBrian Paul */ 19382002e03a5232c54988161cb629966bdce19d35deBrian Paul for (i = 0; i < 16; i++) { 19392002e03a5232c54988161cb629966bdce19d35deBrian Paul for (j = 0; j < 16; j++) { 19402002e03a5232c54988161cb629966bdce19d35deBrian Paul pixels[i][j][0] = 0; 19412002e03a5232c54988161cb629966bdce19d35deBrian Paul pixels[i][j][1] = 0; 19422002e03a5232c54988161cb629966bdce19d35deBrian Paul pixels[i][j][2] = 0; 19432002e03a5232c54988161cb629966bdce19d35deBrian Paul pixels[i][j][3] = 255; 19442002e03a5232c54988161cb629966bdce19d35deBrian Paul } 19452002e03a5232c54988161cb629966bdce19d35deBrian Paul } 1946a7b818d53a95b549bbff942a9cb91272e0799dd5Brian Paul 19478f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul texObj = st->ctx->Driver.NewTextureObject(st->ctx, 0, target); 19488f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul 19498f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul texImg = _mesa_get_tex_image(st->ctx, texObj, target, 0); 19508f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul 19518f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul _mesa_init_teximage_fields(st->ctx, target, texImg, 19528f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul 16, 16, 1, 0, /* w, h, d, border */ 19538f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul GL_RGBA); 19548f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul 19558f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul st_TexImage(st->ctx, 2, target, 19568f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul 0, GL_RGBA, /* level, intformat */ 19578f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul 16, 16, 1, 0, /* w, h, d, border */ 19588f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul GL_RGBA, GL_UNSIGNED_BYTE, pixels, 19598f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul &st->ctx->DefaultPacking, 19608f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul texObj, texImg, 19618f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul 0, 0); 19628f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul 19638f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul texObj->MinFilter = GL_NEAREST; 19648f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul texObj->MagFilter = GL_NEAREST; 19658f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul texObj->_Complete = GL_TRUE; 19668f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul 19678f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul st->default_texture = texObj; 19688f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul } 19698f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul return st->default_texture; 19708f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul} 19718f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul 19728f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul 19736da9234fd437f97267e7831f034c78b31156d939Brianvoid 19746da9234fd437f97267e7831f034c78b31156d939Brianst_init_texture_functions(struct dd_function_table *functions) 197524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 197624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->ChooseTextureFormat = st_ChooseTextureFormat; 197724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->TexImage1D = st_TexImage1D; 197824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->TexImage2D = st_TexImage2D; 197924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->TexImage3D = st_TexImage3D; 198024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->TexSubImage1D = st_TexSubImage1D; 198124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->TexSubImage2D = st_TexSubImage2D; 198224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->TexSubImage3D = st_TexSubImage3D; 1983578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz functions->CompressedTexSubImage1D = st_CompressedTexSubImage1D; 1984a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz functions->CompressedTexSubImage2D = st_CompressedTexSubImage2D; 1985578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz functions->CompressedTexSubImage3D = st_CompressedTexSubImage3D; 198624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->CopyTexImage1D = st_CopyTexImage1D; 198724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->CopyTexImage2D = st_CopyTexImage2D; 198824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->CopyTexSubImage1D = st_CopyTexSubImage1D; 198924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->CopyTexSubImage2D = st_CopyTexSubImage2D; 1990038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian functions->CopyTexSubImage3D = st_CopyTexSubImage3D; 199162abcb9aacc33218d0143a743c738435794b32a9Brian functions->GenerateMipmap = st_generate_mipmap; 1992038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian 199324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->GetTexImage = st_GetTexImage; 199424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 199524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian /* compressed texture functions */ 199624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->CompressedTexImage2D = st_CompressedTexImage2D; 199724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->GetCompressedTexImage = st_GetCompressedTexImage; 199824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 199924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->NewTextureObject = st_NewTextureObject; 200024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->NewTextureImage = st_NewTextureImage; 200124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->DeleteTexture = st_DeleteTextureObject; 200224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->FreeTexImageData = st_FreeTextureImageData; 200324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->UpdateTexturePalette = 0; 200424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 200524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->TextureMemCpy = do_memcpy; 2006f8549e8f4f8bdfebcb4e0a2754df59b3fe4fdff7Brian 2007f8549e8f4f8bdfebcb4e0a2754df59b3fe4fdff7Brian /* XXX Temporary until we can query pipe's texture sizes */ 2008f8549e8f4f8bdfebcb4e0a2754df59b3fe4fdff7Brian functions->TestProxyTexImage = _mesa_test_proxy_teximage; 200924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 2010