st_cb_texture.c revision 83e93b6008213ad86607027e8434ecaccc8b1a2c
124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian/************************************************************************** 224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * 324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas. 424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * All Rights Reserved. 524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * 624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * Permission is hereby granted, free of charge, to any person obtaining a 724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * copy of this software and associated documentation files (the 824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * "Software"), to deal in the Software without restriction, including 924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * without limitation the rights to use, copy, modify, merge, publish, 1024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * distribute, sub license, and/or sell copies of the Software, and to 1124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * permit persons to whom the Software is furnished to do so, subject to 1224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * the following conditions: 1324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * 1424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * The above copyright notice and this permission notice (including the 1524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * next paragraph) shall be included in all copies or substantial portions 1624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * of the Software. 1724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * 1824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 1924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 2024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 2124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR 2224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 2324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 2424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 2524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * 2624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian **************************************************************************/ 2724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 28f2c023291a1f2887294d2aac504f8b82857ad092Brian Paul#include "main/mfeatures.h" 297b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul#include "main/bufferobj.h" 3024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#include "main/enums.h" 3165d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul#include "main/fbobject.h" 3245e76d2665b38ba3787548310efc59e969124c01Brian Paul#include "main/formats.h" 3324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#include "main/image.h" 34f2c023291a1f2887294d2aac504f8b82857ad092Brian Paul#include "main/imports.h" 3524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#include "main/macros.h" 362440ff74d69a8caf49b05a960b4c7e282a96565eBrian#include "main/mipmap.h" 371c131752c3e07ef91f49d4970dafca6d26585334Brian Paul#include "main/pack.h" 381c131752c3e07ef91f49d4970dafca6d26585334Brian Paul#include "main/pixeltransfer.h" 3924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#include "main/texcompress.h" 404ca9ba254462b9be55b78df1d50519e10b2f4d73Brian Paul#include "main/texfetch.h" 41a4bec69e7271eda0137874973aa8c7d44175fedfBrian Paul#include "main/texgetimage.h" 4224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#include "main/teximage.h" 4324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#include "main/texobj.h" 4424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#include "main/texstore.h" 4524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 46b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell#include "state_tracker/st_debug.h" 4724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#include "state_tracker/st_context.h" 48b27498c7cad7dae4e3b3ef9517b9c0aef58f73f6Brian#include "state_tracker/st_cb_fbo.h" 49b0427bedde80e3189524651a327235bdfddbc613José Fonseca#include "state_tracker/st_cb_flush.h" 5024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#include "state_tracker/st_cb_texture.h" 51f8ab24760d0d3f07e9ee81c98207ddf92dfe74daBrian#include "state_tracker/st_format.h" 52753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer#include "state_tracker/st_texture.h" 5362abcb9aacc33218d0143a743c738435794b32a9Brian#include "state_tracker/st_gen_mipmap.h" 54afd16512bc354cf1a7220cb9bf3ce445503c7af4Keith Whitwell#include "state_tracker/st_atom.h" 5524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 5624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#include "pipe/p_context.h" 57b245840b86cf877c9b8d666edf229364a84f1deaBrian#include "pipe/p_defines.h" 5828486880ca3ec39419ccee0cb1a3bedc9ef7117cJosé Fonseca#include "util/u_inlines.h" 598fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell#include "pipe/p_shader_tokens.h" 604f25420bdd834e81a3e22733304efc5261c2998aBrian Paul#include "util/u_tile.h" 613c0dc8242b64518d5635263ba65b39afa919dd86Michel Dänzer#include "util/u_blit.h" 623400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol#include "util/u_format.h" 6351b339af2e8b80575a24bb9146f031c9605180bbBrian Paul#include "util/u_surface.h" 648f55a95178069d5e8b18647e6b675fc403d68073Roland Scheidegger#include "util/u_sampler.h" 65c1785c19ca0716a7e85777242949a0c33e28988fPatrice Mandin#include "util/u_math.h" 6624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 6724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 6824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#define DBG if (0) printf 6924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 7024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 711c5f27a18b775b3784fcd265d60e0affa0b31581Michel Dänzerstatic enum pipe_texture_target 725390a43ce06b27f6d54bc5f237aa305b6948f2afBriangl_target_to_pipe(GLenum target) 735390a43ce06b27f6d54bc5f237aa305b6948f2afBrian{ 745390a43ce06b27f6d54bc5f237aa305b6948f2afBrian switch (target) { 755390a43ce06b27f6d54bc5f237aa305b6948f2afBrian case GL_TEXTURE_1D: 765390a43ce06b27f6d54bc5f237aa305b6948f2afBrian return PIPE_TEXTURE_1D; 775390a43ce06b27f6d54bc5f237aa305b6948f2afBrian 785390a43ce06b27f6d54bc5f237aa305b6948f2afBrian case GL_TEXTURE_2D: 795390a43ce06b27f6d54bc5f237aa305b6948f2afBrian return PIPE_TEXTURE_2D; 805390a43ce06b27f6d54bc5f237aa305b6948f2afBrian 817f15dca6d963b0a69131e8761c477064dba49307Luca Barbieri case GL_TEXTURE_RECTANGLE_NV: 827f15dca6d963b0a69131e8761c477064dba49307Luca Barbieri return PIPE_TEXTURE_RECT; 837f15dca6d963b0a69131e8761c477064dba49307Luca Barbieri 845390a43ce06b27f6d54bc5f237aa305b6948f2afBrian case GL_TEXTURE_3D: 855390a43ce06b27f6d54bc5f237aa305b6948f2afBrian return PIPE_TEXTURE_3D; 865390a43ce06b27f6d54bc5f237aa305b6948f2afBrian 875390a43ce06b27f6d54bc5f237aa305b6948f2afBrian case GL_TEXTURE_CUBE_MAP_ARB: 885390a43ce06b27f6d54bc5f237aa305b6948f2afBrian return PIPE_TEXTURE_CUBE; 895390a43ce06b27f6d54bc5f237aa305b6948f2afBrian 905390a43ce06b27f6d54bc5f237aa305b6948f2afBrian default: 915390a43ce06b27f6d54bc5f237aa305b6948f2afBrian assert(0); 925390a43ce06b27f6d54bc5f237aa305b6948f2afBrian return 0; 935390a43ce06b27f6d54bc5f237aa305b6948f2afBrian } 945390a43ce06b27f6d54bc5f237aa305b6948f2afBrian} 955390a43ce06b27f6d54bc5f237aa305b6948f2afBrian 965390a43ce06b27f6d54bc5f237aa305b6948f2afBrian 974e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul/** called via ctx->Driver.NewTextureImage() */ 9824df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic struct gl_texture_image * 99f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergst_NewTextureImage(struct gl_context * ctx) 10024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 10124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian DBG("%s\n", __FUNCTION__); 10224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian (void) ctx; 103f1a59a6dd7b7b0523db191d82b3af1a841c6475dBrian Paul return (struct gl_texture_image *) ST_CALLOC_STRUCT(st_texture_image); 10424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 10524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 10624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1074e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul/** called via ctx->Driver.NewTextureObject() */ 10824df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic struct gl_texture_object * 109f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergst_NewTextureObject(struct gl_context * ctx, GLuint name, GLenum target) 11024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 111f1a59a6dd7b7b0523db191d82b3af1a841c6475dBrian Paul struct st_texture_object *obj = ST_CALLOC_STRUCT(st_texture_object); 11224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 11324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian DBG("%s\n", __FUNCTION__); 11424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian _mesa_initialize_texture_object(&obj->base, name, target); 11524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 11624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian return &obj->base; 11724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 11824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 11930f46e7b4c9d6c6f8c1c01825b344b90adc93982Brian Paul/** called via ctx->Driver.DeleteTextureObject() */ 12024df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 121f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergst_DeleteTextureObject(struct gl_context *ctx, 1226f715dcc219071e574e363a9db4365c9c31ebbd3Brian struct gl_texture_object *texObj) 12324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 12476c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul struct st_context *st = st_context(ctx); 12524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct st_texture_object *stObj = st_texture_object(texObj); 126753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer if (stObj->pt) 127287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(&stObj->pt, NULL); 1282d6befd9d1e8dcf6495fe1b9cef12224046f3095Brian Paul if (stObj->sampler_view) { 12976c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul if (stObj->sampler_view->context != st->pipe) { 1302d6befd9d1e8dcf6495fe1b9cef12224046f3095Brian Paul /* Take "ownership" of this texture sampler view by setting 1312d6befd9d1e8dcf6495fe1b9cef12224046f3095Brian Paul * its context pointer to this context. This avoids potential 1322d6befd9d1e8dcf6495fe1b9cef12224046f3095Brian Paul * crashes when the texture object is shared among contexts 1332d6befd9d1e8dcf6495fe1b9cef12224046f3095Brian Paul * and the original/owner context has already been destroyed. 1342d6befd9d1e8dcf6495fe1b9cef12224046f3095Brian Paul */ 13576c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul stObj->sampler_view->context = st->pipe; 1362d6befd9d1e8dcf6495fe1b9cef12224046f3095Brian Paul } 137b8030c6561e019e079b5be2fe64ec804df4bfa03Michal Krol pipe_sampler_view_reference(&stObj->sampler_view, NULL); 1382d6befd9d1e8dcf6495fe1b9cef12224046f3095Brian Paul } 13924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian _mesa_delete_texture_object(ctx, texObj); 14024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 14124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 14224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1434e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul/** called via ctx->Driver.FreeTexImageData() */ 14424df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 145f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergst_FreeTextureImageData(struct gl_context * ctx, struct gl_texture_image *texImage) 14624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 14724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct st_texture_image *stImage = st_texture_image(texImage); 14824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 14924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian DBG("%s\n", __FUNCTION__); 15024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 151753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer if (stImage->pt) { 152287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(&stImage->pt, NULL); 15324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 15424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 15524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian if (texImage->Data) { 1568d6ef125ac6044438db5b89d6d310ccfc4b8140aBrian Paul _mesa_align_free(texImage->Data); 15724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian texImage->Data = NULL; 15824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 15924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 16024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 16124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1624e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul/** 16324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * From linux kernel i386 header files, copes with odd sizes better 16424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * than COPY_DWORDS would: 16524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * XXX Put this in src/mesa/main/imports.h ??? 16624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 1671ea7f0fef055245fa18c0fbc3e54a866956c2507José Fonseca#if defined(PIPE_CC_GCC) && defined(PIPE_ARCH_X86) 16824df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic INLINE void * 16924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian__memcpy(void *to, const void *from, size_t n) 17024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 17124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian int d0, d1, d2; 17224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian __asm__ __volatile__("rep ; movsl\n\t" 17324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian "testb $2,%b4\n\t" 17424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian "je 1f\n\t" 17524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian "movsw\n" 17624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian "1:\ttestb $1,%b4\n\t" 17724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian "je 2f\n\t" 17824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian "movsb\n" "2:":"=&c"(d0), "=&D"(d1), "=&S"(d2) 17924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian :"0"(n / 4), "q"(n), "1"((long) to), "2"((long) from) 18024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian :"memory"); 18124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian return (to); 18224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 18324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#else 18424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#define __memcpy(a,b,c) memcpy(a,b,c) 18524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian#endif 18624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 18724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1884e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul/** 1894e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul * The system memcpy (at least on ubuntu 5.10) has problems copying 19024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * to agp (writecombined) memory from a source which isn't 64-byte 19124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * aligned - there is a 4x performance falloff. 19224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * 19324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * The x86 __memcpy is immune to this but is slightly slower 19424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * (10%-ish) than the system memcpy. 19524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * 19624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * The sse_memcpy seems to have a slight cliff at 64/32 bytes, but 19724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * isn't much faster than x86_memcpy for agp copies. 19824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * 19924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * TODO: switch dynamically. 20024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 20124df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void * 20224df8f895fe8807aa2ba058e71bd40adfc01d21eBriando_memcpy(void *dest, const void *src, size_t n) 20324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 204799f55803d15602b10d2bb97ff62792f05ce4de3Brian Paul if ((((unsigned long) src) & 63) || (((unsigned long) dest) & 63)) { 20524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian return __memcpy(dest, src, n); 20624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 20724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian else 20824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian return memcpy(dest, src, n); 20924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 21024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 21124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 212f52f5136e6eed23e55098681e5b082cc452136d6Brian/** 2138283db88414f600e66510de713382c36899d4b03Brian Paul * Return default texture resource binding bitmask for the given format. 2141ad2484f03cbe9ae6bd4ebe50d6894e570d65952Brian Paul */ 2151ad2484f03cbe9ae6bd4ebe50d6894e570d65952Brian Paulstatic GLuint 2168283db88414f600e66510de713382c36899d4b03Brian Pauldefault_bindings(struct st_context *st, enum pipe_format format) 2171ad2484f03cbe9ae6bd4ebe50d6894e570d65952Brian Paul{ 2188283db88414f600e66510de713382c36899d4b03Brian Paul struct pipe_screen *screen = st->pipe->screen; 2198283db88414f600e66510de713382c36899d4b03Brian Paul const unsigned target = PIPE_TEXTURE_2D; 2208283db88414f600e66510de713382c36899d4b03Brian Paul const unsigned geom = 0x0; 2218283db88414f600e66510de713382c36899d4b03Brian Paul unsigned bindings; 2228283db88414f600e66510de713382c36899d4b03Brian Paul 2238283db88414f600e66510de713382c36899d4b03Brian Paul if (util_format_is_depth_or_stencil(format)) 2248283db88414f600e66510de713382c36899d4b03Brian Paul bindings = PIPE_BIND_SAMPLER_VIEW | PIPE_BIND_DEPTH_STENCIL; 2258283db88414f600e66510de713382c36899d4b03Brian Paul else 2268283db88414f600e66510de713382c36899d4b03Brian Paul bindings = PIPE_BIND_SAMPLER_VIEW | PIPE_BIND_RENDER_TARGET; 2278283db88414f600e66510de713382c36899d4b03Brian Paul 228127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger if (screen->is_format_supported(screen, format, target, 0, bindings, geom)) 2298283db88414f600e66510de713382c36899d4b03Brian Paul return bindings; 2301ad2484f03cbe9ae6bd4ebe50d6894e570d65952Brian Paul else 2318283db88414f600e66510de713382c36899d4b03Brian Paul return PIPE_BIND_SAMPLER_VIEW; 2321ad2484f03cbe9ae6bd4ebe50d6894e570d65952Brian Paul} 2331ad2484f03cbe9ae6bd4ebe50d6894e570d65952Brian Paul 2341ad2484f03cbe9ae6bd4ebe50d6894e570d65952Brian Paul 235e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul/** Return number of image dimensions (1, 2 or 3) for a texture target. */ 236e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paulstatic GLuint 237e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paulget_texture_dims(GLenum target) 238e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul{ 239e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul switch (target) { 240e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul case GL_TEXTURE_1D: 241e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul case GL_TEXTURE_1D_ARRAY_EXT: 242e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul return 1; 243e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul case GL_TEXTURE_2D: 244e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul case GL_TEXTURE_CUBE_MAP_ARB: 245168554904bc079650124fbd026d9b75834eabc92Marek Olšák case GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB: 246168554904bc079650124fbd026d9b75834eabc92Marek Olšák case GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB: 247168554904bc079650124fbd026d9b75834eabc92Marek Olšák case GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB: 248168554904bc079650124fbd026d9b75834eabc92Marek Olšák case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB: 249168554904bc079650124fbd026d9b75834eabc92Marek Olšák case GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB: 250168554904bc079650124fbd026d9b75834eabc92Marek Olšák case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB: 251e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul case GL_TEXTURE_RECTANGLE_NV: 252e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul case GL_TEXTURE_2D_ARRAY_EXT: 253e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul return 2; 254e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul case GL_TEXTURE_3D: 255e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul return 3; 256e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul default: 257e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul assert(0 && "invalid texture target in get_texture_dims()"); 258e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul return 1; 259e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul } 260e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul} 261e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul 262e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul 2631ad2484f03cbe9ae6bd4ebe50d6894e570d65952Brian Paul/** 264e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul * Try to allocate a pipe_resource object for the given st_texture_object. 265f52f5136e6eed23e55098681e5b082cc452136d6Brian * 266e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul * We use the given st_texture_image as a clue to determine the size of the 267e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul * mipmap image at level=0. 2682b53f4a9c674e9b02df8a06759e7a2340f257081Brian Paul * 2692b53f4a9c674e9b02df8a06759e7a2340f257081Brian Paul * \return GL_TRUE for success, GL_FALSE if out of memory. 27024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 2712b53f4a9c674e9b02df8a06759e7a2340f257081Brian Paulstatic GLboolean 272753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzerguess_and_alloc_texture(struct st_context *st, 273753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer struct st_texture_object *stObj, 274afc54983370033b65e3a7cbb29bd9c87156f0881Brian const struct st_texture_image *stImage) 27524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 276e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul const GLuint dims = get_texture_dims(stObj->base.Target); 277e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul GLuint level, lastLevel, width, height, depth; 278e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul GLuint bindings; 279a1f95a8bf64f863289b6759caeec76d7e054400eRoland Scheidegger enum pipe_format fmt; 28024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 28124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian DBG("%s\n", __FUNCTION__); 28224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 283f52f5136e6eed23e55098681e5b082cc452136d6Brian assert(!stObj->pt); 284f52f5136e6eed23e55098681e5b082cc452136d6Brian 285e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul level = stImage->level; 286e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul width = stImage->base.Width2; /* size w/out border */ 287e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul height = stImage->base.Height2; 288e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul depth = stImage->base.Depth2; 28924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 290e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul assert(width > 0); 291e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul assert(height > 0); 292e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul assert(depth > 0); 29324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 294e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul /* Depending on the image's size, we can't always make a guess here. 29524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 296e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul if (level > 0) { 297e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul if ( (dims >= 1 && width == 1) || 298e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul (dims >= 2 && height == 1) || 299e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul (dims >= 3 && depth == 1) ) { 300e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul /* we can't determine the image size at level=0 */ 301e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul stObj->width0 = stObj->height0 = stObj->depth0 = 0; 3022b53f4a9c674e9b02df8a06759e7a2340f257081Brian Paul /* this is not an out of memory error */ 3032b53f4a9c674e9b02df8a06759e7a2340f257081Brian Paul return GL_TRUE; 304e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul } 305e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul } 306e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul 307e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul /* grow the image size until we hit level = 0 */ 308e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul while (level > 0) { 30945cc35e77600af8628393475405160e26d56d421Brian Paul if (width != 1) 31045cc35e77600af8628393475405160e26d56d421Brian Paul width <<= 1; 31124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian if (height != 1) 31224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian height <<= 1; 31324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian if (depth != 1) 31424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian depth <<= 1; 315e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul level--; 316e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul } 31724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 318e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul assert(level == 0); 319e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul 320e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul /* At this point, (width x height x depth) is the expected size of 321e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul * the level=0 mipmap image. 322e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul */ 323296378b6c8b205048244746e260739448c4ee590Brian Paul 3244b7812919a5db2f72bd3b9f6d760ffeb469ee3e4Brian Paul /* Guess a reasonable value for lastLevel. With OpenGL we have no 3254b7812919a5db2f72bd3b9f6d760ffeb469ee3e4Brian Paul * idea how many mipmap levels will be in a texture until we start 3264b7812919a5db2f72bd3b9f6d760ffeb469ee3e4Brian Paul * to render with it. Make an educated guess here but be prepared 3274b7812919a5db2f72bd3b9f6d760ffeb469ee3e4Brian Paul * to re-allocating a texture buffer with space for more (or fewer) 3284b7812919a5db2f72bd3b9f6d760ffeb469ee3e4Brian Paul * mipmap levels later. 32924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 33014b98343309fdcff3514f05020303f7b40e83a4aBrian if ((stObj->base.MinFilter == GL_NEAREST || 3312a2236606fd6ae473a2f4db6ef6d3d5030261316José Fonseca stObj->base.MinFilter == GL_LINEAR || 3322a2236606fd6ae473a2f4db6ef6d3d5030261316José Fonseca stImage->base._BaseFormat == GL_DEPTH_COMPONENT || 3332a2236606fd6ae473a2f4db6ef6d3d5030261316José Fonseca stImage->base._BaseFormat == GL_DEPTH_STENCIL_EXT) && 33405bad193f56d48384097e37e47fae3fdda85f144Brian Paul !stObj->base.GenerateMipmap && 335e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul stImage->level == 0) { 33605bad193f56d48384097e37e47fae3fdda85f144Brian Paul /* only alloc space for a single mipmap level */ 337e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul lastLevel = 0; 33824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 33924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian else { 34005bad193f56d48384097e37e47fae3fdda85f144Brian Paul /* alloc space for a full mipmap */ 341c1785c19ca0716a7e85777242949a0c33e28988fPatrice Mandin GLuint l2width = util_logbase2(width); 342c1785c19ca0716a7e85777242949a0c33e28988fPatrice Mandin GLuint l2height = util_logbase2(height); 343c1785c19ca0716a7e85777242949a0c33e28988fPatrice Mandin GLuint l2depth = util_logbase2(depth); 344e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul lastLevel = MAX2(MAX2(l2width, l2height), l2depth); 34524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 34624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 347e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul /* Save the level=0 dimensions */ 348e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul stObj->width0 = width; 349e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul stObj->height0 = height; 350e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul stObj->depth0 = depth; 351e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul 3521f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul fmt = st_mesa_format_to_pipe_format(stImage->base.TexFormat); 3531ad2484f03cbe9ae6bd4ebe50d6894e570d65952Brian Paul 3548283db88414f600e66510de713382c36899d4b03Brian Paul bindings = default_bindings(st, fmt); 3551ad2484f03cbe9ae6bd4ebe50d6894e570d65952Brian Paul 356753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer stObj->pt = st_texture_create(st, 3575390a43ce06b27f6d54bc5f237aa305b6948f2afBrian gl_target_to_pipe(stObj->base.Target), 358a1f95a8bf64f863289b6759caeec76d7e054400eRoland Scheidegger fmt, 3595390a43ce06b27f6d54bc5f237aa305b6948f2afBrian lastLevel, 3605390a43ce06b27f6d54bc5f237aa305b6948f2afBrian width, 3615390a43ce06b27f6d54bc5f237aa305b6948f2afBrian height, 3625390a43ce06b27f6d54bc5f237aa305b6948f2afBrian depth, 3638283db88414f600e66510de713382c36899d4b03Brian Paul bindings); 36424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 3652b53f4a9c674e9b02df8a06759e7a2340f257081Brian Paul DBG("%s returning %d\n", __FUNCTION__, (stObj->pt != NULL)); 3662b53f4a9c674e9b02df8a06759e7a2340f257081Brian Paul 3672b53f4a9c674e9b02df8a06759e7a2340f257081Brian Paul return stObj->pt != NULL; 36824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 36924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 37024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 371212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian/** 372212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian * Adjust pixel unpack params and image dimensions to strip off the 373212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian * texture border. 374212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian * Gallium doesn't support texture borders. They've seldem been used 375212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian * and seldom been implemented correctly anyway. 376212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian * \param unpackNew returns the new pixel unpack parameters 377212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian */ 378212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brianstatic void 379212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brianstrip_texture_border(GLint border, 380212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian GLint *width, GLint *height, GLint *depth, 381212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian const struct gl_pixelstore_attrib *unpack, 382212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian struct gl_pixelstore_attrib *unpackNew) 383212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian{ 384212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian assert(border > 0); /* sanity check */ 385212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian 386212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian *unpackNew = *unpack; 387212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian 388212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian if (unpackNew->RowLength == 0) 389212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian unpackNew->RowLength = *width; 390212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian 391212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian if (depth && unpackNew->ImageHeight == 0) 392212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian unpackNew->ImageHeight = *height; 393212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian 394212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian unpackNew->SkipPixels += border; 395212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian if (height) 396212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian unpackNew->SkipRows += border; 397212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian if (depth) 398212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian unpackNew->SkipImages += border; 399212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian 400212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian assert(*width >= 3); 401212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian *width = *width - 2 * border; 402212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian if (height && *height >= 3) 403212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian *height = *height - 2 * border; 404212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian if (depth && *depth >= 3) 405212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian *depth = *depth - 2 * border; 406212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian} 407212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian 40824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 4094e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul/** 41055ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz * Try to do texture compression via rendering. If the Gallium driver 41155ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz * can render into a compressed surface this will allow us to do texture 41255ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz * compression. 41355ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz * \return GL_TRUE for success, GL_FALSE for failure 41455ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz */ 41555ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantzstatic GLboolean 416f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergcompress_with_blit(struct gl_context * ctx, 41755ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz GLenum target, GLint level, 41855ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz GLint xoffset, GLint yoffset, GLint zoffset, 41955ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz GLint width, GLint height, GLint depth, 42055ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz GLenum format, GLenum type, const void *pixels, 42155ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz const struct gl_pixelstore_attrib *unpack, 42255ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz struct gl_texture_image *texImage) 42355ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz{ 42455ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz const GLuint dstImageOffsets[1] = {0}; 42555ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz struct st_texture_image *stImage = st_texture_image(texImage); 42676c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul struct st_context *st = st_context(ctx); 42776c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul struct pipe_context *pipe = st->pipe; 428b43c182f19c6291c88420fa12714f952c2b461fbKeith Whitwell struct pipe_screen *screen = pipe->screen; 4291f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul gl_format mesa_format; 430287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct pipe_resource templ; 431287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct pipe_resource *src_tex; 4328f55a95178069d5e8b18647e6b675fc403d68073Roland Scheidegger struct pipe_sampler_view view_templ; 4338f55a95178069d5e8b18647e6b675fc403d68073Roland Scheidegger struct pipe_sampler_view *src_view; 43455ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz struct pipe_surface *dst_surface; 43555ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz struct pipe_transfer *tex_xfer; 43655ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz void *map; 43755ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz 43855ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz if (!stImage->pt) { 43955ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz /* XXX: Can this happen? Should we assert? */ 44055ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz return GL_FALSE; 44155ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz } 44255ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz 44355ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz /* get destination surface (in the compressed texture) */ 44455ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz dst_surface = screen->get_tex_surface(screen, stImage->pt, 44555ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz stImage->face, stImage->level, 0, 446127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger 0 /* flags */); 44755ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz if (!dst_surface) { 44855ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz /* can't render into this format (or other problem) */ 44955ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz return GL_FALSE; 45055ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz } 45155ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz 45255ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz /* Choose format for the temporary RGBA texture image. 45355ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz */ 45455ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz mesa_format = st_ChooseTextureFormat(ctx, GL_RGBA, format, type); 45555ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz assert(mesa_format); 45655ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz if (!mesa_format) 45755ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz return GL_FALSE; 45855ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz 45955ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz /* Create the temporary source texture 46055ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz */ 46155ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz memset(&templ, 0, sizeof(templ)); 4627f15dca6d963b0a69131e8761c477064dba49307Luca Barbieri templ.target = st->internal_target; 4631f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul templ.format = st_mesa_format_to_pipe_format(mesa_format); 464683e35f726a182ed9fc6b6d5cb07146eebe14deaKeith Whitwell templ.width0 = width; 465683e35f726a182ed9fc6b6d5cb07146eebe14deaKeith Whitwell templ.height0 = height; 466683e35f726a182ed9fc6b6d5cb07146eebe14deaKeith Whitwell templ.depth0 = 1; 46755ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz templ.last_level = 0; 468a2a01853f3f40b4ef8b3f01503391877960bdaeeBrian Paul templ.usage = PIPE_USAGE_DEFAULT; 469287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell templ.bind = PIPE_BIND_SAMPLER_VIEW; 470287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell src_tex = screen->resource_create(screen, &templ); 47155ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz 47255ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz if (!src_tex) 47355ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz return GL_FALSE; 47455ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz 47555ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz /* Put user's tex data into the temporary texture 47655ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz */ 477b0427bedde80e3189524651a327235bdfddbc613José Fonseca tex_xfer = pipe_get_transfer(st_context(ctx)->pipe, src_tex, 4785ed7764fd6354da8e2be15d6fb724c2d6be9be4aKeith Whitwell 0, 0, 0, /* face, level are zero */ 479e50dd26ca6d0eb0d0f97c2780020ea16e3d4a687Thomas Hellstrom PIPE_TRANSFER_WRITE, 480e50dd26ca6d0eb0d0f97c2780020ea16e3d4a687Thomas Hellstrom 0, 0, width, height); /* x, y, w, h */ 481287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell map = pipe_transfer_map(pipe, tex_xfer); 48255ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz 4836480210b89dc8ae0990c450d27870c7b7930f251Brian Paul _mesa_texstore(ctx, 2, GL_RGBA, mesa_format, 4846480210b89dc8ae0990c450d27870c7b7930f251Brian Paul map, /* dest ptr */ 4856480210b89dc8ae0990c450d27870c7b7930f251Brian Paul 0, 0, 0, /* dest x/y/z offset */ 4866480210b89dc8ae0990c450d27870c7b7930f251Brian Paul tex_xfer->stride, /* dest row stride (bytes) */ 4876480210b89dc8ae0990c450d27870c7b7930f251Brian Paul dstImageOffsets, /* image offsets (for 3D only) */ 4886480210b89dc8ae0990c450d27870c7b7930f251Brian Paul width, height, 1, /* size */ 4896480210b89dc8ae0990c450d27870c7b7930f251Brian Paul format, type, /* source format/type */ 4906480210b89dc8ae0990c450d27870c7b7930f251Brian Paul pixels, /* source data */ 4916480210b89dc8ae0990c450d27870c7b7930f251Brian Paul unpack); /* source data packing */ 49255ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz 493287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_transfer_unmap(pipe, tex_xfer); 494287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe->transfer_destroy(pipe, tex_xfer); 49555ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz 4968f55a95178069d5e8b18647e6b675fc403d68073Roland Scheidegger /* Create temporary sampler view */ 4978f55a95178069d5e8b18647e6b675fc403d68073Roland Scheidegger u_sampler_view_default_template(&view_templ, 4988f55a95178069d5e8b18647e6b675fc403d68073Roland Scheidegger src_tex, 4998f55a95178069d5e8b18647e6b675fc403d68073Roland Scheidegger src_tex->format); 5008f55a95178069d5e8b18647e6b675fc403d68073Roland Scheidegger src_view = pipe->create_sampler_view(pipe, src_tex, &view_templ); 5018f55a95178069d5e8b18647e6b675fc403d68073Roland Scheidegger 5028f55a95178069d5e8b18647e6b675fc403d68073Roland Scheidegger 50355ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz /* copy / compress image */ 50476c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul util_blit_pixels_tex(st->blit, 5058f55a95178069d5e8b18647e6b675fc403d68073Roland Scheidegger src_view, /* sampler view (src) */ 50655ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz 0, 0, /* src x0, y0 */ 50755ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz width, height, /* src x1, y1 */ 50855ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz dst_surface, /* pipe_surface (dst) */ 50955ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz xoffset, yoffset, /* dst x0, y0 */ 51055ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz xoffset + width, /* dst x1 */ 51155ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz yoffset + height, /* dst y1 */ 51255ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz 0.0, /* z */ 51355ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz PIPE_TEX_MIPFILTER_NEAREST); 51455ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz 51555ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz pipe_surface_reference(&dst_surface, NULL); 516287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(&src_tex, NULL); 5178f55a95178069d5e8b18647e6b675fc403d68073Roland Scheidegger pipe_sampler_view_reference(&src_view, NULL); 51855ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz 51955ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz return GL_TRUE; 52055ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz} 52155ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz 52255ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz 52355ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz/** 5244e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul * Do glTexImage1/2/3D(). 5254e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul */ 52624df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 527f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergst_TexImage(struct gl_context * ctx, 528afc54983370033b65e3a7cbb29bd9c87156f0881Brian GLint dims, 529afc54983370033b65e3a7cbb29bd9c87156f0881Brian GLenum target, GLint level, 530afc54983370033b65e3a7cbb29bd9c87156f0881Brian GLint internalFormat, 531afc54983370033b65e3a7cbb29bd9c87156f0881Brian GLint width, GLint height, GLint depth, 532afc54983370033b65e3a7cbb29bd9c87156f0881Brian GLint border, 533afc54983370033b65e3a7cbb29bd9c87156f0881Brian GLenum format, GLenum type, const void *pixels, 534afc54983370033b65e3a7cbb29bd9c87156f0881Brian const struct gl_pixelstore_attrib *unpack, 535afc54983370033b65e3a7cbb29bd9c87156f0881Brian struct gl_texture_object *texObj, 536afc54983370033b65e3a7cbb29bd9c87156f0881Brian struct gl_texture_image *texImage, 53755ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz GLsizei imageSize, GLboolean compressed_src) 53824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 53976c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul struct st_context *st = st_context(ctx); 54076c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul struct pipe_screen *screen = st->pipe->screen; 54114b98343309fdcff3514f05020303f7b40e83a4aBrian struct st_texture_object *stObj = st_texture_object(texObj); 54214b98343309fdcff3514f05020303f7b40e83a4aBrian struct st_texture_image *stImage = st_texture_image(texImage); 5435a8e1ddf193bb25c5cf05b70088c64ede772d7e9Brian Paul GLuint dstRowStride = 0; 544212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian struct gl_pixelstore_attrib unpackNB; 5455a8e1ddf193bb25c5cf05b70088c64ede772d7e9Brian Paul enum pipe_transfer_usage transfer_usage = 0; 54624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 54724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian DBG("%s target %s level %d %dx%dx%d border %d\n", __FUNCTION__, 54824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian _mesa_lookup_enum_by_nr(target), level, width, height, depth, border); 54924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 55054a7115fc27c640e2b3f1a362e8e07aac220556dChia-I Wu /* switch to "normal" */ 55154a7115fc27c640e2b3f1a362e8e07aac220556dChia-I Wu if (stObj->surface_based) { 55283e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul gl_format texFormat; 55383e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul 55454a7115fc27c640e2b3f1a362e8e07aac220556dChia-I Wu _mesa_clear_texture_object(ctx, texObj); 5550f74efdef05c5c27b3137163d795dc91f34cc114Chia-I Wu pipe_resource_reference(&stObj->pt, NULL); 5560f74efdef05c5c27b3137163d795dc91f34cc114Chia-I Wu 5570f74efdef05c5c27b3137163d795dc91f34cc114Chia-I Wu /* oops, need to init this image again */ 55883e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul texFormat = _mesa_choose_texture_format(ctx, texObj, target, level, 55983e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul internalFormat, format, type); 56083e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul 5610f74efdef05c5c27b3137163d795dc91f34cc114Chia-I Wu _mesa_init_teximage_fields(ctx, target, texImage, 56283e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul width, height, depth, border, 56383e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul internalFormat, texFormat); 5640f74efdef05c5c27b3137163d795dc91f34cc114Chia-I Wu 56554a7115fc27c640e2b3f1a362e8e07aac220556dChia-I Wu stObj->surface_based = GL_FALSE; 56654a7115fc27c640e2b3f1a362e8e07aac220556dChia-I Wu } 56754a7115fc27c640e2b3f1a362e8e07aac220556dChia-I Wu 568212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian /* gallium does not support texture borders, strip it off */ 569212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian if (border) { 5705facd7986ace899673499f396897469720476799Brian Paul strip_texture_border(border, &width, &height, &depth, unpack, &unpackNB); 571212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian unpack = &unpackNB; 57221989edd55409d72ee55187f4f9062496ca3fbf8Brian Paul texImage->Width = width; 57321989edd55409d72ee55187f4f9062496ca3fbf8Brian Paul texImage->Height = height; 57421989edd55409d72ee55187f4f9062496ca3fbf8Brian Paul texImage->Depth = depth; 57521989edd55409d72ee55187f4f9062496ca3fbf8Brian Paul texImage->Border = 0; 576212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian border = 0; 577212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian } 578c7d1d34c580e8c76bf2f3f8687223e648e7ec5f1Brian Paul else { 579c7d1d34c580e8c76bf2f3f8687223e648e7ec5f1Brian Paul assert(texImage->Width == width); 580c7d1d34c580e8c76bf2f3f8687223e648e7ec5f1Brian Paul assert(texImage->Height == height); 581c7d1d34c580e8c76bf2f3f8687223e648e7ec5f1Brian Paul assert(texImage->Depth == depth); 582c7d1d34c580e8c76bf2f3f8687223e648e7ec5f1Brian Paul } 583212b27d33f94eeb25ba9cbc58f9e41295a29d2c9Brian 584cfe9e66f2bc596c43760911e7c1604bb32cdee28Brian stImage->face = _mesa_tex_target_to_face(target); 58514b98343309fdcff3514f05020303f7b40e83a4aBrian stImage->level = level; 58624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 58724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian _mesa_set_fetch_functions(texImage, dims); 58824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 58924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian /* Release the reference to a potentially orphaned buffer. 59024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * Release any old malloced memory. 59124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 592753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer if (stImage->pt) { 593287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(&stImage->pt, NULL); 59424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian assert(!texImage->Data); 59524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 59624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian else if (texImage->Data) { 59724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian _mesa_align_free(texImage->Data); 59824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 59924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 600bdf975e9ad25ee65d796a3c1ce3f2afbd2889c4eBrian Paul /* 601bdf975e9ad25ee65d796a3c1ce3f2afbd2889c4eBrian Paul * See if the new image is somehow incompatible with the existing 602bdf975e9ad25ee65d796a3c1ce3f2afbd2889c4eBrian Paul * mipmap. If so, free the old mipmap. 60324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 604a0509f7d28765c6ef8546eafba94aec46d9e7ed3Brian Paul if (stObj->pt) { 605e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul if (level > (GLint) stObj->pt->last_level || 606bdf975e9ad25ee65d796a3c1ce3f2afbd2889c4eBrian Paul !st_texture_match_image(stObj->pt, &stImage->base, 607bdf975e9ad25ee65d796a3c1ce3f2afbd2889c4eBrian Paul stImage->face, stImage->level)) { 608a0509f7d28765c6ef8546eafba94aec46d9e7ed3Brian Paul DBG("release it\n"); 609287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(&stObj->pt, NULL); 610a0509f7d28765c6ef8546eafba94aec46d9e7ed3Brian Paul assert(!stObj->pt); 61140c3861e1e98116c573027b054a6a05208c53b6aMichal Krol pipe_sampler_view_reference(&stObj->sampler_view, NULL); 612a0509f7d28765c6ef8546eafba94aec46d9e7ed3Brian Paul } 61324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 61424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 615bdf975e9ad25ee65d796a3c1ce3f2afbd2889c4eBrian Paul if (width == 0 || height == 0 || depth == 0) { 616bdf975e9ad25ee65d796a3c1ce3f2afbd2889c4eBrian Paul /* stop after freeing old image */ 617bdf975e9ad25ee65d796a3c1ce3f2afbd2889c4eBrian Paul return; 618bdf975e9ad25ee65d796a3c1ce3f2afbd2889c4eBrian Paul } 619bdf975e9ad25ee65d796a3c1ce3f2afbd2889c4eBrian Paul 620753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer if (!stObj->pt) { 6212b53f4a9c674e9b02df8a06759e7a2340f257081Brian Paul if (!guess_and_alloc_texture(st, stObj, stImage)) { 6228d249ca620f6995cc5824d95c29bda7043bbdf8cBrian Paul /* Probably out of memory. 6238d249ca620f6995cc5824d95c29bda7043bbdf8cBrian Paul * Try flushing any pending rendering, then retry. 6248d249ca620f6995cc5824d95c29bda7043bbdf8cBrian Paul */ 62576c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul st_finish(st); 6262b53f4a9c674e9b02df8a06759e7a2340f257081Brian Paul if (!guess_and_alloc_texture(st, stObj, stImage)) { 6278d249ca620f6995cc5824d95c29bda7043bbdf8cBrian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage"); 6288d249ca620f6995cc5824d95c29bda7043bbdf8cBrian Paul return; 6298d249ca620f6995cc5824d95c29bda7043bbdf8cBrian Paul } 63024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 63124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 63224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 633753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer assert(!stImage->pt); 63424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 635013b332cbcad2b9d113e00c467a65d072eb61cecBrian Paul /* Check if this texture image can live inside the texture object's buffer. 636013b332cbcad2b9d113e00c467a65d072eb61cecBrian Paul * If so, store the image there. Otherwise the image will temporarily live 637013b332cbcad2b9d113e00c467a65d072eb61cecBrian Paul * in its own buffer. 638013b332cbcad2b9d113e00c467a65d072eb61cecBrian Paul */ 639753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer if (stObj->pt && 640753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer st_texture_match_image(stObj->pt, &stImage->base, 641013b332cbcad2b9d113e00c467a65d072eb61cecBrian Paul stImage->face, stImage->level)) { 64224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 643287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(&stImage->pt, stObj->pt); 644753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer assert(stImage->pt); 64524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 64624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 647753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer if (!stImage->pt) 648753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer DBG("XXX: Image did not fit into texture - storing in local memory!\n"); 64924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 650013b332cbcad2b9d113e00c467a65d072eb61cecBrian Paul /* Pixel data may come from regular user memory or a PBO. For the later, 651013b332cbcad2b9d113e00c467a65d072eb61cecBrian Paul * do bounds checking and map the PBO to read pixels data from it. 652013b332cbcad2b9d113e00c467a65d072eb61cecBrian Paul * 653013b332cbcad2b9d113e00c467a65d072eb61cecBrian Paul * XXX we should try to use a GPU-accelerated path to copy the image data 654013b332cbcad2b9d113e00c467a65d072eb61cecBrian Paul * from the PBO to the texture. 65524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 65655ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz if (compressed_src) { 65724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian pixels = _mesa_validate_pbo_compressed_teximage(ctx, imageSize, pixels, 65824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian unpack, 65924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian "glCompressedTexImage"); 6605facd7986ace899673499f396897469720476799Brian Paul } 6615facd7986ace899673499f396897469720476799Brian Paul else { 66224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian pixels = _mesa_validate_pbo_teximage(ctx, dims, width, height, 1, 66324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian format, type, 66424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian pixels, unpack, "glTexImage"); 66524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 666cfa1a0a609daefffc6f8c4087ed0bc34c2665ef4Brian Paul 66755ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz /* See if we can do texture compression with a blit/render. 66855ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz */ 66955ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz if (!compressed_src && 67055ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz !ctx->Mesa_DXTn && 67192863109af05acdb4ee5e42141c83ab0f18b7f88Brian Paul _mesa_is_format_compressed(texImage->TexFormat) && 67255ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz screen->is_format_supported(screen, 67355ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz stImage->pt->format, 674127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger stImage->pt->target, 0, 675287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell PIPE_BIND_RENDER_TARGET, 0)) { 676cfa1a0a609daefffc6f8c4087ed0bc34c2665ef4Brian Paul if (!pixels) 677cfa1a0a609daefffc6f8c4087ed0bc34c2665ef4Brian Paul goto done; 678cfa1a0a609daefffc6f8c4087ed0bc34c2665ef4Brian Paul 67955ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz if (compress_with_blit(ctx, target, level, 0, 0, 0, width, height, depth, 68055ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz format, type, pixels, unpack, texImage)) { 681f989390af6f827d1ea36560381340148811836f3Jakob Bornecrantz goto done; 68255ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz } 68355ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz } 68455ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz 685013b332cbcad2b9d113e00c467a65d072eb61cecBrian Paul /* 686013b332cbcad2b9d113e00c467a65d072eb61cecBrian Paul * Prepare to store the texture data. Either map the gallium texture buffer 687013b332cbcad2b9d113e00c467a65d072eb61cecBrian Paul * memory or malloc space for it. 688013b332cbcad2b9d113e00c467a65d072eb61cecBrian Paul */ 689753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer if (stImage->pt) { 69041b8a2e9391cd85a65ba30a7e5f5068b5767d58aBrian Paul /* Store the image in the gallium texture memory buffer */ 69171633abafc935c25da9731bab48c228ceb9b4097Michel Dänzer if (format == GL_DEPTH_COMPONENT && 6920bed834be4a174d20b31a6cbcf066774bf749929Michal Krol util_format_is_depth_and_stencil(stImage->pt->format)) 69371633abafc935c25da9731bab48c228ceb9b4097Michel Dänzer transfer_usage = PIPE_TRANSFER_READ_WRITE; 69471633abafc935c25da9731bab48c228ceb9b4097Michel Dänzer else 69571633abafc935c25da9731bab48c228ceb9b4097Michel Dänzer transfer_usage = PIPE_TRANSFER_WRITE; 69671633abafc935c25da9731bab48c228ceb9b4097Michel Dänzer 69776c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul texImage->Data = st_texture_image_map(st, stImage, 0, 698c7d1d34c580e8c76bf2f3f8687223e648e7ec5f1Brian Paul transfer_usage, 0, 0, width, height); 69901397a66c77f8ebfe78b90ace59c095194a290cfJosé Fonseca if(stImage->transfer) 70001397a66c77f8ebfe78b90ace59c095194a290cfJosé Fonseca dstRowStride = stImage->transfer->stride; 70124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 70224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian else { 70324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian /* Allocate regular memory and store the image there temporarily. */ 704c7d1d34c580e8c76bf2f3f8687223e648e7ec5f1Brian Paul GLuint imageSize = _mesa_format_image_size(texImage->TexFormat, 705c7d1d34c580e8c76bf2f3f8687223e648e7ec5f1Brian Paul width, height, depth); 706c7d1d34c580e8c76bf2f3f8687223e648e7ec5f1Brian Paul dstRowStride = _mesa_format_row_stride(texImage->TexFormat, width); 70724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 708c7d1d34c580e8c76bf2f3f8687223e648e7ec5f1Brian Paul texImage->Data = _mesa_align_malloc(imageSize, 16); 70924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 71024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 7112a39dbe7364af5444b1eb43650dfc31ed09257dcBrian Paul if (!texImage->Data) { 7122a39dbe7364af5444b1eb43650dfc31ed09257dcBrian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage"); 7132a39dbe7364af5444b1eb43650dfc31ed09257dcBrian Paul return; 7142a39dbe7364af5444b1eb43650dfc31ed09257dcBrian Paul } 7152a39dbe7364af5444b1eb43650dfc31ed09257dcBrian Paul 716013b332cbcad2b9d113e00c467a65d072eb61cecBrian Paul if (!pixels) { 717013b332cbcad2b9d113e00c467a65d072eb61cecBrian Paul /* We've allocated texture memory, but have no pixel data - all done. */ 718cfa1a0a609daefffc6f8c4087ed0bc34c2665ef4Brian Paul goto done; 719013b332cbcad2b9d113e00c467a65d072eb61cecBrian Paul } 720cfa1a0a609daefffc6f8c4087ed0bc34c2665ef4Brian Paul 72124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian DBG("Upload image %dx%dx%d row_len %x pitch %x\n", 72241b8a2e9391cd85a65ba30a7e5f5068b5767d58aBrian Paul width, height, depth, width, dstRowStride); 72324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 724013b332cbcad2b9d113e00c467a65d072eb61cecBrian Paul /* Copy user texture image into the texture buffer. 72524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 72655ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz if (compressed_src) { 727e79086865bd67f860dfd0d5951395495530022bcBrian Paul const GLuint srcRowStride = 728e79086865bd67f860dfd0d5951395495530022bcBrian Paul _mesa_format_row_stride(texImage->TexFormat, width); 729e79086865bd67f860dfd0d5951395495530022bcBrian Paul if (dstRowStride == srcRowStride) { 730eea6a7639f767b1d30b6ef1f91a9c49e3f3b78f0Luca Barbieri memcpy(texImage->Data, pixels, imageSize); 731e79086865bd67f860dfd0d5951395495530022bcBrian Paul } 732e79086865bd67f860dfd0d5951395495530022bcBrian Paul else { 733eea6a7639f767b1d30b6ef1f91a9c49e3f3b78f0Luca Barbieri char *dst = texImage->Data; 734eea6a7639f767b1d30b6ef1f91a9c49e3f3b78f0Luca Barbieri const char *src = pixels; 7359328f3a670993167d7fb9a590f9e712467e77c7cLuca Barbieri GLuint i, bw, bh, lines; 7369328f3a670993167d7fb9a590f9e712467e77c7cLuca Barbieri _mesa_get_format_block_size(texImage->TexFormat, &bw, &bh); 7379328f3a670993167d7fb9a590f9e712467e77c7cLuca Barbieri lines = (height + bh - 1) / bh; 738eea6a7639f767b1d30b6ef1f91a9c49e3f3b78f0Luca Barbieri 739e79086865bd67f860dfd0d5951395495530022bcBrian Paul for (i = 0; i < lines; ++i) { 740e79086865bd67f860dfd0d5951395495530022bcBrian Paul memcpy(dst, src, srcRowStride); 741eea6a7639f767b1d30b6ef1f91a9c49e3f3b78f0Luca Barbieri dst += dstRowStride; 742e79086865bd67f860dfd0d5951395495530022bcBrian Paul src += srcRowStride; 743eea6a7639f767b1d30b6ef1f91a9c49e3f3b78f0Luca Barbieri } 744eea6a7639f767b1d30b6ef1f91a9c49e3f3b78f0Luca Barbieri } 74524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 746753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer else { 747eaca19edbbe7876079aa33d7f75d93601677081bBrian Paul const GLuint srcImageStride = 748eaca19edbbe7876079aa33d7f75d93601677081bBrian Paul _mesa_image_image_stride(unpack, width, height, format, type); 7495facd7986ace899673499f396897469720476799Brian Paul GLint i; 7505823f99d0fbc054b87aeb1bc15d413d3eadd27a8Brian const GLubyte *src = (const GLubyte *) pixels; 751753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer 752d11d903c1b81000d04f859dcc2da41dae024f146Brian Paul for (i = 0; i < depth; i++) { 7536480210b89dc8ae0990c450d27870c7b7930f251Brian Paul if (!_mesa_texstore(ctx, dims, 7546480210b89dc8ae0990c450d27870c7b7930f251Brian Paul texImage->_BaseFormat, 7556480210b89dc8ae0990c450d27870c7b7930f251Brian Paul texImage->TexFormat, 7566480210b89dc8ae0990c450d27870c7b7930f251Brian Paul texImage->Data, 7576480210b89dc8ae0990c450d27870c7b7930f251Brian Paul 0, 0, 0, /* dstX/Y/Zoffset */ 7586480210b89dc8ae0990c450d27870c7b7930f251Brian Paul dstRowStride, 7596480210b89dc8ae0990c450d27870c7b7930f251Brian Paul texImage->ImageOffsets, 7606480210b89dc8ae0990c450d27870c7b7930f251Brian Paul width, height, 1, 7616480210b89dc8ae0990c450d27870c7b7930f251Brian Paul format, type, src, unpack)) { 762753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage"); 763753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer } 764753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer 765d11d903c1b81000d04f859dcc2da41dae024f146Brian Paul if (stImage->pt && i + 1 < depth) { 766d11d903c1b81000d04f859dcc2da41dae024f146Brian Paul /* unmap this slice */ 76776c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul st_texture_image_unmap(st, stImage); 768d11d903c1b81000d04f859dcc2da41dae024f146Brian Paul /* map next slice of 3D texture */ 76976c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul texImage->Data = st_texture_image_map(st, stImage, i + 1, 77071633abafc935c25da9731bab48c228ceb9b4097Michel Dänzer transfer_usage, 0, 0, 771c7d1d34c580e8c76bf2f3f8687223e648e7ec5f1Brian Paul width, height); 7725823f99d0fbc054b87aeb1bc15d413d3eadd27a8Brian src += srcImageStride; 773753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer } 774753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer } 77524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 77624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 77708d39251a79a964e4a3ac0d7d8a397c2b66a0808Brian Pauldone: 77824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian _mesa_unmap_teximage_pbo(ctx, unpack); 77924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 78055ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz if (stImage->pt && texImage->Data) { 78176c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul st_texture_image_unmap(st, stImage); 78224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian texImage->Data = NULL; 78324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 78424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 78524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 78624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 78724df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 788f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergst_TexImage3D(struct gl_context * ctx, 7894e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul GLenum target, GLint level, 7904e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul GLint internalFormat, 7914e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul GLint width, GLint height, GLint depth, 7924e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul GLint border, 7934e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul GLenum format, GLenum type, const void *pixels, 7944e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul const struct gl_pixelstore_attrib *unpack, 7954e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul struct gl_texture_object *texObj, 7964e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul struct gl_texture_image *texImage) 79724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 7985facd7986ace899673499f396897469720476799Brian Paul st_TexImage(ctx, 3, target, level, internalFormat, width, height, depth, 7995facd7986ace899673499f396897469720476799Brian Paul border, format, type, pixels, unpack, texObj, texImage, 8005facd7986ace899673499f396897469720476799Brian Paul 0, GL_FALSE); 80124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 80224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 80324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 80424df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 805f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergst_TexImage2D(struct gl_context * ctx, 8064e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul GLenum target, GLint level, 8074e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul GLint internalFormat, 8084e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul GLint width, GLint height, GLint border, 8094e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul GLenum format, GLenum type, const void *pixels, 8104e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul const struct gl_pixelstore_attrib *unpack, 8114e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul struct gl_texture_object *texObj, 8124e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul struct gl_texture_image *texImage) 81324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 8145facd7986ace899673499f396897469720476799Brian Paul st_TexImage(ctx, 2, target, level, internalFormat, width, height, 1, border, 8155facd7986ace899673499f396897469720476799Brian Paul format, type, pixels, unpack, texObj, texImage, 0, GL_FALSE); 81624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 81724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 81824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 81924df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 820f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergst_TexImage1D(struct gl_context * ctx, 8214e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul GLenum target, GLint level, 8224e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul GLint internalFormat, 8234e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul GLint width, GLint border, 8244e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul GLenum format, GLenum type, const void *pixels, 8254e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul const struct gl_pixelstore_attrib *unpack, 8264e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul struct gl_texture_object *texObj, 8274e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul struct gl_texture_image *texImage) 82824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 8295facd7986ace899673499f396897469720476799Brian Paul st_TexImage(ctx, 1, target, level, internalFormat, width, 1, 1, border, 8305facd7986ace899673499f396897469720476799Brian Paul format, type, pixels, unpack, texObj, texImage, 0, GL_FALSE); 83124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 83224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 83324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 83424df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 835f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergst_CompressedTexImage2D(struct gl_context *ctx, GLenum target, GLint level, 8364e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul GLint internalFormat, 8374e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul GLint width, GLint height, GLint border, 8384e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul GLsizei imageSize, const GLvoid *data, 8394e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul struct gl_texture_object *texObj, 8404e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul struct gl_texture_image *texImage) 84124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 8425facd7986ace899673499f396897469720476799Brian Paul st_TexImage(ctx, 2, target, level, internalFormat, width, height, 1, border, 8435facd7986ace899673499f396897469720476799Brian Paul 0, 0, data, &ctx->Unpack, texObj, texImage, imageSize, GL_TRUE); 84424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 84524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 84624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 84751b339af2e8b80575a24bb9146f031c9605180bbBrian Paul 84851b339af2e8b80575a24bb9146f031c9605180bbBrian Paul/** 84951b339af2e8b80575a24bb9146f031c9605180bbBrian Paul * glGetTexImage() helper: decompress a compressed texture by rendering 85051b339af2e8b80575a24bb9146f031c9605180bbBrian Paul * a textured quad. Store the results in the user's buffer. 85151b339af2e8b80575a24bb9146f031c9605180bbBrian Paul */ 85251b339af2e8b80575a24bb9146f031c9605180bbBrian Paulstatic void 853f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergdecompress_with_blit(struct gl_context * ctx, GLenum target, GLint level, 85451b339af2e8b80575a24bb9146f031c9605180bbBrian Paul GLenum format, GLenum type, GLvoid *pixels, 85551b339af2e8b80575a24bb9146f031c9605180bbBrian Paul struct gl_texture_object *texObj, 85651b339af2e8b80575a24bb9146f031c9605180bbBrian Paul struct gl_texture_image *texImage) 85751b339af2e8b80575a24bb9146f031c9605180bbBrian Paul{ 85876c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul struct st_context *st = st_context(ctx); 85976c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul struct pipe_context *pipe = st->pipe; 860b43c182f19c6291c88420fa12714f952c2b461fbKeith Whitwell struct pipe_screen *screen = pipe->screen; 86151b339af2e8b80575a24bb9146f031c9605180bbBrian Paul struct st_texture_image *stImage = st_texture_image(texImage); 8628f55a95178069d5e8b18647e6b675fc403d68073Roland Scheidegger struct st_texture_object *stObj = st_texture_object(texObj); 8635d3d63d45a037fdf603ddcff88da635c3ce8075eBrian Paul struct pipe_sampler_view *src_view = 8645d3d63d45a037fdf603ddcff88da635c3ce8075eBrian Paul st_get_texture_sampler_view(stObj, pipe); 86551b339af2e8b80575a24bb9146f031c9605180bbBrian Paul const GLuint width = texImage->Width; 86651b339af2e8b80575a24bb9146f031c9605180bbBrian Paul const GLuint height = texImage->Height; 86751b339af2e8b80575a24bb9146f031c9605180bbBrian Paul struct pipe_surface *dst_surface; 868287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct pipe_resource *dst_texture; 86951b339af2e8b80575a24bb9146f031c9605180bbBrian Paul struct pipe_transfer *tex_xfer; 870127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger unsigned bind = (PIPE_BIND_RENDER_TARGET | /* util_blit may choose to render */ 871287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell PIPE_BIND_TRANSFER_READ); 87251b339af2e8b80575a24bb9146f031c9605180bbBrian Paul 87351b339af2e8b80575a24bb9146f031c9605180bbBrian Paul /* create temp / dest surface */ 874287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell if (!util_create_rgba_surface(screen, width, height, bind, 87551b339af2e8b80575a24bb9146f031c9605180bbBrian Paul &dst_texture, &dst_surface)) { 87651b339af2e8b80575a24bb9146f031c9605180bbBrian Paul _mesa_problem(ctx, "util_create_rgba_surface() failed " 87751b339af2e8b80575a24bb9146f031c9605180bbBrian Paul "in decompress_with_blit()"); 87851b339af2e8b80575a24bb9146f031c9605180bbBrian Paul return; 87951b339af2e8b80575a24bb9146f031c9605180bbBrian Paul } 88051b339af2e8b80575a24bb9146f031c9605180bbBrian Paul 88151b339af2e8b80575a24bb9146f031c9605180bbBrian Paul /* blit/render/decompress */ 88276c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul util_blit_pixels_tex(st->blit, 883287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell src_view, /* pipe_resource (src) */ 88451b339af2e8b80575a24bb9146f031c9605180bbBrian Paul 0, 0, /* src x0, y0 */ 88551b339af2e8b80575a24bb9146f031c9605180bbBrian Paul width, height, /* src x1, y1 */ 88651b339af2e8b80575a24bb9146f031c9605180bbBrian Paul dst_surface, /* pipe_surface (dst) */ 88751b339af2e8b80575a24bb9146f031c9605180bbBrian Paul 0, 0, /* dst x0, y0 */ 88851b339af2e8b80575a24bb9146f031c9605180bbBrian Paul width, height, /* dst x1, y1 */ 88951b339af2e8b80575a24bb9146f031c9605180bbBrian Paul 0.0, /* z */ 89051b339af2e8b80575a24bb9146f031c9605180bbBrian Paul PIPE_TEX_MIPFILTER_NEAREST); 89151b339af2e8b80575a24bb9146f031c9605180bbBrian Paul 89251b339af2e8b80575a24bb9146f031c9605180bbBrian Paul /* map the dst_surface so we can read from it */ 893b0427bedde80e3189524651a327235bdfddbc613José Fonseca tex_xfer = pipe_get_transfer(st_context(ctx)->pipe, 894e50dd26ca6d0eb0d0f97c2780020ea16e3d4a687Thomas Hellstrom dst_texture, 0, 0, 0, 895e50dd26ca6d0eb0d0f97c2780020ea16e3d4a687Thomas Hellstrom PIPE_TRANSFER_READ, 896e50dd26ca6d0eb0d0f97c2780020ea16e3d4a687Thomas Hellstrom 0, 0, width, height); 89751b339af2e8b80575a24bb9146f031c9605180bbBrian Paul 8981b448c7a5cafa68eeead2a4c45f4362a9883383bBrian Paul pixels = _mesa_map_pbo_dest(ctx, &ctx->Pack, pixels); 89951b339af2e8b80575a24bb9146f031c9605180bbBrian Paul 9007b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul /* copy/pack data into user buffer */ 9017b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul if (st_equal_formats(stImage->pt->format, format, type)) { 9027b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul /* memcpy */ 903b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol const uint bytesPerRow = width * util_format_get_blocksize(stImage->pt->format); 904287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell ubyte *map = pipe_transfer_map(pipe, tex_xfer); 9057b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul GLuint row; 9067b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul for (row = 0; row < height; row++) { 9077b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul GLvoid *dest = _mesa_image_address2d(&ctx->Pack, pixels, width, 9087b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul height, format, type, row, 0); 9097b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul memcpy(dest, map, bytesPerRow); 9107b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul map += tex_xfer->stride; 9117b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul } 912287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_transfer_unmap(pipe, tex_xfer); 91351b339af2e8b80575a24bb9146f031c9605180bbBrian Paul } 9147b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul else { 9157b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul /* format translation via floats */ 9167b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul GLuint row; 9177b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul for (row = 0; row < height; row++) { 9187b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul const GLbitfield transferOps = 0x0; /* bypassed for glGetTexImage() */ 9197b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul GLfloat rgba[4 * MAX_WIDTH]; 9207b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul GLvoid *dest = _mesa_image_address2d(&ctx->Pack, pixels, width, 9217b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul height, format, type, row, 0); 9227b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul 923b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell if (ST_DEBUG & DEBUG_FALLBACK) 924b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell debug_printf("%s: fallback format translation\n", __FUNCTION__); 925b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell 9267b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul /* get float[4] rgba row from surface */ 927d35ecca5ee231c072687578642e0c22c6c0590b1Keith Whitwell pipe_get_tile_rgba(pipe, tex_xfer, 0, row, width, 1, rgba); 9287b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul 9297b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul _mesa_pack_rgba_span_float(ctx, width, (GLfloat (*)[4]) rgba, format, 9307b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul type, dest, &ctx->Pack, transferOps); 9317b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul } 9327b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul } 9337b24e58a0ca571d6230ef5076ea352253b81fe6eBrian Paul 9341b448c7a5cafa68eeead2a4c45f4362a9883383bBrian Paul _mesa_unmap_pbo_dest(ctx, &ctx->Pack); 93551b339af2e8b80575a24bb9146f031c9605180bbBrian Paul 936287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe->transfer_destroy(pipe, tex_xfer); 93763af29bfbe265318bcf5be69e420de361b900321Keith Whitwell 93851b339af2e8b80575a24bb9146f031c9605180bbBrian Paul /* destroy the temp / dest surface */ 93951b339af2e8b80575a24bb9146f031c9605180bbBrian Paul util_destroy_rgba_surface(dst_texture, dst_surface); 94051b339af2e8b80575a24bb9146f031c9605180bbBrian Paul} 94151b339af2e8b80575a24bb9146f031c9605180bbBrian Paul 94251b339af2e8b80575a24bb9146f031c9605180bbBrian Paul 94351b339af2e8b80575a24bb9146f031c9605180bbBrian Paul 94424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian/** 94524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * Need to map texture image into memory before copying image data, 94624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * then unmap it. 94724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 94824df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 949f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergst_get_tex_image(struct gl_context * ctx, GLenum target, GLint level, 95024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLenum format, GLenum type, GLvoid * pixels, 95124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct gl_texture_object *texObj, 95251b339af2e8b80575a24bb9146f031c9605180bbBrian Paul struct gl_texture_image *texImage, GLboolean compressed_dst) 95324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 95476c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul struct st_context *st = st_context(ctx); 95524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct st_texture_image *stImage = st_texture_image(texImage); 956eaca19edbbe7876079aa33d7f75d93601677081bBrian Paul const GLuint dstImageStride = 957eaca19edbbe7876079aa33d7f75d93601677081bBrian Paul _mesa_image_image_stride(&ctx->Pack, texImage->Width, texImage->Height, 958eaca19edbbe7876079aa33d7f75d93601677081bBrian Paul format, type); 9595facd7986ace899673499f396897469720476799Brian Paul GLuint depth, i; 9605823f99d0fbc054b87aeb1bc15d413d3eadd27a8Brian GLubyte *dest; 96124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 96251b339af2e8b80575a24bb9146f031c9605180bbBrian Paul if (stImage->pt && 963cfbbe244d7438a60d389ae9d996dd430f79f362fJosé Fonseca util_format_is_s3tc(stImage->pt->format) && 96451b339af2e8b80575a24bb9146f031c9605180bbBrian Paul !compressed_dst) { 96551b339af2e8b80575a24bb9146f031c9605180bbBrian Paul /* Need to decompress the texture. 96651b339af2e8b80575a24bb9146f031c9605180bbBrian Paul * We'll do this by rendering a textured quad. 96751b339af2e8b80575a24bb9146f031c9605180bbBrian Paul * Note that we only expect RGBA formats (no Z/depth formats). 96851b339af2e8b80575a24bb9146f031c9605180bbBrian Paul */ 96951b339af2e8b80575a24bb9146f031c9605180bbBrian Paul decompress_with_blit(ctx, target, level, format, type, pixels, 97051b339af2e8b80575a24bb9146f031c9605180bbBrian Paul texObj, texImage); 97151b339af2e8b80575a24bb9146f031c9605180bbBrian Paul return; 97251b339af2e8b80575a24bb9146f031c9605180bbBrian Paul } 97351b339af2e8b80575a24bb9146f031c9605180bbBrian Paul 97424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian /* Map */ 975753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer if (stImage->pt) { 97624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian /* Image is stored in hardware format in a buffer managed by the 97724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * kernel. Need to explicitly map and unmap it. 97824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 97976c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul texImage->Data = st_texture_image_map(st, stImage, 0, 9804617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzer PIPE_TRANSFER_READ, 0, 0, 9814617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzer stImage->base.Width, 9824617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzer stImage->base.Height); 9837b640f9f708306b3e8c661771f29bf24bf8687fbBrian Paul /* compute stride in texels from stride in bytes */ 9847b640f9f708306b3e8c661771f29bf24bf8687fbBrian Paul texImage->RowStride = stImage->transfer->stride 9857b640f9f708306b3e8c661771f29bf24bf8687fbBrian Paul * util_format_get_blockwidth(stImage->pt->format) 9867b640f9f708306b3e8c661771f29bf24bf8687fbBrian Paul / util_format_get_blocksize(stImage->pt->format); 98724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 98824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian else { 98924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian /* Otherwise, the image should actually be stored in 990753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer * texImage->Data. This is pretty confusing for 99124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * everybody, I'd much prefer to separate the two functions of 99224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * texImage->Data - storage for texture images in main memory 99324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * and access (ie mappings) of images. In other words, we'd 99424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * create a new texImage->Map field and leave Data simply for 99524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * storage. 99624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 997753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer assert(texImage->Data); 99824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 99924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1000753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer depth = texImage->Depth; 1001753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer texImage->Depth = 1; 100224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 10035823f99d0fbc054b87aeb1bc15d413d3eadd27a8Brian dest = (GLubyte *) pixels; 10045823f99d0fbc054b87aeb1bc15d413d3eadd27a8Brian 1005603bef557220d68dbb165e775c7c9b0d6db7709eLuca Barbieri _mesa_set_fetch_functions(texImage, get_texture_dims(target)); 1006603bef557220d68dbb165e775c7c9b0d6db7709eLuca Barbieri 1007d11d903c1b81000d04f859dcc2da41dae024f146Brian Paul for (i = 0; i < depth; i++) { 100851b339af2e8b80575a24bb9146f031c9605180bbBrian Paul if (compressed_dst) { 10095823f99d0fbc054b87aeb1bc15d413d3eadd27a8Brian _mesa_get_compressed_teximage(ctx, target, level, dest, 1010753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer texObj, texImage); 10115facd7986ace899673499f396897469720476799Brian Paul } 10125facd7986ace899673499f396897469720476799Brian Paul else { 10135823f99d0fbc054b87aeb1bc15d413d3eadd27a8Brian _mesa_get_teximage(ctx, target, level, format, type, dest, 1014753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer texObj, texImage); 1015753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer } 1016753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer 1017d11d903c1b81000d04f859dcc2da41dae024f146Brian Paul if (stImage->pt && i + 1 < depth) { 1018d11d903c1b81000d04f859dcc2da41dae024f146Brian Paul /* unmap this slice */ 101976c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul st_texture_image_unmap(st, stImage); 1020d11d903c1b81000d04f859dcc2da41dae024f146Brian Paul /* map next slice of 3D texture */ 102176c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul texImage->Data = st_texture_image_map(st, stImage, i + 1, 10224617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzer PIPE_TRANSFER_READ, 0, 0, 10234617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzer stImage->base.Width, 10244617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzer stImage->base.Height); 10255823f99d0fbc054b87aeb1bc15d413d3eadd27a8Brian dest += dstImageStride; 1026753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer } 102724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 1028753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer 1029753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer texImage->Depth = depth; 103024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 103124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian /* Unmap */ 1032753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer if (stImage->pt) { 103376c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul st_texture_image_unmap(st, stImage); 1034753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer texImage->Data = NULL; 103524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 103624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 103724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 103824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 103924df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 1040f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergst_GetTexImage(struct gl_context * ctx, GLenum target, GLint level, 10414e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul GLenum format, GLenum type, GLvoid * pixels, 10424e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul struct gl_texture_object *texObj, 10434e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul struct gl_texture_image *texImage) 104424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 10455facd7986ace899673499f396897469720476799Brian Paul st_get_tex_image(ctx, target, level, format, type, pixels, texObj, texImage, 10465facd7986ace899673499f396897469720476799Brian Paul GL_FALSE); 104724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 104824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 104924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 105024df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 1051f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergst_GetCompressedTexImage(struct gl_context *ctx, GLenum target, GLint level, 10524e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul GLvoid *pixels, 105347bf26845712bea756526fc159bdb355ceaef9c2Brian Paul struct gl_texture_object *texObj, 105447bf26845712bea756526fc159bdb355ceaef9c2Brian Paul struct gl_texture_image *texImage) 105524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 10565facd7986ace899673499f396897469720476799Brian Paul st_get_tex_image(ctx, target, level, 0, 0, pixels, texObj, texImage, 10575facd7986ace899673499f396897469720476799Brian Paul GL_TRUE); 105824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 105924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 106024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 106124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 106224df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 1063f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergst_TexSubimage(struct gl_context *ctx, GLint dims, GLenum target, GLint level, 10644e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul GLint xoffset, GLint yoffset, GLint zoffset, 10654e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul GLint width, GLint height, GLint depth, 10664e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul GLenum format, GLenum type, const void *pixels, 10674e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul const struct gl_pixelstore_attrib *packing, 10684e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul struct gl_texture_object *texObj, 10694e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul struct gl_texture_image *texImage) 107024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 107176c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul struct st_context *st = st_context(ctx); 107276c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul struct pipe_screen *screen = st->pipe->screen; 107324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct st_texture_image *stImage = st_texture_image(texImage); 107424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLuint dstRowStride; 1075eaca19edbbe7876079aa33d7f75d93601677081bBrian Paul const GLuint srcImageStride = 1076eaca19edbbe7876079aa33d7f75d93601677081bBrian Paul _mesa_image_image_stride(packing, width, height, format, type); 10775facd7986ace899673499f396897469720476799Brian Paul GLint i; 10785823f99d0fbc054b87aeb1bc15d413d3eadd27a8Brian const GLubyte *src; 1079a7427b0f7b2325b8dcc560d57cb894df25ebef93Brian Paul /* init to silence warning only: */ 1080a7427b0f7b2325b8dcc560d57cb894df25ebef93Brian Paul enum pipe_transfer_usage transfer_usage = PIPE_TRANSFER_WRITE; 108124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 108224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian DBG("%s target %s level %d offset %d,%d %dx%d\n", __FUNCTION__, 108324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian _mesa_lookup_enum_by_nr(target), 108424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian level, xoffset, yoffset, width, height); 108524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 108624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian pixels = 108724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian _mesa_validate_pbo_teximage(ctx, dims, width, height, depth, format, 108824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian type, pixels, packing, "glTexSubImage2D"); 108924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian if (!pixels) 109024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian return; 109124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 109255ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz /* See if we can do texture compression with a blit/render. 109355ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz */ 109455ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz if (!ctx->Mesa_DXTn && 109592863109af05acdb4ee5e42141c83ab0f18b7f88Brian Paul _mesa_is_format_compressed(texImage->TexFormat) && 109655ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz screen->is_format_supported(screen, 109755ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz stImage->pt->format, 1098127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger stImage->pt->target, 0, 1099287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell PIPE_BIND_RENDER_TARGET, 0)) { 110055ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz if (compress_with_blit(ctx, target, level, 110155ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz xoffset, yoffset, zoffset, 110255ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz width, height, depth, 110355ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz format, type, pixels, packing, texImage)) { 1104f989390af6f827d1ea36560381340148811836f3Jakob Bornecrantz goto done; 110555ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz } 110655ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz } 110755ed2a73653fb2fb9dee36c729c09177df2d5b4eJakob Bornecrantz 110824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian /* Map buffer if necessary. Need to lock to prevent other contexts 110924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * from uploading the buffer under us. 111024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 1111753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer if (stImage->pt) { 111271633abafc935c25da9731bab48c228ceb9b4097Michel Dänzer if (format == GL_DEPTH_COMPONENT && 11130bed834be4a174d20b31a6cbcf066774bf749929Michal Krol util_format_is_depth_and_stencil(stImage->pt->format)) 111471633abafc935c25da9731bab48c228ceb9b4097Michel Dänzer transfer_usage = PIPE_TRANSFER_READ_WRITE; 111571633abafc935c25da9731bab48c228ceb9b4097Michel Dänzer else 111671633abafc935c25da9731bab48c228ceb9b4097Michel Dänzer transfer_usage = PIPE_TRANSFER_WRITE; 111771633abafc935c25da9731bab48c228ceb9b4097Michel Dänzer 111876c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul texImage->Data = st_texture_image_map(st, stImage, zoffset, 111971633abafc935c25da9731bab48c228ceb9b4097Michel Dänzer transfer_usage, 11204617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzer xoffset, yoffset, 11219e84e7def152aa8080da59a78795d6434e687403Jakob Bornecrantz width, height); 1122753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer } 1123753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer 11249b44f5a7550d8ede2eda763770e927df4c15cc8eBrian Paul if (!texImage->Data) { 11259b44f5a7550d8ede2eda763770e927df4c15cc8eBrian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexSubImage"); 112608d39251a79a964e4a3ac0d7d8a397c2b66a0808Brian Paul goto done; 11279b44f5a7550d8ede2eda763770e927df4c15cc8eBrian Paul } 11289b44f5a7550d8ede2eda763770e927df4c15cc8eBrian Paul 11295823f99d0fbc054b87aeb1bc15d413d3eadd27a8Brian src = (const GLubyte *) pixels; 1130d7b7b63bd7cca80e99ad9701f8b56ee365053647Michal Krol dstRowStride = stImage->transfer->stride; 11315823f99d0fbc054b87aeb1bc15d413d3eadd27a8Brian 1132d11d903c1b81000d04f859dcc2da41dae024f146Brian Paul for (i = 0; i < depth; i++) { 11336480210b89dc8ae0990c450d27870c7b7930f251Brian Paul if (!_mesa_texstore(ctx, dims, texImage->_BaseFormat, 11346480210b89dc8ae0990c450d27870c7b7930f251Brian Paul texImage->TexFormat, 11356480210b89dc8ae0990c450d27870c7b7930f251Brian Paul texImage->Data, 11366480210b89dc8ae0990c450d27870c7b7930f251Brian Paul 0, 0, 0, 11376480210b89dc8ae0990c450d27870c7b7930f251Brian Paul dstRowStride, 11386480210b89dc8ae0990c450d27870c7b7930f251Brian Paul texImage->ImageOffsets, 11396480210b89dc8ae0990c450d27870c7b7930f251Brian Paul width, height, 1, 11406480210b89dc8ae0990c450d27870c7b7930f251Brian Paul format, type, src, packing)) { 11419b44f5a7550d8ede2eda763770e927df4c15cc8eBrian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexSubImage"); 1142753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer } 1143753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer 1144d11d903c1b81000d04f859dcc2da41dae024f146Brian Paul if (stImage->pt && i + 1 < depth) { 1145d11d903c1b81000d04f859dcc2da41dae024f146Brian Paul /* unmap this slice */ 114676c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul st_texture_image_unmap(st, stImage); 1147d11d903c1b81000d04f859dcc2da41dae024f146Brian Paul /* map next slice of 3D texture */ 114876c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul texImage->Data = st_texture_image_map(st, stImage, 1149d11d903c1b81000d04f859dcc2da41dae024f146Brian Paul zoffset + i + 1, 115071633abafc935c25da9731bab48c228ceb9b4097Michel Dänzer transfer_usage, 11514617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzer xoffset, yoffset, 11529e84e7def152aa8080da59a78795d6434e687403Jakob Bornecrantz width, height); 11535823f99d0fbc054b87aeb1bc15d413d3eadd27a8Brian src += srcImageStride; 1154753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer } 115524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 115624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 115708d39251a79a964e4a3ac0d7d8a397c2b66a0808Brian Pauldone: 115824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian _mesa_unmap_teximage_pbo(ctx, packing); 115924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 11601e414df894fc70b7024eb38c812e582336014974Michel Dänzer if (stImage->pt && texImage->Data) { 116176c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul st_texture_image_unmap(st, stImage); 116224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian texImage->Data = NULL; 116324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 116424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 116524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 116624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 116724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 116824df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 1169f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergst_TexSubImage3D(struct gl_context *ctx, GLenum target, GLint level, 11705facd7986ace899673499f396897469720476799Brian Paul GLint xoffset, GLint yoffset, GLint zoffset, 11715facd7986ace899673499f396897469720476799Brian Paul GLsizei width, GLsizei height, GLsizei depth, 11725facd7986ace899673499f396897469720476799Brian Paul GLenum format, GLenum type, const GLvoid *pixels, 11735facd7986ace899673499f396897469720476799Brian Paul const struct gl_pixelstore_attrib *packing, 11745facd7986ace899673499f396897469720476799Brian Paul struct gl_texture_object *texObj, 11755facd7986ace899673499f396897469720476799Brian Paul struct gl_texture_image *texImage) 117624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 11775facd7986ace899673499f396897469720476799Brian Paul st_TexSubimage(ctx, 3, target, level, xoffset, yoffset, zoffset, 11785facd7986ace899673499f396897469720476799Brian Paul width, height, depth, format, type, 11795facd7986ace899673499f396897469720476799Brian Paul pixels, packing, texObj, texImage); 118024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 118124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 118224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 118324df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 1184f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergst_TexSubImage2D(struct gl_context *ctx, GLenum target, GLint level, 11855facd7986ace899673499f396897469720476799Brian Paul GLint xoffset, GLint yoffset, 11865facd7986ace899673499f396897469720476799Brian Paul GLsizei width, GLsizei height, 11875facd7986ace899673499f396897469720476799Brian Paul GLenum format, GLenum type, const GLvoid * pixels, 11885facd7986ace899673499f396897469720476799Brian Paul const struct gl_pixelstore_attrib *packing, 11895facd7986ace899673499f396897469720476799Brian Paul struct gl_texture_object *texObj, 11905facd7986ace899673499f396897469720476799Brian Paul struct gl_texture_image *texImage) 119124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 11925facd7986ace899673499f396897469720476799Brian Paul st_TexSubimage(ctx, 2, target, level, xoffset, yoffset, 0, 11935facd7986ace899673499f396897469720476799Brian Paul width, height, 1, format, type, 11945facd7986ace899673499f396897469720476799Brian Paul pixels, packing, texObj, texImage); 119524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 119624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 119724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 119824df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 1199f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergst_TexSubImage1D(struct gl_context *ctx, GLenum target, GLint level, 12005facd7986ace899673499f396897469720476799Brian Paul GLint xoffset, GLsizei width, GLenum format, GLenum type, 12015facd7986ace899673499f396897469720476799Brian Paul const GLvoid * pixels, 12025facd7986ace899673499f396897469720476799Brian Paul const struct gl_pixelstore_attrib *packing, 12035facd7986ace899673499f396897469720476799Brian Paul struct gl_texture_object *texObj, 12045facd7986ace899673499f396897469720476799Brian Paul struct gl_texture_image *texImage) 120524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 12065facd7986ace899673499f396897469720476799Brian Paul st_TexSubimage(ctx, 1, target, level, xoffset, 0, 0, width, 1, 1, 1207b245840b86cf877c9b8d666edf229364a84f1deaBrian format, type, pixels, packing, texObj, texImage); 120824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 120924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 121024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1211a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantzstatic void 1212f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergst_CompressedTexSubImage1D(struct gl_context *ctx, GLenum target, GLint level, 1213578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz GLint xoffset, GLsizei width, 1214578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz GLenum format, 1215578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz GLsizei imageSize, const GLvoid *data, 1216578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz struct gl_texture_object *texObj, 1217578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz struct gl_texture_image *texImage) 1218578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz{ 1219578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz assert(0); 1220578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz} 1221578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz 1222578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz 1223578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantzstatic void 1224f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergst_CompressedTexSubImage2D(struct gl_context *ctx, GLenum target, GLint level, 1225a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz GLint xoffset, GLint yoffset, 1226a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz GLsizei width, GLint height, 1227a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz GLenum format, 1228a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz GLsizei imageSize, const GLvoid *data, 1229a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz struct gl_texture_object *texObj, 1230a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz struct gl_texture_image *texImage) 1231a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz{ 123276c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul struct st_context *st = st_context(ctx); 1233a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz struct st_texture_image *stImage = st_texture_image(texImage); 1234a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz int srcBlockStride; 1235a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz int dstBlockStride; 1236a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz int y; 12377b8c4f22d4fd78829dd5843db92321ec0665932eVinson Lee enum pipe_format pformat; 1238a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz 1239a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz if (stImage->pt) { 12407b8c4f22d4fd78829dd5843db92321ec0665932eVinson Lee pformat = stImage->pt->format; 12414ed1de8b84b587d2be0c0e4ecb6b5f421195f562José Fonseca 124276c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul texImage->Data = st_texture_image_map(st, stImage, 0, 1243a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz PIPE_TRANSFER_WRITE, 1244a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz xoffset, yoffset, 1245a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz width, height); 1246a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz 1247b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol srcBlockStride = util_format_get_stride(pformat, width); 1248a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz dstBlockStride = stImage->transfer->stride; 1249a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz } else { 1250a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz assert(stImage->pt); 1251a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz /* TODO find good values for block and strides */ 1252a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz /* TODO also adjust texImage->data for yoffset/xoffset */ 1253a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz return; 1254a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz } 1255a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz 1256a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz if (!texImage->Data) { 1257a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz _mesa_error(ctx, GL_OUT_OF_MEMORY, "glCompressedTexSubImage"); 1258a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz return; 1259a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz } 1260a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz 1261b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol assert(xoffset % util_format_get_blockwidth(pformat) == 0); 1262b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol assert(yoffset % util_format_get_blockheight(pformat) == 0); 1263a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz 1264b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol for (y = 0; y < height; y += util_format_get_blockheight(pformat)) { 1265a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz /* don't need to adjust for xoffset and yoffset as st_texture_image_map does that */ 1266b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol const char *src = (const char*)data + srcBlockStride * util_format_get_nblocksy(pformat, y); 1267b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol char *dst = (char*)texImage->Data + dstBlockStride * util_format_get_nblocksy(pformat, y); 1268b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol memcpy(dst, src, util_format_get_stride(pformat, width)); 1269a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz } 1270a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz 1271a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz if (stImage->pt) { 127276c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul st_texture_image_unmap(st, stImage); 1273a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz texImage->Data = NULL; 1274a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz } 1275a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz} 1276a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz 1277a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz 1278578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantzstatic void 1279f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergst_CompressedTexSubImage3D(struct gl_context *ctx, GLenum target, GLint level, 1280578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz GLint xoffset, GLint yoffset, GLint zoffset, 1281578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz GLsizei width, GLint height, GLint depth, 1282578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz GLenum format, 1283578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz GLsizei imageSize, const GLvoid *data, 1284578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz struct gl_texture_object *texObj, 1285578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz struct gl_texture_image *texImage) 1286578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz{ 1287578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz assert(0); 1288578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz} 1289578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz 1290578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz 129124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 129224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian/** 12935facd7986ace899673499f396897469720476799Brian Paul * Do a CopyTexSubImage operation using a read transfer from the source, 12945facd7986ace899673499f396897469720476799Brian Paul * a write transfer to the destination and get_tile()/put_tile() to access 12955facd7986ace899673499f396897469720476799Brian Paul * the pixels/texels. 1296c6717a86420d7141013165f7acd50b3c3f751756Brian * 1297c6717a86420d7141013165f7acd50b3c3f751756Brian * Note: srcY=0=TOP of renderbuffer 1298038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian */ 1299038cb561eb094af2f2ba06e18e61246fc0c87c3cBrianstatic void 1300f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergfallback_copy_texsubimage(struct gl_context *ctx, GLenum target, GLint level, 1301038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian struct st_renderbuffer *strb, 1302038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian struct st_texture_image *stImage, 1303038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian GLenum baseFormat, 1304038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian GLint destX, GLint destY, GLint destZ, 1305038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian GLint srcX, GLint srcY, 1306038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian GLsizei width, GLsizei height) 1307038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian{ 130876c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul struct st_context *st = st_context(ctx); 130976c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul struct pipe_context *pipe = st->pipe; 13104617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzer struct pipe_transfer *src_trans; 13114617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzer GLvoid *texDest; 131271633abafc935c25da9731bab48c228ceb9b4097Michel Dänzer enum pipe_transfer_usage transfer_usage; 1313b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell 1314b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell if (ST_DEBUG & DEBUG_FALLBACK) 1315b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell debug_printf("%s: fallback processing\n", __FUNCTION__); 13164617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzer 13174617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzer assert(width <= MAX_WIDTH); 1318038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian 13194617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzer if (st_fb_orientation(ctx->ReadBuffer) == Y_0_TOP) { 13207c8836e9ef49d938aa55a1c385b95c6371c301f1Michel Dänzer srcY = strb->Base.Height - srcY - height; 13214617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzer } 1322f3048ad90ed2e4583f0f7aaf35a0f4aa581942ddBrian Paul 1323b0427bedde80e3189524651a327235bdfddbc613José Fonseca src_trans = pipe_get_transfer(st_context(ctx)->pipe, 1324e50dd26ca6d0eb0d0f97c2780020ea16e3d4a687Thomas Hellstrom strb->texture, 1325e50dd26ca6d0eb0d0f97c2780020ea16e3d4a687Thomas Hellstrom 0, 0, 0, 1326e50dd26ca6d0eb0d0f97c2780020ea16e3d4a687Thomas Hellstrom PIPE_TRANSFER_READ, 1327e50dd26ca6d0eb0d0f97c2780020ea16e3d4a687Thomas Hellstrom srcX, srcY, 1328e50dd26ca6d0eb0d0f97c2780020ea16e3d4a687Thomas Hellstrom width, height); 1329038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian 13300197348641614188c400d7c616573bb7f1eea781Brian Paul if ((baseFormat == GL_DEPTH_COMPONENT || 13310197348641614188c400d7c616573bb7f1eea781Brian Paul baseFormat == GL_DEPTH_STENCIL) && 13320bed834be4a174d20b31a6cbcf066774bf749929Michal Krol util_format_is_depth_and_stencil(stImage->pt->format)) 133371633abafc935c25da9731bab48c228ceb9b4097Michel Dänzer transfer_usage = PIPE_TRANSFER_READ_WRITE; 133471633abafc935c25da9731bab48c228ceb9b4097Michel Dänzer else 133571633abafc935c25da9731bab48c228ceb9b4097Michel Dänzer transfer_usage = PIPE_TRANSFER_WRITE; 133671633abafc935c25da9731bab48c228ceb9b4097Michel Dänzer 133776c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul texDest = st_texture_image_map(st, stImage, 0, transfer_usage, 13384617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzer destX, destY, width, height); 1339038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian 1340105758105a790dd8466c6be8c232c3f215ca4deeBrian Paul if (baseFormat == GL_DEPTH_COMPONENT || 13410197348641614188c400d7c616573bb7f1eea781Brian Paul baseFormat == GL_DEPTH_STENCIL) { 1342cc94863429d8a6cef8dbf861e78701a458d30f5aBrian Paul const GLboolean scaleOrBias = (ctx->Pixel.DepthScale != 1.0F || 1343cc94863429d8a6cef8dbf861e78701a458d30f5aBrian Paul ctx->Pixel.DepthBias != 0.0F); 134427858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul GLint row, yStep; 1345cc94863429d8a6cef8dbf861e78701a458d30f5aBrian Paul 134627858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul /* determine bottom-to-top vs. top-to-bottom order for src buffer */ 134727858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul if (st_fb_orientation(ctx->ReadBuffer) == Y_0_TOP) { 13487c8836e9ef49d938aa55a1c385b95c6371c301f1Michel Dänzer srcY = height - 1; 134927858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul yStep = -1; 135027858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul } 135127858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul else { 13524617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzer srcY = 0; 135327858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul yStep = 1; 135427858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul } 135527858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul 135627858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul /* To avoid a large temp memory allocation, do copy row by row */ 13574617981ec72f7985941bee4b03c534d97ff96bc6Michel Dänzer for (row = 0; row < height; row++, srcY += yStep) { 1358cc94863429d8a6cef8dbf861e78701a458d30f5aBrian Paul uint data[MAX_WIDTH]; 1359d35ecca5ee231c072687578642e0c22c6c0590b1Keith Whitwell pipe_get_tile_z(pipe, src_trans, 0, srcY, width, 1, data); 1360cc94863429d8a6cef8dbf861e78701a458d30f5aBrian Paul if (scaleOrBias) { 1361cc94863429d8a6cef8dbf861e78701a458d30f5aBrian Paul _mesa_scale_and_bias_depth_uint(ctx, width, data); 1362cc94863429d8a6cef8dbf861e78701a458d30f5aBrian Paul } 1363d35ecca5ee231c072687578642e0c22c6c0590b1Keith Whitwell pipe_put_tile_z(pipe, stImage->transfer, 0, row, width, 1, data); 1364cc94863429d8a6cef8dbf861e78701a458d30f5aBrian Paul } 1365cc94863429d8a6cef8dbf861e78701a458d30f5aBrian Paul } 1366cc94863429d8a6cef8dbf861e78701a458d30f5aBrian Paul else { 1367cc94863429d8a6cef8dbf861e78701a458d30f5aBrian Paul /* RGBA format */ 136827858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul GLfloat *tempSrc = 136932f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg (GLfloat *) malloc(width * height * 4 * sizeof(GLfloat)); 137027858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul 137127858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul if (tempSrc && texDest) { 137227858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul const GLint dims = 2; 13735facd7986ace899673499f396897469720476799Brian Paul const GLint dstRowStride = stImage->transfer->stride; 137427858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul struct gl_texture_image *texImage = &stImage->base; 137527858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul struct gl_pixelstore_attrib unpack = ctx->DefaultPacking; 137627858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul 137727858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul if (st_fb_orientation(ctx->ReadBuffer) == Y_0_TOP) { 137827858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul unpack.Invert = GL_TRUE; 1379cc94863429d8a6cef8dbf861e78701a458d30f5aBrian Paul } 138027858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul 138127858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul /* get float/RGBA image from framebuffer */ 138227858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul /* XXX this usually involves a lot of int/float conversion. 138327858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul * try to avoid that someday. 138427858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul */ 1385d35ecca5ee231c072687578642e0c22c6c0590b1Keith Whitwell pipe_get_tile_rgba(pipe, src_trans, 0, 0, width, height, tempSrc); 138627858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul 138727858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul /* Store into texture memory. 138827858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul * Note that this does some special things such as pixel transfer 138927858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul * ops and format conversion. In particular, if the dest tex format 139027858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul * is actually RGBA but the user created the texture as GL_RGB we 139127858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul * need to fill-in/override the alpha channel with 1.0. 139227858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul */ 13936480210b89dc8ae0990c450d27870c7b7930f251Brian Paul _mesa_texstore(ctx, dims, 13946480210b89dc8ae0990c450d27870c7b7930f251Brian Paul texImage->_BaseFormat, 13956480210b89dc8ae0990c450d27870c7b7930f251Brian Paul texImage->TexFormat, 13966480210b89dc8ae0990c450d27870c7b7930f251Brian Paul texDest, 13976480210b89dc8ae0990c450d27870c7b7930f251Brian Paul 0, 0, 0, 13986480210b89dc8ae0990c450d27870c7b7930f251Brian Paul dstRowStride, 13996480210b89dc8ae0990c450d27870c7b7930f251Brian Paul texImage->ImageOffsets, 14006480210b89dc8ae0990c450d27870c7b7930f251Brian Paul width, height, 1, 14016480210b89dc8ae0990c450d27870c7b7930f251Brian Paul GL_RGBA, GL_FLOAT, tempSrc, /* src */ 14026480210b89dc8ae0990c450d27870c7b7930f251Brian Paul &unpack); 140327858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul } 140427858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul else { 140527858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexSubImage"); 14065c83f1371978472fbe4bba8f686733c6b519874aBrian } 140727858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul 140827858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul if (tempSrc) 140932f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free(tempSrc); 14105c83f1371978472fbe4bba8f686733c6b519874aBrian } 1411d0279fc4b38c72356a341173317bcd45d9093f45Michel Dänzer 141276c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul st_texture_image_unmap(st, stImage); 1413287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe->transfer_destroy(pipe, src_trans); 1414038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian} 1415038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian 1416038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian 141765d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul 141865d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul/** 141965d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * If the format of the src renderbuffer and the format of the dest 142065d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * texture are compatible (in terms of blitting), return a TGSI writemask 142165d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * to be used during the blit. 142265d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * If the src/dest are incompatible, return 0. 142365d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul */ 14248fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwellstatic unsigned 1425f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergcompatible_src_dst_formats(struct gl_context *ctx, 142665d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul const struct gl_renderbuffer *src, 14278fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell const struct gl_texture_image *dst) 14288fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell{ 142965d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul /* Get logical base formats for the src and dest. 143065d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * That is, use the user-requested formats and not the actual, device- 143165d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * chosen formats. 143265d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * For example, the user may have requested an A8 texture but the 143365d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * driver may actually be using an RGBA texture format. When we 143465d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * copy/blit to that texture, we only want to copy the Alpha channel 143565d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * and not the RGB channels. 143665d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * 143765d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * Similarly, when the src FBO was created an RGB format may have been 143865d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * requested but the driver actually chose an RGBA format. In that case, 143965d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * we don't want to copy the undefined Alpha channel to the dest texture 144065d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * (it should be 1.0). 144165d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul */ 144265d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul const GLenum srcFormat = _mesa_base_fbo_format(ctx, src->InternalFormat); 144365d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul const GLenum dstFormat = _mesa_base_tex_format(ctx, dst->InternalFormat); 14448fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell 144565d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul /** 144665d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * XXX when we have red-only and red/green renderbuffers we'll need 144765d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * to add more cases here (or implement a general-purpose routine that 144865d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * queries the existance of the R,G,B,A channels in the src and dest). 144965d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul */ 145065d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul if (srcFormat == dstFormat) { 14518fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell /* This is the same as matching_base_formats, which should 14528fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell * always pass, as it did previously. 14538fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell */ 14548fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell return TGSI_WRITEMASK_XYZW; 14558fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell } 145665d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul else if (srcFormat == GL_RGB && dstFormat == GL_RGBA) { 145765d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul /* Make sure that A in the dest is 1. The actual src format 145865d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * may be RGBA and have undefined A values. 145965d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul */ 146065d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul return TGSI_WRITEMASK_XYZ; 146165d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul } 146265d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul else if (srcFormat == GL_RGBA && dstFormat == GL_RGB) { 146365d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul /* Make sure that A in the dest is 1. The actual dst format 146465d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * may be RGBA and will need A=1 to provide proper alpha values 146565d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul * when sampled later. 14668fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell */ 146765d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul return TGSI_WRITEMASK_XYZ; 14688fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell } 14698fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell else { 1470b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell if (ST_DEBUG & DEBUG_FALLBACK) 1471b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell debug_printf("%s failed for src %s, dst %s\n", 1472b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell __FUNCTION__, 1473b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell _mesa_lookup_enum_by_nr(srcFormat), 147465d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul _mesa_lookup_enum_by_nr(dstFormat)); 1475b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell 14768fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell /* Otherwise fail. 14778fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell */ 14788fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell return 0; 14798fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell } 14808fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell} 14818fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell 14828fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell 14838fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell 1484038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian/** 14854e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul * Do a CopyTex[Sub]Image1/2/3D() using a hardware (blit) path if possible. 14864e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul * Note that the region to copy has already been clipped so we know we 14874e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul * won't read from outside the source renderbuffer's bounds. 1488c6717a86420d7141013165f7acd50b3c3f751756Brian * 14894e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul * Note: srcY=0=Bottom of renderbuffer (GL convention) 149024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 1491038cb561eb094af2f2ba06e18e61246fc0c87c3cBrianstatic void 1492f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergst_copy_texsubimage(struct gl_context *ctx, 1493038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian GLenum target, GLint level, 1494038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian GLint destX, GLint destY, GLint destZ, 1495038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian GLint srcX, GLint srcY, 1496038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian GLsizei width, GLsizei height) 149724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 1498038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian struct gl_texture_unit *texUnit = 1499038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian &ctx->Texture.Unit[ctx->Texture.CurrentUnit]; 1500038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian struct gl_texture_object *texObj = 1501038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian _mesa_select_tex_object(ctx, texUnit, target); 1502038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian struct gl_texture_image *texImage = 1503038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian _mesa_select_tex_image(ctx, texObj, target, level); 1504038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian struct st_texture_image *stImage = st_texture_image(texImage); 15050197348641614188c400d7c616573bb7f1eea781Brian Paul const GLenum texBaseFormat = texImage->_BaseFormat; 1506b27498c7cad7dae4e3b3ef9517b9c0aef58f73f6Brian struct gl_framebuffer *fb = ctx->ReadBuffer; 1507b27498c7cad7dae4e3b3ef9517b9c0aef58f73f6Brian struct st_renderbuffer *strb; 150876c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul struct st_context *st = st_context(ctx); 150976c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul struct pipe_context *pipe = st->pipe; 15106f715dcc219071e574e363a9db4365c9c31ebbd3Brian struct pipe_screen *screen = pipe->screen; 151127858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul enum pipe_format dest_format, src_format; 1512cc94863429d8a6cef8dbf861e78701a458d30f5aBrian Paul GLboolean use_fallback = GL_TRUE; 151327858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul GLboolean matching_base_formats; 1514127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger GLuint format_writemask, sample_count; 15158fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell struct pipe_surface *dest_surface = NULL; 15168fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell GLboolean do_flip = (st_fb_orientation(ctx->ReadBuffer) == Y_0_TOP); 151724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1518afd16512bc354cf1a7220cb9bf3ce445503c7af4Keith Whitwell /* make sure finalize_textures has been called? 1519afd16512bc354cf1a7220cb9bf3ce445503c7af4Keith Whitwell */ 152076c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul if (0) st_validate_state(st); 1521afd16512bc354cf1a7220cb9bf3ce445503c7af4Keith Whitwell 1522b27498c7cad7dae4e3b3ef9517b9c0aef58f73f6Brian /* determine if copying depth or color data */ 1523105758105a790dd8466c6be8c232c3f215ca4deeBrian Paul if (texBaseFormat == GL_DEPTH_COMPONENT || 15240197348641614188c400d7c616573bb7f1eea781Brian Paul texBaseFormat == GL_DEPTH_STENCIL) { 1525b27498c7cad7dae4e3b3ef9517b9c0aef58f73f6Brian strb = st_renderbuffer(fb->_DepthBuffer); 152624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 1527b27498c7cad7dae4e3b3ef9517b9c0aef58f73f6Brian else { 15284e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul /* texBaseFormat == GL_RGB, GL_RGBA, GL_ALPHA, etc */ 1529b27498c7cad7dae4e3b3ef9517b9c0aef58f73f6Brian strb = st_renderbuffer(fb->_ColorReadBuffer); 1530b27498c7cad7dae4e3b3ef9517b9c0aef58f73f6Brian } 1531b27498c7cad7dae4e3b3ef9517b9c0aef58f73f6Brian 1532afd16512bc354cf1a7220cb9bf3ce445503c7af4Keith Whitwell if (!strb || !strb->surface || !stImage->pt) { 1533afd16512bc354cf1a7220cb9bf3ce445503c7af4Keith Whitwell debug_printf("%s: null strb or stImage\n", __FUNCTION__); 1534afd16512bc354cf1a7220cb9bf3ce445503c7af4Keith Whitwell return; 1535afd16512bc354cf1a7220cb9bf3ce445503c7af4Keith Whitwell } 1536afd16512bc354cf1a7220cb9bf3ce445503c7af4Keith Whitwell 1537127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger sample_count = strb->surface->texture->nr_samples; 1538127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger /* I believe this would be legal, presumably would need to do a resolve 1539127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger for color, and for depth/stencil spec says to just use one of the 1540127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger depth/stencil samples per pixel? Need some transfer clarifications. */ 1541127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger assert(sample_count < 2); 1542127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger 1543e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell if (srcX < 0) { 1544e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell width -= -srcX; 1545e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell destX += -srcX; 1546e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell srcX = 0; 1547e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell } 1548e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell 1549e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell if (srcY < 0) { 1550e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell height -= -srcY; 1551e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell destY += -srcY; 1552e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell srcY = 0; 1553e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell } 1554e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell 1555e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell if (destX < 0) { 1556e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell width -= -destX; 1557e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell srcX += -destX; 1558e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell destX = 0; 1559e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell } 1560e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell 1561e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell if (destY < 0) { 1562e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell height -= -destY; 1563e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell srcY += -destY; 1564e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell destY = 0; 1565e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell } 1566e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell 1567e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell if (width < 0 || height < 0) 1568e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell return; 1569e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell 1570e90beb93a89f77bffce8ab3d54457ea65868e93cKeith Whitwell 1571b27498c7cad7dae4e3b3ef9517b9c0aef58f73f6Brian assert(strb); 1572b27498c7cad7dae4e3b3ef9517b9c0aef58f73f6Brian assert(strb->surface); 1573753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer assert(stImage->pt); 1574c6717a86420d7141013165f7acd50b3c3f751756Brian 1575b27498c7cad7dae4e3b3ef9517b9c0aef58f73f6Brian src_format = strb->surface->format; 1576753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer dest_format = stImage->pt->format; 1577b27498c7cad7dae4e3b3ef9517b9c0aef58f73f6Brian 157827858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul /* 157927858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul * Determine if the src framebuffer and dest texture have the same 158027858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul * base format. We need this to detect a case such as the framebuffer 158127858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul * being GL_RGBA but the texture being GL_RGB. If the actual hardware 158227858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul * texture format stores RGBA we need to set A=1 (overriding the 158327858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul * framebuffer's alpha values). We can't do that with the blit or 158427858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul * textured-quad paths. 158527858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul */ 158645e76d2665b38ba3787548310efc59e969124c01Brian Paul matching_base_formats = 158745e76d2665b38ba3787548310efc59e969124c01Brian Paul (_mesa_get_format_base_format(strb->Base.Format) == 158845e76d2665b38ba3787548310efc59e969124c01Brian Paul _mesa_get_format_base_format(texImage->TexFormat)); 158965d2a266375cf32fd90c7fb77fb87993d3a652eaBrian Paul format_writemask = compatible_src_dst_formats(ctx, &strb->Base, texImage); 159079931e38abc62286151121a3f59127e296144551Michel Dänzer 15918fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell if (ctx->_ImageTransferState == 0x0) { 1592b27498c7cad7dae4e3b3ef9517b9c0aef58f73f6Brian 1593c11d582411a999ed40db4c02143dd380113e0ffdBrian Paul if (matching_base_formats && 15948fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell src_format == dest_format && 15958fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell !do_flip) 15968fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell { 15974e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul /* use surface_copy() / blit */ 1598127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger struct pipe_subresource subdst, subsrc; 1599127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger subdst.face = stImage->face; 1600127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger subdst.level = stImage->level; 1601127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger subsrc.face = strb->surface->face; 1602127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger subsrc.level = strb->surface->level; 1603127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger 1604127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger /* for resource_copy_region(), y=0=top, always */ 1605127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger pipe->resource_copy_region(pipe, 1606127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger /* dest */ 1607127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger stImage->pt, 1608127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger subdst, 1609127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger destX, destY, destZ, 1610127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger /* src */ 1611127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger strb->texture, 1612127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger subsrc, 1613127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger srcX, srcY, strb->surface->zslice, 1614127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger /* size */ 1615127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger width, height); 1616a479bf62353b6517841e620122112e7565d2391cBrian Paul use_fallback = GL_FALSE; 1617cc94863429d8a6cef8dbf861e78701a458d30f5aBrian Paul } 16188fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell else if (format_writemask && 1619e60ebebb392d1d4c47541766737b5a79685a24d5Brian Paul texBaseFormat != GL_DEPTH_COMPONENT && 1620e60ebebb392d1d4c47541766737b5a79685a24d5Brian Paul texBaseFormat != GL_DEPTH_STENCIL && 16218fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell screen->is_format_supported(screen, src_format, 1622127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger PIPE_TEXTURE_2D, sample_count, 1623287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell PIPE_BIND_SAMPLER_VIEW, 16248aafc03b260ab8923f1b373f7effa75bcdb40a72José Fonseca 0) && 16254e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul screen->is_format_supported(screen, dest_format, 1626127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger PIPE_TEXTURE_2D, 0, 1627287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell PIPE_BIND_RENDER_TARGET, 16288aafc03b260ab8923f1b373f7effa75bcdb40a72José Fonseca 0)) { 16294e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul /* draw textured quad to do the copy */ 1630eaca19edbbe7876079aa33d7f75d93601677081bBrian Paul GLint srcY0, srcY1; 1631127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger struct pipe_subresource subsrc; 163227858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul 163327858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul dest_surface = screen->get_tex_surface(screen, stImage->pt, 163427858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul stImage->face, stImage->level, 163527858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul destZ, 1636127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger PIPE_BIND_RENDER_TARGET); 163727858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul 1638a479bf62353b6517841e620122112e7565d2391cBrian Paul if (do_flip) { 1639a479bf62353b6517841e620122112e7565d2391cBrian Paul srcY1 = strb->Base.Height - srcY - height; 1640a479bf62353b6517841e620122112e7565d2391cBrian Paul srcY0 = srcY1 + height; 1641a479bf62353b6517841e620122112e7565d2391cBrian Paul } 1642a479bf62353b6517841e620122112e7565d2391cBrian Paul else { 1643a479bf62353b6517841e620122112e7565d2391cBrian Paul srcY0 = srcY; 1644a479bf62353b6517841e620122112e7565d2391cBrian Paul srcY1 = srcY0 + height; 1645a479bf62353b6517841e620122112e7565d2391cBrian Paul } 1646127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger subsrc.face = strb->surface->face; 1647127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger subsrc.level = strb->surface->level; 1648127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger 164976c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul util_blit_pixels_writemask(st->blit, 1650127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger strb->texture, 1651127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger subsrc, 16528fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell srcX, srcY0, 16538fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell srcX + width, srcY1, 1654127328bfadaa5f080730fd41f404f1bc74f490d3Roland Scheidegger strb->surface->zslice, 16558fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell dest_surface, 16568fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell destX, destY, 16578fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell destX + width, destY + height, 16588fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell 0.0, PIPE_TEX_MIPFILTER_NEAREST, 16598fc945cd847aa5d343a5f76eb2f9f2c9075cccddKeith Whitwell format_writemask); 1660cc94863429d8a6cef8dbf861e78701a458d30f5aBrian Paul use_fallback = GL_FALSE; 16613c0dc8242b64518d5635263ba65b39afa919dd86Michel Dänzer } 166279931e38abc62286151121a3f59127e296144551Michel Dänzer 166327858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul if (dest_surface) 166427858226dc4eb3e64d980ba8530c2fd2e39218cfBrian Paul pipe_surface_reference(&dest_surface, NULL); 1665038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian } 1666cc94863429d8a6cef8dbf861e78701a458d30f5aBrian Paul 1667cc94863429d8a6cef8dbf861e78701a458d30f5aBrian Paul if (use_fallback) { 16684e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul /* software fallback */ 1669038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian fallback_copy_texsubimage(ctx, target, level, 16704e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul strb, stImage, texBaseFormat, 1671038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian destX, destY, destZ, 1672038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian srcX, srcY, width, height); 1673038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian } 167424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 167524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 167624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1677038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian 167824df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 1679f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergst_CopyTexImage1D(struct gl_context * ctx, GLenum target, GLint level, 168024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLenum internalFormat, 168124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLint x, GLint y, GLsizei width, GLint border) 168224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 168324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct gl_texture_unit *texUnit = 168424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian &ctx->Texture.Unit[ctx->Texture.CurrentUnit]; 168524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct gl_texture_object *texObj = 168624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian _mesa_select_tex_object(ctx, texUnit, target); 168724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct gl_texture_image *texImage = 168824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian _mesa_select_tex_image(ctx, texObj, target, level); 168924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1690753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer /* Setup or redefine the texture object, texture and texture 169124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * image. Don't populate yet. 169224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 169324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian ctx->Driver.TexImage1D(ctx, target, level, internalFormat, 169424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian width, border, 169524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GL_RGBA, CHAN_TYPE, NULL, 169624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian &ctx->DefaultPacking, texObj, texImage); 169724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 16984e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul st_copy_texsubimage(ctx, target, level, 16994e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul 0, 0, 0, /* destX,Y,Z */ 17004e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul x, y, width, 1); /* src X, Y, size */ 170124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 170224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 170324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 170424df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 1705f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergst_CopyTexImage2D(struct gl_context * ctx, GLenum target, GLint level, 170624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLenum internalFormat, 170724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLint x, GLint y, GLsizei width, GLsizei height, 170824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLint border) 170924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 171024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct gl_texture_unit *texUnit = 171124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian &ctx->Texture.Unit[ctx->Texture.CurrentUnit]; 171224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct gl_texture_object *texObj = 171324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian _mesa_select_tex_object(ctx, texUnit, target); 171424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct gl_texture_image *texImage = 171524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian _mesa_select_tex_image(ctx, texObj, target, level); 171624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1717753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer /* Setup or redefine the texture object, texture and texture 171824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * image. Don't populate yet. 171924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 172024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian ctx->Driver.TexImage2D(ctx, target, level, internalFormat, 172124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian width, height, border, 172224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GL_RGBA, CHAN_TYPE, NULL, 172324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian &ctx->DefaultPacking, texObj, texImage); 172424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 17254e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul st_copy_texsubimage(ctx, target, level, 17264e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul 0, 0, 0, /* destX,Y,Z */ 17274e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul x, y, width, height); /* src X, Y, size */ 172824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 172924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 173024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 173124df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 1732f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergst_CopyTexSubImage1D(struct gl_context * ctx, GLenum target, GLint level, 173324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLint xoffset, GLint x, GLint y, GLsizei width) 173424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 1735038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian const GLint yoffset = 0, zoffset = 0; 1736038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian const GLsizei height = 1; 17374e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul st_copy_texsubimage(ctx, target, level, 17384e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul xoffset, yoffset, zoffset, /* destX,Y,Z */ 17394e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul x, y, width, height); /* src X, Y, size */ 174024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 174124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 174224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 174324df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 1744f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergst_CopyTexSubImage2D(struct gl_context * ctx, GLenum target, GLint level, 174524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLint xoffset, GLint yoffset, 174624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian GLint x, GLint y, GLsizei width, GLsizei height) 174724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 1748038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian const GLint zoffset = 0; 17494e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul st_copy_texsubimage(ctx, target, level, 17504e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul xoffset, yoffset, zoffset, /* destX,Y,Z */ 17514e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul x, y, width, height); /* src X, Y, size */ 1752038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian} 175324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 175424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1755038cb561eb094af2f2ba06e18e61246fc0c87c3cBrianstatic void 1756f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergst_CopyTexSubImage3D(struct gl_context * ctx, GLenum target, GLint level, 1757038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian GLint xoffset, GLint yoffset, GLint zoffset, 1758038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian GLint x, GLint y, GLsizei width, GLsizei height) 1759038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian{ 17604e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul st_copy_texsubimage(ctx, target, level, 17614e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul xoffset, yoffset, zoffset, /* destX,Y,Z */ 17624e070f10c0a2af8a563eadf7fdb09b11d9067a99Brian Paul x, y, width, height); /* src X, Y, size */ 176324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 176424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 176524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1766e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul/** 1767e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul * Copy image data from stImage into the texture object 'stObj' at level 1768e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul * 'dstLevel'. 1769e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul */ 177024df8f895fe8807aa2ba058e71bd40adfc01d21eBrianstatic void 1771753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzercopy_image_data_to_texture(struct st_context *st, 1772753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer struct st_texture_object *stObj, 17734da1cdf78fa3b954840650fa46cf72da5daf149fBrian GLuint dstLevel, 1774753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer struct st_texture_image *stImage) 177524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 1776e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul /* debug checks */ 1777e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul { 1778e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul const struct gl_texture_image *dstImage = 1779e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul stObj->base.Image[stImage->face][stImage->level]; 1780e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul assert(dstImage); 1781e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul assert(dstImage->Width == stImage->base.Width); 1782e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul assert(dstImage->Height == stImage->base.Height); 1783e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul assert(dstImage->Depth == stImage->base.Depth); 1784e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul } 1785e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul 1786753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer if (stImage->pt) { 178724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian /* Copy potentially with the blitter: 178824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 1789753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer st_texture_image_copy(st->pipe, 17904da1cdf78fa3b954840650fa46cf72da5daf149fBrian stObj->pt, dstLevel, /* dest texture, level */ 1791c6fdb950e9fdf42fb1d6c837019df23386fffee7Brian Paul stImage->pt, stImage->level, /* src texture, level */ 1792b628950662a97452e539bcc704bd2acee70f8355Brian Paul stImage->face); 179324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1794287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(&stImage->pt, NULL); 179524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 17964c50969334844bc9aa622176c3ebcbc733394f78Brian Paul else if (stImage->base.Data) { 1797e50dd26ca6d0eb0d0f97c2780020ea16e3d4a687Thomas Hellstrom st_texture_image_data(st, 17985facd7986ace899673499f396897469720476799Brian Paul stObj->pt, 17995facd7986ace899673499f396897469720476799Brian Paul stImage->face, 18005facd7986ace899673499f396897469720476799Brian Paul dstLevel, 18015facd7986ace899673499f396897469720476799Brian Paul stImage->base.Data, 18025facd7986ace899673499f396897469720476799Brian Paul stImage->base.RowStride * 1803b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol util_format_get_blocksize(stObj->pt->format), 18045facd7986ace899673499f396897469720476799Brian Paul stImage->base.RowStride * 18055facd7986ace899673499f396897469720476799Brian Paul stImage->base.Height * 1806b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol util_format_get_blocksize(stObj->pt->format)); 180724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian _mesa_align_free(stImage->base.Data); 180824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian stImage->base.Data = NULL; 180924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 181024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1811287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(&stImage->pt, stObj->pt); 181224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 181324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 181424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1815afc54983370033b65e3a7cbb29bd9c87156f0881Brian/** 1816afc54983370033b65e3a7cbb29bd9c87156f0881Brian * Called during state validation. When this function is finished, 1817afc54983370033b65e3a7cbb29bd9c87156f0881Brian * the texture object should be ready for rendering. 18183b3774b1227743147159676795b542c0eb7c2bdfBrian Paul * \return GL_TRUE for success, GL_FALSE for failure (out of mem) 181924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 182014b98343309fdcff3514f05020303f7b40e83a4aBrianGLboolean 1821f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergst_finalize_texture(struct gl_context *ctx, 1822c3af68dc5022715cc8f126b7df12f3f5248aefe7Keith Whitwell struct pipe_context *pipe, 1823295a87f6c211322faefc4ef7f88f02722973f5b6Brian Paul struct gl_texture_object *tObj) 182424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 182576c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul struct st_context *st = st_context(ctx); 182614b98343309fdcff3514f05020303f7b40e83a4aBrian struct st_texture_object *stObj = st_texture_object(tObj); 1827afc54983370033b65e3a7cbb29bd9c87156f0881Brian const GLuint nr_faces = (stObj->base.Target == GL_TEXTURE_CUBE_MAP) ? 6 : 1; 1828e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul GLuint face; 182924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct st_texture_image *firstImage; 1830e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul enum pipe_format firstImageFormat; 183124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1832e3a6f57ad6c0e7bda5d45eb146194ed39f45abddBrian Paul if (stObj->base._Complete) { 1833e3a6f57ad6c0e7bda5d45eb146194ed39f45abddBrian Paul /* The texture is complete and we know exactly how many mipmap levels 1834e3a6f57ad6c0e7bda5d45eb146194ed39f45abddBrian Paul * are present/needed. This is conditional because we may be called 1835e3a6f57ad6c0e7bda5d45eb146194ed39f45abddBrian Paul * from the st_generate_mipmap() function when the texture object is 1836e3a6f57ad6c0e7bda5d45eb146194ed39f45abddBrian Paul * incomplete. In that case, we'll have set stObj->lastLevel before 1837e3a6f57ad6c0e7bda5d45eb146194ed39f45abddBrian Paul * we get here. 1838e3a6f57ad6c0e7bda5d45eb146194ed39f45abddBrian Paul */ 1839ae2daacbac7242938cffe0e2409071e030e00863Cooper Yuan if (stObj->base.MinFilter == GL_LINEAR || 1840ae2daacbac7242938cffe0e2409071e030e00863Cooper Yuan stObj->base.MinFilter == GL_NEAREST) 1841ae2daacbac7242938cffe0e2409071e030e00863Cooper Yuan stObj->lastLevel = stObj->base.BaseLevel; 1842ae2daacbac7242938cffe0e2409071e030e00863Cooper Yuan else 1843e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul stObj->lastLevel = stObj->base._MaxLevel; 1844e3a6f57ad6c0e7bda5d45eb146194ed39f45abddBrian Paul } 184524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 18464da1cdf78fa3b954840650fa46cf72da5daf149fBrian firstImage = st_texture_image(stObj->base.Image[0][stObj->base.BaseLevel]); 1847e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul assert(firstImage); 184824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1849753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer /* If both firstImage and stObj point to a texture which can contain 185024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * all active images, favour firstImage. Note that because of the 185124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * completeness requirement, we know that the image dimensions 185224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian * will match. 185324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 1854753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer if (firstImage->pt && 1855753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer firstImage->pt != stObj->pt && 1856753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer firstImage->pt->last_level >= stObj->lastLevel) { 1857287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(&stObj->pt, firstImage->pt); 185840c3861e1e98116c573027b054a6a05208c53b6aMichal Krol pipe_sampler_view_reference(&stObj->sampler_view, NULL); 185924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 186024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1861e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul /* Find gallium format for the Mesa texture */ 1862e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul firstImageFormat = st_mesa_format_to_pipe_format(firstImage->base.TexFormat); 186324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1864ce509401738e7073de94a2b7fc41461c52a73da0Brian Paul /* If we already have a gallium texture, check that it matches the texture 1865ce509401738e7073de94a2b7fc41461c52a73da0Brian Paul * object's format, target, size, num_levels, etc. 186624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 1867809dd9089bae70cf35cea6a75258e700e7455738Brian Paul if (stObj->pt) { 1868809dd9089bae70cf35cea6a75258e700e7455738Brian Paul if (stObj->pt->target != gl_target_to_pipe(stObj->base.Target) || 1869a2817f6ae566b672f195cff22e14e2058d3617eaDave Airlie !st_sampler_compat_formats(stObj->pt->format, firstImageFormat) || 1870529b7b355d392b1534ccd8ff7b428dc21cbfdc21Brian Paul stObj->pt->last_level < stObj->lastLevel || 1871e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul stObj->pt->width0 != stObj->width0 || 1872e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul stObj->pt->height0 != stObj->height0 || 1873e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul stObj->pt->depth0 != stObj->depth0) 1874311f77198e171e9ce8ddcce91fd6a894fff1f14fBrian Paul { 1875e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul /* The gallium texture does not match the Mesa texture so delete the 1876e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul * gallium texture now. We'll make a new one below. 1877e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul */ 1878287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(&stObj->pt, NULL); 187940c3861e1e98116c573027b054a6a05208c53b6aMichal Krol pipe_sampler_view_reference(&stObj->sampler_view, NULL); 188076c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul st->dirty.st |= ST_NEW_FRAMEBUFFER; 1881809dd9089bae70cf35cea6a75258e700e7455738Brian Paul } 188224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 188324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1884ce509401738e7073de94a2b7fc41461c52a73da0Brian Paul /* May need to create a new gallium texture: 188524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 1886753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer if (!stObj->pt) { 1887e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul GLuint bindings = default_bindings(st, firstImageFormat); 18881ad2484f03cbe9ae6bd4ebe50d6894e570d65952Brian Paul 188976c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul stObj->pt = st_texture_create(st, 18905390a43ce06b27f6d54bc5f237aa305b6948f2afBrian gl_target_to_pipe(stObj->base.Target), 1891e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul firstImageFormat, 1892b245840b86cf877c9b8d666edf229364a84f1deaBrian stObj->lastLevel, 1893e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul stObj->width0, 1894e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul stObj->height0, 1895e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul stObj->depth0, 18968283db88414f600e66510de713382c36899d4b03Brian Paul bindings); 1897a73ae3d5eb8419feab5aea26573aa41b72f941ebKeith Whitwell 18983b3774b1227743147159676795b542c0eb7c2bdfBrian Paul if (!stObj->pt) { 18993b3774b1227743147159676795b542c0eb7c2bdfBrian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage"); 19003b3774b1227743147159676795b542c0eb7c2bdfBrian Paul return GL_FALSE; 19013b3774b1227743147159676795b542c0eb7c2bdfBrian Paul } 190224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 190324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1904753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer /* Pull in any images not in the object's texture: 190524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 190624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian for (face = 0; face < nr_faces; face++) { 19074da1cdf78fa3b954840650fa46cf72da5daf149fBrian GLuint level; 19089adebe172df9fbf9ba359d949e64ce07bbef77b7Brian Paul for (level = stObj->base.BaseLevel; level <= stObj->lastLevel; level++) { 190924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian struct st_texture_image *stImage = 1910e648d4a1d1c0c5f70916e38366b863f0bec79a62Brian Paul st_texture_image(stObj->base.Image[face][level]); 191124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 1912753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer /* Need to import images in main memory or held in other textures. 191324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian */ 1914a34b43b3f4817268ef4b3f186203b5fbafc7214eBrian if (stImage && stObj->pt != stImage->pt) { 191576c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul copy_image_data_to_texture(st, stObj, level, stImage); 191624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 191724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 191824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian } 191924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 192024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian return GL_TRUE; 192124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 192224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 192324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 19248f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul/** 19258f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul * Returns pointer to a default/dummy texture. 19268f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul * This is typically used when the current shader has tex/sample instructions 19278f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul * but the user has not provided a (any) texture(s). 19288f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul */ 19298f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paulstruct gl_texture_object * 19308f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paulst_get_default_texture(struct st_context *st) 19318f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul{ 19328f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul if (!st->default_texture) { 19338f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul static const GLenum target = GL_TEXTURE_2D; 19348f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul GLubyte pixels[16][16][4]; 19358f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul struct gl_texture_object *texObj; 19368f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul struct gl_texture_image *texImg; 19372002e03a5232c54988161cb629966bdce19d35deBrian Paul GLuint i, j; 19388f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul 19392002e03a5232c54988161cb629966bdce19d35deBrian Paul /* The ARB_fragment_program spec says (0,0,0,1) should be returned 19402002e03a5232c54988161cb629966bdce19d35deBrian Paul * when attempting to sample incomplete textures. 19412002e03a5232c54988161cb629966bdce19d35deBrian Paul */ 19422002e03a5232c54988161cb629966bdce19d35deBrian Paul for (i = 0; i < 16; i++) { 19432002e03a5232c54988161cb629966bdce19d35deBrian Paul for (j = 0; j < 16; j++) { 19442002e03a5232c54988161cb629966bdce19d35deBrian Paul pixels[i][j][0] = 0; 19452002e03a5232c54988161cb629966bdce19d35deBrian Paul pixels[i][j][1] = 0; 19462002e03a5232c54988161cb629966bdce19d35deBrian Paul pixels[i][j][2] = 0; 19472002e03a5232c54988161cb629966bdce19d35deBrian Paul pixels[i][j][3] = 255; 19482002e03a5232c54988161cb629966bdce19d35deBrian Paul } 19492002e03a5232c54988161cb629966bdce19d35deBrian Paul } 1950a7b818d53a95b549bbff942a9cb91272e0799dd5Brian Paul 19518f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul texObj = st->ctx->Driver.NewTextureObject(st->ctx, 0, target); 19528f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul 19538f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul texImg = _mesa_get_tex_image(st->ctx, texObj, target, 0); 19548f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul 19558f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul _mesa_init_teximage_fields(st->ctx, target, texImg, 19568f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul 16, 16, 1, 0, /* w, h, d, border */ 195783e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul GL_RGBA, MESA_FORMAT_RGBA8888); 19588f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul 19598f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul st_TexImage(st->ctx, 2, target, 19608f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul 0, GL_RGBA, /* level, intformat */ 19618f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul 16, 16, 1, 0, /* w, h, d, border */ 19628f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul GL_RGBA, GL_UNSIGNED_BYTE, pixels, 19638f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul &st->ctx->DefaultPacking, 19648f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul texObj, texImg, 19658f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul 0, 0); 19668f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul 19678f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul texObj->MinFilter = GL_NEAREST; 19688f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul texObj->MagFilter = GL_NEAREST; 19698f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul texObj->_Complete = GL_TRUE; 19708f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul 19718f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul st->default_texture = texObj; 19728f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul } 19738f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul return st->default_texture; 19748f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul} 19758f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul 19768f6d9e12be0be086ca2aab0b56dff8d2181addd9Brian Paul 19776da9234fd437f97267e7831f034c78b31156d939Brianvoid 19786da9234fd437f97267e7831f034c78b31156d939Brianst_init_texture_functions(struct dd_function_table *functions) 197924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian{ 198024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->ChooseTextureFormat = st_ChooseTextureFormat; 198124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->TexImage1D = st_TexImage1D; 198224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->TexImage2D = st_TexImage2D; 198324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->TexImage3D = st_TexImage3D; 198424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->TexSubImage1D = st_TexSubImage1D; 198524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->TexSubImage2D = st_TexSubImage2D; 198624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->TexSubImage3D = st_TexSubImage3D; 1987578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz functions->CompressedTexSubImage1D = st_CompressedTexSubImage1D; 1988a4fd94a54a75a3418462c30f1240ab50b5f24090Jakob Bornecrantz functions->CompressedTexSubImage2D = st_CompressedTexSubImage2D; 1989578230dbbffbf5317d6002d1023dcd62b57186f5Jakob Bornecrantz functions->CompressedTexSubImage3D = st_CompressedTexSubImage3D; 199024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->CopyTexImage1D = st_CopyTexImage1D; 199124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->CopyTexImage2D = st_CopyTexImage2D; 199224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->CopyTexSubImage1D = st_CopyTexSubImage1D; 199324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->CopyTexSubImage2D = st_CopyTexSubImage2D; 1994038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian functions->CopyTexSubImage3D = st_CopyTexSubImage3D; 199562abcb9aacc33218d0143a743c738435794b32a9Brian functions->GenerateMipmap = st_generate_mipmap; 1996038cb561eb094af2f2ba06e18e61246fc0c87c3cBrian 199724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->GetTexImage = st_GetTexImage; 199824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 199924df8f895fe8807aa2ba058e71bd40adfc01d21eBrian /* compressed texture functions */ 200024df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->CompressedTexImage2D = st_CompressedTexImage2D; 200124df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->GetCompressedTexImage = st_GetCompressedTexImage; 200224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 200324df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->NewTextureObject = st_NewTextureObject; 200424df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->NewTextureImage = st_NewTextureImage; 200524df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->DeleteTexture = st_DeleteTextureObject; 200624df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->FreeTexImageData = st_FreeTextureImageData; 200724df8f895fe8807aa2ba058e71bd40adfc01d21eBrian 200824df8f895fe8807aa2ba058e71bd40adfc01d21eBrian functions->TextureMemCpy = do_memcpy; 2009f8549e8f4f8bdfebcb4e0a2754df59b3fe4fdff7Brian 2010f8549e8f4f8bdfebcb4e0a2754df59b3fe4fdff7Brian /* XXX Temporary until we can query pipe's texture sizes */ 2011f8549e8f4f8bdfebcb4e0a2754df59b3fe4fdff7Brian functions->TestProxyTexImage = _mesa_test_proxy_teximage; 201224df8f895fe8807aa2ba058e71bd40adfc01d21eBrian} 2013