st_cb_texture.c revision 41b8a2e9391cd85a65ba30a7e5f5068b5767d58a
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 * 25924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 26024df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 261753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzerguess_and_alloc_texture(struct st_context *st, 262753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer struct st_texture_object *stObj, 263afc54983370033b65e3a7cbb29bd9c87156f0881Brian const struct st_texture_image *stImage) 26424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 265e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul const GLuint dims = get_texture_dims(stObj->base.Target); 266e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul GLuint level, lastLevel, width, height, depth; 267e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul GLuint bindings; 268a1f95a8bf64f863289b6759caeec76d7e054400eRoland Scheidegger enum pipe_format fmt; 26924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 27024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian DBG("%s\n", __FUNCTION__); 27124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 272f52f5136e6eed23e55098681e5b082cc452136d6Brian assert(!stObj->pt); 273f52f5136e6eed23e55098681e5b082cc452136d6Brian 274e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul level = stImage->level; 275e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul width = stImage->base.Width2; /* size w/out border */ 276e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul height = stImage->base.Height2; 277e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul depth = stImage->base.Depth2; 27824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 279e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul assert(width > 0); 280e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul assert(height > 0); 281e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul assert(depth > 0); 28224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 283e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul /* Depending on the image's size, we can't always make a guess here. 28424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 285e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul if (level > 0) { 286e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul if ( (dims >= 1 && width == 1) || 287e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul (dims >= 2 && height == 1) || 288e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul (dims >= 3 && depth == 1) ) { 289e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul /* we can't determine the image size at level=0 */ 290e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul stObj->width0 = stObj->height0 = stObj->depth0 = 0; 291e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul return; 292e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul } 293e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul } 294e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul 295e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul /* grow the image size until we hit level = 0 */ 296e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul while (level > 0) { 29745cc35e77600af8628393475405160e26d56d421Brian Paul if (width != 1) 29845cc35e77600af8628393475405160e26d56d421Brian Paul width <<= 1; 29924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian if (height != 1) 30024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian height <<= 1; 30124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian if (depth != 1) 30224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian depth <<= 1; 303e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul level--; 304e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul } 30524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 306e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul assert(level == 0); 307e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul 308e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul /* At this point, (width x height x depth) is the expected size of 309e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul * the level=0 mipmap image. 310e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul */ 311296378b6c8b205048244746e260739448c4ee590Brian Paul 3124b7812919a5db2f72bd3b9f6d760ffeb469ee3e4Brian Paul /* Guess a reasonable value for lastLevel. With OpenGL we have no 3134b7812919a5db2f72bd3b9f6d760ffeb469ee3e4Brian Paul * idea how many mipmap levels will be in a texture until we start 3144b7812919a5db2f72bd3b9f6d760ffeb469ee3e4Brian Paul * to render with it. Make an educated guess here but be prepared 3154b7812919a5db2f72bd3b9f6d760ffeb469ee3e4Brian Paul * to re-allocating a texture buffer with space for more (or fewer) 3164b7812919a5db2f72bd3b9f6d760ffeb469ee3e4Brian Paul * mipmap levels later. 31724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 31814b98343309fdcff3514f05020303f7b40e83a4aBrian if ((stObj->base.MinFilter == GL_NEAREST || 3192a2236606fd6ae473a2f4db6ef6d3d5030261316José Fonseca stObj->base.MinFilter == GL_LINEAR || 3202a2236606fd6ae473a2f4db6ef6d3d5030261316José Fonseca stImage->base._BaseFormat == GL_DEPTH_COMPONENT || 3212a2236606fd6ae473a2f4db6ef6d3d5030261316José Fonseca stImage->base._BaseFormat == GL_DEPTH_STENCIL_EXT) && 32205bad193f56d48384097e37e47fae3fdda85f144Brian Paul !stObj->base.GenerateMipmap && 323e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul stImage->level == 0) { 32405bad193f56d48384097e37e47fae3fdda85f144Brian Paul /* only alloc space for a single mipmap level */ 325e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul lastLevel = 0; 32624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 32724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian else { 32805bad193f56d48384097e37e47fae3fdda85f144Brian Paul /* alloc space for a full mipmap */ 329c1785c19ca0716a7e85777242949a0c33e28988fPatrice Mandin GLuint l2width = util_logbase2(width); 330c1785c19ca0716a7e85777242949a0c33e28988fPatrice Mandin GLuint l2height = util_logbase2(height); 331c1785c19ca0716a7e85777242949a0c33e28988fPatrice Mandin GLuint l2depth = util_logbase2(depth); 332e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul lastLevel = MAX2(MAX2(l2width, l2height), l2depth); 33324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 33424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 335e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul /* Save the level=0 dimensions */ 336e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul stObj->width0 = width; 337e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul stObj->height0 = height; 338e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul stObj->depth0 = depth; 339e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul 3401f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul fmt = st_mesa_format_to_pipe_format(stImage->base.TexFormat); 3411ad2484f03cbe9ae6bd4ebe50d6894e570d65952Brian Paul 3428283db88414f600e66510de713382c36899d4b03Brian Paul bindings = default_bindings(st, fmt); 3431ad2484f03cbe9ae6bd4ebe50d6894e570d65952Brian Paul 344753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer stObj->pt = st_texture_create(st, 3455390a43ce06b27f6d54bc5f237aa305b6948f2afBrian gl_target_to_pipe(stObj->base.Target), 346a1f95a8bf64f863289b6759caeec76d7e054400eRoland Scheidegger fmt, 3475390a43ce06b27f6d54bc5f237aa305b6948f2afBrian lastLevel, 3485390a43ce06b27f6d54bc5f237aa305b6948f2afBrian width, 3495390a43ce06b27f6d54bc5f237aa305b6948f2afBrian height, 3505390a43ce06b27f6d54bc5f237aa305b6948f2afBrian depth, 3518283db88414f600e66510de713382c36899d4b03Brian Paul bindings); 35224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 35324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian DBG("%s - success\n", __FUNCTION__); 35424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 35524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 35624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 357212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian/** 358212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian * Adjust pixel unpack params and image dimensions to strip off the 359212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian * texture border. 360212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian * Gallium doesn't support texture borders. They've seldem been used 361212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian * and seldom been implemented correctly anyway. 362212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian * \param unpackNew returns the new pixel unpack parameters 363212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian */ 364212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brianstatic void 365212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brianstrip_texture_border(GLint border, 366212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian GLint *width, GLint *height, GLint *depth, 367212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian const struct gl_pixelstore_attrib *unpack, 368212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian struct gl_pixelstore_attrib *unpackNew) 369212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian{ 370212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian assert(border > 0); /* sanity check */ 371212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian 372212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian *unpackNew = *unpack; 373212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian 374212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian if (unpackNew->RowLength == 0) 375212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian unpackNew->RowLength = *width; 376212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian 377212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian if (depth && unpackNew->ImageHeight == 0) 378212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian unpackNew->ImageHeight = *height; 379212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian 380212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian unpackNew->SkipPixels += border; 381212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian if (height) 382212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian unpackNew->SkipRows += border; 383212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian if (depth) 384212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian unpackNew->SkipImages += border; 385212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian 386212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian assert(*width >= 3); 387212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian *width = *width - 2 * border; 388212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian if (height && *height >= 3) 389212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian *height = *height - 2 * border; 390212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian if (depth && *depth >= 3) 391212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian *depth = *depth - 2 * border; 392212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian} 393212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian 39424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 3954e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul/** 39655ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz * Try to do texture compression via rendering. If the Gallium driver 39755ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz * can render into a compressed surface this will allow us to do texture 39855ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz * compression. 39955ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz * \return GL_TRUE for success, GL_FALSE for failure 40055ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz */ 40155ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantzstatic GLboolean 40255ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantzcompress_with_blit(GLcontext * ctx, 40355ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz GLenum target, GLint level, 40455ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz GLint xoffset, GLint yoffset, GLint zoffset, 40555ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz GLint width, GLint height, GLint depth, 40655ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz GLenum format, GLenum type, const void *pixels, 40755ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz const struct gl_pixelstore_attrib *unpack, 40855ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz struct gl_texture_image *texImage) 40955ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz{ 41055ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz const GLuint dstImageOffsets[1] = {0}; 41155ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz struct st_texture_image *stImage = st_texture_image(texImage); 41276c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul struct st_context *st = st_context(ctx); 41376c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul struct pipe_context *pipe = st->pipe; 414b43c182f19c6291c88420fa12714f952c2b461fbKeith Whitwell struct pipe_screen *screen = pipe->screen; 4151f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul gl_format mesa_format; 416287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct pipe_resource templ; 417287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct pipe_resource *src_tex; 4188f55a95178069d5e8b18647e6b675fc403d68073Roland Scheidegger struct pipe_sampler_view view_templ; 4198f55a95178069d5e8b18647e6b675fc403d68073Roland Scheidegger struct pipe_sampler_view *src_view; 42055ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz struct pipe_surface *dst_surface; 42155ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz struct pipe_transfer *tex_xfer; 42255ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz void *map; 42355ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz 42455ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz if (!stImage->pt) { 42555ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz /* XXX: Can this happen? Should we assert? */ 42655ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz return GL_FALSE; 42755ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz } 42855ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz 42955ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz /* get destination surface (in the compressed texture) */ 43055ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz dst_surface = screen->get_tex_surface(screen, stImage->pt, 43155ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz stImage->face, stImage->level, 0, 432287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell PIPE_BIND_BLIT_DESTINATION); 43355ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz if (!dst_surface) { 43455ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz /* can't render into this format (or other problem) */ 43555ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz return GL_FALSE; 43655ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz } 43755ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz 43855ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz /* Choose format for the temporary RGBA texture image. 43955ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz */ 44055ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz mesa_format = st_ChooseTextureFormat(ctx, GL_RGBA, format, type); 44155ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz assert(mesa_format); 44255ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz if (!mesa_format) 44355ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz return GL_FALSE; 44455ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz 44555ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz /* Create the temporary source texture 44655ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz */ 44755ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz memset(&templ, 0, sizeof(templ)); 44855ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz templ.target = PIPE_TEXTURE_2D; 4491f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul templ.format = st_mesa_format_to_pipe_format(mesa_format); 450683e35f726a182ed9fc6b6d5cb07146eebe14deaKeith Whitwell templ.width0 = width; 451683e35f726a182ed9fc6b6d5cb07146eebe14deaKeith Whitwell templ.height0 = height; 452683e35f726a182ed9fc6b6d5cb07146eebe14deaKeith Whitwell templ.depth0 = 1; 45355ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz templ.last_level = 0; 454a2a01853f3f40b4ef8b3f01503391877960bdaeeBrian Paul templ.usage = PIPE_USAGE_DEFAULT; 455287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell templ.bind = PIPE_BIND_SAMPLER_VIEW; 456287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell src_tex = screen->resource_create(screen, &templ); 45755ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz 45855ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz if (!src_tex) 45955ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz return GL_FALSE; 46055ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz 46155ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz /* Put user's tex data into the temporary texture 46255ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz */ 463e50dd26ca6d0eb0d0f97c2780020ea16e3d4a687Thomas Hellstrom tex_xfer = st_cond_flush_get_tex_transfer(st_context(ctx), src_tex, 4645ed7764fd6354da8e2be15d6fb724c2d6be9be4aKeith Whitwell 0, 0, 0, /* face, level are zero */ 465e50dd26ca6d0eb0d0f97c2780020ea16e3d4a687Thomas Hellstrom PIPE_TRANSFER_WRITE, 466e50dd26ca6d0eb0d0f97c2780020ea16e3d4a687Thomas Hellstrom 0, 0, width, height); /* x, y, w, h */ 467287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell map = pipe_transfer_map(pipe, tex_xfer); 46855ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz 4696480210b89dc8ae0990c450d27870c7b7930f251Brian Paul _mesa_texstore(ctx, 2, GL_RGBA, mesa_format, 4706480210b89dc8ae0990c450d27870c7b7930f251Brian Paul map, /* dest ptr */ 4716480210b89dc8ae0990c450d27870c7b7930f251Brian Paul 0, 0, 0, /* dest x/y/z offset */ 4726480210b89dc8ae0990c450d27870c7b7930f251Brian Paul tex_xfer->stride, /* dest row stride (bytes) */ 4736480210b89dc8ae0990c450d27870c7b7930f251Brian Paul dstImageOffsets, /* image offsets (for 3D only) */ 4746480210b89dc8ae0990c450d27870c7b7930f251Brian Paul width, height, 1, /* size */ 4756480210b89dc8ae0990c450d27870c7b7930f251Brian Paul format, type, /* source format/type */ 4766480210b89dc8ae0990c450d27870c7b7930f251Brian Paul pixels, /* source data */ 4776480210b89dc8ae0990c450d27870c7b7930f251Brian Paul unpack); /* source data packing */ 47855ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz 479287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_transfer_unmap(pipe, tex_xfer); 480287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe->transfer_destroy(pipe, tex_xfer); 48155ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz 4828f55a95178069d5e8b18647e6b675fc403d68073Roland Scheidegger /* Create temporary sampler view */ 4838f55a95178069d5e8b18647e6b675fc403d68073Roland Scheidegger u_sampler_view_default_template(&view_templ, 4848f55a95178069d5e8b18647e6b675fc403d68073Roland Scheidegger src_tex, 4858f55a95178069d5e8b18647e6b675fc403d68073Roland Scheidegger src_tex->format); 4868f55a95178069d5e8b18647e6b675fc403d68073Roland Scheidegger src_view = pipe->create_sampler_view(pipe, src_tex, &view_templ); 4878f55a95178069d5e8b18647e6b675fc403d68073Roland Scheidegger 4888f55a95178069d5e8b18647e6b675fc403d68073Roland Scheidegger 48955ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz /* copy / compress image */ 49076c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul util_blit_pixels_tex(st->blit, 4918f55a95178069d5e8b18647e6b675fc403d68073Roland Scheidegger src_view, /* sampler view (src) */ 49255ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz 0, 0, /* src x0, y0 */ 49355ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz width, height, /* src x1, y1 */ 49455ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz dst_surface, /* pipe_surface (dst) */ 49555ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz xoffset, yoffset, /* dst x0, y0 */ 49655ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz xoffset + width, /* dst x1 */ 49755ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz yoffset + height, /* dst y1 */ 49855ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz 0.0, /* z */ 49955ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz PIPE_TEX_MIPFILTER_NEAREST); 50055ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz 50155ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz pipe_surface_reference(&dst_surface, NULL); 502287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(&src_tex, NULL); 5038f55a95178069d5e8b18647e6b675fc403d68073Roland Scheidegger pipe_sampler_view_reference(&src_view, NULL); 50455ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz 50555ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz return GL_TRUE; 50655ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz} 50755ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz 50855ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz 50955ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz/** 5104e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul * Do glTexImage1/2/3D(). 5114e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul */ 51224df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 51324df8f895fe8807aa2ba058e71bd40adfc01d21eBrianst_TexImage(GLcontext * ctx, 514afc54983370033b65e3a7cbb29bd9c87156f0881Brian GLint dims, 515afc54983370033b65e3a7cbb29bd9c87156f0881Brian GLenum target, GLint level, 516afc54983370033b65e3a7cbb29bd9c87156f0881Brian GLint internalFormat, 517afc54983370033b65e3a7cbb29bd9c87156f0881Brian GLint width, GLint height, GLint depth, 518afc54983370033b65e3a7cbb29bd9c87156f0881Brian GLint border, 519afc54983370033b65e3a7cbb29bd9c87156f0881Brian GLenum format, GLenum type, const void *pixels, 520afc54983370033b65e3a7cbb29bd9c87156f0881Brian const struct gl_pixelstore_attrib *unpack, 521afc54983370033b65e3a7cbb29bd9c87156f0881Brian struct gl_texture_object *texObj, 522afc54983370033b65e3a7cbb29bd9c87156f0881Brian struct gl_texture_image *texImage, 52355ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz GLsizei imageSize, GLboolean compressed_src) 52424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 52576c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul struct st_context *st = st_context(ctx); 52676c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul struct pipe_screen *screen = st->pipe->screen; 52714b98343309fdcff3514f05020303f7b40e83a4aBrian struct st_texture_object *stObj = st_texture_object(texObj); 52814b98343309fdcff3514f05020303f7b40e83a4aBrian struct st_texture_image *stImage = st_texture_image(texImage); 5295a8e1ddf193bb25c5cf05b70088c64ede772d7e9Brian Paul GLuint dstRowStride = 0; 530212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian struct gl_pixelstore_attrib unpackNB; 5315a8e1ddf193bb25c5cf05b70088c64ede772d7e9Brian Paul enum pipe_transfer_usage transfer_usage = 0; 53224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 53324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian DBG("%s target %s level %d %dx%dx%d border %d\n", __FUNCTION__, 53424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian _mesa_lookup_enum_by_nr(target), level, width, height, depth, border); 53524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 536b02619914eed4bdb5c8bb2239c6e3b9639ed00f6Brian Paul /* The Mesa/Gallium state tracker does not implement the imaging extensions 537b02619914eed4bdb5c8bb2239c6e3b9639ed00f6Brian Paul * such as convolution. 538b02619914eed4bdb5c8bb2239c6e3b9639ed00f6Brian Paul */ 539b02619914eed4bdb5c8bb2239c6e3b9639ed00f6Brian Paul assert(!ctx->Extensions.ARB_imaging); 540b02619914eed4bdb5c8bb2239c6e3b9639ed00f6Brian Paul assert(!ctx->Extensions.EXT_convolution); 541b02619914eed4bdb5c8bb2239c6e3b9639ed00f6Brian Paul 54254a7115fc27c640e2b3f1a362e8e07aac220556dChia-I Wu /* switch to "normal" */ 54354a7115fc27c640e2b3f1a362e8e07aac220556dChia-I Wu if (stObj->surface_based) { 54454a7115fc27c640e2b3f1a362e8e07aac220556dChia-I Wu _mesa_clear_texture_object(ctx, texObj); 54554a7115fc27c640e2b3f1a362e8e07aac220556dChia-I Wu stObj->surface_based = GL_FALSE; 54654a7115fc27c640e2b3f1a362e8e07aac220556dChia-I Wu } 54754a7115fc27c640e2b3f1a362e8e07aac220556dChia-I Wu 548212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian /* gallium does not support texture borders, strip it off */ 549212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian if (border) { 5505facd7986ace899673499f396897469720476799Brian Paul strip_texture_border(border, &width, &height, &depth, unpack, &unpackNB); 551212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian unpack = &unpackNB; 55221989edd55409d72ee55187f4f9062496ca3fbf8Brian Paul texImage->Width = width; 55321989edd55409d72ee55187f4f9062496ca3fbf8Brian Paul texImage->Height = height; 55421989edd55409d72ee55187f4f9062496ca3fbf8Brian Paul texImage->Depth = depth; 55521989edd55409d72ee55187f4f9062496ca3fbf8Brian Paul texImage->Border = 0; 556212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian border = 0; 557212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian } 558212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian 559cfe9e66f2bc596c43760911e7c1604bb32cdee28Brian stImage->face = _mesa_tex_target_to_face(target); 56014b98343309fdcff3514f05020303f7b40e83a4aBrian stImage->level = level; 56124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 56224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian _mesa_set_fetch_functions(texImage, dims); 56324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 56424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian /* Release the reference to a potentially orphaned buffer. 56524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * Release any old malloced memory. 56624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 567753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer if (stImage->pt) { 568287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(&stImage->pt, NULL); 56924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian assert(!texImage->Data); 57024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 57124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian else if (texImage->Data) { 57224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian _mesa_align_free(texImage->Data); 57324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 57424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 575bdf975e9ad25ee65d796a3c1ce3f2afbd2889c4eBrian Paul /* 576bdf975e9ad25ee65d796a3c1ce3f2afbd2889c4eBrian Paul * See if the new image is somehow incompatible with the existing 577bdf975e9ad25ee65d796a3c1ce3f2afbd2889c4eBrian Paul * mipmap. If so, free the old mipmap. 57824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 579a0509f7d28765c6ef8546eafba94aec46d9e7ed3Brian Paul if (stObj->pt) { 580e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul if (level > (GLint) stObj->pt->last_level || 581bdf975e9ad25ee65d796a3c1ce3f2afbd2889c4eBrian Paul !st_texture_match_image(stObj->pt, &stImage->base, 582bdf975e9ad25ee65d796a3c1ce3f2afbd2889c4eBrian Paul stImage->face, stImage->level)) { 583a0509f7d28765c6ef8546eafba94aec46d9e7ed3Brian Paul DBG("release it\n"); 584287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(&stObj->pt, NULL); 585a0509f7d28765c6ef8546eafba94aec46d9e7ed3Brian Paul assert(!stObj->pt); 58640c3861e1e98116c573027b054a6a05208c53b6aMichal Krol pipe_sampler_view_reference(&stObj->sampler_view, NULL); 587a0509f7d28765c6ef8546eafba94aec46d9e7ed3Brian Paul } 58824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 58924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 590bdf975e9ad25ee65d796a3c1ce3f2afbd2889c4eBrian Paul if (width == 0 || height == 0 || depth == 0) { 591bdf975e9ad25ee65d796a3c1ce3f2afbd2889c4eBrian Paul /* stop after freeing old image */ 592bdf975e9ad25ee65d796a3c1ce3f2afbd2889c4eBrian Paul return; 593bdf975e9ad25ee65d796a3c1ce3f2afbd2889c4eBrian Paul } 594bdf975e9ad25ee65d796a3c1ce3f2afbd2889c4eBrian Paul 595753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer if (!stObj->pt) { 59676c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul guess_and_alloc_texture(st, stObj, stImage); 597753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer if (!stObj->pt) { 5988d249ca620f6995cc5824d95c29bda7043bbdf8cBrian Paul /* Probably out of memory. 5998d249ca620f6995cc5824d95c29bda7043bbdf8cBrian Paul * Try flushing any pending rendering, then retry. 6008d249ca620f6995cc5824d95c29bda7043bbdf8cBrian Paul */ 60176c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul st_finish(st); 60276c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul guess_and_alloc_texture(st, stObj, stImage); 6038d249ca620f6995cc5824d95c29bda7043bbdf8cBrian Paul if (!stObj->pt) { 6048d249ca620f6995cc5824d95c29bda7043bbdf8cBrian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage"); 6058d249ca620f6995cc5824d95c29bda7043bbdf8cBrian Paul return; 6068d249ca620f6995cc5824d95c29bda7043bbdf8cBrian Paul } 60724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 60824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 60924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 610753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer assert(!stImage->pt); 61124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 612753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer if (stObj->pt && 613753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer st_texture_match_image(stObj->pt, &stImage->base, 61414b98343309fdcff3514f05020303f7b40e83a4aBrian stImage->face, stImage->level)) { 61524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 616287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(&stImage->pt, stObj->pt); 617753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer assert(stImage->pt); 61824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 61924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 620753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer if (!stImage->pt) 621753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer DBG("XXX: Image did not fit into texture - storing in local memory!\n"); 62224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 623987d59bb83e9e08192563e5f1b52949c5511053cMichel Dänzer /* st_CopyTexImage calls this function with pixels == NULL, with 624753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer * the expectation that the texture will be set up but nothing 62524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * more will be done. This is where those calls return: 62624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 62755ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz if (compressed_src) { 62824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian pixels = _mesa_validate_pbo_compressed_teximage(ctx, imageSize, pixels, 62924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian unpack, 63024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian "glCompressedTexImage"); 6315facd7986ace899673499f396897469720476799Brian Paul } 6325facd7986ace899673499f396897469720476799Brian Paul else { 63324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian pixels = _mesa_validate_pbo_teximage(ctx, dims, width, height, 1, 63424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian format, type, 63524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian pixels, unpack, "glTexImage"); 63624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 637cfa1a0a609daefffc6f8c4087ed0bc34c2665ef4Brian Paul 638cfa1a0a609daefffc6f8c4087ed0bc34c2665ef4Brian Paul /* Note: we can't check for pixels==NULL until after we've allocated 639cfa1a0a609daefffc6f8c4087ed0bc34c2665ef4Brian Paul * memory for the texture. 640cfa1a0a609daefffc6f8c4087ed0bc34c2665ef4Brian Paul */ 64124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 64255ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz /* See if we can do texture compression with a blit/render. 64355ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz */ 64455ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz if (!compressed_src && 64555ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz !ctx->Mesa_DXTn && 64692863109af05acdb4ee5e42141c83ab0f18b7f88Brian Paul _mesa_is_format_compressed(texImage->TexFormat) && 64755ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz screen->is_format_supported(screen, 64855ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz stImage->pt->format, 64955ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz stImage->pt->target, 650287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell PIPE_BIND_RENDER_TARGET, 0)) { 651cfa1a0a609daefffc6f8c4087ed0bc34c2665ef4Brian Paul if (!pixels) 652cfa1a0a609daefffc6f8c4087ed0bc34c2665ef4Brian Paul goto done; 653cfa1a0a609daefffc6f8c4087ed0bc34c2665ef4Brian Paul 65455ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz if (compress_with_blit(ctx, target, level, 0, 0, 0, width, height, depth, 65555ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz format, type, pixels, unpack, texImage)) { 656f989390af6f827d1ea36560381340148811836f3Jakob Bornecrantz goto done; 65755ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz } 65855ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz } 65955ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz 660753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer if (stImage->pt) { 66141b8a2e9391cd85a65ba30a7e5f5068b5767d58aBrian Paul /* Store the image in the gallium texture memory buffer */ 66271633abafc935c25da9731bab48c228ceb9b4097Michel Dänzer if (format == GL_DEPTH_COMPONENT && 6630bed834be4a174d20b31a6cbcf066774bf749929Michal Krol util_format_is_depth_and_stencil(stImage->pt->format)) 66471633abafc935c25da9731bab48c228ceb9b4097Michel Dänzer transfer_usage = PIPE_TRANSFER_READ_WRITE; 66571633abafc935c25da9731bab48c228ceb9b4097Michel Dänzer else 66671633abafc935c25da9731bab48c228ceb9b4097Michel Dänzer transfer_usage = PIPE_TRANSFER_WRITE; 66771633abafc935c25da9731bab48c228ceb9b4097Michel Dänzer 66876c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul texImage->Data = st_texture_image_map(st, stImage, 0, 66971633abafc935c25da9731bab48c228ceb9b4097Michel Dänzer transfer_usage, 0, 0, 6704617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzer stImage->base.Width, 6714617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzer stImage->base.Height); 67201397a66c77f8ebfe78b90ace59c095194a290cfJosé Fonseca if(stImage->transfer) 67301397a66c77f8ebfe78b90ace59c095194a290cfJosé Fonseca dstRowStride = stImage->transfer->stride; 67424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 67524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian else { 67624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian /* Allocate regular memory and store the image there temporarily. */ 67741b8a2e9391cd85a65ba30a7e5f5068b5767d58aBrian Paul GLint sizeInBytes; 67841b8a2e9391cd85a65ba30a7e5f5068b5767d58aBrian Paul 679b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul if (_mesa_is_format_compressed(texImage->TexFormat)) { 68035efc6a1b3e3dada2cf9bd3a503c1b84f4bcb7f5Brian Paul sizeInBytes = _mesa_format_image_size(texImage->TexFormat, 68135efc6a1b3e3dada2cf9bd3a503c1b84f4bcb7f5Brian Paul texImage->Width, 68235efc6a1b3e3dada2cf9bd3a503c1b84f4bcb7f5Brian Paul texImage->Height, 68335efc6a1b3e3dada2cf9bd3a503c1b84f4bcb7f5Brian Paul texImage->Depth); 684253e7fee5dc7f0872987b214a6fa162db5e2aa19Brian Paul dstRowStride = _mesa_format_row_stride(texImage->TexFormat, width); 68524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian assert(dims != 3); 68624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 68724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian else { 68841b8a2e9391cd85a65ba30a7e5f5068b5767d58aBrian Paul GLint texelBytes; 68941b8a2e9391cd85a65ba30a7e5f5068b5767d58aBrian Paul texelBytes = _mesa_get_format_bytes(texImage->TexFormat); 690682fec0dca5bfd38ff9943663b7647e600fc4c1dBrian Paul dstRowStride = width * texelBytes; 691682fec0dca5bfd38ff9943663b7647e600fc4c1dBrian Paul sizeInBytes = depth * dstRowStride * height; 69224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 69324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 6948d6ef125ac6044438db5b89d6d310ccfc4b8140aBrian Paul texImage->Data = _mesa_align_malloc(sizeInBytes, 16); 69524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 69624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 6972a39dbe7364af5444b1eb43650dfc31ed09257dcBrian Paul if (!texImage->Data) { 6982a39dbe7364af5444b1eb43650dfc31ed09257dcBrian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage"); 6992a39dbe7364af5444b1eb43650dfc31ed09257dcBrian Paul return; 7002a39dbe7364af5444b1eb43650dfc31ed09257dcBrian Paul } 7012a39dbe7364af5444b1eb43650dfc31ed09257dcBrian Paul 702cfa1a0a609daefffc6f8c4087ed0bc34c2665ef4Brian Paul if (!pixels) 703cfa1a0a609daefffc6f8c4087ed0bc34c2665ef4Brian Paul goto done; 704cfa1a0a609daefffc6f8c4087ed0bc34c2665ef4Brian Paul 70524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian DBG("Upload image %dx%dx%d row_len %x pitch %x\n", 70641b8a2e9391cd85a65ba30a7e5f5068b5767d58aBrian Paul width, height, depth, width, dstRowStride); 70724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 70824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian /* Copy data. Would like to know when it's ok for us to eg. use 70924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * the blitter to copy. Or, use the hardware to do the format 71024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * conversion and copy: 71124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 71255ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz if (compressed_src) { 713eea6a7639f767b1d30b6ef1f91a9c49e3f3b78f0Luca Barbieri const GLuint srcImageStride = _mesa_format_row_stride(texImage->TexFormat, width); 714eea6a7639f767b1d30b6ef1f91a9c49e3f3b78f0Luca Barbieri if(dstRowStride == srcImageStride) 715eea6a7639f767b1d30b6ef1f91a9c49e3f3b78f0Luca Barbieri memcpy(texImage->Data, pixels, imageSize); 716eea6a7639f767b1d30b6ef1f91a9c49e3f3b78f0Luca Barbieri else 717eea6a7639f767b1d30b6ef1f91a9c49e3f3b78f0Luca Barbieri { 718eea6a7639f767b1d30b6ef1f91a9c49e3f3b78f0Luca Barbieri char *dst = texImage->Data; 719eea6a7639f767b1d30b6ef1f91a9c49e3f3b78f0Luca Barbieri const char *src = pixels; 7209328f3a670993167d7fb9a590f9e712467e77c7cLuca Barbieri GLuint i, bw, bh, lines; 7219328f3a670993167d7fb9a590f9e712467e77c7cLuca Barbieri _mesa_get_format_block_size(texImage->TexFormat, &bw, &bh); 7229328f3a670993167d7fb9a590f9e712467e77c7cLuca Barbieri lines = (height + bh - 1) / bh; 723eea6a7639f767b1d30b6ef1f91a9c49e3f3b78f0Luca Barbieri 7249328f3a670993167d7fb9a590f9e712467e77c7cLuca Barbieri for(i = 0; i < lines; ++i) 725eea6a7639f767b1d30b6ef1f91a9c49e3f3b78f0Luca Barbieri { 726eea6a7639f767b1d30b6ef1f91a9c49e3f3b78f0Luca Barbieri memcpy(dst, src, srcImageStride); 727eea6a7639f767b1d30b6ef1f91a9c49e3f3b78f0Luca Barbieri dst += dstRowStride; 728eea6a7639f767b1d30b6ef1f91a9c49e3f3b78f0Luca Barbieri src += srcImageStride; 729eea6a7639f767b1d30b6ef1f91a9c49e3f3b78f0Luca Barbieri } 730eea6a7639f767b1d30b6ef1f91a9c49e3f3b78f0Luca Barbieri } 73124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 732753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer else { 733eaca19edbbe7876079aa33d7f75d93601677081bBrian Paul const GLuint srcImageStride = 734eaca19edbbe7876079aa33d7f75d93601677081bBrian Paul _mesa_image_image_stride(unpack, width, height, format, type); 7355facd7986ace899673499f396897469720476799Brian Paul GLint i; 7365823f99d0fbc054b87aeb1bc15d413d3eadd27a8Brian const GLubyte *src = (const GLubyte *) pixels; 737753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer 738d11d903c1b81000d04f859dcc2da41dae024f146Brian Paul for (i = 0; i < depth; i++) { 7396480210b89dc8ae0990c450d27870c7b7930f251Brian Paul if (!_mesa_texstore(ctx, dims, 7406480210b89dc8ae0990c450d27870c7b7930f251Brian Paul texImage->_BaseFormat, 7416480210b89dc8ae0990c450d27870c7b7930f251Brian Paul texImage->TexFormat, 7426480210b89dc8ae0990c450d27870c7b7930f251Brian Paul texImage->Data, 7436480210b89dc8ae0990c450d27870c7b7930f251Brian Paul 0, 0, 0, /* dstX/Y/Zoffset */ 7446480210b89dc8ae0990c450d27870c7b7930f251Brian Paul dstRowStride, 7456480210b89dc8ae0990c450d27870c7b7930f251Brian Paul texImage->ImageOffsets, 7466480210b89dc8ae0990c450d27870c7b7930f251Brian Paul width, height, 1, 7476480210b89dc8ae0990c450d27870c7b7930f251Brian Paul format, type, src, unpack)) { 748753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage"); 749753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer } 750753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer 751d11d903c1b81000d04f859dcc2da41dae024f146Brian Paul if (stImage->pt && i + 1 < depth) { 752d11d903c1b81000d04f859dcc2da41dae024f146Brian Paul /* unmap this slice */ 75376c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul st_texture_image_unmap(st, stImage); 754d11d903c1b81000d04f859dcc2da41dae024f146Brian Paul /* map next slice of 3D texture */ 75576c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul texImage->Data = st_texture_image_map(st, stImage, i + 1, 75671633abafc935c25da9731bab48c228ceb9b4097Michel Dänzer transfer_usage, 0, 0, 7574617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzer stImage->base.Width, 7584617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzer stImage->base.Height); 7595823f99d0fbc054b87aeb1bc15d413d3eadd27a8Brian src += srcImageStride; 760753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer } 761753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer } 76224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 76324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 76408d39251a79a964e4a3ac0d7d8a397c2b66a0808Brian Pauldone: 76524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian _mesa_unmap_teximage_pbo(ctx, unpack); 76624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 76755ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz if (stImage->pt && texImage->Data) { 76876c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul st_texture_image_unmap(st, stImage); 76924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian texImage->Data = NULL; 77024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 77124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 77224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 77324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 77424df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 77524df8f895fe8807aa2ba058e71bd40adfc01d21eBrianst_TexImage3D(GLcontext * ctx, 7764e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul GLenum target, GLint level, 7774e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul GLint internalFormat, 7784e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul GLint width, GLint height, GLint depth, 7794e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul GLint border, 7804e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul GLenum format, GLenum type, const void *pixels, 7814e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul const struct gl_pixelstore_attrib *unpack, 7824e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul struct gl_texture_object *texObj, 7834e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul struct gl_texture_image *texImage) 78424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 7855facd7986ace899673499f396897469720476799Brian Paul st_TexImage(ctx, 3, target, level, internalFormat, width, height, depth, 7865facd7986ace899673499f396897469720476799Brian Paul border, format, type, pixels, unpack, texObj, texImage, 7875facd7986ace899673499f396897469720476799Brian Paul 0, GL_FALSE); 78824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 78924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 79024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 79124df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 79224df8f895fe8807aa2ba058e71bd40adfc01d21eBrianst_TexImage2D(GLcontext * ctx, 7934e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul GLenum target, GLint level, 7944e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul GLint internalFormat, 7954e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul GLint width, GLint height, GLint border, 7964e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul GLenum format, GLenum type, const void *pixels, 7974e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul const struct gl_pixelstore_attrib *unpack, 7984e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul struct gl_texture_object *texObj, 7994e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul struct gl_texture_image *texImage) 80024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 8015facd7986ace899673499f396897469720476799Brian Paul st_TexImage(ctx, 2, target, level, internalFormat, width, height, 1, border, 8025facd7986ace899673499f396897469720476799Brian Paul format, type, pixels, unpack, texObj, texImage, 0, GL_FALSE); 80324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 80424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 80524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 80624df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 80724df8f895fe8807aa2ba058e71bd40adfc01d21eBrianst_TexImage1D(GLcontext * ctx, 8084e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul GLenum target, GLint level, 8094e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul GLint internalFormat, 8104e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul GLint width, GLint border, 8114e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul GLenum format, GLenum type, const void *pixels, 8124e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul const struct gl_pixelstore_attrib *unpack, 8134e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul struct gl_texture_object *texObj, 8144e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul struct gl_texture_image *texImage) 81524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 8165facd7986ace899673499f396897469720476799Brian Paul st_TexImage(ctx, 1, target, level, internalFormat, width, 1, 1, border, 8175facd7986ace899673499f396897469720476799Brian Paul format, type, pixels, unpack, texObj, texImage, 0, GL_FALSE); 81824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 81924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 82024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 82124df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 8224e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paulst_CompressedTexImage2D(GLcontext *ctx, GLenum target, GLint level, 8234e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul GLint internalFormat, 8244e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul GLint width, GLint height, GLint border, 8254e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul GLsizei imageSize, const GLvoid *data, 8264e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul struct gl_texture_object *texObj, 8274e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul struct gl_texture_image *texImage) 82824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 8295facd7986ace899673499f396897469720476799Brian Paul st_TexImage(ctx, 2, target, level, internalFormat, width, height, 1, border, 8305facd7986ace899673499f396897469720476799Brian Paul 0, 0, data, &ctx->Unpack, texObj, texImage, imageSize, GL_TRUE); 83124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 83224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 83324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 83451b339af2e8b80575a24bb9146f031c9605180bbBrian Paul 83551b339af2e8b80575a24bb9146f031c9605180bbBrian Paul/** 83651b339af2e8b80575a24bb9146f031c9605180bbBrian Paul * glGetTexImage() helper: decompress a compressed texture by rendering 83751b339af2e8b80575a24bb9146f031c9605180bbBrian Paul * a textured quad. Store the results in the user's buffer. 83851b339af2e8b80575a24bb9146f031c9605180bbBrian Paul */ 83951b339af2e8b80575a24bb9146f031c9605180bbBrian Paulstatic void 84051b339af2e8b80575a24bb9146f031c9605180bbBrian Pauldecompress_with_blit(GLcontext * ctx, GLenum target, GLint level, 84151b339af2e8b80575a24bb9146f031c9605180bbBrian Paul GLenum format, GLenum type, GLvoid *pixels, 84251b339af2e8b80575a24bb9146f031c9605180bbBrian Paul struct gl_texture_object *texObj, 84351b339af2e8b80575a24bb9146f031c9605180bbBrian Paul struct gl_texture_image *texImage) 84451b339af2e8b80575a24bb9146f031c9605180bbBrian Paul{ 84576c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul struct st_context *st = st_context(ctx); 84676c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul struct pipe_context *pipe = st->pipe; 847b43c182f19c6291c88420fa12714f952c2b461fbKeith Whitwell struct pipe_screen *screen = pipe->screen; 84851b339af2e8b80575a24bb9146f031c9605180bbBrian Paul struct st_texture_image *stImage = st_texture_image(texImage); 8498f55a95178069d5e8b18647e6b675fc403d68073Roland Scheidegger struct st_texture_object *stObj = st_texture_object(texObj); 8505d3d63d45a037fdf603ddcff88da635c3ce8075eBrian Paul struct pipe_sampler_view *src_view = 8515d3d63d45a037fdf603ddcff88da635c3ce8075eBrian Paul st_get_texture_sampler_view(stObj, pipe); 85251b339af2e8b80575a24bb9146f031c9605180bbBrian Paul const GLuint width = texImage->Width; 85351b339af2e8b80575a24bb9146f031c9605180bbBrian Paul const GLuint height = texImage->Height; 85451b339af2e8b80575a24bb9146f031c9605180bbBrian Paul struct pipe_surface *dst_surface; 855287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct pipe_resource *dst_texture; 85651b339af2e8b80575a24bb9146f031c9605180bbBrian Paul struct pipe_transfer *tex_xfer; 857287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell unsigned bind = (PIPE_BIND_BLIT_DESTINATION | 858287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell PIPE_BIND_RENDER_TARGET | /* util_blit may choose to render */ 859287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell PIPE_BIND_TRANSFER_READ); 86051b339af2e8b80575a24bb9146f031c9605180bbBrian Paul 86151b339af2e8b80575a24bb9146f031c9605180bbBrian Paul /* create temp / dest surface */ 862287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell if (!util_create_rgba_surface(screen, width, height, bind, 86351b339af2e8b80575a24bb9146f031c9605180bbBrian Paul &dst_texture, &dst_surface)) { 86451b339af2e8b80575a24bb9146f031c9605180bbBrian Paul _mesa_problem(ctx, "util_create_rgba_surface() failed " 86551b339af2e8b80575a24bb9146f031c9605180bbBrian Paul "in decompress_with_blit()"); 86651b339af2e8b80575a24bb9146f031c9605180bbBrian Paul return; 86751b339af2e8b80575a24bb9146f031c9605180bbBrian Paul } 86851b339af2e8b80575a24bb9146f031c9605180bbBrian Paul 86951b339af2e8b80575a24bb9146f031c9605180bbBrian Paul /* blit/render/decompress */ 87076c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul util_blit_pixels_tex(st->blit, 871287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell src_view, /* pipe_resource (src) */ 87251b339af2e8b80575a24bb9146f031c9605180bbBrian Paul 0, 0, /* src x0, y0 */ 87351b339af2e8b80575a24bb9146f031c9605180bbBrian Paul width, height, /* src x1, y1 */ 87451b339af2e8b80575a24bb9146f031c9605180bbBrian Paul dst_surface, /* pipe_surface (dst) */ 87551b339af2e8b80575a24bb9146f031c9605180bbBrian Paul 0, 0, /* dst x0, y0 */ 87651b339af2e8b80575a24bb9146f031c9605180bbBrian Paul width, height, /* dst x1, y1 */ 87751b339af2e8b80575a24bb9146f031c9605180bbBrian Paul 0.0, /* z */ 87851b339af2e8b80575a24bb9146f031c9605180bbBrian Paul PIPE_TEX_MIPFILTER_NEAREST); 87951b339af2e8b80575a24bb9146f031c9605180bbBrian Paul 88051b339af2e8b80575a24bb9146f031c9605180bbBrian Paul /* map the dst_surface so we can read from it */ 881e50dd26ca6d0eb0d0f97c2780020ea16e3d4a687Thomas Hellstrom tex_xfer = st_cond_flush_get_tex_transfer(st_context(ctx), 882e50dd26ca6d0eb0d0f97c2780020ea16e3d4a687Thomas Hellstrom dst_texture, 0, 0, 0, 883e50dd26ca6d0eb0d0f97c2780020ea16e3d4a687Thomas Hellstrom PIPE_TRANSFER_READ, 884e50dd26ca6d0eb0d0f97c2780020ea16e3d4a687Thomas Hellstrom 0, 0, width, height); 88551b339af2e8b80575a24bb9146f031c9605180bbBrian Paul 8861b448c7a5cafa68eeead2a4c45f4362a9883383bBrian Paul pixels = _mesa_map_pbo_dest(ctx, &ctx->Pack, pixels); 88751b339af2e8b80575a24bb9146f031c9605180bbBrian Paul 8887b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul /* copy/pack data into user buffer */ 8897b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul if (st_equal_formats(stImage->pt->format, format, type)) { 8907b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul /* memcpy */ 891b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol const uint bytesPerRow = width * util_format_get_blocksize(stImage->pt->format); 892287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell ubyte *map = pipe_transfer_map(pipe, tex_xfer); 8937b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul GLuint row; 8947b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul for (row = 0; row < height; row++) { 8957b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul GLvoid *dest = _mesa_image_address2d(&ctx->Pack, pixels, width, 8967b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul height, format, type, row, 0); 8977b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul memcpy(dest, map, bytesPerRow); 8987b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul map += tex_xfer->stride; 8997b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul } 900287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_transfer_unmap(pipe, tex_xfer); 90151b339af2e8b80575a24bb9146f031c9605180bbBrian Paul } 9027b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul else { 9037b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul /* format translation via floats */ 9047b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul GLuint row; 9057b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul for (row = 0; row < height; row++) { 9067b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul const GLbitfield transferOps = 0x0; /* bypassed for glGetTexImage() */ 9077b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul GLfloat rgba[4 * MAX_WIDTH]; 9087b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul GLvoid *dest = _mesa_image_address2d(&ctx->Pack, pixels, width, 9097b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul height, format, type, row, 0); 9107b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul 911b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell if (ST_DEBUG & DEBUG_FALLBACK) 912b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell debug_printf("%s: fallback format translation\n", __FUNCTION__); 913b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell 9147b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul /* get float[4] rgba row from surface */ 915d35ecca5ee231c072687578642e0c22c6c0590b1Keith Whitwell pipe_get_tile_rgba(pipe, tex_xfer, 0, row, width, 1, rgba); 9167b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul 9177b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul _mesa_pack_rgba_span_float(ctx, width, (GLfloat (*)[4]) rgba, format, 9187b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul type, dest, &ctx->Pack, transferOps); 9197b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul } 9207b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul } 9217b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul 9221b448c7a5cafa68eeead2a4c45f4362a9883383bBrian Paul _mesa_unmap_pbo_dest(ctx, &ctx->Pack); 92351b339af2e8b80575a24bb9146f031c9605180bbBrian Paul 924287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe->transfer_destroy(pipe, tex_xfer); 92563af29bfbe265318bcf5be69e420de361b900321Keith Whitwell 92651b339af2e8b80575a24bb9146f031c9605180bbBrian Paul /* destroy the temp / dest surface */ 92751b339af2e8b80575a24bb9146f031c9605180bbBrian Paul util_destroy_rgba_surface(dst_texture, dst_surface); 92851b339af2e8b80575a24bb9146f031c9605180bbBrian Paul} 92951b339af2e8b80575a24bb9146f031c9605180bbBrian Paul 93051b339af2e8b80575a24bb9146f031c9605180bbBrian Paul 93151b339af2e8b80575a24bb9146f031c9605180bbBrian Paul 93224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian/** 93324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * Need to map texture image into memory before copying image data, 93424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * then unmap it. 93524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 93624df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 93724df8f895fe8807aa2ba058e71bd40adfc01d21eBrianst_get_tex_image(GLcontext * ctx, GLenum target, GLint level, 93824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLenum format, GLenum type, GLvoid * pixels, 93924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct gl_texture_object *texObj, 94051b339af2e8b80575a24bb9146f031c9605180bbBrian Paul struct gl_texture_image *texImage, GLboolean compressed_dst) 94124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 94276c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul struct st_context *st = st_context(ctx); 94324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct st_texture_image *stImage = st_texture_image(texImage); 944eaca19edbbe7876079aa33d7f75d93601677081bBrian Paul const GLuint dstImageStride = 945eaca19edbbe7876079aa33d7f75d93601677081bBrian Paul _mesa_image_image_stride(&ctx->Pack, texImage->Width, texImage->Height, 946eaca19edbbe7876079aa33d7f75d93601677081bBrian Paul format, type); 9475facd7986ace899673499f396897469720476799Brian Paul GLuint depth, i; 9485823f99d0fbc054b87aeb1bc15d413d3eadd27a8Brian GLubyte *dest; 94924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 95051b339af2e8b80575a24bb9146f031c9605180bbBrian Paul if (stImage->pt && 951cfbbe244d7438a60d389ae9d996dd430f79f362fJosé Fonseca util_format_is_s3tc(stImage->pt->format) && 95251b339af2e8b80575a24bb9146f031c9605180bbBrian Paul !compressed_dst) { 95351b339af2e8b80575a24bb9146f031c9605180bbBrian Paul /* Need to decompress the texture. 95451b339af2e8b80575a24bb9146f031c9605180bbBrian Paul * We'll do this by rendering a textured quad. 95551b339af2e8b80575a24bb9146f031c9605180bbBrian Paul * Note that we only expect RGBA formats (no Z/depth formats). 95651b339af2e8b80575a24bb9146f031c9605180bbBrian Paul */ 95751b339af2e8b80575a24bb9146f031c9605180bbBrian Paul decompress_with_blit(ctx, target, level, format, type, pixels, 95851b339af2e8b80575a24bb9146f031c9605180bbBrian Paul texObj, texImage); 95951b339af2e8b80575a24bb9146f031c9605180bbBrian Paul return; 96051b339af2e8b80575a24bb9146f031c9605180bbBrian Paul } 96151b339af2e8b80575a24bb9146f031c9605180bbBrian Paul 96224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian /* Map */ 963753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer if (stImage->pt) { 96424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian /* Image is stored in hardware format in a buffer managed by the 96524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * kernel. Need to explicitly map and unmap it. 96624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 9674ed1de8b84b587d2be0c0e4ecb6b5f421195f562José Fonseca unsigned face = _mesa_tex_target_to_face(target); 9689b75627fab5bf2ea90f27ddd31b60c54895f6de6Thomas Hellstrom 96976c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul st_teximage_flush_before_map(st, stImage->pt, face, level, 9709b75627fab5bf2ea90f27ddd31b60c54895f6de6Thomas Hellstrom PIPE_TRANSFER_READ); 9719b75627fab5bf2ea90f27ddd31b60c54895f6de6Thomas Hellstrom 97276c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul texImage->Data = st_texture_image_map(st, stImage, 0, 9734617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzer PIPE_TRANSFER_READ, 0, 0, 9744617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzer stImage->base.Width, 9754617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzer stImage->base.Height); 9767b640f9f708306b3e8c661771f29bf24bf8687fbBrian Paul /* compute stride in texels from stride in bytes */ 9777b640f9f708306b3e8c661771f29bf24bf8687fbBrian Paul texImage->RowStride = stImage->transfer->stride 9787b640f9f708306b3e8c661771f29bf24bf8687fbBrian Paul * util_format_get_blockwidth(stImage->pt->format) 9797b640f9f708306b3e8c661771f29bf24bf8687fbBrian Paul / util_format_get_blocksize(stImage->pt->format); 98024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 98124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian else { 98224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian /* Otherwise, the image should actually be stored in 983753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer * texImage->Data. This is pretty confusing for 98424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * everybody, I'd much prefer to separate the two functions of 98524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * texImage->Data - storage for texture images in main memory 98624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * and access (ie mappings) of images. In other words, we'd 98724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * create a new texImage->Map field and leave Data simply for 98824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * storage. 98924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 990753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer assert(texImage->Data); 99124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 99224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 993753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer depth = texImage->Depth; 994753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer texImage->Depth = 1; 99524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 9965823f99d0fbc054b87aeb1bc15d413d3eadd27a8Brian dest = (GLubyte *) pixels; 9975823f99d0fbc054b87aeb1bc15d413d3eadd27a8Brian 998d11d903c1b81000d04f859dcc2da41dae024f146Brian Paul for (i = 0; i < depth; i++) { 99951b339af2e8b80575a24bb9146f031c9605180bbBrian Paul if (compressed_dst) { 10005823f99d0fbc054b87aeb1bc15d413d3eadd27a8Brian _mesa_get_compressed_teximage(ctx, target, level, dest, 1001753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer texObj, texImage); 10025facd7986ace899673499f396897469720476799Brian Paul } 10035facd7986ace899673499f396897469720476799Brian Paul else { 10045823f99d0fbc054b87aeb1bc15d413d3eadd27a8Brian _mesa_get_teximage(ctx, target, level, format, type, dest, 1005753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer texObj, texImage); 1006753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer } 1007753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer 1008d11d903c1b81000d04f859dcc2da41dae024f146Brian Paul if (stImage->pt && i + 1 < depth) { 1009d11d903c1b81000d04f859dcc2da41dae024f146Brian Paul /* unmap this slice */ 101076c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul st_texture_image_unmap(st, stImage); 1011d11d903c1b81000d04f859dcc2da41dae024f146Brian Paul /* map next slice of 3D texture */ 101276c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul texImage->Data = st_texture_image_map(st, stImage, i + 1, 10134617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzer PIPE_TRANSFER_READ, 0, 0, 10144617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzer stImage->base.Width, 10154617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzer stImage->base.Height); 10165823f99d0fbc054b87aeb1bc15d413d3eadd27a8Brian dest += dstImageStride; 1017753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer } 101824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 1019753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer 1020753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer texImage->Depth = depth; 102124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 102224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian /* Unmap */ 1023753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer if (stImage->pt) { 102476c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul st_texture_image_unmap(st, stImage); 1025753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer texImage->Data = NULL; 102624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 102724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 102824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 102924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 103024df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 103124df8f895fe8807aa2ba058e71bd40adfc01d21eBrianst_GetTexImage(GLcontext * ctx, GLenum target, GLint level, 10324e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul GLenum format, GLenum type, GLvoid * pixels, 10334e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul struct gl_texture_object *texObj, 10344e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul struct gl_texture_image *texImage) 103524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 10365facd7986ace899673499f396897469720476799Brian Paul st_get_tex_image(ctx, target, level, format, type, pixels, texObj, texImage, 10375facd7986ace899673499f396897469720476799Brian Paul GL_FALSE); 103824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 103924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 104024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 104124df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 104224df8f895fe8807aa2ba058e71bd40adfc01d21eBrianst_GetCompressedTexImage(GLcontext *ctx, GLenum target, GLint level, 10434e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul GLvoid *pixels, 104447bf26845712bea756526fc159bdb355ceaef9c2Brian Paul struct gl_texture_object *texObj, 104547bf26845712bea756526fc159bdb355ceaef9c2Brian Paul struct gl_texture_image *texImage) 104624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 10475facd7986ace899673499f396897469720476799Brian Paul st_get_tex_image(ctx, target, level, 0, 0, pixels, texObj, texImage, 10485facd7986ace899673499f396897469720476799Brian Paul GL_TRUE); 104924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 105024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 105124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 105224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 105324df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 10545facd7986ace899673499f396897469720476799Brian Paulst_TexSubimage(GLcontext *ctx, GLint dims, GLenum target, GLint level, 10554e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul GLint xoffset, GLint yoffset, GLint zoffset, 10564e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul GLint width, GLint height, GLint depth, 10574e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul GLenum format, GLenum type, const void *pixels, 10584e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul const struct gl_pixelstore_attrib *packing, 10594e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul struct gl_texture_object *texObj, 10604e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul struct gl_texture_image *texImage) 106124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 106276c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul struct st_context *st = st_context(ctx); 106376c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul struct pipe_screen *screen = st->pipe->screen; 106424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct st_texture_image *stImage = st_texture_image(texImage); 106524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLuint dstRowStride; 1066eaca19edbbe7876079aa33d7f75d93601677081bBrian Paul const GLuint srcImageStride = 1067eaca19edbbe7876079aa33d7f75d93601677081bBrian Paul _mesa_image_image_stride(packing, width, height, format, type); 10685facd7986ace899673499f396897469720476799Brian Paul GLint i; 10695823f99d0fbc054b87aeb1bc15d413d3eadd27a8Brian const GLubyte *src; 1070a7427b0f7b2325b8dcc560d57cb894df25ebef93Brian Paul /* init to silence warning only: */ 1071a7427b0f7b2325b8dcc560d57cb894df25ebef93Brian Paul enum pipe_transfer_usage transfer_usage = PIPE_TRANSFER_WRITE; 107224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 107324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian DBG("%s target %s level %d offset %d,%d %dx%d\n", __FUNCTION__, 107424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian _mesa_lookup_enum_by_nr(target), 107524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian level, xoffset, yoffset, width, height); 107624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 107724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian pixels = 107824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian _mesa_validate_pbo_teximage(ctx, dims, width, height, depth, format, 107924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian type, pixels, packing, "glTexSubImage2D"); 108024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian if (!pixels) 108124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian return; 108224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 108355ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz /* See if we can do texture compression with a blit/render. 108455ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz */ 108555ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz if (!ctx->Mesa_DXTn && 108692863109af05acdb4ee5e42141c83ab0f18b7f88Brian Paul _mesa_is_format_compressed(texImage->TexFormat) && 108755ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz screen->is_format_supported(screen, 108855ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz stImage->pt->format, 108955ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz stImage->pt->target, 1090287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell PIPE_BIND_RENDER_TARGET, 0)) { 109155ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz if (compress_with_blit(ctx, target, level, 109255ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz xoffset, yoffset, zoffset, 109355ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz width, height, depth, 109455ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz format, type, pixels, packing, texImage)) { 1095f989390af6f827d1ea36560381340148811836f3Jakob Bornecrantz goto done; 109655ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz } 109755ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz } 109855ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz 109924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian /* Map buffer if necessary. Need to lock to prevent other contexts 110024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * from uploading the buffer under us. 110124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 1102753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer if (stImage->pt) { 11034ed1de8b84b587d2be0c0e4ecb6b5f421195f562José Fonseca unsigned face = _mesa_tex_target_to_face(target); 11044ed1de8b84b587d2be0c0e4ecb6b5f421195f562José Fonseca 110571633abafc935c25da9731bab48c228ceb9b4097Michel Dänzer if (format == GL_DEPTH_COMPONENT && 11060bed834be4a174d20b31a6cbcf066774bf749929Michal Krol util_format_is_depth_and_stencil(stImage->pt->format)) 110771633abafc935c25da9731bab48c228ceb9b4097Michel Dänzer transfer_usage = PIPE_TRANSFER_READ_WRITE; 110871633abafc935c25da9731bab48c228ceb9b4097Michel Dänzer else 110971633abafc935c25da9731bab48c228ceb9b4097Michel Dänzer transfer_usage = PIPE_TRANSFER_WRITE; 111071633abafc935c25da9731bab48c228ceb9b4097Michel Dänzer 111176c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul st_teximage_flush_before_map(st, stImage->pt, face, level, 111271633abafc935c25da9731bab48c228ceb9b4097Michel Dänzer transfer_usage); 111376c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul texImage->Data = st_texture_image_map(st, stImage, zoffset, 111471633abafc935c25da9731bab48c228ceb9b4097Michel Dänzer transfer_usage, 11154617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzer xoffset, yoffset, 11169e84e7def152aa8080da59a78795d6434e687403Jakob Bornecrantz width, height); 1117753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer } 1118753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer 11199b44f5a7550d8ede2eda763770e927df4c15cc8eBrian Paul if (!texImage->Data) { 11209b44f5a7550d8ede2eda763770e927df4c15cc8eBrian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexSubImage"); 112108d39251a79a964e4a3ac0d7d8a397c2b66a0808Brian Paul goto done; 11229b44f5a7550d8ede2eda763770e927df4c15cc8eBrian Paul } 11239b44f5a7550d8ede2eda763770e927df4c15cc8eBrian Paul 11245823f99d0fbc054b87aeb1bc15d413d3eadd27a8Brian src = (const GLubyte *) pixels; 1125d7b7b63bd7cca80e99ad9701f8b56ee365053647Michal Krol dstRowStride = stImage->transfer->stride; 11265823f99d0fbc054b87aeb1bc15d413d3eadd27a8Brian 1127d11d903c1b81000d04f859dcc2da41dae024f146Brian Paul for (i = 0; i < depth; i++) { 11286480210b89dc8ae0990c450d27870c7b7930f251Brian Paul if (!_mesa_texstore(ctx, dims, texImage->_BaseFormat, 11296480210b89dc8ae0990c450d27870c7b7930f251Brian Paul texImage->TexFormat, 11306480210b89dc8ae0990c450d27870c7b7930f251Brian Paul texImage->Data, 11316480210b89dc8ae0990c450d27870c7b7930f251Brian Paul 0, 0, 0, 11326480210b89dc8ae0990c450d27870c7b7930f251Brian Paul dstRowStride, 11336480210b89dc8ae0990c450d27870c7b7930f251Brian Paul texImage->ImageOffsets, 11346480210b89dc8ae0990c450d27870c7b7930f251Brian Paul width, height, 1, 11356480210b89dc8ae0990c450d27870c7b7930f251Brian Paul format, type, src, packing)) { 11369b44f5a7550d8ede2eda763770e927df4c15cc8eBrian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexSubImage"); 1137753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer } 1138753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer 1139d11d903c1b81000d04f859dcc2da41dae024f146Brian Paul if (stImage->pt && i + 1 < depth) { 1140d11d903c1b81000d04f859dcc2da41dae024f146Brian Paul /* unmap this slice */ 114176c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul st_texture_image_unmap(st, stImage); 1142d11d903c1b81000d04f859dcc2da41dae024f146Brian Paul /* map next slice of 3D texture */ 114376c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul texImage->Data = st_texture_image_map(st, stImage, 1144d11d903c1b81000d04f859dcc2da41dae024f146Brian Paul zoffset + i + 1, 114571633abafc935c25da9731bab48c228ceb9b4097Michel Dänzer transfer_usage, 11464617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzer xoffset, yoffset, 11479e84e7def152aa8080da59a78795d6434e687403Jakob Bornecrantz width, height); 11485823f99d0fbc054b87aeb1bc15d413d3eadd27a8Brian src += srcImageStride; 1149753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer } 115024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 115124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 115208d39251a79a964e4a3ac0d7d8a397c2b66a0808Brian Pauldone: 115324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian _mesa_unmap_teximage_pbo(ctx, packing); 115424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 11551e414df894fc70b7024eb38c812e582336014974Michel Dänzer if (stImage->pt && texImage->Data) { 115676c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul st_texture_image_unmap(st, stImage); 115724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian texImage->Data = NULL; 115824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 115924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 116024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 116124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 116224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 116324df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 11645facd7986ace899673499f396897469720476799Brian Paulst_TexSubImage3D(GLcontext *ctx, GLenum target, GLint level, 11655facd7986ace899673499f396897469720476799Brian Paul GLint xoffset, GLint yoffset, GLint zoffset, 11665facd7986ace899673499f396897469720476799Brian Paul GLsizei width, GLsizei height, GLsizei depth, 11675facd7986ace899673499f396897469720476799Brian Paul GLenum format, GLenum type, const GLvoid *pixels, 11685facd7986ace899673499f396897469720476799Brian Paul const struct gl_pixelstore_attrib *packing, 11695facd7986ace899673499f396897469720476799Brian Paul struct gl_texture_object *texObj, 11705facd7986ace899673499f396897469720476799Brian Paul struct gl_texture_image *texImage) 117124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 11725facd7986ace899673499f396897469720476799Brian Paul st_TexSubimage(ctx, 3, target, level, xoffset, yoffset, zoffset, 11735facd7986ace899673499f396897469720476799Brian Paul width, height, depth, format, type, 11745facd7986ace899673499f396897469720476799Brian Paul pixels, packing, texObj, texImage); 117524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 117624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 117724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 117824df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 11795facd7986ace899673499f396897469720476799Brian Paulst_TexSubImage2D(GLcontext *ctx, GLenum target, GLint level, 11805facd7986ace899673499f396897469720476799Brian Paul GLint xoffset, GLint yoffset, 11815facd7986ace899673499f396897469720476799Brian Paul GLsizei width, GLsizei height, 11825facd7986ace899673499f396897469720476799Brian Paul GLenum format, GLenum type, const GLvoid * pixels, 11835facd7986ace899673499f396897469720476799Brian Paul const struct gl_pixelstore_attrib *packing, 11845facd7986ace899673499f396897469720476799Brian Paul struct gl_texture_object *texObj, 11855facd7986ace899673499f396897469720476799Brian Paul struct gl_texture_image *texImage) 118624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 11875facd7986ace899673499f396897469720476799Brian Paul st_TexSubimage(ctx, 2, target, level, xoffset, yoffset, 0, 11885facd7986ace899673499f396897469720476799Brian Paul width, height, 1, format, type, 11895facd7986ace899673499f396897469720476799Brian Paul pixels, packing, texObj, texImage); 119024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 119124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 119224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 119324df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 11945facd7986ace899673499f396897469720476799Brian Paulst_TexSubImage1D(GLcontext *ctx, GLenum target, GLint level, 11955facd7986ace899673499f396897469720476799Brian Paul GLint xoffset, GLsizei width, GLenum format, GLenum type, 11965facd7986ace899673499f396897469720476799Brian Paul const GLvoid * pixels, 11975facd7986ace899673499f396897469720476799Brian Paul const struct gl_pixelstore_attrib *packing, 11985facd7986ace899673499f396897469720476799Brian Paul struct gl_texture_object *texObj, 11995facd7986ace899673499f396897469720476799Brian Paul struct gl_texture_image *texImage) 120024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 12015facd7986ace899673499f396897469720476799Brian Paul st_TexSubimage(ctx, 1, target, level, xoffset, 0, 0, width, 1, 1, 1202b245840b86cf877c9b8d666edf229364a84f1deaBrian format, type, pixels, packing, texObj, texImage); 120324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 120424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 120524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1206a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantzstatic void 1207578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantzst_CompressedTexSubImage1D(GLcontext *ctx, GLenum target, GLint level, 1208578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz GLint xoffset, GLsizei width, 1209578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz GLenum format, 1210578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz GLsizei imageSize, const GLvoid *data, 1211578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz struct gl_texture_object *texObj, 1212578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz struct gl_texture_image *texImage) 1213578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz{ 1214578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz assert(0); 1215578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz} 1216578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz 1217578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz 1218578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantzstatic void 1219a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantzst_CompressedTexSubImage2D(GLcontext *ctx, GLenum target, GLint level, 1220a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz GLint xoffset, GLint yoffset, 1221a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz GLsizei width, GLint height, 1222a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz GLenum format, 1223a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz GLsizei imageSize, const GLvoid *data, 1224a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz struct gl_texture_object *texObj, 1225a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz struct gl_texture_image *texImage) 1226a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz{ 122776c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul struct st_context *st = st_context(ctx); 1228a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz struct st_texture_image *stImage = st_texture_image(texImage); 1229a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz int srcBlockStride; 1230a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz int dstBlockStride; 1231a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz int y; 12327b8c4f22d4fd78829dd5843db92321ec0665932eVinson Lee enum pipe_format pformat; 1233a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz 1234a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz if (stImage->pt) { 12354ed1de8b84b587d2be0c0e4ecb6b5f421195f562José Fonseca unsigned face = _mesa_tex_target_to_face(target); 12367b8c4f22d4fd78829dd5843db92321ec0665932eVinson Lee pformat = stImage->pt->format; 12374ed1de8b84b587d2be0c0e4ecb6b5f421195f562José Fonseca 123876c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul st_teximage_flush_before_map(st, stImage->pt, face, level, 1239a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz PIPE_TRANSFER_WRITE); 124076c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul texImage->Data = st_texture_image_map(st, stImage, 0, 1241a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz PIPE_TRANSFER_WRITE, 1242a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz xoffset, yoffset, 1243a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz width, height); 1244a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz 1245b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol srcBlockStride = util_format_get_stride(pformat, width); 1246a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz dstBlockStride = stImage->transfer->stride; 1247a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz } else { 1248a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz assert(stImage->pt); 1249a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz /* TODO find good values for block and strides */ 1250a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz /* TODO also adjust texImage->data for yoffset/xoffset */ 1251a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz return; 1252a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz } 1253a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz 1254a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz if (!texImage->Data) { 1255a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz _mesa_error(ctx, GL_OUT_OF_MEMORY, "glCompressedTexSubImage"); 1256a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz return; 1257a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz } 1258a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz 1259b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol assert(xoffset % util_format_get_blockwidth(pformat) == 0); 1260b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol assert(yoffset % util_format_get_blockheight(pformat) == 0); 1261b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol assert(width % util_format_get_blockwidth(pformat) == 0); 1262b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol assert(height % util_format_get_blockheight(pformat) == 0); 1263a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz 1264b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol for (y = 0; y < height; y += util_format_get_blockheight(pformat)) { 1265a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz /* don't need to adjust for xoffset and yoffset as st_texture_image_map does that */ 1266b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol const char *src = (const char*)data + srcBlockStride * util_format_get_nblocksy(pformat, y); 1267b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol char *dst = (char*)texImage->Data + dstBlockStride * util_format_get_nblocksy(pformat, y); 1268b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol memcpy(dst, src, util_format_get_stride(pformat, width)); 1269a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz } 1270a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz 1271a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz if (stImage->pt) { 127276c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul st_texture_image_unmap(st, stImage); 1273a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz texImage->Data = NULL; 1274a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz } 1275a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz} 1276a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz 1277a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz 1278578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantzstatic void 1279578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantzst_CompressedTexSubImage3D(GLcontext *ctx, GLenum target, GLint level, 1280578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz GLint xoffset, GLint yoffset, GLint zoffset, 1281578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz GLsizei width, GLint height, GLint depth, 1282578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz GLenum format, 1283578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz GLsizei imageSize, const GLvoid *data, 1284578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz struct gl_texture_object *texObj, 1285578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz struct gl_texture_image *texImage) 1286578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz{ 1287578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz assert(0); 1288578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz} 1289578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz 1290578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz 129124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 129224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian/** 12935facd7986ace899673499f396897469720476799Brian Paul * Do a CopyTexSubImage operation using a read transfer from the source, 12945facd7986ace899673499f396897469720476799Brian Paul * a write transfer to the destination and get_tile()/put_tile() to access 12955facd7986ace899673499f396897469720476799Brian Paul * the pixels/texels. 1296c6717a86420d7141013165f7acd50b3c3f751756Brian * 1297c6717a86420d7141013165f7acd50b3c3f751756Brian * Note: srcY=0=TOP of renderbuffer 1298038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian */ 1299038cb561eb094af2f2ba06e18e61246fc0c87c3cBrianstatic void 13005facd7986ace899673499f396897469720476799Brian Paulfallback_copy_texsubimage(GLcontext *ctx, GLenum target, GLint level, 1301038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian struct st_renderbuffer *strb, 1302038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian struct st_texture_image *stImage, 1303038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian GLenum baseFormat, 1304038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian GLint destX, GLint destY, GLint destZ, 1305038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian GLint srcX, GLint srcY, 1306038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian GLsizei width, GLsizei height) 1307038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian{ 130876c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul struct st_context *st = st_context(ctx); 130976c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul struct pipe_context *pipe = st->pipe; 13104617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzer struct pipe_transfer *src_trans; 13114617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzer GLvoid *texDest; 131271633abafc935c25da9731bab48c228ceb9b4097Michel Dänzer enum pipe_transfer_usage transfer_usage; 1313b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell 1314b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell if (ST_DEBUG & DEBUG_FALLBACK) 1315b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell debug_printf("%s: fallback processing\n", __FUNCTION__); 13164617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzer 13174617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzer assert(width <= MAX_WIDTH); 1318038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian 13194617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzer if (st_fb_orientation(ctx->ReadBuffer) == Y_0_TOP) { 13207c8836e9ef49d938aa55a1c385b95c6371c301f1Michel Dänzer srcY = strb->Base.Height - srcY - height; 13214617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzer } 1322f3048ad90ed2e4583f0f7aaf35a0f4aa581942ddBrian Paul 1323e50dd26ca6d0eb0d0f97c2780020ea16e3d4a687Thomas Hellstrom src_trans = st_cond_flush_get_tex_transfer( st_context(ctx), 1324e50dd26ca6d0eb0d0f97c2780020ea16e3d4a687Thomas Hellstrom strb->texture, 1325e50dd26ca6d0eb0d0f97c2780020ea16e3d4a687Thomas Hellstrom 0, 0, 0, 1326e50dd26ca6d0eb0d0f97c2780020ea16e3d4a687Thomas Hellstrom PIPE_TRANSFER_READ, 1327e50dd26ca6d0eb0d0f97c2780020ea16e3d4a687Thomas Hellstrom srcX, srcY, 1328e50dd26ca6d0eb0d0f97c2780020ea16e3d4a687Thomas Hellstrom width, height); 1329038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian 13300197348641614188c400d7c616573bb7f1eea781Brian Paul if ((baseFormat == GL_DEPTH_COMPONENT || 13310197348641614188c400d7c616573bb7f1eea781Brian Paul baseFormat == GL_DEPTH_STENCIL) && 13320bed834be4a174d20b31a6cbcf066774bf749929Michal Krol util_format_is_depth_and_stencil(stImage->pt->format)) 133371633abafc935c25da9731bab48c228ceb9b4097Michel Dänzer transfer_usage = PIPE_TRANSFER_READ_WRITE; 133471633abafc935c25da9731bab48c228ceb9b4097Michel Dänzer else 133571633abafc935c25da9731bab48c228ceb9b4097Michel Dänzer transfer_usage = PIPE_TRANSFER_WRITE; 133671633abafc935c25da9731bab48c228ceb9b4097Michel Dänzer 133776c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul st_teximage_flush_before_map(st, stImage->pt, 0, 0, 133871633abafc935c25da9731bab48c228ceb9b4097Michel Dänzer transfer_usage); 13399b75627fab5bf2ea90f27ddd31b60c54895f6de6Thomas Hellstrom 134076c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul texDest = st_texture_image_map(st, stImage, 0, transfer_usage, 13414617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzer destX, destY, width, height); 1342038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian 1343105758105a790dd8466c6be8c232c3f215ca4deeBrian Paul if (baseFormat == GL_DEPTH_COMPONENT || 13440197348641614188c400d7c616573bb7f1eea781Brian Paul baseFormat == GL_DEPTH_STENCIL) { 1345cc94863429d8a6cef8dbf861e78701a458d30f5aBrian Paul const GLboolean scaleOrBias = (ctx->Pixel.DepthScale != 1.0F || 1346cc94863429d8a6cef8dbf861e78701a458d30f5aBrian Paul ctx->Pixel.DepthBias != 0.0F); 134727858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul GLint row, yStep; 1348cc94863429d8a6cef8dbf861e78701a458d30f5aBrian Paul 134927858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul /* determine bottom-to-top vs. top-to-bottom order for src buffer */ 135027858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul if (st_fb_orientation(ctx->ReadBuffer) == Y_0_TOP) { 13517c8836e9ef49d938aa55a1c385b95c6371c301f1Michel Dänzer srcY = height - 1; 135227858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul yStep = -1; 135327858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul } 135427858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul else { 13554617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzer srcY = 0; 135627858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul yStep = 1; 135727858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul } 135827858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul 135927858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul /* To avoid a large temp memory allocation, do copy row by row */ 13604617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzer for (row = 0; row < height; row++, srcY += yStep) { 1361cc94863429d8a6cef8dbf861e78701a458d30f5aBrian Paul uint data[MAX_WIDTH]; 1362d35ecca5ee231c072687578642e0c22c6c0590b1Keith Whitwell pipe_get_tile_z(pipe, src_trans, 0, srcY, width, 1, data); 1363cc94863429d8a6cef8dbf861e78701a458d30f5aBrian Paul if (scaleOrBias) { 1364cc94863429d8a6cef8dbf861e78701a458d30f5aBrian Paul _mesa_scale_and_bias_depth_uint(ctx, width, data); 1365cc94863429d8a6cef8dbf861e78701a458d30f5aBrian Paul } 1366d35ecca5ee231c072687578642e0c22c6c0590b1Keith Whitwell pipe_put_tile_z(pipe, stImage->transfer, 0, row, width, 1, data); 1367cc94863429d8a6cef8dbf861e78701a458d30f5aBrian Paul } 1368cc94863429d8a6cef8dbf861e78701a458d30f5aBrian Paul } 1369cc94863429d8a6cef8dbf861e78701a458d30f5aBrian Paul else { 1370cc94863429d8a6cef8dbf861e78701a458d30f5aBrian Paul /* RGBA format */ 137127858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul GLfloat *tempSrc = 137232f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg (GLfloat *) malloc(width * height * 4 * sizeof(GLfloat)); 137327858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul 137427858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul if (tempSrc && texDest) { 137527858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul const GLint dims = 2; 13765facd7986ace899673499f396897469720476799Brian Paul const GLint dstRowStride = stImage->transfer->stride; 137727858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul struct gl_texture_image *texImage = &stImage->base; 137827858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul struct gl_pixelstore_attrib unpack = ctx->DefaultPacking; 137927858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul 138027858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul if (st_fb_orientation(ctx->ReadBuffer) == Y_0_TOP) { 138127858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul unpack.Invert = GL_TRUE; 1382cc94863429d8a6cef8dbf861e78701a458d30f5aBrian Paul } 138327858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul 138427858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul /* get float/RGBA image from framebuffer */ 138527858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul /* XXX this usually involves a lot of int/float conversion. 138627858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul * try to avoid that someday. 138727858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul */ 1388d35ecca5ee231c072687578642e0c22c6c0590b1Keith Whitwell pipe_get_tile_rgba(pipe, src_trans, 0, 0, width, height, tempSrc); 138927858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul 139027858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul /* Store into texture memory. 139127858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul * Note that this does some special things such as pixel transfer 139227858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul * ops and format conversion. In particular, if the dest tex format 139327858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul * is actually RGBA but the user created the texture as GL_RGB we 139427858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul * need to fill-in/override the alpha channel with 1.0. 139527858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul */ 13966480210b89dc8ae0990c450d27870c7b7930f251Brian Paul _mesa_texstore(ctx, dims, 13976480210b89dc8ae0990c450d27870c7b7930f251Brian Paul texImage->_BaseFormat, 13986480210b89dc8ae0990c450d27870c7b7930f251Brian Paul texImage->TexFormat, 13996480210b89dc8ae0990c450d27870c7b7930f251Brian Paul texDest, 14006480210b89dc8ae0990c450d27870c7b7930f251Brian Paul 0, 0, 0, 14016480210b89dc8ae0990c450d27870c7b7930f251Brian Paul dstRowStride, 14026480210b89dc8ae0990c450d27870c7b7930f251Brian Paul texImage->ImageOffsets, 14036480210b89dc8ae0990c450d27870c7b7930f251Brian Paul width, height, 1, 14046480210b89dc8ae0990c450d27870c7b7930f251Brian Paul GL_RGBA, GL_FLOAT, tempSrc, /* src */ 14056480210b89dc8ae0990c450d27870c7b7930f251Brian Paul &unpack); 140627858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul } 140727858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul else { 140827858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexSubImage"); 14095c83f1371978472fbe4bba8f686733c6b519874aBrian } 141027858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul 141127858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul if (tempSrc) 141232f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free(tempSrc); 14135c83f1371978472fbe4bba8f686733c6b519874aBrian } 1414d0279fc4b38c72356a341173317bcd45d9093f45Michel Dänzer 141576c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul st_texture_image_unmap(st, stImage); 1416287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe->transfer_destroy(pipe, src_trans); 1417038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian} 1418038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian 1419038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian 142065d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul 142165d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul/** 142265d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * If the format of the src renderbuffer and the format of the dest 142365d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * texture are compatible (in terms of blitting), return a TGSI writemask 142465d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * to be used during the blit. 142565d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * If the src/dest are incompatible, return 0. 142665d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul */ 14278fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwellstatic unsigned 142865d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paulcompatible_src_dst_formats(GLcontext *ctx, 142965d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul const struct gl_renderbuffer *src, 14308fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell const struct gl_texture_image *dst) 14318fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell{ 143265d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul /* Get logical base formats for the src and dest. 143365d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * That is, use the user-requested formats and not the actual, device- 143465d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * chosen formats. 143565d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * For example, the user may have requested an A8 texture but the 143665d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * driver may actually be using an RGBA texture format. When we 143765d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * copy/blit to that texture, we only want to copy the Alpha channel 143865d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * and not the RGB channels. 143965d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * 144065d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * Similarly, when the src FBO was created an RGB format may have been 144165d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * requested but the driver actually chose an RGBA format. In that case, 144265d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * we don't want to copy the undefined Alpha channel to the dest texture 144365d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * (it should be 1.0). 144465d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul */ 144565d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul const GLenum srcFormat = _mesa_base_fbo_format(ctx, src->InternalFormat); 144665d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul const GLenum dstFormat = _mesa_base_tex_format(ctx, dst->InternalFormat); 14478fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell 144865d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul /** 144965d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * XXX when we have red-only and red/green renderbuffers we'll need 145065d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * to add more cases here (or implement a general-purpose routine that 145165d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * queries the existance of the R,G,B,A channels in the src and dest). 145265d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul */ 145365d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul if (srcFormat == dstFormat) { 14548fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell /* This is the same as matching_base_formats, which should 14558fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell * always pass, as it did previously. 14568fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell */ 14578fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell return TGSI_WRITEMASK_XYZW; 14588fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell } 145965d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul else if (srcFormat == GL_RGB && dstFormat == GL_RGBA) { 146065d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul /* Make sure that A in the dest is 1. The actual src format 146165d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * may be RGBA and have undefined A values. 146265d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul */ 146365d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul return TGSI_WRITEMASK_XYZ; 146465d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul } 146565d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul else if (srcFormat == GL_RGBA && dstFormat == GL_RGB) { 146665d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul /* Make sure that A in the dest is 1. The actual dst format 146765d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * may be RGBA and will need A=1 to provide proper alpha values 146865d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * when sampled later. 14698fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell */ 147065d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul return TGSI_WRITEMASK_XYZ; 14718fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell } 14728fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell else { 1473b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell if (ST_DEBUG & DEBUG_FALLBACK) 1474b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell debug_printf("%s failed for src %s, dst %s\n", 1475b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell __FUNCTION__, 1476b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell _mesa_lookup_enum_by_nr(srcFormat), 147765d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul _mesa_lookup_enum_by_nr(dstFormat)); 1478b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell 14798fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell /* Otherwise fail. 14808fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell */ 14818fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell return 0; 14828fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell } 14838fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell} 14848fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell 14858fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell 14868fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell 1487038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian/** 14884e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul * Do a CopyTex[Sub]Image1/2/3D() using a hardware (blit) path if possible. 14894e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul * Note that the region to copy has already been clipped so we know we 14904e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul * won't read from outside the source renderbuffer's bounds. 1491c6717a86420d7141013165f7acd50b3c3f751756Brian * 14924e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul * Note: srcY=0=Bottom of renderbuffer (GL convention) 149324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 1494038cb561eb094af2f2ba06e18e61246fc0c87c3cBrianstatic void 14954e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paulst_copy_texsubimage(GLcontext *ctx, 1496038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian GLenum target, GLint level, 1497038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian GLint destX, GLint destY, GLint destZ, 1498038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian GLint srcX, GLint srcY, 1499038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian GLsizei width, GLsizei height) 150024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 1501038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian struct gl_texture_unit *texUnit = 1502038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian &ctx->Texture.Unit[ctx->Texture.CurrentUnit]; 1503038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian struct gl_texture_object *texObj = 1504038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian _mesa_select_tex_object(ctx, texUnit, target); 1505038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian struct gl_texture_image *texImage = 1506038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian _mesa_select_tex_image(ctx, texObj, target, level); 1507038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian struct st_texture_image *stImage = st_texture_image(texImage); 15080197348641614188c400d7c616573bb7f1eea781Brian Paul const GLenum texBaseFormat = texImage->_BaseFormat; 1509b27498c7cad7dae4e3b3ef9517b9c0aef58f73f6Brian struct gl_framebuffer *fb = ctx->ReadBuffer; 1510b27498c7cad7dae4e3b3ef9517b9c0aef58f73f6Brian struct st_renderbuffer *strb; 151176c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul struct st_context *st = st_context(ctx); 151276c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul struct pipe_context *pipe = st->pipe; 15136f715dcc219071e574e363a9db4365c9c31ebbd3Brian struct pipe_screen *screen = pipe->screen; 151427858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul enum pipe_format dest_format, src_format; 1515cc94863429d8a6cef8dbf861e78701a458d30f5aBrian Paul GLboolean use_fallback = GL_TRUE; 151627858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul GLboolean matching_base_formats; 15178fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell GLuint format_writemask; 15188fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell struct pipe_surface *dest_surface = NULL; 15198fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell GLboolean do_flip = (st_fb_orientation(ctx->ReadBuffer) == Y_0_TOP); 152024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1521503632557e8904b775e1b6f3f84eb41bda3af122Keith Whitwell /* any rendering in progress must flushed before we grab the fb image */ 152276c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul st_flush(st, PIPE_FLUSH_RENDER_CACHE, NULL); 1523503632557e8904b775e1b6f3f84eb41bda3af122Keith Whitwell 1524afd16512bc354cf1a7220cb9bf3ce445503c7af4Keith Whitwell /* make sure finalize_textures has been called? 1525afd16512bc354cf1a7220cb9bf3ce445503c7af4Keith Whitwell */ 152676c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul if (0) st_validate_state(st); 1527afd16512bc354cf1a7220cb9bf3ce445503c7af4Keith Whitwell 1528b27498c7cad7dae4e3b3ef9517b9c0aef58f73f6Brian /* determine if copying depth or color data */ 1529105758105a790dd8466c6be8c232c3f215ca4deeBrian Paul if (texBaseFormat == GL_DEPTH_COMPONENT || 15300197348641614188c400d7c616573bb7f1eea781Brian Paul texBaseFormat == GL_DEPTH_STENCIL) { 1531b27498c7cad7dae4e3b3ef9517b9c0aef58f73f6Brian strb = st_renderbuffer(fb->_DepthBuffer); 153224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 1533b27498c7cad7dae4e3b3ef9517b9c0aef58f73f6Brian else { 15344e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul /* texBaseFormat == GL_RGB, GL_RGBA, GL_ALPHA, etc */ 1535b27498c7cad7dae4e3b3ef9517b9c0aef58f73f6Brian strb = st_renderbuffer(fb->_ColorReadBuffer); 1536b27498c7cad7dae4e3b3ef9517b9c0aef58f73f6Brian } 1537b27498c7cad7dae4e3b3ef9517b9c0aef58f73f6Brian 1538afd16512bc354cf1a7220cb9bf3ce445503c7af4Keith Whitwell if (!strb || !strb->surface || !stImage->pt) { 1539afd16512bc354cf1a7220cb9bf3ce445503c7af4Keith Whitwell debug_printf("%s: null strb or stImage\n", __FUNCTION__); 1540afd16512bc354cf1a7220cb9bf3ce445503c7af4Keith Whitwell return; 1541afd16512bc354cf1a7220cb9bf3ce445503c7af4Keith Whitwell } 1542afd16512bc354cf1a7220cb9bf3ce445503c7af4Keith Whitwell 1543e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell if (srcX < 0) { 1544e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell width -= -srcX; 1545e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell destX += -srcX; 1546e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell srcX = 0; 1547e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell } 1548e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell 1549e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell if (srcY < 0) { 1550e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell height -= -srcY; 1551e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell destY += -srcY; 1552e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell srcY = 0; 1553e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell } 1554e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell 1555e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell if (destX < 0) { 1556e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell width -= -destX; 1557e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell srcX += -destX; 1558e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell destX = 0; 1559e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell } 1560e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell 1561e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell if (destY < 0) { 1562e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell height -= -destY; 1563e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell srcY += -destY; 1564e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell destY = 0; 1565e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell } 1566e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell 1567e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell if (width < 0 || height < 0) 1568e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell return; 1569e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell 1570e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell 1571b27498c7cad7dae4e3b3ef9517b9c0aef58f73f6Brian assert(strb); 1572b27498c7cad7dae4e3b3ef9517b9c0aef58f73f6Brian assert(strb->surface); 1573753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer assert(stImage->pt); 1574c6717a86420d7141013165f7acd50b3c3f751756Brian 1575b27498c7cad7dae4e3b3ef9517b9c0aef58f73f6Brian src_format = strb->surface->format; 1576753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer dest_format = stImage->pt->format; 1577b27498c7cad7dae4e3b3ef9517b9c0aef58f73f6Brian 157827858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul /* 157927858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul * Determine if the src framebuffer and dest texture have the same 158027858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul * base format. We need this to detect a case such as the framebuffer 158127858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul * being GL_RGBA but the texture being GL_RGB. If the actual hardware 158227858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul * texture format stores RGBA we need to set A=1 (overriding the 158327858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul * framebuffer's alpha values). We can't do that with the blit or 158427858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul * textured-quad paths. 158527858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul */ 158645e76d2665b38ba3787548310efc59e969124c01Brian Paul matching_base_formats = 158745e76d2665b38ba3787548310efc59e969124c01Brian Paul (_mesa_get_format_base_format(strb->Base.Format) == 158845e76d2665b38ba3787548310efc59e969124c01Brian Paul _mesa_get_format_base_format(texImage->TexFormat)); 158965d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul format_writemask = compatible_src_dst_formats(ctx, &strb->Base, texImage); 159079931e38abc62286151121a3f59127e296144551Michel Dänzer 15918fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell if (ctx->_ImageTransferState == 0x0) { 1592b27498c7cad7dae4e3b3ef9517b9c0aef58f73f6Brian 1593c11d582411a999ed40db4c02143dd380113e0ffdBrian Paul if (matching_base_formats && 15948fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell src_format == dest_format && 15958fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell !do_flip) 15968fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell { 15974e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul /* use surface_copy() / blit */ 1598f500f3a72c6be61ff9b8e1166f734e408d00adedJakob Bornecrantz 159927858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul dest_surface = screen->get_tex_surface(screen, stImage->pt, 160027858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul stImage->face, stImage->level, 160127858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul destZ, 1602287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell PIPE_BIND_BLIT_DESTINATION); 1603145a45e9d6807add8229f1fc9c63fbb6951b1b88Brian Paul 1604145a45e9d6807add8229f1fc9c63fbb6951b1b88Brian Paul /* for surface_copy(), y=0=top, always */ 1605a479bf62353b6517841e620122112e7565d2391cBrian Paul pipe->surface_copy(pipe, 1606a479bf62353b6517841e620122112e7565d2391cBrian Paul /* dest */ 1607a479bf62353b6517841e620122112e7565d2391cBrian Paul dest_surface, 1608a479bf62353b6517841e620122112e7565d2391cBrian Paul destX, destY, 1609a479bf62353b6517841e620122112e7565d2391cBrian Paul /* src */ 1610a479bf62353b6517841e620122112e7565d2391cBrian Paul strb->surface, 1611a479bf62353b6517841e620122112e7565d2391cBrian Paul srcX, srcY, 1612a479bf62353b6517841e620122112e7565d2391cBrian Paul /* size */ 1613a479bf62353b6517841e620122112e7565d2391cBrian Paul width, height); 1614a479bf62353b6517841e620122112e7565d2391cBrian Paul use_fallback = GL_FALSE; 1615cc94863429d8a6cef8dbf861e78701a458d30f5aBrian Paul } 16168fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell else if (format_writemask && 1617e60ebebb392d1d4c47541766737b5a79685a24d5Brian Paul texBaseFormat != GL_DEPTH_COMPONENT && 1618e60ebebb392d1d4c47541766737b5a79685a24d5Brian Paul texBaseFormat != GL_DEPTH_STENCIL && 16198fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell screen->is_format_supported(screen, src_format, 16208aafc03b260ab8923f1b373f7effa75bcdb40a72José Fonseca PIPE_TEXTURE_2D, 1621287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell PIPE_BIND_SAMPLER_VIEW, 16228aafc03b260ab8923f1b373f7effa75bcdb40a72José Fonseca 0) && 16234e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul screen->is_format_supported(screen, dest_format, 16248aafc03b260ab8923f1b373f7effa75bcdb40a72José Fonseca PIPE_TEXTURE_2D, 1625287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell PIPE_BIND_RENDER_TARGET, 16268aafc03b260ab8923f1b373f7effa75bcdb40a72José Fonseca 0)) { 16274e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul /* draw textured quad to do the copy */ 1628eaca19edbbe7876079aa33d7f75d93601677081bBrian Paul GLint srcY0, srcY1; 162927858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul 163027858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul dest_surface = screen->get_tex_surface(screen, stImage->pt, 163127858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul stImage->face, stImage->level, 163227858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul destZ, 1633287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell PIPE_BIND_BLIT_DESTINATION); 163427858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul 1635a479bf62353b6517841e620122112e7565d2391cBrian Paul if (do_flip) { 1636a479bf62353b6517841e620122112e7565d2391cBrian Paul srcY1 = strb->Base.Height - srcY - height; 1637a479bf62353b6517841e620122112e7565d2391cBrian Paul srcY0 = srcY1 + height; 1638a479bf62353b6517841e620122112e7565d2391cBrian Paul } 1639a479bf62353b6517841e620122112e7565d2391cBrian Paul else { 1640a479bf62353b6517841e620122112e7565d2391cBrian Paul srcY0 = srcY; 1641a479bf62353b6517841e620122112e7565d2391cBrian Paul srcY1 = srcY0 + height; 1642a479bf62353b6517841e620122112e7565d2391cBrian Paul } 164376c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul util_blit_pixels_writemask(st->blit, 16448fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell strb->surface, 1645073048c872ea5893ad0c39b32ca171893c17148bBrian Paul st_get_renderbuffer_sampler_view(strb, pipe), 16468fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell srcX, srcY0, 16478fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell srcX + width, srcY1, 16488fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell dest_surface, 16498fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell destX, destY, 16508fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell destX + width, destY + height, 16518fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell 0.0, PIPE_TEX_MIPFILTER_NEAREST, 16528fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell format_writemask); 1653cc94863429d8a6cef8dbf861e78701a458d30f5aBrian Paul use_fallback = GL_FALSE; 16543c0dc8242b64518d5635263ba65b39afa919dd86Michel Dänzer } 165579931e38abc62286151121a3f59127e296144551Michel Dänzer 165627858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul if (dest_surface) 165727858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul pipe_surface_reference(&dest_surface, NULL); 1658038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian } 1659cc94863429d8a6cef8dbf861e78701a458d30f5aBrian Paul 1660cc94863429d8a6cef8dbf861e78701a458d30f5aBrian Paul if (use_fallback) { 16614e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul /* software fallback */ 1662038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian fallback_copy_texsubimage(ctx, target, level, 16634e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul strb, stImage, texBaseFormat, 1664038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian destX, destY, destZ, 1665038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian srcX, srcY, width, height); 1666038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian } 166724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 166824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 166924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1670038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian 167124df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 167224df8f895fe8807aa2ba058e71bd40adfc01d21eBrianst_CopyTexImage1D(GLcontext * ctx, GLenum target, GLint level, 167324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLenum internalFormat, 167424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLint x, GLint y, GLsizei width, GLint border) 167524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 167624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct gl_texture_unit *texUnit = 167724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian &ctx->Texture.Unit[ctx->Texture.CurrentUnit]; 167824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct gl_texture_object *texObj = 167924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian _mesa_select_tex_object(ctx, texUnit, target); 168024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct gl_texture_image *texImage = 168124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian _mesa_select_tex_image(ctx, texObj, target, level); 168224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1683753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer /* Setup or redefine the texture object, texture and texture 168424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * image. Don't populate yet. 168524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 168624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian ctx->Driver.TexImage1D(ctx, target, level, internalFormat, 168724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian width, border, 168824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GL_RGBA, CHAN_TYPE, NULL, 168924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian &ctx->DefaultPacking, texObj, texImage); 169024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 16914e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul st_copy_texsubimage(ctx, target, level, 16924e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul 0, 0, 0, /* destX,Y,Z */ 16934e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul x, y, width, 1); /* src X, Y, size */ 169424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 169524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 169624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 169724df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 169824df8f895fe8807aa2ba058e71bd40adfc01d21eBrianst_CopyTexImage2D(GLcontext * ctx, GLenum target, GLint level, 169924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLenum internalFormat, 170024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLint x, GLint y, GLsizei width, GLsizei height, 170124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLint border) 170224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 170324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct gl_texture_unit *texUnit = 170424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian &ctx->Texture.Unit[ctx->Texture.CurrentUnit]; 170524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct gl_texture_object *texObj = 170624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian _mesa_select_tex_object(ctx, texUnit, target); 170724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct gl_texture_image *texImage = 170824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian _mesa_select_tex_image(ctx, texObj, target, level); 170924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1710753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer /* Setup or redefine the texture object, texture and texture 171124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * image. Don't populate yet. 171224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 171324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian ctx->Driver.TexImage2D(ctx, target, level, internalFormat, 171424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian width, height, border, 171524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GL_RGBA, CHAN_TYPE, NULL, 171624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian &ctx->DefaultPacking, texObj, texImage); 171724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 17184e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul st_copy_texsubimage(ctx, target, level, 17194e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul 0, 0, 0, /* destX,Y,Z */ 17204e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul x, y, width, height); /* src X, Y, size */ 172124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 172224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 172324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 172424df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 172524df8f895fe8807aa2ba058e71bd40adfc01d21eBrianst_CopyTexSubImage1D(GLcontext * ctx, GLenum target, GLint level, 172624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLint xoffset, GLint x, GLint y, GLsizei width) 172724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 1728038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian const GLint yoffset = 0, zoffset = 0; 1729038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian const GLsizei height = 1; 17304e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul st_copy_texsubimage(ctx, target, level, 17314e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul xoffset, yoffset, zoffset, /* destX,Y,Z */ 17324e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul x, y, width, height); /* src X, Y, size */ 173324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 173424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 173524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 173624df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 173724df8f895fe8807aa2ba058e71bd40adfc01d21eBrianst_CopyTexSubImage2D(GLcontext * ctx, GLenum target, GLint level, 173824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLint xoffset, GLint yoffset, 173924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLint x, GLint y, GLsizei width, GLsizei height) 174024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 1741038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian const GLint zoffset = 0; 17424e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul st_copy_texsubimage(ctx, target, level, 17434e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul xoffset, yoffset, zoffset, /* destX,Y,Z */ 17444e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul x, y, width, height); /* src X, Y, size */ 1745038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian} 174624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 174724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1748038cb561eb094af2f2ba06e18e61246fc0c87c3cBrianstatic void 1749038cb561eb094af2f2ba06e18e61246fc0c87c3cBrianst_CopyTexSubImage3D(GLcontext * ctx, GLenum target, GLint level, 1750038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian GLint xoffset, GLint yoffset, GLint zoffset, 1751038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian GLint x, GLint y, GLsizei width, GLsizei height) 1752038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian{ 17534e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul st_copy_texsubimage(ctx, target, level, 17544e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul xoffset, yoffset, zoffset, /* destX,Y,Z */ 17554e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul x, y, width, height); /* src X, Y, size */ 175624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 175724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 175824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1759e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul/** 1760e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul * Copy image data from stImage into the texture object 'stObj' at level 1761e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul * 'dstLevel'. 1762e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul */ 176324df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 1764753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzercopy_image_data_to_texture(struct st_context *st, 1765753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer struct st_texture_object *stObj, 17664da1cdf78fa3b954840650fa46cf72da5daf149fBrian GLuint dstLevel, 1767753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer struct st_texture_image *stImage) 176824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 1769e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul /* debug checks */ 1770e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul { 1771e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul const struct gl_texture_image *dstImage = 1772e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul stObj->base.Image[stImage->face][stImage->level]; 1773e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul assert(dstImage); 1774e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul assert(dstImage->Width == stImage->base.Width); 1775e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul assert(dstImage->Height == stImage->base.Height); 1776e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul assert(dstImage->Depth == stImage->base.Depth); 1777e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul } 1778e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul 1779753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer if (stImage->pt) { 178024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian /* Copy potentially with the blitter: 178124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 1782753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer st_texture_image_copy(st->pipe, 17834da1cdf78fa3b954840650fa46cf72da5daf149fBrian stObj->pt, dstLevel, /* dest texture, level */ 17844da1cdf78fa3b954840650fa46cf72da5daf149fBrian stImage->pt, /* src texture */ 1785b628950662a97452e539bcc704bd2acee70f8355Brian Paul stImage->face); 178624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1787287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(&stImage->pt, NULL); 178824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 17894c50969334844bc9aa622176c3ebcbc733394f78Brian Paul else if (stImage->base.Data) { 179024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian /* More straightforward upload. 179124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 17929b75627fab5bf2ea90f27ddd31b60c54895f6de6Thomas Hellstrom st_teximage_flush_before_map(st, stObj->pt, stImage->face, dstLevel, 17939b75627fab5bf2ea90f27ddd31b60c54895f6de6Thomas Hellstrom PIPE_TRANSFER_WRITE); 17949b75627fab5bf2ea90f27ddd31b60c54895f6de6Thomas Hellstrom 1795e50dd26ca6d0eb0d0f97c2780020ea16e3d4a687Thomas Hellstrom st_texture_image_data(st, 17965facd7986ace899673499f396897469720476799Brian Paul stObj->pt, 17975facd7986ace899673499f396897469720476799Brian Paul stImage->face, 17985facd7986ace899673499f396897469720476799Brian Paul dstLevel, 17995facd7986ace899673499f396897469720476799Brian Paul stImage->base.Data, 18005facd7986ace899673499f396897469720476799Brian Paul stImage->base.RowStride * 1801b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol util_format_get_blocksize(stObj->pt->format), 18025facd7986ace899673499f396897469720476799Brian Paul stImage->base.RowStride * 18035facd7986ace899673499f396897469720476799Brian Paul stImage->base.Height * 1804b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol util_format_get_blocksize(stObj->pt->format)); 180524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian _mesa_align_free(stImage->base.Data); 180624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian stImage->base.Data = NULL; 180724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 180824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1809287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(&stImage->pt, stObj->pt); 181024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 181124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 181224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1813afc54983370033b65e3a7cbb29bd9c87156f0881Brian/** 1814afc54983370033b65e3a7cbb29bd9c87156f0881Brian * Called during state validation. When this function is finished, 1815afc54983370033b65e3a7cbb29bd9c87156f0881Brian * the texture object should be ready for rendering. 18163b3774b1227743147159676795b542c0eb7c2bdfBrian Paul * \return GL_TRUE for success, GL_FALSE for failure (out of mem) 181724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 181814b98343309fdcff3514f05020303f7b40e83a4aBrianGLboolean 1819753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzerst_finalize_texture(GLcontext *ctx, 1820c3af68dc5022715cc8f126b7df12f3f5248aefe7Keith Whitwell struct pipe_context *pipe, 1821c3af68dc5022715cc8f126b7df12f3f5248aefe7Keith Whitwell struct gl_texture_object *tObj, 1822753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer GLboolean *needFlush) 182324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 182476c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul struct st_context *st = st_context(ctx); 182514b98343309fdcff3514f05020303f7b40e83a4aBrian struct st_texture_object *stObj = st_texture_object(tObj); 1826afc54983370033b65e3a7cbb29bd9c87156f0881Brian const GLuint nr_faces = (stObj->base.Target == GL_TEXTURE_CUBE_MAP) ? 6 : 1; 1827e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul GLuint face; 182824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct st_texture_image *firstImage; 1829e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul enum pipe_format firstImageFormat; 183024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 183124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian *needFlush = GL_FALSE; 183224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1833e3a6f57ad6c0e7bda5d45eb146194ed39f45abddBrian Paul if (stObj->base._Complete) { 1834e3a6f57ad6c0e7bda5d45eb146194ed39f45abddBrian Paul /* The texture is complete and we know exactly how many mipmap levels 1835e3a6f57ad6c0e7bda5d45eb146194ed39f45abddBrian Paul * are present/needed. This is conditional because we may be called 1836e3a6f57ad6c0e7bda5d45eb146194ed39f45abddBrian Paul * from the st_generate_mipmap() function when the texture object is 1837e3a6f57ad6c0e7bda5d45eb146194ed39f45abddBrian Paul * incomplete. In that case, we'll have set stObj->lastLevel before 1838e3a6f57ad6c0e7bda5d45eb146194ed39f45abddBrian Paul * we get here. 1839e3a6f57ad6c0e7bda5d45eb146194ed39f45abddBrian Paul */ 1840ae2daacbac7242938cffe0e2409071e030e00863Cooper Yuan if (stObj->base.MinFilter == GL_LINEAR || 1841ae2daacbac7242938cffe0e2409071e030e00863Cooper Yuan stObj->base.MinFilter == GL_NEAREST) 1842ae2daacbac7242938cffe0e2409071e030e00863Cooper Yuan stObj->lastLevel = stObj->base.BaseLevel; 1843ae2daacbac7242938cffe0e2409071e030e00863Cooper Yuan else 1844e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul stObj->lastLevel = stObj->base._MaxLevel; 1845e3a6f57ad6c0e7bda5d45eb146194ed39f45abddBrian Paul } 184624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 18474da1cdf78fa3b954840650fa46cf72da5daf149fBrian firstImage = st_texture_image(stObj->base.Image[0][stObj->base.BaseLevel]); 1848e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul assert(firstImage); 184924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1850753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer /* If both firstImage and stObj point to a texture which can contain 185124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * all active images, favour firstImage. Note that because of the 185224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * completeness requirement, we know that the image dimensions 185324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * will match. 185424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 1855753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer if (firstImage->pt && 1856753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer firstImage->pt != stObj->pt && 1857753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer firstImage->pt->last_level >= stObj->lastLevel) { 1858287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(&stObj->pt, firstImage->pt); 185940c3861e1e98116c573027b054a6a05208c53b6aMichal Krol pipe_sampler_view_reference(&stObj->sampler_view, NULL); 186024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 186124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1862e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul /* Find gallium format for the Mesa texture */ 1863e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul firstImageFormat = st_mesa_format_to_pipe_format(firstImage->base.TexFormat); 186424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1865ce509401738e7073de94a2b7fc41461c52a73da0Brian Paul /* If we already have a gallium texture, check that it matches the texture 1866ce509401738e7073de94a2b7fc41461c52a73da0Brian Paul * object's format, target, size, num_levels, etc. 186724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 1868809dd9089bae70cf35cea6a75258e700e7455738Brian Paul if (stObj->pt) { 1869809dd9089bae70cf35cea6a75258e700e7455738Brian Paul if (stObj->pt->target != gl_target_to_pipe(stObj->base.Target) || 1870e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul stObj->pt->format != firstImageFormat || 1871529b7b355d392b1534ccd8ff7b428dc21cbfdc21Brian Paul stObj->pt->last_level < stObj->lastLevel || 1872e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul stObj->pt->width0 != stObj->width0 || 1873e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul stObj->pt->height0 != stObj->height0 || 1874e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul stObj->pt->depth0 != stObj->depth0) 1875311f77198e171e9ce8ddcce91fd6a894fff1f14fBrian Paul { 1876e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul /* The gallium texture does not match the Mesa texture so delete the 1877e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul * gallium texture now. We'll make a new one below. 1878e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul */ 1879287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(&stObj->pt, NULL); 188040c3861e1e98116c573027b054a6a05208c53b6aMichal Krol pipe_sampler_view_reference(&stObj->sampler_view, NULL); 188176c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul st->dirty.st |= ST_NEW_FRAMEBUFFER; 1882809dd9089bae70cf35cea6a75258e700e7455738Brian Paul } 188324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 188424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1885ce509401738e7073de94a2b7fc41461c52a73da0Brian Paul /* May need to create a new gallium texture: 188624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 1887753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer if (!stObj->pt) { 1888e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul GLuint bindings = default_bindings(st, firstImageFormat); 18891ad2484f03cbe9ae6bd4ebe50d6894e570d65952Brian Paul 189076c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul stObj->pt = st_texture_create(st, 18915390a43ce06b27f6d54bc5f237aa305b6948f2afBrian gl_target_to_pipe(stObj->base.Target), 1892e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul firstImageFormat, 1893b245840b86cf877c9b8d666edf229364a84f1deaBrian stObj->lastLevel, 1894e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul stObj->width0, 1895e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul stObj->height0, 1896e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul stObj->depth0, 18978283db88414f600e66510de713382c36899d4b03Brian Paul bindings); 1898a73ae3d5eb8419feab5aea26573aa41b72f941ebKeith Whitwell 18993b3774b1227743147159676795b542c0eb7c2bdfBrian Paul if (!stObj->pt) { 19003b3774b1227743147159676795b542c0eb7c2bdfBrian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage"); 19013b3774b1227743147159676795b542c0eb7c2bdfBrian Paul return GL_FALSE; 19023b3774b1227743147159676795b542c0eb7c2bdfBrian Paul } 190324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 190424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1905753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer /* Pull in any images not in the object's texture: 190624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 190724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian for (face = 0; face < nr_faces; face++) { 19084da1cdf78fa3b954840650fa46cf72da5daf149fBrian GLuint level; 19094da1cdf78fa3b954840650fa46cf72da5daf149fBrian for (level = 0; level <= stObj->lastLevel; level++) { 191024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct st_texture_image *stImage = 1911e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul st_texture_image(stObj->base.Image[face][level]); 191224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1913753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer /* Need to import images in main memory or held in other textures. 191424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 1915a34b43b3f4817268ef4b3f186203b5fbafc7214eBrian if (stImage && stObj->pt != stImage->pt) { 191676c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul copy_image_data_to_texture(st, stObj, level, stImage); 191724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian *needFlush = GL_TRUE; 191824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 191924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 192024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 192124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 192224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian return GL_TRUE; 192324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 192424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 192524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 19268f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul/** 19278f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul * Returns pointer to a default/dummy texture. 19288f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul * This is typically used when the current shader has tex/sample instructions 19298f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul * but the user has not provided a (any) texture(s). 19308f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul */ 19318f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paulstruct gl_texture_object * 19328f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paulst_get_default_texture(struct st_context *st) 19338f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul{ 19348f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul if (!st->default_texture) { 19358f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul static const GLenum target = GL_TEXTURE_2D; 19368f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul GLubyte pixels[16][16][4]; 19378f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul struct gl_texture_object *texObj; 19388f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul struct gl_texture_image *texImg; 19392002e03a5232c54988161cb629966bdce19d35deBrian Paul GLuint i, j; 19408f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul 19412002e03a5232c54988161cb629966bdce19d35deBrian Paul /* The ARB_fragment_program spec says (0,0,0,1) should be returned 19422002e03a5232c54988161cb629966bdce19d35deBrian Paul * when attempting to sample incomplete textures. 19432002e03a5232c54988161cb629966bdce19d35deBrian Paul */ 19442002e03a5232c54988161cb629966bdce19d35deBrian Paul for (i = 0; i < 16; i++) { 19452002e03a5232c54988161cb629966bdce19d35deBrian Paul for (j = 0; j < 16; j++) { 19462002e03a5232c54988161cb629966bdce19d35deBrian Paul pixels[i][j][0] = 0; 19472002e03a5232c54988161cb629966bdce19d35deBrian Paul pixels[i][j][1] = 0; 19482002e03a5232c54988161cb629966bdce19d35deBrian Paul pixels[i][j][2] = 0; 19492002e03a5232c54988161cb629966bdce19d35deBrian Paul pixels[i][j][3] = 255; 19502002e03a5232c54988161cb629966bdce19d35deBrian Paul } 19512002e03a5232c54988161cb629966bdce19d35deBrian Paul } 1952a7b818d53a95b549bbff942a9cb91272e0799dd5Brian Paul 19538f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul texObj = st->ctx->Driver.NewTextureObject(st->ctx, 0, target); 19548f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul 19558f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul texImg = _mesa_get_tex_image(st->ctx, texObj, target, 0); 19568f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul 19578f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul _mesa_init_teximage_fields(st->ctx, target, texImg, 19588f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul 16, 16, 1, 0, /* w, h, d, border */ 19598f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul GL_RGBA); 19608f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul 19618f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul st_TexImage(st->ctx, 2, target, 19628f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul 0, GL_RGBA, /* level, intformat */ 19638f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul 16, 16, 1, 0, /* w, h, d, border */ 19648f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul GL_RGBA, GL_UNSIGNED_BYTE, pixels, 19658f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul &st->ctx->DefaultPacking, 19668f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul texObj, texImg, 19678f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul 0, 0); 19688f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul 19698f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul texObj->MinFilter = GL_NEAREST; 19708f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul texObj->MagFilter = GL_NEAREST; 19718f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul texObj->_Complete = GL_TRUE; 19728f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul 19738f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul st->default_texture = texObj; 19748f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul } 19758f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul return st->default_texture; 19768f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul} 19778f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul 19788f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul 19796da9234fd437f97267e7831f034c78b31156d939Brianvoid 19806da9234fd437f97267e7831f034c78b31156d939Brianst_init_texture_functions(struct dd_function_table *functions) 198124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 198224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->ChooseTextureFormat = st_ChooseTextureFormat; 198324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->TexImage1D = st_TexImage1D; 198424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->TexImage2D = st_TexImage2D; 198524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->TexImage3D = st_TexImage3D; 198624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->TexSubImage1D = st_TexSubImage1D; 198724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->TexSubImage2D = st_TexSubImage2D; 198824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->TexSubImage3D = st_TexSubImage3D; 1989578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz functions->CompressedTexSubImage1D = st_CompressedTexSubImage1D; 1990a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz functions->CompressedTexSubImage2D = st_CompressedTexSubImage2D; 1991578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz functions->CompressedTexSubImage3D = st_CompressedTexSubImage3D; 199224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->CopyTexImage1D = st_CopyTexImage1D; 199324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->CopyTexImage2D = st_CopyTexImage2D; 199424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->CopyTexSubImage1D = st_CopyTexSubImage1D; 199524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->CopyTexSubImage2D = st_CopyTexSubImage2D; 1996038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian functions->CopyTexSubImage3D = st_CopyTexSubImage3D; 199762abcb9aacc33218d0143a743c738435794b32a9Brian functions->GenerateMipmap = st_generate_mipmap; 1998038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian 199924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->GetTexImage = st_GetTexImage; 200024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 200124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian /* compressed texture functions */ 200224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->CompressedTexImage2D = st_CompressedTexImage2D; 200324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->GetCompressedTexImage = st_GetCompressedTexImage; 200424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 200524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->NewTextureObject = st_NewTextureObject; 200624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->NewTextureImage = st_NewTextureImage; 200724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->DeleteTexture = st_DeleteTextureObject; 200824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->FreeTexImageData = st_FreeTextureImageData; 200924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->UpdateTexturePalette = 0; 201024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 201124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->TextureMemCpy = do_memcpy; 2012f8549e8f4f8bdfebcb4e0a2754df59b3fe4fdff7Brian 2013f8549e8f4f8bdfebcb4e0a2754df59b3fe4fdff7Brian /* XXX Temporary until we can query pipe's texture sizes */ 2014f8549e8f4f8bdfebcb4e0a2754df59b3fe4fdff7Brian functions->TestProxyTexImage = _mesa_test_proxy_teximage; 201524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 2016