st_cb_texture.c revision 0f74efdef05c5c27b3137163d795dc91f34cc114
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" 47b0427bedde80e3189524651a327235bdfddbc613José Fonseca#include "state_tracker/st_cb_flush.h" 4824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#include "state_tracker/st_cb_texture.h" 49f8ab24760d0d3f07e9ee81c98207ddf92dfe74daBrian#include "state_tracker/st_format.h" 50753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer#include "state_tracker/st_texture.h" 5162abcb9aacc33218d0143a743c738435794b32a9Brian#include "state_tracker/st_gen_mipmap.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 return PIPE_TEXTURE_2D; 785390a43ce06b27f6d54bc5f237aa305b6948f2afBrian 797f15dca6d963b0a69131e8761c477064dba49307Luca Barbieri case GL_TEXTURE_RECTANGLE_NV: 807f15dca6d963b0a69131e8761c477064dba49307Luca Barbieri return PIPE_TEXTURE_RECT; 817f15dca6d963b0a69131e8761c477064dba49307Luca Barbieri 825390a43ce06b27f6d54bc5f237aa305b6948f2afBrian case GL_TEXTURE_3D: 835390a43ce06b27f6d54bc5f237aa305b6948f2afBrian return PIPE_TEXTURE_3D; 845390a43ce06b27f6d54bc5f237aa305b6948f2afBrian 855390a43ce06b27f6d54bc5f237aa305b6948f2afBrian case GL_TEXTURE_CUBE_MAP_ARB: 865390a43ce06b27f6d54bc5f237aa305b6948f2afBrian return PIPE_TEXTURE_CUBE; 875390a43ce06b27f6d54bc5f237aa305b6948f2afBrian 885390a43ce06b27f6d54bc5f237aa305b6948f2afBrian default: 895390a43ce06b27f6d54bc5f237aa305b6948f2afBrian assert(0); 905390a43ce06b27f6d54bc5f237aa305b6948f2afBrian return 0; 915390a43ce06b27f6d54bc5f237aa305b6948f2afBrian } 925390a43ce06b27f6d54bc5f237aa305b6948f2afBrian} 935390a43ce06b27f6d54bc5f237aa305b6948f2afBrian 945390a43ce06b27f6d54bc5f237aa305b6948f2afBrian 954e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul/** called via ctx->Driver.NewTextureImage() */ 9624df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic struct gl_texture_image * 9724df8f895fe8807aa2ba058e71bd40adfc01d21eBrianst_NewTextureImage(GLcontext * ctx) 9824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 9924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian DBG("%s\n", __FUNCTION__); 10024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian (void) ctx; 101f1a59a6dd7b7b0523db191d82b3af1a841c6475dBrian Paul return (struct gl_texture_image *) ST_CALLOC_STRUCT(st_texture_image); 10224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 10324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 10424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1054e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul/** called via ctx->Driver.NewTextureObject() */ 10624df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic struct gl_texture_object * 10724df8f895fe8807aa2ba058e71bd40adfc01d21eBrianst_NewTextureObject(GLcontext * ctx, GLuint name, GLenum target) 10824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 109f1a59a6dd7b7b0523db191d82b3af1a841c6475dBrian Paul struct st_texture_object *obj = ST_CALLOC_STRUCT(st_texture_object); 11024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 11124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian DBG("%s\n", __FUNCTION__); 11224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian _mesa_initialize_texture_object(&obj->base, name, target); 11324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 11424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian return &obj->base; 11524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 11624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 11730f46e7b4c9d6c6f8c1c01825b344b90adc93982Brian Paul/** called via ctx->Driver.DeleteTextureObject() */ 11824df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 11924df8f895fe8807aa2ba058e71bd40adfc01d21eBrianst_DeleteTextureObject(GLcontext *ctx, 1206f715dcc219071e574e363a9db4365c9c31ebbd3Brian struct gl_texture_object *texObj) 12124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 12276c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul struct st_context *st = st_context(ctx); 12324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct st_texture_object *stObj = st_texture_object(texObj); 124753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer if (stObj->pt) 125287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(&stObj->pt, NULL); 1262d6befd9d1e8dcf6495fe1b9cef12224046f3095Brian Paul if (stObj->sampler_view) { 12776c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul if (stObj->sampler_view->context != st->pipe) { 1282d6befd9d1e8dcf6495fe1b9cef12224046f3095Brian Paul /* Take "ownership" of this texture sampler view by setting 1292d6befd9d1e8dcf6495fe1b9cef12224046f3095Brian Paul * its context pointer to this context. This avoids potential 1302d6befd9d1e8dcf6495fe1b9cef12224046f3095Brian Paul * crashes when the texture object is shared among contexts 1312d6befd9d1e8dcf6495fe1b9cef12224046f3095Brian Paul * and the original/owner context has already been destroyed. 1322d6befd9d1e8dcf6495fe1b9cef12224046f3095Brian Paul */ 13376c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul stObj->sampler_view->context = st->pipe; 1342d6befd9d1e8dcf6495fe1b9cef12224046f3095Brian Paul } 135b8030c6561e019e079b5be2fe64ec804df4bfa03Michal Krol pipe_sampler_view_reference(&stObj->sampler_view, NULL); 1362d6befd9d1e8dcf6495fe1b9cef12224046f3095Brian Paul } 13724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian _mesa_delete_texture_object(ctx, texObj); 13824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 13924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 14024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1414e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul/** called via ctx->Driver.FreeTexImageData() */ 14224df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 14324df8f895fe8807aa2ba058e71bd40adfc01d21eBrianst_FreeTextureImageData(GLcontext * ctx, struct gl_texture_image *texImage) 14424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 14524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct st_texture_image *stImage = st_texture_image(texImage); 14624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 14724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian DBG("%s\n", __FUNCTION__); 14824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 149753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer if (stImage->pt) { 150287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(&stImage->pt, NULL); 15124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 15224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 15324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian if (texImage->Data) { 1548d6ef125ac6044438db5b89d6d310ccfc4b8140aBrian Paul _mesa_align_free(texImage->Data); 15524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian texImage->Data = NULL; 15624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 15724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 15824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 15924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1604e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul/** 16124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * From linux kernel i386 header files, copes with odd sizes better 16224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * than COPY_DWORDS would: 16324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * XXX Put this in src/mesa/main/imports.h ??? 16424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 1651ea7f0fef055245fa18c0fbc3e54a866956c2507José Fonseca#if defined(PIPE_CC_GCC) && defined(PIPE_ARCH_X86) 16624df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic INLINE void * 16724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian__memcpy(void *to, const void *from, size_t n) 16824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 16924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian int d0, d1, d2; 17024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian __asm__ __volatile__("rep ; movsl\n\t" 17124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian "testb $2,%b4\n\t" 17224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian "je 1f\n\t" 17324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian "movsw\n" 17424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian "1:\ttestb $1,%b4\n\t" 17524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian "je 2f\n\t" 17624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian "movsb\n" "2:":"=&c"(d0), "=&D"(d1), "=&S"(d2) 17724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian :"0"(n / 4), "q"(n), "1"((long) to), "2"((long) from) 17824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian :"memory"); 17924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian return (to); 18024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 18124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#else 18224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#define __memcpy(a,b,c) memcpy(a,b,c) 18324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#endif 18424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 18524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1864e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul/** 1874e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul * The system memcpy (at least on ubuntu 5.10) has problems copying 18824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * to agp (writecombined) memory from a source which isn't 64-byte 18924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * aligned - there is a 4x performance falloff. 19024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * 19124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * The x86 __memcpy is immune to this but is slightly slower 19224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * (10%-ish) than the system memcpy. 19324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * 19424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * The sse_memcpy seems to have a slight cliff at 64/32 bytes, but 19524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * isn't much faster than x86_memcpy for agp copies. 19624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * 19724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * TODO: switch dynamically. 19824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 19924df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void * 20024df8f895fe8807aa2ba058e71bd40adfc01d21eBriando_memcpy(void *dest, const void *src, size_t n) 20124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 202799f55803d15602b10d2bb97ff62792f05ce4de3Brian Paul if ((((unsigned long) src) & 63) || (((unsigned long) dest) & 63)) { 20324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian return __memcpy(dest, src, n); 20424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 20524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian else 20624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian return memcpy(dest, src, n); 20724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 20824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 20924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 210f52f5136e6eed23e55098681e5b082cc452136d6Brian/** 2118283db88414f600e66510de713382c36899d4b03Brian Paul * Return default texture resource binding bitmask for the given format. 2121ad2484f03cbe9ae6bd4ebe50d6894e570d65952Brian Paul */ 2131ad2484f03cbe9ae6bd4ebe50d6894e570d65952Brian Paulstatic GLuint 2148283db88414f600e66510de713382c36899d4b03Brian Pauldefault_bindings(struct st_context *st, enum pipe_format format) 2151ad2484f03cbe9ae6bd4ebe50d6894e570d65952Brian Paul{ 2168283db88414f600e66510de713382c36899d4b03Brian Paul struct pipe_screen *screen = st->pipe->screen; 2178283db88414f600e66510de713382c36899d4b03Brian Paul const unsigned target = PIPE_TEXTURE_2D; 2188283db88414f600e66510de713382c36899d4b03Brian Paul const unsigned geom = 0x0; 2198283db88414f600e66510de713382c36899d4b03Brian Paul unsigned bindings; 2208283db88414f600e66510de713382c36899d4b03Brian Paul 2218283db88414f600e66510de713382c36899d4b03Brian Paul if (util_format_is_depth_or_stencil(format)) 2228283db88414f600e66510de713382c36899d4b03Brian Paul bindings = PIPE_BIND_SAMPLER_VIEW | PIPE_BIND_DEPTH_STENCIL; 2238283db88414f600e66510de713382c36899d4b03Brian Paul else 2248283db88414f600e66510de713382c36899d4b03Brian Paul bindings = PIPE_BIND_SAMPLER_VIEW | PIPE_BIND_RENDER_TARGET; 2258283db88414f600e66510de713382c36899d4b03Brian Paul 226127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger if (screen->is_format_supported(screen, format, target, 0, bindings, geom)) 2278283db88414f600e66510de713382c36899d4b03Brian Paul return bindings; 2281ad2484f03cbe9ae6bd4ebe50d6894e570d65952Brian Paul else 2298283db88414f600e66510de713382c36899d4b03Brian Paul return PIPE_BIND_SAMPLER_VIEW; 2301ad2484f03cbe9ae6bd4ebe50d6894e570d65952Brian Paul} 2311ad2484f03cbe9ae6bd4ebe50d6894e570d65952Brian Paul 2321ad2484f03cbe9ae6bd4ebe50d6894e570d65952Brian Paul 233e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul/** Return number of image dimensions (1, 2 or 3) for a texture target. */ 234e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paulstatic GLuint 235e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paulget_texture_dims(GLenum target) 236e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul{ 237e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul switch (target) { 238e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul case GL_TEXTURE_1D: 239e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul case GL_TEXTURE_1D_ARRAY_EXT: 240e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul return 1; 241e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul case GL_TEXTURE_2D: 242e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul case GL_TEXTURE_CUBE_MAP_ARB: 243e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul case GL_TEXTURE_RECTANGLE_NV: 244e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul case GL_TEXTURE_2D_ARRAY_EXT: 245e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul return 2; 246e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul case GL_TEXTURE_3D: 247e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul return 3; 248e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul default: 249e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul assert(0 && "invalid texture target in get_texture_dims()"); 250e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul return 1; 251e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul } 252e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul} 253e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul 254e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul 2551ad2484f03cbe9ae6bd4ebe50d6894e570d65952Brian Paul/** 256e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul * Try to allocate a pipe_resource object for the given st_texture_object. 257f52f5136e6eed23e55098681e5b082cc452136d6Brian * 258e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul * We use the given st_texture_image as a clue to determine the size of the 259e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul * mipmap image at level=0. 2602b53f4a9c674e9b02df8a06759e7a2340f257081Brian Paul * 2612b53f4a9c674e9b02df8a06759e7a2340f257081Brian Paul * \return GL_TRUE for success, GL_FALSE if out of memory. 26224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 2632b53f4a9c674e9b02df8a06759e7a2340f257081Brian Paulstatic GLboolean 264753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzerguess_and_alloc_texture(struct st_context *st, 265753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer struct st_texture_object *stObj, 266afc54983370033b65e3a7cbb29bd9c87156f0881Brian const struct st_texture_image *stImage) 26724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 268e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul const GLuint dims = get_texture_dims(stObj->base.Target); 269e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul GLuint level, lastLevel, width, height, depth; 270e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul GLuint bindings; 271a1f95a8bf64f863289b6759caeec76d7e054400eRoland Scheidegger enum pipe_format fmt; 27224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 27324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian DBG("%s\n", __FUNCTION__); 27424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 275f52f5136e6eed23e55098681e5b082cc452136d6Brian assert(!stObj->pt); 276f52f5136e6eed23e55098681e5b082cc452136d6Brian 277e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul level = stImage->level; 278e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul width = stImage->base.Width2; /* size w/out border */ 279e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul height = stImage->base.Height2; 280e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul depth = stImage->base.Depth2; 28124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 282e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul assert(width > 0); 283e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul assert(height > 0); 284e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul assert(depth > 0); 28524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 286e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul /* Depending on the image's size, we can't always make a guess here. 28724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 288e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul if (level > 0) { 289e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul if ( (dims >= 1 && width == 1) || 290e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul (dims >= 2 && height == 1) || 291e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul (dims >= 3 && depth == 1) ) { 292e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul /* we can't determine the image size at level=0 */ 293e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul stObj->width0 = stObj->height0 = stObj->depth0 = 0; 2942b53f4a9c674e9b02df8a06759e7a2340f257081Brian Paul /* this is not an out of memory error */ 2952b53f4a9c674e9b02df8a06759e7a2340f257081Brian Paul return GL_TRUE; 296e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul } 297e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul } 298e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul 299e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul /* grow the image size until we hit level = 0 */ 300e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul while (level > 0) { 30145cc35e77600af8628393475405160e26d56d421Brian Paul if (width != 1) 30245cc35e77600af8628393475405160e26d56d421Brian Paul width <<= 1; 30324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian if (height != 1) 30424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian height <<= 1; 30524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian if (depth != 1) 30624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian depth <<= 1; 307e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul level--; 308e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul } 30924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 310e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul assert(level == 0); 311e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul 312e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul /* At this point, (width x height x depth) is the expected size of 313e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul * the level=0 mipmap image. 314e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul */ 315296378b6c8b205048244746e260739448c4ee590Brian Paul 3164b7812919a5db2f72bd3b9f6d760ffeb469ee3e4Brian Paul /* Guess a reasonable value for lastLevel. With OpenGL we have no 3174b7812919a5db2f72bd3b9f6d760ffeb469ee3e4Brian Paul * idea how many mipmap levels will be in a texture until we start 3184b7812919a5db2f72bd3b9f6d760ffeb469ee3e4Brian Paul * to render with it. Make an educated guess here but be prepared 3194b7812919a5db2f72bd3b9f6d760ffeb469ee3e4Brian Paul * to re-allocating a texture buffer with space for more (or fewer) 3204b7812919a5db2f72bd3b9f6d760ffeb469ee3e4Brian Paul * mipmap levels later. 32124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 32214b98343309fdcff3514f05020303f7b40e83a4aBrian if ((stObj->base.MinFilter == GL_NEAREST || 3232a2236606fd6ae473a2f4db6ef6d3d5030261316José Fonseca stObj->base.MinFilter == GL_LINEAR || 3242a2236606fd6ae473a2f4db6ef6d3d5030261316José Fonseca stImage->base._BaseFormat == GL_DEPTH_COMPONENT || 3252a2236606fd6ae473a2f4db6ef6d3d5030261316José Fonseca stImage->base._BaseFormat == GL_DEPTH_STENCIL_EXT) && 32605bad193f56d48384097e37e47fae3fdda85f144Brian Paul !stObj->base.GenerateMipmap && 327e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul stImage->level == 0) { 32805bad193f56d48384097e37e47fae3fdda85f144Brian Paul /* only alloc space for a single mipmap level */ 329e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul lastLevel = 0; 33024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 33124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian else { 33205bad193f56d48384097e37e47fae3fdda85f144Brian Paul /* alloc space for a full mipmap */ 333c1785c19ca0716a7e85777242949a0c33e28988fPatrice Mandin GLuint l2width = util_logbase2(width); 334c1785c19ca0716a7e85777242949a0c33e28988fPatrice Mandin GLuint l2height = util_logbase2(height); 335c1785c19ca0716a7e85777242949a0c33e28988fPatrice Mandin GLuint l2depth = util_logbase2(depth); 336e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul lastLevel = MAX2(MAX2(l2width, l2height), l2depth); 33724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 33824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 339e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul /* Save the level=0 dimensions */ 340e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul stObj->width0 = width; 341e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul stObj->height0 = height; 342e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul stObj->depth0 = depth; 343e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul 3441f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul fmt = st_mesa_format_to_pipe_format(stImage->base.TexFormat); 3451ad2484f03cbe9ae6bd4ebe50d6894e570d65952Brian Paul 3468283db88414f600e66510de713382c36899d4b03Brian Paul bindings = default_bindings(st, fmt); 3471ad2484f03cbe9ae6bd4ebe50d6894e570d65952Brian Paul 348753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer stObj->pt = st_texture_create(st, 3495390a43ce06b27f6d54bc5f237aa305b6948f2afBrian gl_target_to_pipe(stObj->base.Target), 350a1f95a8bf64f863289b6759caeec76d7e054400eRoland Scheidegger fmt, 3515390a43ce06b27f6d54bc5f237aa305b6948f2afBrian lastLevel, 3525390a43ce06b27f6d54bc5f237aa305b6948f2afBrian width, 3535390a43ce06b27f6d54bc5f237aa305b6948f2afBrian height, 3545390a43ce06b27f6d54bc5f237aa305b6948f2afBrian depth, 3558283db88414f600e66510de713382c36899d4b03Brian Paul bindings); 35624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 3572b53f4a9c674e9b02df8a06759e7a2340f257081Brian Paul DBG("%s returning %d\n", __FUNCTION__, (stObj->pt != NULL)); 3582b53f4a9c674e9b02df8a06759e7a2340f257081Brian Paul 3592b53f4a9c674e9b02df8a06759e7a2340f257081Brian Paul return stObj->pt != NULL; 36024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 36124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 36224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 363212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian/** 364212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian * Adjust pixel unpack params and image dimensions to strip off the 365212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian * texture border. 366212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian * Gallium doesn't support texture borders. They've seldem been used 367212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian * and seldom been implemented correctly anyway. 368212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian * \param unpackNew returns the new pixel unpack parameters 369212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian */ 370212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brianstatic void 371212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brianstrip_texture_border(GLint border, 372212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian GLint *width, GLint *height, GLint *depth, 373212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian const struct gl_pixelstore_attrib *unpack, 374212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian struct gl_pixelstore_attrib *unpackNew) 375212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian{ 376212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian assert(border > 0); /* sanity check */ 377212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian 378212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian *unpackNew = *unpack; 379212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian 380212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian if (unpackNew->RowLength == 0) 381212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian unpackNew->RowLength = *width; 382212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian 383212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian if (depth && unpackNew->ImageHeight == 0) 384212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian unpackNew->ImageHeight = *height; 385212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian 386212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian unpackNew->SkipPixels += border; 387212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian if (height) 388212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian unpackNew->SkipRows += border; 389212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian if (depth) 390212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian unpackNew->SkipImages += border; 391212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian 392212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian assert(*width >= 3); 393212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian *width = *width - 2 * border; 394212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian if (height && *height >= 3) 395212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian *height = *height - 2 * border; 396212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian if (depth && *depth >= 3) 397212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian *depth = *depth - 2 * border; 398212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian} 399212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian 40024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 4014e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul/** 40255ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz * Try to do texture compression via rendering. If the Gallium driver 40355ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz * can render into a compressed surface this will allow us to do texture 40455ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz * compression. 40555ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz * \return GL_TRUE for success, GL_FALSE for failure 40655ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz */ 40755ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantzstatic GLboolean 40855ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantzcompress_with_blit(GLcontext * ctx, 40955ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz GLenum target, GLint level, 41055ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz GLint xoffset, GLint yoffset, GLint zoffset, 41155ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz GLint width, GLint height, GLint depth, 41255ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz GLenum format, GLenum type, const void *pixels, 41355ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz const struct gl_pixelstore_attrib *unpack, 41455ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz struct gl_texture_image *texImage) 41555ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz{ 41655ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz const GLuint dstImageOffsets[1] = {0}; 41755ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz struct st_texture_image *stImage = st_texture_image(texImage); 41876c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul struct st_context *st = st_context(ctx); 41976c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul struct pipe_context *pipe = st->pipe; 420b43c182f19c6291c88420fa12714f952c2b461fbKeith Whitwell struct pipe_screen *screen = pipe->screen; 4211f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul gl_format mesa_format; 422287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct pipe_resource templ; 423287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct pipe_resource *src_tex; 4248f55a95178069d5e8b18647e6b675fc403d68073Roland Scheidegger struct pipe_sampler_view view_templ; 4258f55a95178069d5e8b18647e6b675fc403d68073Roland Scheidegger struct pipe_sampler_view *src_view; 42655ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz struct pipe_surface *dst_surface; 42755ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz struct pipe_transfer *tex_xfer; 42855ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz void *map; 42955ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz 43055ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz if (!stImage->pt) { 43155ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz /* XXX: Can this happen? Should we assert? */ 43255ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz return GL_FALSE; 43355ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz } 43455ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz 43555ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz /* get destination surface (in the compressed texture) */ 43655ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz dst_surface = screen->get_tex_surface(screen, stImage->pt, 43755ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz stImage->face, stImage->level, 0, 438127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger 0 /* flags */); 43955ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz if (!dst_surface) { 44055ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz /* can't render into this format (or other problem) */ 44155ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz return GL_FALSE; 44255ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz } 44355ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz 44455ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz /* Choose format for the temporary RGBA texture image. 44555ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz */ 44655ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz mesa_format = st_ChooseTextureFormat(ctx, GL_RGBA, format, type); 44755ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz assert(mesa_format); 44855ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz if (!mesa_format) 44955ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz return GL_FALSE; 45055ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz 45155ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz /* Create the temporary source texture 45255ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz */ 45355ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz memset(&templ, 0, sizeof(templ)); 4547f15dca6d963b0a69131e8761c477064dba49307Luca Barbieri templ.target = st->internal_target; 4551f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul templ.format = st_mesa_format_to_pipe_format(mesa_format); 456683e35f726a182ed9fc6b6d5cb07146eebe14deaKeith Whitwell templ.width0 = width; 457683e35f726a182ed9fc6b6d5cb07146eebe14deaKeith Whitwell templ.height0 = height; 458683e35f726a182ed9fc6b6d5cb07146eebe14deaKeith Whitwell templ.depth0 = 1; 45955ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz templ.last_level = 0; 460a2a01853f3f40b4ef8b3f01503391877960bdaeeBrian Paul templ.usage = PIPE_USAGE_DEFAULT; 461287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell templ.bind = PIPE_BIND_SAMPLER_VIEW; 462287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell src_tex = screen->resource_create(screen, &templ); 46355ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz 46455ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz if (!src_tex) 46555ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz return GL_FALSE; 46655ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz 46755ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz /* Put user's tex data into the temporary texture 46855ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz */ 469b0427bedde80e3189524651a327235bdfddbc613José Fonseca tex_xfer = pipe_get_transfer(st_context(ctx)->pipe, src_tex, 4705ed7764fd6354da8e2be15d6fb724c2d6be9be4aKeith Whitwell 0, 0, 0, /* face, level are zero */ 471e50dd26ca6d0eb0d0f97c2780020ea16e3d4a687Thomas Hellstrom PIPE_TRANSFER_WRITE, 472e50dd26ca6d0eb0d0f97c2780020ea16e3d4a687Thomas Hellstrom 0, 0, width, height); /* x, y, w, h */ 473287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell map = pipe_transfer_map(pipe, tex_xfer); 47455ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz 4756480210b89dc8ae0990c450d27870c7b7930f251Brian Paul _mesa_texstore(ctx, 2, GL_RGBA, mesa_format, 4766480210b89dc8ae0990c450d27870c7b7930f251Brian Paul map, /* dest ptr */ 4776480210b89dc8ae0990c450d27870c7b7930f251Brian Paul 0, 0, 0, /* dest x/y/z offset */ 4786480210b89dc8ae0990c450d27870c7b7930f251Brian Paul tex_xfer->stride, /* dest row stride (bytes) */ 4796480210b89dc8ae0990c450d27870c7b7930f251Brian Paul dstImageOffsets, /* image offsets (for 3D only) */ 4806480210b89dc8ae0990c450d27870c7b7930f251Brian Paul width, height, 1, /* size */ 4816480210b89dc8ae0990c450d27870c7b7930f251Brian Paul format, type, /* source format/type */ 4826480210b89dc8ae0990c450d27870c7b7930f251Brian Paul pixels, /* source data */ 4836480210b89dc8ae0990c450d27870c7b7930f251Brian Paul unpack); /* source data packing */ 48455ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz 485287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_transfer_unmap(pipe, tex_xfer); 486287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe->transfer_destroy(pipe, tex_xfer); 48755ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz 4888f55a95178069d5e8b18647e6b675fc403d68073Roland Scheidegger /* Create temporary sampler view */ 4898f55a95178069d5e8b18647e6b675fc403d68073Roland Scheidegger u_sampler_view_default_template(&view_templ, 4908f55a95178069d5e8b18647e6b675fc403d68073Roland Scheidegger src_tex, 4918f55a95178069d5e8b18647e6b675fc403d68073Roland Scheidegger src_tex->format); 4928f55a95178069d5e8b18647e6b675fc403d68073Roland Scheidegger src_view = pipe->create_sampler_view(pipe, src_tex, &view_templ); 4938f55a95178069d5e8b18647e6b675fc403d68073Roland Scheidegger 4948f55a95178069d5e8b18647e6b675fc403d68073Roland Scheidegger 49555ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz /* copy / compress image */ 49676c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul util_blit_pixels_tex(st->blit, 4978f55a95178069d5e8b18647e6b675fc403d68073Roland Scheidegger src_view, /* sampler view (src) */ 49855ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz 0, 0, /* src x0, y0 */ 49955ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz width, height, /* src x1, y1 */ 50055ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz dst_surface, /* pipe_surface (dst) */ 50155ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz xoffset, yoffset, /* dst x0, y0 */ 50255ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz xoffset + width, /* dst x1 */ 50355ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz yoffset + height, /* dst y1 */ 50455ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz 0.0, /* z */ 50555ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz PIPE_TEX_MIPFILTER_NEAREST); 50655ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz 50755ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz pipe_surface_reference(&dst_surface, NULL); 508287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(&src_tex, NULL); 5098f55a95178069d5e8b18647e6b675fc403d68073Roland Scheidegger pipe_sampler_view_reference(&src_view, NULL); 51055ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz 51155ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz return GL_TRUE; 51255ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz} 51355ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz 51455ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz 51555ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz/** 5164e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul * Do glTexImage1/2/3D(). 5174e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul */ 51824df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 51924df8f895fe8807aa2ba058e71bd40adfc01d21eBrianst_TexImage(GLcontext * ctx, 520afc54983370033b65e3a7cbb29bd9c87156f0881Brian GLint dims, 521afc54983370033b65e3a7cbb29bd9c87156f0881Brian GLenum target, GLint level, 522afc54983370033b65e3a7cbb29bd9c87156f0881Brian GLint internalFormat, 523afc54983370033b65e3a7cbb29bd9c87156f0881Brian GLint width, GLint height, GLint depth, 524afc54983370033b65e3a7cbb29bd9c87156f0881Brian GLint border, 525afc54983370033b65e3a7cbb29bd9c87156f0881Brian GLenum format, GLenum type, const void *pixels, 526afc54983370033b65e3a7cbb29bd9c87156f0881Brian const struct gl_pixelstore_attrib *unpack, 527afc54983370033b65e3a7cbb29bd9c87156f0881Brian struct gl_texture_object *texObj, 528afc54983370033b65e3a7cbb29bd9c87156f0881Brian struct gl_texture_image *texImage, 52955ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz GLsizei imageSize, GLboolean compressed_src) 53024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 53176c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul struct st_context *st = st_context(ctx); 53276c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul struct pipe_screen *screen = st->pipe->screen; 53314b98343309fdcff3514f05020303f7b40e83a4aBrian struct st_texture_object *stObj = st_texture_object(texObj); 53414b98343309fdcff3514f05020303f7b40e83a4aBrian struct st_texture_image *stImage = st_texture_image(texImage); 5355a8e1ddf193bb25c5cf05b70088c64ede772d7e9Brian Paul GLuint dstRowStride = 0; 536212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian struct gl_pixelstore_attrib unpackNB; 5375a8e1ddf193bb25c5cf05b70088c64ede772d7e9Brian Paul enum pipe_transfer_usage transfer_usage = 0; 53824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 53924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian DBG("%s target %s level %d %dx%dx%d border %d\n", __FUNCTION__, 54024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian _mesa_lookup_enum_by_nr(target), level, width, height, depth, border); 54124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 542b02619914eed4bdb5c8bb2239c6e3b9639ed00f6Brian Paul /* The Mesa/Gallium state tracker does not implement the imaging extensions 543b02619914eed4bdb5c8bb2239c6e3b9639ed00f6Brian Paul * such as convolution. 544b02619914eed4bdb5c8bb2239c6e3b9639ed00f6Brian Paul */ 545b02619914eed4bdb5c8bb2239c6e3b9639ed00f6Brian Paul assert(!ctx->Extensions.ARB_imaging); 546b02619914eed4bdb5c8bb2239c6e3b9639ed00f6Brian Paul assert(!ctx->Extensions.EXT_convolution); 547b02619914eed4bdb5c8bb2239c6e3b9639ed00f6Brian Paul 54854a7115fc27c640e2b3f1a362e8e07aac220556dChia-I Wu /* switch to "normal" */ 54954a7115fc27c640e2b3f1a362e8e07aac220556dChia-I Wu if (stObj->surface_based) { 55054a7115fc27c640e2b3f1a362e8e07aac220556dChia-I Wu _mesa_clear_texture_object(ctx, texObj); 5510f74efdef05c5c27b3137163d795dc91f34cc114Chia-I Wu pipe_resource_reference(&stObj->pt, NULL); 5520f74efdef05c5c27b3137163d795dc91f34cc114Chia-I Wu 5530f74efdef05c5c27b3137163d795dc91f34cc114Chia-I Wu /* oops, need to init this image again */ 5540f74efdef05c5c27b3137163d795dc91f34cc114Chia-I Wu _mesa_init_teximage_fields(ctx, target, texImage, 5550f74efdef05c5c27b3137163d795dc91f34cc114Chia-I Wu width, height, depth, border, internalFormat); 5560f74efdef05c5c27b3137163d795dc91f34cc114Chia-I Wu _mesa_choose_texture_format(ctx, texObj, texImage, target, level, 5570f74efdef05c5c27b3137163d795dc91f34cc114Chia-I Wu internalFormat, format, type); 5580f74efdef05c5c27b3137163d795dc91f34cc114Chia-I Wu 55954a7115fc27c640e2b3f1a362e8e07aac220556dChia-I Wu stObj->surface_based = GL_FALSE; 56054a7115fc27c640e2b3f1a362e8e07aac220556dChia-I Wu } 56154a7115fc27c640e2b3f1a362e8e07aac220556dChia-I Wu 562212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian /* gallium does not support texture borders, strip it off */ 563212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian if (border) { 5645facd7986ace899673499f396897469720476799Brian Paul strip_texture_border(border, &width, &height, &depth, unpack, &unpackNB); 565212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian unpack = &unpackNB; 56621989edd55409d72ee55187f4f9062496ca3fbf8Brian Paul texImage->Width = width; 56721989edd55409d72ee55187f4f9062496ca3fbf8Brian Paul texImage->Height = height; 56821989edd55409d72ee55187f4f9062496ca3fbf8Brian Paul texImage->Depth = depth; 56921989edd55409d72ee55187f4f9062496ca3fbf8Brian Paul texImage->Border = 0; 570212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian border = 0; 571212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian } 572c7d1d34c580e8c76bf2f3f8687223e648e7ec5f1Brian Paul else { 573c7d1d34c580e8c76bf2f3f8687223e648e7ec5f1Brian Paul assert(texImage->Width == width); 574c7d1d34c580e8c76bf2f3f8687223e648e7ec5f1Brian Paul assert(texImage->Height == height); 575c7d1d34c580e8c76bf2f3f8687223e648e7ec5f1Brian Paul assert(texImage->Depth == depth); 576c7d1d34c580e8c76bf2f3f8687223e648e7ec5f1Brian Paul } 577212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian 578cfe9e66f2bc596c43760911e7c1604bb32cdee28Brian stImage->face = _mesa_tex_target_to_face(target); 57914b98343309fdcff3514f05020303f7b40e83a4aBrian stImage->level = level; 58024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 58124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian _mesa_set_fetch_functions(texImage, dims); 58224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 58324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian /* Release the reference to a potentially orphaned buffer. 58424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * Release any old malloced memory. 58524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 586753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer if (stImage->pt) { 587287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(&stImage->pt, NULL); 58824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian assert(!texImage->Data); 58924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 59024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian else if (texImage->Data) { 59124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian _mesa_align_free(texImage->Data); 59224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 59324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 594bdf975e9ad25ee65d796a3c1ce3f2afbd2889c4eBrian Paul /* 595bdf975e9ad25ee65d796a3c1ce3f2afbd2889c4eBrian Paul * See if the new image is somehow incompatible with the existing 596bdf975e9ad25ee65d796a3c1ce3f2afbd2889c4eBrian Paul * mipmap. If so, free the old mipmap. 59724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 598a0509f7d28765c6ef8546eafba94aec46d9e7ed3Brian Paul if (stObj->pt) { 599e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul if (level > (GLint) stObj->pt->last_level || 600bdf975e9ad25ee65d796a3c1ce3f2afbd2889c4eBrian Paul !st_texture_match_image(stObj->pt, &stImage->base, 601bdf975e9ad25ee65d796a3c1ce3f2afbd2889c4eBrian Paul stImage->face, stImage->level)) { 602a0509f7d28765c6ef8546eafba94aec46d9e7ed3Brian Paul DBG("release it\n"); 603287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(&stObj->pt, NULL); 604a0509f7d28765c6ef8546eafba94aec46d9e7ed3Brian Paul assert(!stObj->pt); 60540c3861e1e98116c573027b054a6a05208c53b6aMichal Krol pipe_sampler_view_reference(&stObj->sampler_view, NULL); 606a0509f7d28765c6ef8546eafba94aec46d9e7ed3Brian Paul } 60724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 60824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 609bdf975e9ad25ee65d796a3c1ce3f2afbd2889c4eBrian Paul if (width == 0 || height == 0 || depth == 0) { 610bdf975e9ad25ee65d796a3c1ce3f2afbd2889c4eBrian Paul /* stop after freeing old image */ 611bdf975e9ad25ee65d796a3c1ce3f2afbd2889c4eBrian Paul return; 612bdf975e9ad25ee65d796a3c1ce3f2afbd2889c4eBrian Paul } 613bdf975e9ad25ee65d796a3c1ce3f2afbd2889c4eBrian Paul 614753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer if (!stObj->pt) { 6152b53f4a9c674e9b02df8a06759e7a2340f257081Brian Paul if (!guess_and_alloc_texture(st, stObj, stImage)) { 6168d249ca620f6995cc5824d95c29bda7043bbdf8cBrian Paul /* Probably out of memory. 6178d249ca620f6995cc5824d95c29bda7043bbdf8cBrian Paul * Try flushing any pending rendering, then retry. 6188d249ca620f6995cc5824d95c29bda7043bbdf8cBrian Paul */ 61976c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul st_finish(st); 6202b53f4a9c674e9b02df8a06759e7a2340f257081Brian Paul if (!guess_and_alloc_texture(st, stObj, stImage)) { 6218d249ca620f6995cc5824d95c29bda7043bbdf8cBrian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage"); 6228d249ca620f6995cc5824d95c29bda7043bbdf8cBrian Paul return; 6238d249ca620f6995cc5824d95c29bda7043bbdf8cBrian Paul } 62424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 62524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 62624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 627753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer assert(!stImage->pt); 62824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 629013b332cbcad2b9d113e00c467a65d072eb61cecBrian Paul /* Check if this texture image can live inside the texture object's buffer. 630013b332cbcad2b9d113e00c467a65d072eb61cecBrian Paul * If so, store the image there. Otherwise the image will temporarily live 631013b332cbcad2b9d113e00c467a65d072eb61cecBrian Paul * in its own buffer. 632013b332cbcad2b9d113e00c467a65d072eb61cecBrian Paul */ 633753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer if (stObj->pt && 634753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer st_texture_match_image(stObj->pt, &stImage->base, 635013b332cbcad2b9d113e00c467a65d072eb61cecBrian Paul stImage->face, stImage->level)) { 63624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 637287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(&stImage->pt, stObj->pt); 638753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer assert(stImage->pt); 63924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 64024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 641753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer if (!stImage->pt) 642753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer DBG("XXX: Image did not fit into texture - storing in local memory!\n"); 64324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 644013b332cbcad2b9d113e00c467a65d072eb61cecBrian Paul /* Pixel data may come from regular user memory or a PBO. For the later, 645013b332cbcad2b9d113e00c467a65d072eb61cecBrian Paul * do bounds checking and map the PBO to read pixels data from it. 646013b332cbcad2b9d113e00c467a65d072eb61cecBrian Paul * 647013b332cbcad2b9d113e00c467a65d072eb61cecBrian Paul * XXX we should try to use a GPU-accelerated path to copy the image data 648013b332cbcad2b9d113e00c467a65d072eb61cecBrian Paul * from the PBO to the texture. 64924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 65055ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz if (compressed_src) { 65124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian pixels = _mesa_validate_pbo_compressed_teximage(ctx, imageSize, pixels, 65224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian unpack, 65324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian "glCompressedTexImage"); 6545facd7986ace899673499f396897469720476799Brian Paul } 6555facd7986ace899673499f396897469720476799Brian Paul else { 65624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian pixels = _mesa_validate_pbo_teximage(ctx, dims, width, height, 1, 65724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian format, type, 65824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian pixels, unpack, "glTexImage"); 65924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 660cfa1a0a609daefffc6f8c4087ed0bc34c2665ef4Brian Paul 66155ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz /* See if we can do texture compression with a blit/render. 66255ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz */ 66355ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz if (!compressed_src && 66455ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz !ctx->Mesa_DXTn && 66592863109af05acdb4ee5e42141c83ab0f18b7f88Brian Paul _mesa_is_format_compressed(texImage->TexFormat) && 66655ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz screen->is_format_supported(screen, 66755ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz stImage->pt->format, 668127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger stImage->pt->target, 0, 669287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell PIPE_BIND_RENDER_TARGET, 0)) { 670cfa1a0a609daefffc6f8c4087ed0bc34c2665ef4Brian Paul if (!pixels) 671cfa1a0a609daefffc6f8c4087ed0bc34c2665ef4Brian Paul goto done; 672cfa1a0a609daefffc6f8c4087ed0bc34c2665ef4Brian Paul 67355ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz if (compress_with_blit(ctx, target, level, 0, 0, 0, width, height, depth, 67455ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz format, type, pixels, unpack, texImage)) { 675f989390af6f827d1ea36560381340148811836f3Jakob Bornecrantz goto done; 67655ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz } 67755ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz } 67855ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz 679013b332cbcad2b9d113e00c467a65d072eb61cecBrian Paul /* 680013b332cbcad2b9d113e00c467a65d072eb61cecBrian Paul * Prepare to store the texture data. Either map the gallium texture buffer 681013b332cbcad2b9d113e00c467a65d072eb61cecBrian Paul * memory or malloc space for it. 682013b332cbcad2b9d113e00c467a65d072eb61cecBrian Paul */ 683753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer if (stImage->pt) { 68441b8a2e9391cd85a65ba30a7e5f5068b5767d58aBrian Paul /* Store the image in the gallium texture memory buffer */ 68571633abafc935c25da9731bab48c228ceb9b4097Michel Dänzer if (format == GL_DEPTH_COMPONENT && 6860bed834be4a174d20b31a6cbcf066774bf749929Michal Krol util_format_is_depth_and_stencil(stImage->pt->format)) 68771633abafc935c25da9731bab48c228ceb9b4097Michel Dänzer transfer_usage = PIPE_TRANSFER_READ_WRITE; 68871633abafc935c25da9731bab48c228ceb9b4097Michel Dänzer else 68971633abafc935c25da9731bab48c228ceb9b4097Michel Dänzer transfer_usage = PIPE_TRANSFER_WRITE; 69071633abafc935c25da9731bab48c228ceb9b4097Michel Dänzer 69176c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul texImage->Data = st_texture_image_map(st, stImage, 0, 692c7d1d34c580e8c76bf2f3f8687223e648e7ec5f1Brian Paul transfer_usage, 0, 0, width, height); 69301397a66c77f8ebfe78b90ace59c095194a290cfJosé Fonseca if(stImage->transfer) 69401397a66c77f8ebfe78b90ace59c095194a290cfJosé Fonseca dstRowStride = stImage->transfer->stride; 69524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 69624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian else { 69724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian /* Allocate regular memory and store the image there temporarily. */ 698c7d1d34c580e8c76bf2f3f8687223e648e7ec5f1Brian Paul GLuint imageSize = _mesa_format_image_size(texImage->TexFormat, 699c7d1d34c580e8c76bf2f3f8687223e648e7ec5f1Brian Paul width, height, depth); 700c7d1d34c580e8c76bf2f3f8687223e648e7ec5f1Brian Paul dstRowStride = _mesa_format_row_stride(texImage->TexFormat, width); 70124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 702c7d1d34c580e8c76bf2f3f8687223e648e7ec5f1Brian Paul texImage->Data = _mesa_align_malloc(imageSize, 16); 70324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 70424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 7052a39dbe7364af5444b1eb43650dfc31ed09257dcBrian Paul if (!texImage->Data) { 7062a39dbe7364af5444b1eb43650dfc31ed09257dcBrian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage"); 7072a39dbe7364af5444b1eb43650dfc31ed09257dcBrian Paul return; 7082a39dbe7364af5444b1eb43650dfc31ed09257dcBrian Paul } 7092a39dbe7364af5444b1eb43650dfc31ed09257dcBrian Paul 710013b332cbcad2b9d113e00c467a65d072eb61cecBrian Paul if (!pixels) { 711013b332cbcad2b9d113e00c467a65d072eb61cecBrian Paul /* We've allocated texture memory, but have no pixel data - all done. */ 712cfa1a0a609daefffc6f8c4087ed0bc34c2665ef4Brian Paul goto done; 713013b332cbcad2b9d113e00c467a65d072eb61cecBrian Paul } 714cfa1a0a609daefffc6f8c4087ed0bc34c2665ef4Brian Paul 71524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian DBG("Upload image %dx%dx%d row_len %x pitch %x\n", 71641b8a2e9391cd85a65ba30a7e5f5068b5767d58aBrian Paul width, height, depth, width, dstRowStride); 71724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 718013b332cbcad2b9d113e00c467a65d072eb61cecBrian Paul /* Copy user texture image into the texture buffer. 71924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 72055ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz if (compressed_src) { 721e79086865bd67f860dfd0d5951395495530022bcBrian Paul const GLuint srcRowStride = 722e79086865bd67f860dfd0d5951395495530022bcBrian Paul _mesa_format_row_stride(texImage->TexFormat, width); 723e79086865bd67f860dfd0d5951395495530022bcBrian Paul if (dstRowStride == srcRowStride) { 724eea6a7639f767b1d30b6ef1f91a9c49e3f3b78f0Luca Barbieri memcpy(texImage->Data, pixels, imageSize); 725e79086865bd67f860dfd0d5951395495530022bcBrian Paul } 726e79086865bd67f860dfd0d5951395495530022bcBrian Paul else { 727eea6a7639f767b1d30b6ef1f91a9c49e3f3b78f0Luca Barbieri char *dst = texImage->Data; 728eea6a7639f767b1d30b6ef1f91a9c49e3f3b78f0Luca Barbieri const char *src = pixels; 7299328f3a670993167d7fb9a590f9e712467e77c7cLuca Barbieri GLuint i, bw, bh, lines; 7309328f3a670993167d7fb9a590f9e712467e77c7cLuca Barbieri _mesa_get_format_block_size(texImage->TexFormat, &bw, &bh); 7319328f3a670993167d7fb9a590f9e712467e77c7cLuca Barbieri lines = (height + bh - 1) / bh; 732eea6a7639f767b1d30b6ef1f91a9c49e3f3b78f0Luca Barbieri 733e79086865bd67f860dfd0d5951395495530022bcBrian Paul for (i = 0; i < lines; ++i) { 734e79086865bd67f860dfd0d5951395495530022bcBrian Paul memcpy(dst, src, srcRowStride); 735eea6a7639f767b1d30b6ef1f91a9c49e3f3b78f0Luca Barbieri dst += dstRowStride; 736e79086865bd67f860dfd0d5951395495530022bcBrian Paul src += srcRowStride; 737eea6a7639f767b1d30b6ef1f91a9c49e3f3b78f0Luca Barbieri } 738eea6a7639f767b1d30b6ef1f91a9c49e3f3b78f0Luca Barbieri } 73924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 740753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer else { 741eaca19edbbe7876079aa33d7f75d93601677081bBrian Paul const GLuint srcImageStride = 742eaca19edbbe7876079aa33d7f75d93601677081bBrian Paul _mesa_image_image_stride(unpack, width, height, format, type); 7435facd7986ace899673499f396897469720476799Brian Paul GLint i; 7445823f99d0fbc054b87aeb1bc15d413d3eadd27a8Brian const GLubyte *src = (const GLubyte *) pixels; 745753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer 746d11d903c1b81000d04f859dcc2da41dae024f146Brian Paul for (i = 0; i < depth; i++) { 7476480210b89dc8ae0990c450d27870c7b7930f251Brian Paul if (!_mesa_texstore(ctx, dims, 7486480210b89dc8ae0990c450d27870c7b7930f251Brian Paul texImage->_BaseFormat, 7496480210b89dc8ae0990c450d27870c7b7930f251Brian Paul texImage->TexFormat, 7506480210b89dc8ae0990c450d27870c7b7930f251Brian Paul texImage->Data, 7516480210b89dc8ae0990c450d27870c7b7930f251Brian Paul 0, 0, 0, /* dstX/Y/Zoffset */ 7526480210b89dc8ae0990c450d27870c7b7930f251Brian Paul dstRowStride, 7536480210b89dc8ae0990c450d27870c7b7930f251Brian Paul texImage->ImageOffsets, 7546480210b89dc8ae0990c450d27870c7b7930f251Brian Paul width, height, 1, 7556480210b89dc8ae0990c450d27870c7b7930f251Brian Paul format, type, src, unpack)) { 756753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage"); 757753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer } 758753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer 759d11d903c1b81000d04f859dcc2da41dae024f146Brian Paul if (stImage->pt && i + 1 < depth) { 760d11d903c1b81000d04f859dcc2da41dae024f146Brian Paul /* unmap this slice */ 76176c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul st_texture_image_unmap(st, stImage); 762d11d903c1b81000d04f859dcc2da41dae024f146Brian Paul /* map next slice of 3D texture */ 76376c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul texImage->Data = st_texture_image_map(st, stImage, i + 1, 76471633abafc935c25da9731bab48c228ceb9b4097Michel Dänzer transfer_usage, 0, 0, 765c7d1d34c580e8c76bf2f3f8687223e648e7ec5f1Brian Paul width, height); 7665823f99d0fbc054b87aeb1bc15d413d3eadd27a8Brian src += srcImageStride; 767753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer } 768753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer } 76924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 77024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 77108d39251a79a964e4a3ac0d7d8a397c2b66a0808Brian Pauldone: 77224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian _mesa_unmap_teximage_pbo(ctx, unpack); 77324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 77455ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz if (stImage->pt && texImage->Data) { 77576c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul st_texture_image_unmap(st, stImage); 77624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian texImage->Data = NULL; 77724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 77824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 77924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 78024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 78124df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 78224df8f895fe8807aa2ba058e71bd40adfc01d21eBrianst_TexImage3D(GLcontext * ctx, 7834e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul GLenum target, GLint level, 7844e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul GLint internalFormat, 7854e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul GLint width, GLint height, GLint depth, 7864e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul GLint border, 7874e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul GLenum format, GLenum type, const void *pixels, 7884e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul const struct gl_pixelstore_attrib *unpack, 7894e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul struct gl_texture_object *texObj, 7904e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul struct gl_texture_image *texImage) 79124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 7925facd7986ace899673499f396897469720476799Brian Paul st_TexImage(ctx, 3, target, level, internalFormat, width, height, depth, 7935facd7986ace899673499f396897469720476799Brian Paul border, format, type, pixels, unpack, texObj, texImage, 7945facd7986ace899673499f396897469720476799Brian Paul 0, GL_FALSE); 79524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 79624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 79724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 79824df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 79924df8f895fe8807aa2ba058e71bd40adfc01d21eBrianst_TexImage2D(GLcontext * ctx, 8004e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul GLenum target, GLint level, 8014e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul GLint internalFormat, 8024e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul GLint width, GLint height, GLint border, 8034e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul GLenum format, GLenum type, const void *pixels, 8044e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul const struct gl_pixelstore_attrib *unpack, 8054e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul struct gl_texture_object *texObj, 8064e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul struct gl_texture_image *texImage) 80724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 8085facd7986ace899673499f396897469720476799Brian Paul st_TexImage(ctx, 2, target, level, internalFormat, width, height, 1, border, 8095facd7986ace899673499f396897469720476799Brian Paul format, type, pixels, unpack, texObj, texImage, 0, GL_FALSE); 81024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 81124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 81224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 81324df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 81424df8f895fe8807aa2ba058e71bd40adfc01d21eBrianst_TexImage1D(GLcontext * ctx, 8154e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul GLenum target, GLint level, 8164e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul GLint internalFormat, 8174e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul GLint width, GLint border, 8184e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul GLenum format, GLenum type, const void *pixels, 8194e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul const struct gl_pixelstore_attrib *unpack, 8204e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul struct gl_texture_object *texObj, 8214e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul struct gl_texture_image *texImage) 82224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 8235facd7986ace899673499f396897469720476799Brian Paul st_TexImage(ctx, 1, target, level, internalFormat, width, 1, 1, border, 8245facd7986ace899673499f396897469720476799Brian Paul format, type, pixels, unpack, texObj, texImage, 0, GL_FALSE); 82524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 82624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 82724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 82824df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 8294e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paulst_CompressedTexImage2D(GLcontext *ctx, GLenum target, GLint level, 8304e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul GLint internalFormat, 8314e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul GLint width, GLint height, GLint border, 8324e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul GLsizei imageSize, const GLvoid *data, 8334e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul struct gl_texture_object *texObj, 8344e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul struct gl_texture_image *texImage) 83524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 8365facd7986ace899673499f396897469720476799Brian Paul st_TexImage(ctx, 2, target, level, internalFormat, width, height, 1, border, 8375facd7986ace899673499f396897469720476799Brian Paul 0, 0, data, &ctx->Unpack, texObj, texImage, imageSize, GL_TRUE); 83824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 83924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 84024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 84151b339af2e8b80575a24bb9146f031c9605180bbBrian Paul 84251b339af2e8b80575a24bb9146f031c9605180bbBrian Paul/** 84351b339af2e8b80575a24bb9146f031c9605180bbBrian Paul * glGetTexImage() helper: decompress a compressed texture by rendering 84451b339af2e8b80575a24bb9146f031c9605180bbBrian Paul * a textured quad. Store the results in the user's buffer. 84551b339af2e8b80575a24bb9146f031c9605180bbBrian Paul */ 84651b339af2e8b80575a24bb9146f031c9605180bbBrian Paulstatic void 84751b339af2e8b80575a24bb9146f031c9605180bbBrian Pauldecompress_with_blit(GLcontext * ctx, GLenum target, GLint level, 84851b339af2e8b80575a24bb9146f031c9605180bbBrian Paul GLenum format, GLenum type, GLvoid *pixels, 84951b339af2e8b80575a24bb9146f031c9605180bbBrian Paul struct gl_texture_object *texObj, 85051b339af2e8b80575a24bb9146f031c9605180bbBrian Paul struct gl_texture_image *texImage) 85151b339af2e8b80575a24bb9146f031c9605180bbBrian Paul{ 85276c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul struct st_context *st = st_context(ctx); 85376c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul struct pipe_context *pipe = st->pipe; 854b43c182f19c6291c88420fa12714f952c2b461fbKeith Whitwell struct pipe_screen *screen = pipe->screen; 85551b339af2e8b80575a24bb9146f031c9605180bbBrian Paul struct st_texture_image *stImage = st_texture_image(texImage); 8568f55a95178069d5e8b18647e6b675fc403d68073Roland Scheidegger struct st_texture_object *stObj = st_texture_object(texObj); 8575d3d63d45a037fdf603ddcff88da635c3ce8075eBrian Paul struct pipe_sampler_view *src_view = 8585d3d63d45a037fdf603ddcff88da635c3ce8075eBrian Paul st_get_texture_sampler_view(stObj, pipe); 85951b339af2e8b80575a24bb9146f031c9605180bbBrian Paul const GLuint width = texImage->Width; 86051b339af2e8b80575a24bb9146f031c9605180bbBrian Paul const GLuint height = texImage->Height; 86151b339af2e8b80575a24bb9146f031c9605180bbBrian Paul struct pipe_surface *dst_surface; 862287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct pipe_resource *dst_texture; 86351b339af2e8b80575a24bb9146f031c9605180bbBrian Paul struct pipe_transfer *tex_xfer; 864127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger unsigned bind = (PIPE_BIND_RENDER_TARGET | /* util_blit may choose to render */ 865287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell PIPE_BIND_TRANSFER_READ); 86651b339af2e8b80575a24bb9146f031c9605180bbBrian Paul 86751b339af2e8b80575a24bb9146f031c9605180bbBrian Paul /* create temp / dest surface */ 868287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell if (!util_create_rgba_surface(screen, width, height, bind, 86951b339af2e8b80575a24bb9146f031c9605180bbBrian Paul &dst_texture, &dst_surface)) { 87051b339af2e8b80575a24bb9146f031c9605180bbBrian Paul _mesa_problem(ctx, "util_create_rgba_surface() failed " 87151b339af2e8b80575a24bb9146f031c9605180bbBrian Paul "in decompress_with_blit()"); 87251b339af2e8b80575a24bb9146f031c9605180bbBrian Paul return; 87351b339af2e8b80575a24bb9146f031c9605180bbBrian Paul } 87451b339af2e8b80575a24bb9146f031c9605180bbBrian Paul 87551b339af2e8b80575a24bb9146f031c9605180bbBrian Paul /* blit/render/decompress */ 87676c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul util_blit_pixels_tex(st->blit, 877287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell src_view, /* pipe_resource (src) */ 87851b339af2e8b80575a24bb9146f031c9605180bbBrian Paul 0, 0, /* src x0, y0 */ 87951b339af2e8b80575a24bb9146f031c9605180bbBrian Paul width, height, /* src x1, y1 */ 88051b339af2e8b80575a24bb9146f031c9605180bbBrian Paul dst_surface, /* pipe_surface (dst) */ 88151b339af2e8b80575a24bb9146f031c9605180bbBrian Paul 0, 0, /* dst x0, y0 */ 88251b339af2e8b80575a24bb9146f031c9605180bbBrian Paul width, height, /* dst x1, y1 */ 88351b339af2e8b80575a24bb9146f031c9605180bbBrian Paul 0.0, /* z */ 88451b339af2e8b80575a24bb9146f031c9605180bbBrian Paul PIPE_TEX_MIPFILTER_NEAREST); 88551b339af2e8b80575a24bb9146f031c9605180bbBrian Paul 88651b339af2e8b80575a24bb9146f031c9605180bbBrian Paul /* map the dst_surface so we can read from it */ 887b0427bedde80e3189524651a327235bdfddbc613José Fonseca tex_xfer = pipe_get_transfer(st_context(ctx)->pipe, 888e50dd26ca6d0eb0d0f97c2780020ea16e3d4a687Thomas Hellstrom dst_texture, 0, 0, 0, 889e50dd26ca6d0eb0d0f97c2780020ea16e3d4a687Thomas Hellstrom PIPE_TRANSFER_READ, 890e50dd26ca6d0eb0d0f97c2780020ea16e3d4a687Thomas Hellstrom 0, 0, width, height); 89151b339af2e8b80575a24bb9146f031c9605180bbBrian Paul 8921b448c7a5cafa68eeead2a4c45f4362a9883383bBrian Paul pixels = _mesa_map_pbo_dest(ctx, &ctx->Pack, pixels); 89351b339af2e8b80575a24bb9146f031c9605180bbBrian Paul 8947b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul /* copy/pack data into user buffer */ 8957b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul if (st_equal_formats(stImage->pt->format, format, type)) { 8967b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul /* memcpy */ 897b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol const uint bytesPerRow = width * util_format_get_blocksize(stImage->pt->format); 898287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell ubyte *map = pipe_transfer_map(pipe, tex_xfer); 8997b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul GLuint row; 9007b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul for (row = 0; row < height; row++) { 9017b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul GLvoid *dest = _mesa_image_address2d(&ctx->Pack, pixels, width, 9027b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul height, format, type, row, 0); 9037b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul memcpy(dest, map, bytesPerRow); 9047b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul map += tex_xfer->stride; 9057b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul } 906287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_transfer_unmap(pipe, tex_xfer); 90751b339af2e8b80575a24bb9146f031c9605180bbBrian Paul } 9087b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul else { 9097b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul /* format translation via floats */ 9107b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul GLuint row; 9117b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul for (row = 0; row < height; row++) { 9127b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul const GLbitfield transferOps = 0x0; /* bypassed for glGetTexImage() */ 9137b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul GLfloat rgba[4 * MAX_WIDTH]; 9147b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul GLvoid *dest = _mesa_image_address2d(&ctx->Pack, pixels, width, 9157b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul height, format, type, row, 0); 9167b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul 917b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell if (ST_DEBUG & DEBUG_FALLBACK) 918b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell debug_printf("%s: fallback format translation\n", __FUNCTION__); 919b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell 9207b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul /* get float[4] rgba row from surface */ 921d35ecca5ee231c072687578642e0c22c6c0590b1Keith Whitwell pipe_get_tile_rgba(pipe, tex_xfer, 0, row, width, 1, rgba); 9227b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul 9237b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul _mesa_pack_rgba_span_float(ctx, width, (GLfloat (*)[4]) rgba, format, 9247b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul type, dest, &ctx->Pack, transferOps); 9257b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul } 9267b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul } 9277b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul 9281b448c7a5cafa68eeead2a4c45f4362a9883383bBrian Paul _mesa_unmap_pbo_dest(ctx, &ctx->Pack); 92951b339af2e8b80575a24bb9146f031c9605180bbBrian Paul 930287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe->transfer_destroy(pipe, tex_xfer); 93163af29bfbe265318bcf5be69e420de361b900321Keith Whitwell 93251b339af2e8b80575a24bb9146f031c9605180bbBrian Paul /* destroy the temp / dest surface */ 93351b339af2e8b80575a24bb9146f031c9605180bbBrian Paul util_destroy_rgba_surface(dst_texture, dst_surface); 93451b339af2e8b80575a24bb9146f031c9605180bbBrian Paul} 93551b339af2e8b80575a24bb9146f031c9605180bbBrian Paul 93651b339af2e8b80575a24bb9146f031c9605180bbBrian Paul 93751b339af2e8b80575a24bb9146f031c9605180bbBrian Paul 93824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian/** 93924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * Need to map texture image into memory before copying image data, 94024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * then unmap it. 94124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 94224df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 94324df8f895fe8807aa2ba058e71bd40adfc01d21eBrianst_get_tex_image(GLcontext * ctx, GLenum target, GLint level, 94424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLenum format, GLenum type, GLvoid * pixels, 94524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct gl_texture_object *texObj, 94651b339af2e8b80575a24bb9146f031c9605180bbBrian Paul struct gl_texture_image *texImage, GLboolean compressed_dst) 94724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 94876c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul struct st_context *st = st_context(ctx); 94924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct st_texture_image *stImage = st_texture_image(texImage); 950eaca19edbbe7876079aa33d7f75d93601677081bBrian Paul const GLuint dstImageStride = 951eaca19edbbe7876079aa33d7f75d93601677081bBrian Paul _mesa_image_image_stride(&ctx->Pack, texImage->Width, texImage->Height, 952eaca19edbbe7876079aa33d7f75d93601677081bBrian Paul format, type); 9535facd7986ace899673499f396897469720476799Brian Paul GLuint depth, i; 9545823f99d0fbc054b87aeb1bc15d413d3eadd27a8Brian GLubyte *dest; 95524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 95651b339af2e8b80575a24bb9146f031c9605180bbBrian Paul if (stImage->pt && 957cfbbe244d7438a60d389ae9d996dd430f79f362fJosé Fonseca util_format_is_s3tc(stImage->pt->format) && 95851b339af2e8b80575a24bb9146f031c9605180bbBrian Paul !compressed_dst) { 95951b339af2e8b80575a24bb9146f031c9605180bbBrian Paul /* Need to decompress the texture. 96051b339af2e8b80575a24bb9146f031c9605180bbBrian Paul * We'll do this by rendering a textured quad. 96151b339af2e8b80575a24bb9146f031c9605180bbBrian Paul * Note that we only expect RGBA formats (no Z/depth formats). 96251b339af2e8b80575a24bb9146f031c9605180bbBrian Paul */ 96351b339af2e8b80575a24bb9146f031c9605180bbBrian Paul decompress_with_blit(ctx, target, level, format, type, pixels, 96451b339af2e8b80575a24bb9146f031c9605180bbBrian Paul texObj, texImage); 96551b339af2e8b80575a24bb9146f031c9605180bbBrian Paul return; 96651b339af2e8b80575a24bb9146f031c9605180bbBrian Paul } 96751b339af2e8b80575a24bb9146f031c9605180bbBrian Paul 96824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian /* Map */ 969753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer if (stImage->pt) { 97024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian /* Image is stored in hardware format in a buffer managed by the 97124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * kernel. Need to explicitly map and unmap it. 97224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 97376c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul texImage->Data = st_texture_image_map(st, stImage, 0, 9744617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzer PIPE_TRANSFER_READ, 0, 0, 9754617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzer stImage->base.Width, 9764617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzer stImage->base.Height); 9777b640f9f708306b3e8c661771f29bf24bf8687fbBrian Paul /* compute stride in texels from stride in bytes */ 9787b640f9f708306b3e8c661771f29bf24bf8687fbBrian Paul texImage->RowStride = stImage->transfer->stride 9797b640f9f708306b3e8c661771f29bf24bf8687fbBrian Paul * util_format_get_blockwidth(stImage->pt->format) 9807b640f9f708306b3e8c661771f29bf24bf8687fbBrian Paul / util_format_get_blocksize(stImage->pt->format); 98124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 98224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian else { 98324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian /* Otherwise, the image should actually be stored in 984753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer * texImage->Data. This is pretty confusing for 98524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * everybody, I'd much prefer to separate the two functions of 98624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * texImage->Data - storage for texture images in main memory 98724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * and access (ie mappings) of images. In other words, we'd 98824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * create a new texImage->Map field and leave Data simply for 98924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * storage. 99024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 991753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer assert(texImage->Data); 99224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 99324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 994753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer depth = texImage->Depth; 995753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer texImage->Depth = 1; 99624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 9975823f99d0fbc054b87aeb1bc15d413d3eadd27a8Brian dest = (GLubyte *) pixels; 9985823f99d0fbc054b87aeb1bc15d413d3eadd27a8Brian 999d11d903c1b81000d04f859dcc2da41dae024f146Brian Paul for (i = 0; i < depth; i++) { 100051b339af2e8b80575a24bb9146f031c9605180bbBrian Paul if (compressed_dst) { 10015823f99d0fbc054b87aeb1bc15d413d3eadd27a8Brian _mesa_get_compressed_teximage(ctx, target, level, dest, 1002753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer texObj, texImage); 10035facd7986ace899673499f396897469720476799Brian Paul } 10045facd7986ace899673499f396897469720476799Brian Paul else { 10055823f99d0fbc054b87aeb1bc15d413d3eadd27a8Brian _mesa_get_teximage(ctx, target, level, format, type, dest, 1006753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer texObj, texImage); 1007753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer } 1008753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer 1009d11d903c1b81000d04f859dcc2da41dae024f146Brian Paul if (stImage->pt && i + 1 < depth) { 1010d11d903c1b81000d04f859dcc2da41dae024f146Brian Paul /* unmap this slice */ 101176c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul st_texture_image_unmap(st, stImage); 1012d11d903c1b81000d04f859dcc2da41dae024f146Brian Paul /* map next slice of 3D texture */ 101376c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul texImage->Data = st_texture_image_map(st, stImage, i + 1, 10144617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzer PIPE_TRANSFER_READ, 0, 0, 10154617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzer stImage->base.Width, 10164617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzer stImage->base.Height); 10175823f99d0fbc054b87aeb1bc15d413d3eadd27a8Brian dest += dstImageStride; 1018753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer } 101924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 1020753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer 1021753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer texImage->Depth = depth; 102224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 102324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian /* Unmap */ 1024753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer if (stImage->pt) { 102576c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul st_texture_image_unmap(st, stImage); 1026753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer texImage->Data = NULL; 102724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 102824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 102924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 103024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 103124df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 103224df8f895fe8807aa2ba058e71bd40adfc01d21eBrianst_GetTexImage(GLcontext * ctx, GLenum target, GLint level, 10334e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul GLenum format, GLenum type, GLvoid * pixels, 10344e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul struct gl_texture_object *texObj, 10354e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul struct gl_texture_image *texImage) 103624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 10375facd7986ace899673499f396897469720476799Brian Paul st_get_tex_image(ctx, target, level, format, type, pixels, texObj, texImage, 10385facd7986ace899673499f396897469720476799Brian Paul GL_FALSE); 103924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 104024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 104124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 104224df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 104324df8f895fe8807aa2ba058e71bd40adfc01d21eBrianst_GetCompressedTexImage(GLcontext *ctx, GLenum target, GLint level, 10444e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul GLvoid *pixels, 104547bf26845712bea756526fc159bdb355ceaef9c2Brian Paul struct gl_texture_object *texObj, 104647bf26845712bea756526fc159bdb355ceaef9c2Brian Paul struct gl_texture_image *texImage) 104724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 10485facd7986ace899673499f396897469720476799Brian Paul st_get_tex_image(ctx, target, level, 0, 0, pixels, texObj, texImage, 10495facd7986ace899673499f396897469720476799Brian Paul GL_TRUE); 105024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 105124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 105224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 105324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 105424df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 10555facd7986ace899673499f396897469720476799Brian Paulst_TexSubimage(GLcontext *ctx, GLint dims, GLenum target, GLint level, 10564e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul GLint xoffset, GLint yoffset, GLint zoffset, 10574e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul GLint width, GLint height, GLint depth, 10584e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul GLenum format, GLenum type, const void *pixels, 10594e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul const struct gl_pixelstore_attrib *packing, 10604e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul struct gl_texture_object *texObj, 10614e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul struct gl_texture_image *texImage) 106224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 106376c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul struct st_context *st = st_context(ctx); 106476c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul struct pipe_screen *screen = st->pipe->screen; 106524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct st_texture_image *stImage = st_texture_image(texImage); 106624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLuint dstRowStride; 1067eaca19edbbe7876079aa33d7f75d93601677081bBrian Paul const GLuint srcImageStride = 1068eaca19edbbe7876079aa33d7f75d93601677081bBrian Paul _mesa_image_image_stride(packing, width, height, format, type); 10695facd7986ace899673499f396897469720476799Brian Paul GLint i; 10705823f99d0fbc054b87aeb1bc15d413d3eadd27a8Brian const GLubyte *src; 1071a7427b0f7b2325b8dcc560d57cb894df25ebef93Brian Paul /* init to silence warning only: */ 1072a7427b0f7b2325b8dcc560d57cb894df25ebef93Brian Paul enum pipe_transfer_usage transfer_usage = PIPE_TRANSFER_WRITE; 107324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 107424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian DBG("%s target %s level %d offset %d,%d %dx%d\n", __FUNCTION__, 107524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian _mesa_lookup_enum_by_nr(target), 107624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian level, xoffset, yoffset, width, height); 107724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 107824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian pixels = 107924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian _mesa_validate_pbo_teximage(ctx, dims, width, height, depth, format, 108024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian type, pixels, packing, "glTexSubImage2D"); 108124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian if (!pixels) 108224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian return; 108324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 108455ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz /* See if we can do texture compression with a blit/render. 108555ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz */ 108655ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz if (!ctx->Mesa_DXTn && 108792863109af05acdb4ee5e42141c83ab0f18b7f88Brian Paul _mesa_is_format_compressed(texImage->TexFormat) && 108855ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz screen->is_format_supported(screen, 108955ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz stImage->pt->format, 1090127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger stImage->pt->target, 0, 1091287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell PIPE_BIND_RENDER_TARGET, 0)) { 109255ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz if (compress_with_blit(ctx, target, level, 109355ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz xoffset, yoffset, zoffset, 109455ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz width, height, depth, 109555ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz format, type, pixels, packing, texImage)) { 1096f989390af6f827d1ea36560381340148811836f3Jakob Bornecrantz goto done; 109755ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz } 109855ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz } 109955ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz 110024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian /* Map buffer if necessary. Need to lock to prevent other contexts 110124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * from uploading the buffer under us. 110224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 1103753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer if (stImage->pt) { 110471633abafc935c25da9731bab48c228ceb9b4097Michel Dänzer if (format == GL_DEPTH_COMPONENT && 11050bed834be4a174d20b31a6cbcf066774bf749929Michal Krol util_format_is_depth_and_stencil(stImage->pt->format)) 110671633abafc935c25da9731bab48c228ceb9b4097Michel Dänzer transfer_usage = PIPE_TRANSFER_READ_WRITE; 110771633abafc935c25da9731bab48c228ceb9b4097Michel Dänzer else 110871633abafc935c25da9731bab48c228ceb9b4097Michel Dänzer transfer_usage = PIPE_TRANSFER_WRITE; 110971633abafc935c25da9731bab48c228ceb9b4097Michel Dänzer 111076c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul texImage->Data = st_texture_image_map(st, stImage, zoffset, 111171633abafc935c25da9731bab48c228ceb9b4097Michel Dänzer transfer_usage, 11124617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzer xoffset, yoffset, 11139e84e7def152aa8080da59a78795d6434e687403Jakob Bornecrantz width, height); 1114753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer } 1115753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer 11169b44f5a7550d8ede2eda763770e927df4c15cc8eBrian Paul if (!texImage->Data) { 11179b44f5a7550d8ede2eda763770e927df4c15cc8eBrian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexSubImage"); 111808d39251a79a964e4a3ac0d7d8a397c2b66a0808Brian Paul goto done; 11199b44f5a7550d8ede2eda763770e927df4c15cc8eBrian Paul } 11209b44f5a7550d8ede2eda763770e927df4c15cc8eBrian Paul 11215823f99d0fbc054b87aeb1bc15d413d3eadd27a8Brian src = (const GLubyte *) pixels; 1122d7b7b63bd7cca80e99ad9701f8b56ee365053647Michal Krol dstRowStride = stImage->transfer->stride; 11235823f99d0fbc054b87aeb1bc15d413d3eadd27a8Brian 1124d11d903c1b81000d04f859dcc2da41dae024f146Brian Paul for (i = 0; i < depth; i++) { 11256480210b89dc8ae0990c450d27870c7b7930f251Brian Paul if (!_mesa_texstore(ctx, dims, texImage->_BaseFormat, 11266480210b89dc8ae0990c450d27870c7b7930f251Brian Paul texImage->TexFormat, 11276480210b89dc8ae0990c450d27870c7b7930f251Brian Paul texImage->Data, 11286480210b89dc8ae0990c450d27870c7b7930f251Brian Paul 0, 0, 0, 11296480210b89dc8ae0990c450d27870c7b7930f251Brian Paul dstRowStride, 11306480210b89dc8ae0990c450d27870c7b7930f251Brian Paul texImage->ImageOffsets, 11316480210b89dc8ae0990c450d27870c7b7930f251Brian Paul width, height, 1, 11326480210b89dc8ae0990c450d27870c7b7930f251Brian Paul format, type, src, packing)) { 11339b44f5a7550d8ede2eda763770e927df4c15cc8eBrian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexSubImage"); 1134753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer } 1135753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer 1136d11d903c1b81000d04f859dcc2da41dae024f146Brian Paul if (stImage->pt && i + 1 < depth) { 1137d11d903c1b81000d04f859dcc2da41dae024f146Brian Paul /* unmap this slice */ 113876c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul st_texture_image_unmap(st, stImage); 1139d11d903c1b81000d04f859dcc2da41dae024f146Brian Paul /* map next slice of 3D texture */ 114076c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul texImage->Data = st_texture_image_map(st, stImage, 1141d11d903c1b81000d04f859dcc2da41dae024f146Brian Paul zoffset + i + 1, 114271633abafc935c25da9731bab48c228ceb9b4097Michel Dänzer transfer_usage, 11434617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzer xoffset, yoffset, 11449e84e7def152aa8080da59a78795d6434e687403Jakob Bornecrantz width, height); 11455823f99d0fbc054b87aeb1bc15d413d3eadd27a8Brian src += srcImageStride; 1146753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer } 114724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 114824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 114908d39251a79a964e4a3ac0d7d8a397c2b66a0808Brian Pauldone: 115024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian _mesa_unmap_teximage_pbo(ctx, packing); 115124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 11521e414df894fc70b7024eb38c812e582336014974Michel Dänzer if (stImage->pt && texImage->Data) { 115376c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul st_texture_image_unmap(st, stImage); 115424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian texImage->Data = NULL; 115524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 115624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 115724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 115824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 115924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 116024df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 11615facd7986ace899673499f396897469720476799Brian Paulst_TexSubImage3D(GLcontext *ctx, GLenum target, GLint level, 11625facd7986ace899673499f396897469720476799Brian Paul GLint xoffset, GLint yoffset, GLint zoffset, 11635facd7986ace899673499f396897469720476799Brian Paul GLsizei width, GLsizei height, GLsizei depth, 11645facd7986ace899673499f396897469720476799Brian Paul GLenum format, GLenum type, const GLvoid *pixels, 11655facd7986ace899673499f396897469720476799Brian Paul const struct gl_pixelstore_attrib *packing, 11665facd7986ace899673499f396897469720476799Brian Paul struct gl_texture_object *texObj, 11675facd7986ace899673499f396897469720476799Brian Paul struct gl_texture_image *texImage) 116824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 11695facd7986ace899673499f396897469720476799Brian Paul st_TexSubimage(ctx, 3, target, level, xoffset, yoffset, zoffset, 11705facd7986ace899673499f396897469720476799Brian Paul width, height, depth, format, type, 11715facd7986ace899673499f396897469720476799Brian Paul pixels, packing, texObj, texImage); 117224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 117324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 117424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 117524df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 11765facd7986ace899673499f396897469720476799Brian Paulst_TexSubImage2D(GLcontext *ctx, GLenum target, GLint level, 11775facd7986ace899673499f396897469720476799Brian Paul GLint xoffset, GLint yoffset, 11785facd7986ace899673499f396897469720476799Brian Paul GLsizei width, GLsizei height, 11795facd7986ace899673499f396897469720476799Brian Paul GLenum format, GLenum type, const GLvoid * pixels, 11805facd7986ace899673499f396897469720476799Brian Paul const struct gl_pixelstore_attrib *packing, 11815facd7986ace899673499f396897469720476799Brian Paul struct gl_texture_object *texObj, 11825facd7986ace899673499f396897469720476799Brian Paul struct gl_texture_image *texImage) 118324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 11845facd7986ace899673499f396897469720476799Brian Paul st_TexSubimage(ctx, 2, target, level, xoffset, yoffset, 0, 11855facd7986ace899673499f396897469720476799Brian Paul width, height, 1, format, type, 11865facd7986ace899673499f396897469720476799Brian Paul pixels, packing, texObj, texImage); 118724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 118824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 118924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 119024df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 11915facd7986ace899673499f396897469720476799Brian Paulst_TexSubImage1D(GLcontext *ctx, GLenum target, GLint level, 11925facd7986ace899673499f396897469720476799Brian Paul GLint xoffset, GLsizei width, GLenum format, GLenum type, 11935facd7986ace899673499f396897469720476799Brian Paul const GLvoid * pixels, 11945facd7986ace899673499f396897469720476799Brian Paul const struct gl_pixelstore_attrib *packing, 11955facd7986ace899673499f396897469720476799Brian Paul struct gl_texture_object *texObj, 11965facd7986ace899673499f396897469720476799Brian Paul struct gl_texture_image *texImage) 119724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 11985facd7986ace899673499f396897469720476799Brian Paul st_TexSubimage(ctx, 1, target, level, xoffset, 0, 0, width, 1, 1, 1199b245840b86cf877c9b8d666edf229364a84f1deaBrian format, type, pixels, packing, texObj, texImage); 120024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 120124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 120224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1203a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantzstatic void 1204578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantzst_CompressedTexSubImage1D(GLcontext *ctx, GLenum target, GLint level, 1205578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz GLint xoffset, GLsizei width, 1206578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz GLenum format, 1207578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz GLsizei imageSize, const GLvoid *data, 1208578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz struct gl_texture_object *texObj, 1209578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz struct gl_texture_image *texImage) 1210578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz{ 1211578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz assert(0); 1212578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz} 1213578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz 1214578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz 1215578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantzstatic void 1216a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantzst_CompressedTexSubImage2D(GLcontext *ctx, GLenum target, GLint level, 1217a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz GLint xoffset, GLint yoffset, 1218a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz GLsizei width, GLint height, 1219a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz GLenum format, 1220a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz GLsizei imageSize, const GLvoid *data, 1221a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz struct gl_texture_object *texObj, 1222a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz struct gl_texture_image *texImage) 1223a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz{ 122476c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul struct st_context *st = st_context(ctx); 1225a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz struct st_texture_image *stImage = st_texture_image(texImage); 1226a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz int srcBlockStride; 1227a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz int dstBlockStride; 1228a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz int y; 12297b8c4f22d4fd78829dd5843db92321ec0665932eVinson Lee enum pipe_format pformat; 1230a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz 1231a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz if (stImage->pt) { 12327b8c4f22d4fd78829dd5843db92321ec0665932eVinson Lee pformat = stImage->pt->format; 12334ed1de8b84b587d2be0c0e4ecb6b5f421195f562José Fonseca 123476c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul texImage->Data = st_texture_image_map(st, stImage, 0, 1235a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz PIPE_TRANSFER_WRITE, 1236a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz xoffset, yoffset, 1237a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz width, height); 1238a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz 1239b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol srcBlockStride = util_format_get_stride(pformat, width); 1240a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz dstBlockStride = stImage->transfer->stride; 1241a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz } else { 1242a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz assert(stImage->pt); 1243a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz /* TODO find good values for block and strides */ 1244a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz /* TODO also adjust texImage->data for yoffset/xoffset */ 1245a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz return; 1246a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz } 1247a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz 1248a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz if (!texImage->Data) { 1249a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz _mesa_error(ctx, GL_OUT_OF_MEMORY, "glCompressedTexSubImage"); 1250a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz return; 1251a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz } 1252a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz 1253b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol assert(xoffset % util_format_get_blockwidth(pformat) == 0); 1254b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol assert(yoffset % util_format_get_blockheight(pformat) == 0); 1255a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz 1256b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol for (y = 0; y < height; y += util_format_get_blockheight(pformat)) { 1257a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz /* don't need to adjust for xoffset and yoffset as st_texture_image_map does that */ 1258b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol const char *src = (const char*)data + srcBlockStride * util_format_get_nblocksy(pformat, y); 1259b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol char *dst = (char*)texImage->Data + dstBlockStride * util_format_get_nblocksy(pformat, y); 1260b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol memcpy(dst, src, util_format_get_stride(pformat, width)); 1261a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz } 1262a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz 1263a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz if (stImage->pt) { 126476c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul st_texture_image_unmap(st, stImage); 1265a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz texImage->Data = NULL; 1266a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz } 1267a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz} 1268a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz 1269a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz 1270578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantzstatic void 1271578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantzst_CompressedTexSubImage3D(GLcontext *ctx, GLenum target, GLint level, 1272578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz GLint xoffset, GLint yoffset, GLint zoffset, 1273578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz GLsizei width, GLint height, GLint depth, 1274578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz GLenum format, 1275578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz GLsizei imageSize, const GLvoid *data, 1276578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz struct gl_texture_object *texObj, 1277578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz struct gl_texture_image *texImage) 1278578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz{ 1279578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz assert(0); 1280578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz} 1281578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz 1282578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz 128324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 128424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian/** 12855facd7986ace899673499f396897469720476799Brian Paul * Do a CopyTexSubImage operation using a read transfer from the source, 12865facd7986ace899673499f396897469720476799Brian Paul * a write transfer to the destination and get_tile()/put_tile() to access 12875facd7986ace899673499f396897469720476799Brian Paul * the pixels/texels. 1288c6717a86420d7141013165f7acd50b3c3f751756Brian * 1289c6717a86420d7141013165f7acd50b3c3f751756Brian * Note: srcY=0=TOP of renderbuffer 1290038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian */ 1291038cb561eb094af2f2ba06e18e61246fc0c87c3cBrianstatic void 12925facd7986ace899673499f396897469720476799Brian Paulfallback_copy_texsubimage(GLcontext *ctx, GLenum target, GLint level, 1293038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian struct st_renderbuffer *strb, 1294038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian struct st_texture_image *stImage, 1295038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian GLenum baseFormat, 1296038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian GLint destX, GLint destY, GLint destZ, 1297038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian GLint srcX, GLint srcY, 1298038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian GLsizei width, GLsizei height) 1299038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian{ 130076c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul struct st_context *st = st_context(ctx); 130176c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul struct pipe_context *pipe = st->pipe; 13024617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzer struct pipe_transfer *src_trans; 13034617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzer GLvoid *texDest; 130471633abafc935c25da9731bab48c228ceb9b4097Michel Dänzer enum pipe_transfer_usage transfer_usage; 1305b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell 1306b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell if (ST_DEBUG & DEBUG_FALLBACK) 1307b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell debug_printf("%s: fallback processing\n", __FUNCTION__); 13084617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzer 13094617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzer assert(width <= MAX_WIDTH); 1310038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian 13114617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzer if (st_fb_orientation(ctx->ReadBuffer) == Y_0_TOP) { 13127c8836e9ef49d938aa55a1c385b95c6371c301f1Michel Dänzer srcY = strb->Base.Height - srcY - height; 13134617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzer } 1314f3048ad90ed2e4583f0f7aaf35a0f4aa581942ddBrian Paul 1315b0427bedde80e3189524651a327235bdfddbc613José Fonseca src_trans = pipe_get_transfer(st_context(ctx)->pipe, 1316e50dd26ca6d0eb0d0f97c2780020ea16e3d4a687Thomas Hellstrom strb->texture, 1317e50dd26ca6d0eb0d0f97c2780020ea16e3d4a687Thomas Hellstrom 0, 0, 0, 1318e50dd26ca6d0eb0d0f97c2780020ea16e3d4a687Thomas Hellstrom PIPE_TRANSFER_READ, 1319e50dd26ca6d0eb0d0f97c2780020ea16e3d4a687Thomas Hellstrom srcX, srcY, 1320e50dd26ca6d0eb0d0f97c2780020ea16e3d4a687Thomas Hellstrom width, height); 1321038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian 13220197348641614188c400d7c616573bb7f1eea781Brian Paul if ((baseFormat == GL_DEPTH_COMPONENT || 13230197348641614188c400d7c616573bb7f1eea781Brian Paul baseFormat == GL_DEPTH_STENCIL) && 13240bed834be4a174d20b31a6cbcf066774bf749929Michal Krol util_format_is_depth_and_stencil(stImage->pt->format)) 132571633abafc935c25da9731bab48c228ceb9b4097Michel Dänzer transfer_usage = PIPE_TRANSFER_READ_WRITE; 132671633abafc935c25da9731bab48c228ceb9b4097Michel Dänzer else 132771633abafc935c25da9731bab48c228ceb9b4097Michel Dänzer transfer_usage = PIPE_TRANSFER_WRITE; 132871633abafc935c25da9731bab48c228ceb9b4097Michel Dänzer 132976c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul texDest = st_texture_image_map(st, stImage, 0, transfer_usage, 13304617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzer destX, destY, width, height); 1331038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian 1332105758105a790dd8466c6be8c232c3f215ca4deeBrian Paul if (baseFormat == GL_DEPTH_COMPONENT || 13330197348641614188c400d7c616573bb7f1eea781Brian Paul baseFormat == GL_DEPTH_STENCIL) { 1334cc94863429d8a6cef8dbf861e78701a458d30f5aBrian Paul const GLboolean scaleOrBias = (ctx->Pixel.DepthScale != 1.0F || 1335cc94863429d8a6cef8dbf861e78701a458d30f5aBrian Paul ctx->Pixel.DepthBias != 0.0F); 133627858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul GLint row, yStep; 1337cc94863429d8a6cef8dbf861e78701a458d30f5aBrian Paul 133827858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul /* determine bottom-to-top vs. top-to-bottom order for src buffer */ 133927858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul if (st_fb_orientation(ctx->ReadBuffer) == Y_0_TOP) { 13407c8836e9ef49d938aa55a1c385b95c6371c301f1Michel Dänzer srcY = height - 1; 134127858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul yStep = -1; 134227858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul } 134327858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul else { 13444617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzer srcY = 0; 134527858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul yStep = 1; 134627858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul } 134727858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul 134827858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul /* To avoid a large temp memory allocation, do copy row by row */ 13494617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzer for (row = 0; row < height; row++, srcY += yStep) { 1350cc94863429d8a6cef8dbf861e78701a458d30f5aBrian Paul uint data[MAX_WIDTH]; 1351d35ecca5ee231c072687578642e0c22c6c0590b1Keith Whitwell pipe_get_tile_z(pipe, src_trans, 0, srcY, width, 1, data); 1352cc94863429d8a6cef8dbf861e78701a458d30f5aBrian Paul if (scaleOrBias) { 1353cc94863429d8a6cef8dbf861e78701a458d30f5aBrian Paul _mesa_scale_and_bias_depth_uint(ctx, width, data); 1354cc94863429d8a6cef8dbf861e78701a458d30f5aBrian Paul } 1355d35ecca5ee231c072687578642e0c22c6c0590b1Keith Whitwell pipe_put_tile_z(pipe, stImage->transfer, 0, row, width, 1, data); 1356cc94863429d8a6cef8dbf861e78701a458d30f5aBrian Paul } 1357cc94863429d8a6cef8dbf861e78701a458d30f5aBrian Paul } 1358cc94863429d8a6cef8dbf861e78701a458d30f5aBrian Paul else { 1359cc94863429d8a6cef8dbf861e78701a458d30f5aBrian Paul /* RGBA format */ 136027858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul GLfloat *tempSrc = 136132f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg (GLfloat *) malloc(width * height * 4 * sizeof(GLfloat)); 136227858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul 136327858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul if (tempSrc && texDest) { 136427858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul const GLint dims = 2; 13655facd7986ace899673499f396897469720476799Brian Paul const GLint dstRowStride = stImage->transfer->stride; 136627858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul struct gl_texture_image *texImage = &stImage->base; 136727858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul struct gl_pixelstore_attrib unpack = ctx->DefaultPacking; 136827858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul 136927858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul if (st_fb_orientation(ctx->ReadBuffer) == Y_0_TOP) { 137027858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul unpack.Invert = GL_TRUE; 1371cc94863429d8a6cef8dbf861e78701a458d30f5aBrian Paul } 137227858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul 137327858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul /* get float/RGBA image from framebuffer */ 137427858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul /* XXX this usually involves a lot of int/float conversion. 137527858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul * try to avoid that someday. 137627858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul */ 1377d35ecca5ee231c072687578642e0c22c6c0590b1Keith Whitwell pipe_get_tile_rgba(pipe, src_trans, 0, 0, width, height, tempSrc); 137827858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul 137927858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul /* Store into texture memory. 138027858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul * Note that this does some special things such as pixel transfer 138127858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul * ops and format conversion. In particular, if the dest tex format 138227858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul * is actually RGBA but the user created the texture as GL_RGB we 138327858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul * need to fill-in/override the alpha channel with 1.0. 138427858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul */ 13856480210b89dc8ae0990c450d27870c7b7930f251Brian Paul _mesa_texstore(ctx, dims, 13866480210b89dc8ae0990c450d27870c7b7930f251Brian Paul texImage->_BaseFormat, 13876480210b89dc8ae0990c450d27870c7b7930f251Brian Paul texImage->TexFormat, 13886480210b89dc8ae0990c450d27870c7b7930f251Brian Paul texDest, 13896480210b89dc8ae0990c450d27870c7b7930f251Brian Paul 0, 0, 0, 13906480210b89dc8ae0990c450d27870c7b7930f251Brian Paul dstRowStride, 13916480210b89dc8ae0990c450d27870c7b7930f251Brian Paul texImage->ImageOffsets, 13926480210b89dc8ae0990c450d27870c7b7930f251Brian Paul width, height, 1, 13936480210b89dc8ae0990c450d27870c7b7930f251Brian Paul GL_RGBA, GL_FLOAT, tempSrc, /* src */ 13946480210b89dc8ae0990c450d27870c7b7930f251Brian Paul &unpack); 139527858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul } 139627858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul else { 139727858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexSubImage"); 13985c83f1371978472fbe4bba8f686733c6b519874aBrian } 139927858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul 140027858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul if (tempSrc) 140132f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free(tempSrc); 14025c83f1371978472fbe4bba8f686733c6b519874aBrian } 1403d0279fc4b38c72356a341173317bcd45d9093f45Michel Dänzer 140476c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul st_texture_image_unmap(st, stImage); 1405287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe->transfer_destroy(pipe, src_trans); 1406038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian} 1407038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian 1408038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian 140965d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul 141065d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul/** 141165d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * If the format of the src renderbuffer and the format of the dest 141265d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * texture are compatible (in terms of blitting), return a TGSI writemask 141365d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * to be used during the blit. 141465d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * If the src/dest are incompatible, return 0. 141565d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul */ 14168fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwellstatic unsigned 141765d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paulcompatible_src_dst_formats(GLcontext *ctx, 141865d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul const struct gl_renderbuffer *src, 14198fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell const struct gl_texture_image *dst) 14208fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell{ 142165d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul /* Get logical base formats for the src and dest. 142265d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * That is, use the user-requested formats and not the actual, device- 142365d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * chosen formats. 142465d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * For example, the user may have requested an A8 texture but the 142565d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * driver may actually be using an RGBA texture format. When we 142665d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * copy/blit to that texture, we only want to copy the Alpha channel 142765d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * and not the RGB channels. 142865d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * 142965d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * Similarly, when the src FBO was created an RGB format may have been 143065d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * requested but the driver actually chose an RGBA format. In that case, 143165d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * we don't want to copy the undefined Alpha channel to the dest texture 143265d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * (it should be 1.0). 143365d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul */ 143465d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul const GLenum srcFormat = _mesa_base_fbo_format(ctx, src->InternalFormat); 143565d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul const GLenum dstFormat = _mesa_base_tex_format(ctx, dst->InternalFormat); 14368fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell 143765d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul /** 143865d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * XXX when we have red-only and red/green renderbuffers we'll need 143965d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * to add more cases here (or implement a general-purpose routine that 144065d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * queries the existance of the R,G,B,A channels in the src and dest). 144165d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul */ 144265d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul if (srcFormat == dstFormat) { 14438fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell /* This is the same as matching_base_formats, which should 14448fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell * always pass, as it did previously. 14458fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell */ 14468fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell return TGSI_WRITEMASK_XYZW; 14478fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell } 144865d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul else if (srcFormat == GL_RGB && dstFormat == GL_RGBA) { 144965d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul /* Make sure that A in the dest is 1. The actual src format 145065d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * may be RGBA and have undefined A values. 145165d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul */ 145265d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul return TGSI_WRITEMASK_XYZ; 145365d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul } 145465d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul else if (srcFormat == GL_RGBA && dstFormat == GL_RGB) { 145565d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul /* Make sure that A in the dest is 1. The actual dst format 145665d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * may be RGBA and will need A=1 to provide proper alpha values 145765d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * when sampled later. 14588fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell */ 145965d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul return TGSI_WRITEMASK_XYZ; 14608fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell } 14618fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell else { 1462b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell if (ST_DEBUG & DEBUG_FALLBACK) 1463b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell debug_printf("%s failed for src %s, dst %s\n", 1464b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell __FUNCTION__, 1465b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell _mesa_lookup_enum_by_nr(srcFormat), 146665d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul _mesa_lookup_enum_by_nr(dstFormat)); 1467b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell 14688fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell /* Otherwise fail. 14698fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell */ 14708fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell return 0; 14718fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell } 14728fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell} 14738fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell 14748fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell 14758fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell 1476038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian/** 14774e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul * Do a CopyTex[Sub]Image1/2/3D() using a hardware (blit) path if possible. 14784e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul * Note that the region to copy has already been clipped so we know we 14794e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul * won't read from outside the source renderbuffer's bounds. 1480c6717a86420d7141013165f7acd50b3c3f751756Brian * 14814e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul * Note: srcY=0=Bottom of renderbuffer (GL convention) 148224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 1483038cb561eb094af2f2ba06e18e61246fc0c87c3cBrianstatic void 14844e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paulst_copy_texsubimage(GLcontext *ctx, 1485038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian GLenum target, GLint level, 1486038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian GLint destX, GLint destY, GLint destZ, 1487038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian GLint srcX, GLint srcY, 1488038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian GLsizei width, GLsizei height) 148924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 1490038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian struct gl_texture_unit *texUnit = 1491038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian &ctx->Texture.Unit[ctx->Texture.CurrentUnit]; 1492038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian struct gl_texture_object *texObj = 1493038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian _mesa_select_tex_object(ctx, texUnit, target); 1494038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian struct gl_texture_image *texImage = 1495038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian _mesa_select_tex_image(ctx, texObj, target, level); 1496038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian struct st_texture_image *stImage = st_texture_image(texImage); 14970197348641614188c400d7c616573bb7f1eea781Brian Paul const GLenum texBaseFormat = texImage->_BaseFormat; 1498b27498c7cad7dae4e3b3ef9517b9c0aef58f73f6Brian struct gl_framebuffer *fb = ctx->ReadBuffer; 1499b27498c7cad7dae4e3b3ef9517b9c0aef58f73f6Brian struct st_renderbuffer *strb; 150076c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul struct st_context *st = st_context(ctx); 150176c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul struct pipe_context *pipe = st->pipe; 15026f715dcc219071e574e363a9db4365c9c31ebbd3Brian struct pipe_screen *screen = pipe->screen; 150327858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul enum pipe_format dest_format, src_format; 1504cc94863429d8a6cef8dbf861e78701a458d30f5aBrian Paul GLboolean use_fallback = GL_TRUE; 150527858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul GLboolean matching_base_formats; 1506127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger GLuint format_writemask, sample_count; 15078fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell struct pipe_surface *dest_surface = NULL; 15088fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell GLboolean do_flip = (st_fb_orientation(ctx->ReadBuffer) == Y_0_TOP); 150924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1510afd16512bc354cf1a7220cb9bf3ce445503c7af4Keith Whitwell /* make sure finalize_textures has been called? 1511afd16512bc354cf1a7220cb9bf3ce445503c7af4Keith Whitwell */ 151276c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul if (0) st_validate_state(st); 1513afd16512bc354cf1a7220cb9bf3ce445503c7af4Keith Whitwell 1514b27498c7cad7dae4e3b3ef9517b9c0aef58f73f6Brian /* determine if copying depth or color data */ 1515105758105a790dd8466c6be8c232c3f215ca4deeBrian Paul if (texBaseFormat == GL_DEPTH_COMPONENT || 15160197348641614188c400d7c616573bb7f1eea781Brian Paul texBaseFormat == GL_DEPTH_STENCIL) { 1517b27498c7cad7dae4e3b3ef9517b9c0aef58f73f6Brian strb = st_renderbuffer(fb->_DepthBuffer); 151824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 1519b27498c7cad7dae4e3b3ef9517b9c0aef58f73f6Brian else { 15204e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul /* texBaseFormat == GL_RGB, GL_RGBA, GL_ALPHA, etc */ 1521b27498c7cad7dae4e3b3ef9517b9c0aef58f73f6Brian strb = st_renderbuffer(fb->_ColorReadBuffer); 1522b27498c7cad7dae4e3b3ef9517b9c0aef58f73f6Brian } 1523b27498c7cad7dae4e3b3ef9517b9c0aef58f73f6Brian 1524afd16512bc354cf1a7220cb9bf3ce445503c7af4Keith Whitwell if (!strb || !strb->surface || !stImage->pt) { 1525afd16512bc354cf1a7220cb9bf3ce445503c7af4Keith Whitwell debug_printf("%s: null strb or stImage\n", __FUNCTION__); 1526afd16512bc354cf1a7220cb9bf3ce445503c7af4Keith Whitwell return; 1527afd16512bc354cf1a7220cb9bf3ce445503c7af4Keith Whitwell } 1528afd16512bc354cf1a7220cb9bf3ce445503c7af4Keith Whitwell 1529127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger sample_count = strb->surface->texture->nr_samples; 1530127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger /* I believe this would be legal, presumably would need to do a resolve 1531127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger for color, and for depth/stencil spec says to just use one of the 1532127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger depth/stencil samples per pixel? Need some transfer clarifications. */ 1533127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger assert(sample_count < 2); 1534127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger 1535e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell if (srcX < 0) { 1536e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell width -= -srcX; 1537e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell destX += -srcX; 1538e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell srcX = 0; 1539e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell } 1540e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell 1541e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell if (srcY < 0) { 1542e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell height -= -srcY; 1543e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell destY += -srcY; 1544e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell srcY = 0; 1545e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell } 1546e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell 1547e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell if (destX < 0) { 1548e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell width -= -destX; 1549e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell srcX += -destX; 1550e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell destX = 0; 1551e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell } 1552e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell 1553e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell if (destY < 0) { 1554e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell height -= -destY; 1555e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell srcY += -destY; 1556e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell destY = 0; 1557e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell } 1558e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell 1559e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell if (width < 0 || height < 0) 1560e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell return; 1561e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell 1562e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell 1563b27498c7cad7dae4e3b3ef9517b9c0aef58f73f6Brian assert(strb); 1564b27498c7cad7dae4e3b3ef9517b9c0aef58f73f6Brian assert(strb->surface); 1565753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer assert(stImage->pt); 1566c6717a86420d7141013165f7acd50b3c3f751756Brian 1567b27498c7cad7dae4e3b3ef9517b9c0aef58f73f6Brian src_format = strb->surface->format; 1568753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer dest_format = stImage->pt->format; 1569b27498c7cad7dae4e3b3ef9517b9c0aef58f73f6Brian 157027858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul /* 157127858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul * Determine if the src framebuffer and dest texture have the same 157227858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul * base format. We need this to detect a case such as the framebuffer 157327858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul * being GL_RGBA but the texture being GL_RGB. If the actual hardware 157427858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul * texture format stores RGBA we need to set A=1 (overriding the 157527858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul * framebuffer's alpha values). We can't do that with the blit or 157627858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul * textured-quad paths. 157727858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul */ 157845e76d2665b38ba3787548310efc59e969124c01Brian Paul matching_base_formats = 157945e76d2665b38ba3787548310efc59e969124c01Brian Paul (_mesa_get_format_base_format(strb->Base.Format) == 158045e76d2665b38ba3787548310efc59e969124c01Brian Paul _mesa_get_format_base_format(texImage->TexFormat)); 158165d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul format_writemask = compatible_src_dst_formats(ctx, &strb->Base, texImage); 158279931e38abc62286151121a3f59127e296144551Michel Dänzer 15838fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell if (ctx->_ImageTransferState == 0x0) { 1584b27498c7cad7dae4e3b3ef9517b9c0aef58f73f6Brian 1585c11d582411a999ed40db4c02143dd380113e0ffdBrian Paul if (matching_base_formats && 15868fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell src_format == dest_format && 15878fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell !do_flip) 15888fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell { 15894e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul /* use surface_copy() / blit */ 1590127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger struct pipe_subresource subdst, subsrc; 1591127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger subdst.face = stImage->face; 1592127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger subdst.level = stImage->level; 1593127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger subsrc.face = strb->surface->face; 1594127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger subsrc.level = strb->surface->level; 1595127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger 1596127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger /* for resource_copy_region(), y=0=top, always */ 1597127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger pipe->resource_copy_region(pipe, 1598127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger /* dest */ 1599127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger stImage->pt, 1600127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger subdst, 1601127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger destX, destY, destZ, 1602127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger /* src */ 1603127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger strb->texture, 1604127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger subsrc, 1605127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger srcX, srcY, strb->surface->zslice, 1606127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger /* size */ 1607127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger width, height); 1608a479bf62353b6517841e620122112e7565d2391cBrian Paul use_fallback = GL_FALSE; 1609cc94863429d8a6cef8dbf861e78701a458d30f5aBrian Paul } 16108fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell else if (format_writemask && 1611e60ebebb392d1d4c47541766737b5a79685a24d5Brian Paul texBaseFormat != GL_DEPTH_COMPONENT && 1612e60ebebb392d1d4c47541766737b5a79685a24d5Brian Paul texBaseFormat != GL_DEPTH_STENCIL && 16138fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell screen->is_format_supported(screen, src_format, 1614127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger PIPE_TEXTURE_2D, sample_count, 1615287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell PIPE_BIND_SAMPLER_VIEW, 16168aafc03b260ab8923f1b373f7effa75bcdb40a72José Fonseca 0) && 16174e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul screen->is_format_supported(screen, dest_format, 1618127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger PIPE_TEXTURE_2D, 0, 1619287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell PIPE_BIND_RENDER_TARGET, 16208aafc03b260ab8923f1b373f7effa75bcdb40a72José Fonseca 0)) { 16214e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul /* draw textured quad to do the copy */ 1622eaca19edbbe7876079aa33d7f75d93601677081bBrian Paul GLint srcY0, srcY1; 1623127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger struct pipe_subresource subsrc; 162427858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul 162527858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul dest_surface = screen->get_tex_surface(screen, stImage->pt, 162627858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul stImage->face, stImage->level, 162727858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul destZ, 1628127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger PIPE_BIND_RENDER_TARGET); 162927858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul 1630a479bf62353b6517841e620122112e7565d2391cBrian Paul if (do_flip) { 1631a479bf62353b6517841e620122112e7565d2391cBrian Paul srcY1 = strb->Base.Height - srcY - height; 1632a479bf62353b6517841e620122112e7565d2391cBrian Paul srcY0 = srcY1 + height; 1633a479bf62353b6517841e620122112e7565d2391cBrian Paul } 1634a479bf62353b6517841e620122112e7565d2391cBrian Paul else { 1635a479bf62353b6517841e620122112e7565d2391cBrian Paul srcY0 = srcY; 1636a479bf62353b6517841e620122112e7565d2391cBrian Paul srcY1 = srcY0 + height; 1637a479bf62353b6517841e620122112e7565d2391cBrian Paul } 1638127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger subsrc.face = strb->surface->face; 1639127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger subsrc.level = strb->surface->level; 1640127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger 164176c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul util_blit_pixels_writemask(st->blit, 1642127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger strb->texture, 1643127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger subsrc, 16448fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell srcX, srcY0, 16458fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell srcX + width, srcY1, 1646127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger strb->surface->zslice, 16478fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell dest_surface, 16488fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell destX, destY, 16498fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell destX + width, destY + height, 16508fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell 0.0, PIPE_TEX_MIPFILTER_NEAREST, 16518fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell format_writemask); 1652cc94863429d8a6cef8dbf861e78701a458d30f5aBrian Paul use_fallback = GL_FALSE; 16533c0dc8242b64518d5635263ba65b39afa919dd86Michel Dänzer } 165479931e38abc62286151121a3f59127e296144551Michel Dänzer 165527858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul if (dest_surface) 165627858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul pipe_surface_reference(&dest_surface, NULL); 1657038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian } 1658cc94863429d8a6cef8dbf861e78701a458d30f5aBrian Paul 1659cc94863429d8a6cef8dbf861e78701a458d30f5aBrian Paul if (use_fallback) { 16604e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul /* software fallback */ 1661038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian fallback_copy_texsubimage(ctx, target, level, 16624e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul strb, stImage, texBaseFormat, 1663038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian destX, destY, destZ, 1664038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian srcX, srcY, width, height); 1665038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian } 166624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 166724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 166824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1669038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian 167024df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 167124df8f895fe8807aa2ba058e71bd40adfc01d21eBrianst_CopyTexImage1D(GLcontext * ctx, GLenum target, GLint level, 167224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLenum internalFormat, 167324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLint x, GLint y, GLsizei width, GLint border) 167424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 167524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct gl_texture_unit *texUnit = 167624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian &ctx->Texture.Unit[ctx->Texture.CurrentUnit]; 167724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct gl_texture_object *texObj = 167824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian _mesa_select_tex_object(ctx, texUnit, target); 167924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct gl_texture_image *texImage = 168024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian _mesa_select_tex_image(ctx, texObj, target, level); 168124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1682753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer /* Setup or redefine the texture object, texture and texture 168324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * image. Don't populate yet. 168424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 168524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian ctx->Driver.TexImage1D(ctx, target, level, internalFormat, 168624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian width, border, 168724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GL_RGBA, CHAN_TYPE, NULL, 168824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian &ctx->DefaultPacking, texObj, texImage); 168924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 16904e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul st_copy_texsubimage(ctx, target, level, 16914e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul 0, 0, 0, /* destX,Y,Z */ 16924e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul x, y, width, 1); /* src X, Y, size */ 169324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 169424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 169524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 169624df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 169724df8f895fe8807aa2ba058e71bd40adfc01d21eBrianst_CopyTexImage2D(GLcontext * ctx, GLenum target, GLint level, 169824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLenum internalFormat, 169924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLint x, GLint y, GLsizei width, GLsizei height, 170024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLint border) 170124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 170224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct gl_texture_unit *texUnit = 170324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian &ctx->Texture.Unit[ctx->Texture.CurrentUnit]; 170424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct gl_texture_object *texObj = 170524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian _mesa_select_tex_object(ctx, texUnit, target); 170624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct gl_texture_image *texImage = 170724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian _mesa_select_tex_image(ctx, texObj, target, level); 170824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1709753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer /* Setup or redefine the texture object, texture and texture 171024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * image. Don't populate yet. 171124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 171224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian ctx->Driver.TexImage2D(ctx, target, level, internalFormat, 171324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian width, height, border, 171424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GL_RGBA, CHAN_TYPE, NULL, 171524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian &ctx->DefaultPacking, texObj, texImage); 171624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 17174e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul st_copy_texsubimage(ctx, target, level, 17184e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul 0, 0, 0, /* destX,Y,Z */ 17194e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul x, y, width, height); /* src X, Y, size */ 172024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 172124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 172224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 172324df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 172424df8f895fe8807aa2ba058e71bd40adfc01d21eBrianst_CopyTexSubImage1D(GLcontext * ctx, GLenum target, GLint level, 172524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLint xoffset, GLint x, GLint y, GLsizei width) 172624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 1727038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian const GLint yoffset = 0, zoffset = 0; 1728038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian const GLsizei height = 1; 17294e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul st_copy_texsubimage(ctx, target, level, 17304e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul xoffset, yoffset, zoffset, /* destX,Y,Z */ 17314e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul x, y, width, height); /* src X, Y, size */ 173224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 173324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 173424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 173524df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 173624df8f895fe8807aa2ba058e71bd40adfc01d21eBrianst_CopyTexSubImage2D(GLcontext * ctx, GLenum target, GLint level, 173724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLint xoffset, GLint yoffset, 173824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLint x, GLint y, GLsizei width, GLsizei height) 173924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 1740038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian const GLint zoffset = 0; 17414e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul st_copy_texsubimage(ctx, target, level, 17424e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul xoffset, yoffset, zoffset, /* destX,Y,Z */ 17434e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul x, y, width, height); /* src X, Y, size */ 1744038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian} 174524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 174624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1747038cb561eb094af2f2ba06e18e61246fc0c87c3cBrianstatic void 1748038cb561eb094af2f2ba06e18e61246fc0c87c3cBrianst_CopyTexSubImage3D(GLcontext * ctx, GLenum target, GLint level, 1749038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian GLint xoffset, GLint yoffset, GLint zoffset, 1750038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian GLint x, GLint y, GLsizei width, GLsizei height) 1751038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian{ 17524e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul st_copy_texsubimage(ctx, target, level, 17534e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul xoffset, yoffset, zoffset, /* destX,Y,Z */ 17544e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul x, y, width, height); /* src X, Y, size */ 175524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 175624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 175724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1758e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul/** 1759e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul * Copy image data from stImage into the texture object 'stObj' at level 1760e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul * 'dstLevel'. 1761e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul */ 176224df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 1763753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzercopy_image_data_to_texture(struct st_context *st, 1764753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer struct st_texture_object *stObj, 17654da1cdf78fa3b954840650fa46cf72da5daf149fBrian GLuint dstLevel, 1766753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer struct st_texture_image *stImage) 176724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 1768e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul /* debug checks */ 1769e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul { 1770e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul const struct gl_texture_image *dstImage = 1771e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul stObj->base.Image[stImage->face][stImage->level]; 1772e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul assert(dstImage); 1773e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul assert(dstImage->Width == stImage->base.Width); 1774e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul assert(dstImage->Height == stImage->base.Height); 1775e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul assert(dstImage->Depth == stImage->base.Depth); 1776e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul } 1777e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul 1778753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer if (stImage->pt) { 177924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian /* Copy potentially with the blitter: 178024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 1781753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer st_texture_image_copy(st->pipe, 17824da1cdf78fa3b954840650fa46cf72da5daf149fBrian stObj->pt, dstLevel, /* dest texture, level */ 1783c6fdb950e9fdf42fb1d6c837019df23386fffee7Brian Paul stImage->pt, stImage->level, /* src texture, level */ 1784b628950662a97452e539bcc704bd2acee70f8355Brian Paul stImage->face); 178524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1786287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(&stImage->pt, NULL); 178724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 17884c50969334844bc9aa622176c3ebcbc733394f78Brian Paul else if (stImage->base.Data) { 1789e50dd26ca6d0eb0d0f97c2780020ea16e3d4a687Thomas Hellstrom st_texture_image_data(st, 17905facd7986ace899673499f396897469720476799Brian Paul stObj->pt, 17915facd7986ace899673499f396897469720476799Brian Paul stImage->face, 17925facd7986ace899673499f396897469720476799Brian Paul dstLevel, 17935facd7986ace899673499f396897469720476799Brian Paul stImage->base.Data, 17945facd7986ace899673499f396897469720476799Brian Paul stImage->base.RowStride * 1795b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol util_format_get_blocksize(stObj->pt->format), 17965facd7986ace899673499f396897469720476799Brian Paul stImage->base.RowStride * 17975facd7986ace899673499f396897469720476799Brian Paul stImage->base.Height * 1798b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol util_format_get_blocksize(stObj->pt->format)); 179924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian _mesa_align_free(stImage->base.Data); 180024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian stImage->base.Data = NULL; 180124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 180224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1803287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(&stImage->pt, stObj->pt); 180424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 180524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 180624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1807afc54983370033b65e3a7cbb29bd9c87156f0881Brian/** 1808afc54983370033b65e3a7cbb29bd9c87156f0881Brian * Called during state validation. When this function is finished, 1809afc54983370033b65e3a7cbb29bd9c87156f0881Brian * the texture object should be ready for rendering. 18103b3774b1227743147159676795b542c0eb7c2bdfBrian Paul * \return GL_TRUE for success, GL_FALSE for failure (out of mem) 181124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 181214b98343309fdcff3514f05020303f7b40e83a4aBrianGLboolean 1813753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzerst_finalize_texture(GLcontext *ctx, 1814c3af68dc5022715cc8f126b7df12f3f5248aefe7Keith Whitwell struct pipe_context *pipe, 1815295a87f6c211322faefc4ef7f88f02722973f5b6Brian Paul struct gl_texture_object *tObj) 181624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 181776c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul struct st_context *st = st_context(ctx); 181814b98343309fdcff3514f05020303f7b40e83a4aBrian struct st_texture_object *stObj = st_texture_object(tObj); 1819afc54983370033b65e3a7cbb29bd9c87156f0881Brian const GLuint nr_faces = (stObj->base.Target == GL_TEXTURE_CUBE_MAP) ? 6 : 1; 1820e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul GLuint face; 182124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct st_texture_image *firstImage; 1822e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul enum pipe_format firstImageFormat; 182324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1824e3a6f57ad6c0e7bda5d45eb146194ed39f45abddBrian Paul if (stObj->base._Complete) { 1825e3a6f57ad6c0e7bda5d45eb146194ed39f45abddBrian Paul /* The texture is complete and we know exactly how many mipmap levels 1826e3a6f57ad6c0e7bda5d45eb146194ed39f45abddBrian Paul * are present/needed. This is conditional because we may be called 1827e3a6f57ad6c0e7bda5d45eb146194ed39f45abddBrian Paul * from the st_generate_mipmap() function when the texture object is 1828e3a6f57ad6c0e7bda5d45eb146194ed39f45abddBrian Paul * incomplete. In that case, we'll have set stObj->lastLevel before 1829e3a6f57ad6c0e7bda5d45eb146194ed39f45abddBrian Paul * we get here. 1830e3a6f57ad6c0e7bda5d45eb146194ed39f45abddBrian Paul */ 1831ae2daacbac7242938cffe0e2409071e030e00863Cooper Yuan if (stObj->base.MinFilter == GL_LINEAR || 1832ae2daacbac7242938cffe0e2409071e030e00863Cooper Yuan stObj->base.MinFilter == GL_NEAREST) 1833ae2daacbac7242938cffe0e2409071e030e00863Cooper Yuan stObj->lastLevel = stObj->base.BaseLevel; 1834ae2daacbac7242938cffe0e2409071e030e00863Cooper Yuan else 1835e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul stObj->lastLevel = stObj->base._MaxLevel; 1836e3a6f57ad6c0e7bda5d45eb146194ed39f45abddBrian Paul } 183724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 18384da1cdf78fa3b954840650fa46cf72da5daf149fBrian firstImage = st_texture_image(stObj->base.Image[0][stObj->base.BaseLevel]); 1839e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul assert(firstImage); 184024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1841753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer /* If both firstImage and stObj point to a texture which can contain 184224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * all active images, favour firstImage. Note that because of the 184324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * completeness requirement, we know that the image dimensions 184424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * will match. 184524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 1846753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer if (firstImage->pt && 1847753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer firstImage->pt != stObj->pt && 1848753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer firstImage->pt->last_level >= stObj->lastLevel) { 1849287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(&stObj->pt, firstImage->pt); 185040c3861e1e98116c573027b054a6a05208c53b6aMichal Krol pipe_sampler_view_reference(&stObj->sampler_view, NULL); 185124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 185224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1853e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul /* Find gallium format for the Mesa texture */ 1854e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul firstImageFormat = st_mesa_format_to_pipe_format(firstImage->base.TexFormat); 185524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1856ce509401738e7073de94a2b7fc41461c52a73da0Brian Paul /* If we already have a gallium texture, check that it matches the texture 1857ce509401738e7073de94a2b7fc41461c52a73da0Brian Paul * object's format, target, size, num_levels, etc. 185824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 1859809dd9089bae70cf35cea6a75258e700e7455738Brian Paul if (stObj->pt) { 1860809dd9089bae70cf35cea6a75258e700e7455738Brian Paul if (stObj->pt->target != gl_target_to_pipe(stObj->base.Target) || 1861a2817f6ae566b672f195cff22e14e2058d3617eaDave Airlie !st_sampler_compat_formats(stObj->pt->format, firstImageFormat) || 1862529b7b355d392b1534ccd8ff7b428dc21cbfdc21Brian Paul stObj->pt->last_level < stObj->lastLevel || 1863e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul stObj->pt->width0 != stObj->width0 || 1864e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul stObj->pt->height0 != stObj->height0 || 1865e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul stObj->pt->depth0 != stObj->depth0) 1866311f77198e171e9ce8ddcce91fd6a894fff1f14fBrian Paul { 1867e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul /* The gallium texture does not match the Mesa texture so delete the 1868e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul * gallium texture now. We'll make a new one below. 1869e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul */ 1870287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(&stObj->pt, NULL); 187140c3861e1e98116c573027b054a6a05208c53b6aMichal Krol pipe_sampler_view_reference(&stObj->sampler_view, NULL); 187276c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul st->dirty.st |= ST_NEW_FRAMEBUFFER; 1873809dd9089bae70cf35cea6a75258e700e7455738Brian Paul } 187424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 187524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1876ce509401738e7073de94a2b7fc41461c52a73da0Brian Paul /* May need to create a new gallium texture: 187724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 1878753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer if (!stObj->pt) { 1879e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul GLuint bindings = default_bindings(st, firstImageFormat); 18801ad2484f03cbe9ae6bd4ebe50d6894e570d65952Brian Paul 188176c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul stObj->pt = st_texture_create(st, 18825390a43ce06b27f6d54bc5f237aa305b6948f2afBrian gl_target_to_pipe(stObj->base.Target), 1883e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul firstImageFormat, 1884b245840b86cf877c9b8d666edf229364a84f1deaBrian stObj->lastLevel, 1885e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul stObj->width0, 1886e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul stObj->height0, 1887e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul stObj->depth0, 18888283db88414f600e66510de713382c36899d4b03Brian Paul bindings); 1889a73ae3d5eb8419feab5aea26573aa41b72f941ebKeith Whitwell 18903b3774b1227743147159676795b542c0eb7c2bdfBrian Paul if (!stObj->pt) { 18913b3774b1227743147159676795b542c0eb7c2bdfBrian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage"); 18923b3774b1227743147159676795b542c0eb7c2bdfBrian Paul return GL_FALSE; 18933b3774b1227743147159676795b542c0eb7c2bdfBrian Paul } 189424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 189524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1896753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer /* Pull in any images not in the object's texture: 189724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 189824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian for (face = 0; face < nr_faces; face++) { 18994da1cdf78fa3b954840650fa46cf72da5daf149fBrian GLuint level; 19009adebe172df9fbf9ba359d949e64ce07bbef77b7Brian Paul for (level = stObj->base.BaseLevel; level <= stObj->lastLevel; level++) { 190124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct st_texture_image *stImage = 1902e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul st_texture_image(stObj->base.Image[face][level]); 190324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1904753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer /* Need to import images in main memory or held in other textures. 190524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 1906a34b43b3f4817268ef4b3f186203b5fbafc7214eBrian if (stImage && stObj->pt != stImage->pt) { 190776c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul copy_image_data_to_texture(st, stObj, level, stImage); 190824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 190924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 191024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 191124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 191224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian return GL_TRUE; 191324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 191424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 191524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 19168f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul/** 19178f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul * Returns pointer to a default/dummy texture. 19188f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul * This is typically used when the current shader has tex/sample instructions 19198f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul * but the user has not provided a (any) texture(s). 19208f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul */ 19218f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paulstruct gl_texture_object * 19228f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paulst_get_default_texture(struct st_context *st) 19238f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul{ 19248f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul if (!st->default_texture) { 19258f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul static const GLenum target = GL_TEXTURE_2D; 19268f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul GLubyte pixels[16][16][4]; 19278f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul struct gl_texture_object *texObj; 19288f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul struct gl_texture_image *texImg; 19292002e03a5232c54988161cb629966bdce19d35deBrian Paul GLuint i, j; 19308f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul 19312002e03a5232c54988161cb629966bdce19d35deBrian Paul /* The ARB_fragment_program spec says (0,0,0,1) should be returned 19322002e03a5232c54988161cb629966bdce19d35deBrian Paul * when attempting to sample incomplete textures. 19332002e03a5232c54988161cb629966bdce19d35deBrian Paul */ 19342002e03a5232c54988161cb629966bdce19d35deBrian Paul for (i = 0; i < 16; i++) { 19352002e03a5232c54988161cb629966bdce19d35deBrian Paul for (j = 0; j < 16; j++) { 19362002e03a5232c54988161cb629966bdce19d35deBrian Paul pixels[i][j][0] = 0; 19372002e03a5232c54988161cb629966bdce19d35deBrian Paul pixels[i][j][1] = 0; 19382002e03a5232c54988161cb629966bdce19d35deBrian Paul pixels[i][j][2] = 0; 19392002e03a5232c54988161cb629966bdce19d35deBrian Paul pixels[i][j][3] = 255; 19402002e03a5232c54988161cb629966bdce19d35deBrian Paul } 19412002e03a5232c54988161cb629966bdce19d35deBrian Paul } 1942a7b818d53a95b549bbff942a9cb91272e0799dd5Brian Paul 19438f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul texObj = st->ctx->Driver.NewTextureObject(st->ctx, 0, target); 19448f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul 19458f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul texImg = _mesa_get_tex_image(st->ctx, texObj, target, 0); 19468f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul 19478f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul _mesa_init_teximage_fields(st->ctx, target, texImg, 19488f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul 16, 16, 1, 0, /* w, h, d, border */ 19498f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul GL_RGBA); 19508f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul 19518f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul st_TexImage(st->ctx, 2, target, 19528f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul 0, GL_RGBA, /* level, intformat */ 19538f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul 16, 16, 1, 0, /* w, h, d, border */ 19548f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul GL_RGBA, GL_UNSIGNED_BYTE, pixels, 19558f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul &st->ctx->DefaultPacking, 19568f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul texObj, texImg, 19578f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul 0, 0); 19588f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul 19598f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul texObj->MinFilter = GL_NEAREST; 19608f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul texObj->MagFilter = GL_NEAREST; 19618f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul texObj->_Complete = GL_TRUE; 19628f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul 19638f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul st->default_texture = texObj; 19648f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul } 19658f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul return st->default_texture; 19668f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul} 19678f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul 19688f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul 19696da9234fd437f97267e7831f034c78b31156d939Brianvoid 19706da9234fd437f97267e7831f034c78b31156d939Brianst_init_texture_functions(struct dd_function_table *functions) 197124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 197224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->ChooseTextureFormat = st_ChooseTextureFormat; 197324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->TexImage1D = st_TexImage1D; 197424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->TexImage2D = st_TexImage2D; 197524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->TexImage3D = st_TexImage3D; 197624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->TexSubImage1D = st_TexSubImage1D; 197724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->TexSubImage2D = st_TexSubImage2D; 197824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->TexSubImage3D = st_TexSubImage3D; 1979578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz functions->CompressedTexSubImage1D = st_CompressedTexSubImage1D; 1980a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz functions->CompressedTexSubImage2D = st_CompressedTexSubImage2D; 1981578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz functions->CompressedTexSubImage3D = st_CompressedTexSubImage3D; 198224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->CopyTexImage1D = st_CopyTexImage1D; 198324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->CopyTexImage2D = st_CopyTexImage2D; 198424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->CopyTexSubImage1D = st_CopyTexSubImage1D; 198524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->CopyTexSubImage2D = st_CopyTexSubImage2D; 1986038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian functions->CopyTexSubImage3D = st_CopyTexSubImage3D; 198762abcb9aacc33218d0143a743c738435794b32a9Brian functions->GenerateMipmap = st_generate_mipmap; 1988038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian 198924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->GetTexImage = st_GetTexImage; 199024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 199124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian /* compressed texture functions */ 199224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->CompressedTexImage2D = st_CompressedTexImage2D; 199324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->GetCompressedTexImage = st_GetCompressedTexImage; 199424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 199524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->NewTextureObject = st_NewTextureObject; 199624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->NewTextureImage = st_NewTextureImage; 199724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->DeleteTexture = st_DeleteTextureObject; 199824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->FreeTexImageData = st_FreeTextureImageData; 199924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->UpdateTexturePalette = 0; 200024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 200124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->TextureMemCpy = do_memcpy; 2002f8549e8f4f8bdfebcb4e0a2754df59b3fe4fdff7Brian 2003f8549e8f4f8bdfebcb4e0a2754df59b3fe4fdff7Brian /* XXX Temporary until we can query pipe's texture sizes */ 2004f8549e8f4f8bdfebcb4e0a2754df59b3fe4fdff7Brian functions->TestProxyTexImage = _mesa_test_proxy_teximage; 200524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 2006