177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
2ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/glheader.h"
3ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/macros.h"
445a56e4730a74a012ad712fd9b6013d900b04742Vinson Lee#include "main/mfeatures.h"
5ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/mtypes.h"
6ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/enums.h"
7ced699b37a048ea32434c222fcf83235048918bcBrian Paul#include "main/bufferobj.h"
8ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/context.h"
92073006c9566b08888b4338748a843c645bd0db1Eric Anholt#include "main/formats.h"
10b70610b9823fc7dc3672735c11be1a75fbb1a2a4Brian Paul#include "main/pbo.h"
11d09704b4e96ab333d567e3a60e77b4dba9be5e76Chad Versace#include "main/renderbuffer.h"
12ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/texcompress.h"
134d363cc16d94b1e356b7cc23bb3b15ca0374d1e3Brian Paul#include "main/texgetimage.h"
14ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/texobj.h"
15ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/teximage.h"
1666681b4c8cb1ef16f42c1591298cb30c83bca09bBrian Paul#include "main/texstore.h"
1777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
1877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt#include "intel_context.h"
1977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt#include "intel_mipmap_tree.h"
2077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt#include "intel_buffer_objects.h"
2177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt#include "intel_batchbuffer.h"
2277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt#include "intel_tex.h"
2377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt#include "intel_blit.h"
24dcbe215c015c8dc48440f578023c2b9d12b934e4Kristian Høgsberg#include "intel_fbo.h"
2501e493980c133ad20f70d627dcc1b1900e3ebf44Chad Versace#include "intel_span.h"
2677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
2777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt#define FILE_DEBUG_FLAG DEBUG_TEXTURE
2877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
294ad8a0adec588b4c2c5a8f93265ed46cee5d3ff6Eric Anholt/* Work back from the specified level of the image to the baselevel and create a
304ad8a0adec588b4c2c5a8f93265ed46cee5d3ff6Eric Anholt * miptree of that size.
315b3eb7538cd9ceb967b6e9e765896183e7c2c4d4Eric Anholt */
32e928c34d3ec54bb8a6b80036e6b6a91977bf0865Eric Anholtstruct intel_mipmap_tree *
3348024fb44cbbccd0c688949084ef249d3c1208abEric Anholtintel_miptree_create_for_teximage(struct intel_context *intel,
3448024fb44cbbccd0c688949084ef249d3c1208abEric Anholt				  struct intel_texture_object *intelObj,
3548024fb44cbbccd0c688949084ef249d3c1208abEric Anholt				  struct intel_texture_image *intelImage,
362e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke				  bool expect_accelerated_upload)
3777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{
385b3eb7538cd9ceb967b6e9e765896183e7c2c4d4Eric Anholt   GLuint firstLevel;
3977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   GLuint lastLevel;
40fd99cd0e10849205749aad580fea8c970fb46a31Eric Anholt   int width, height, depth;
416dcc398ac0837025cf60b4d6a056fa3b0a16466fEric Anholt   GLuint i;
4277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
43fd99cd0e10849205749aad580fea8c970fb46a31Eric Anholt   intel_miptree_get_dimensions_for_image(&intelImage->base.Base,
44fd99cd0e10849205749aad580fea8c970fb46a31Eric Anholt                                          &width, &height, &depth);
45fd99cd0e10849205749aad580fea8c970fb46a31Eric Anholt
4677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   DBG("%s\n", __FUNCTION__);
4777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
48fa2c886863492cc3eeee6d2059ae24edc1cb2bffBrian Paul   if (intelImage->base.Base.Level > intelObj->base.BaseLevel &&
49fd99cd0e10849205749aad580fea8c970fb46a31Eric Anholt       (width == 1 ||
50fd99cd0e10849205749aad580fea8c970fb46a31Eric Anholt        (intelObj->base.Target != GL_TEXTURE_1D && height == 1) ||
51fd99cd0e10849205749aad580fea8c970fb46a31Eric Anholt        (intelObj->base.Target == GL_TEXTURE_3D && depth == 1))) {
5248024fb44cbbccd0c688949084ef249d3c1208abEric Anholt      /* For this combination, we're at some lower mipmap level and
5348024fb44cbbccd0c688949084ef249d3c1208abEric Anholt       * some important dimension is 1.  We can't extrapolate up to a
5448024fb44cbbccd0c688949084ef249d3c1208abEric Anholt       * likely base level width/height/depth for a full mipmap stack
5548024fb44cbbccd0c688949084ef249d3c1208abEric Anholt       * from this info, so just allocate this one level.
5648024fb44cbbccd0c688949084ef249d3c1208abEric Anholt       */
57fa2c886863492cc3eeee6d2059ae24edc1cb2bffBrian Paul      firstLevel = intelImage->base.Base.Level;
58fa2c886863492cc3eeee6d2059ae24edc1cb2bffBrian Paul      lastLevel = intelImage->base.Base.Level;
5948024fb44cbbccd0c688949084ef249d3c1208abEric Anholt   } else {
6048024fb44cbbccd0c688949084ef249d3c1208abEric Anholt      /* If this image disrespects BaseLevel, allocate from level zero.
6148024fb44cbbccd0c688949084ef249d3c1208abEric Anholt       * Usually BaseLevel == 0, so it's unlikely to happen.
6248024fb44cbbccd0c688949084ef249d3c1208abEric Anholt       */
63fa2c886863492cc3eeee6d2059ae24edc1cb2bffBrian Paul      if (intelImage->base.Base.Level < intelObj->base.BaseLevel)
6448024fb44cbbccd0c688949084ef249d3c1208abEric Anholt	 firstLevel = 0;
6548024fb44cbbccd0c688949084ef249d3c1208abEric Anholt      else
6648024fb44cbbccd0c688949084ef249d3c1208abEric Anholt	 firstLevel = intelObj->base.BaseLevel;
6748024fb44cbbccd0c688949084ef249d3c1208abEric Anholt
6848024fb44cbbccd0c688949084ef249d3c1208abEric Anholt      /* Figure out image dimensions at start level. */
69fa2c886863492cc3eeee6d2059ae24edc1cb2bffBrian Paul      for (i = intelImage->base.Base.Level; i > firstLevel; i--) {
7048024fb44cbbccd0c688949084ef249d3c1208abEric Anholt	 width <<= 1;
7148024fb44cbbccd0c688949084ef249d3c1208abEric Anholt	 if (height != 1)
7248024fb44cbbccd0c688949084ef249d3c1208abEric Anholt	    height <<= 1;
7348024fb44cbbccd0c688949084ef249d3c1208abEric Anholt	 if (depth != 1)
7448024fb44cbbccd0c688949084ef249d3c1208abEric Anholt	    depth <<= 1;
7548024fb44cbbccd0c688949084ef249d3c1208abEric Anholt      }
7677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
7748024fb44cbbccd0c688949084ef249d3c1208abEric Anholt      /* Guess a reasonable value for lastLevel.  This is probably going
7848024fb44cbbccd0c688949084ef249d3c1208abEric Anholt       * to be wrong fairly often and might mean that we have to look at
7948024fb44cbbccd0c688949084ef249d3c1208abEric Anholt       * resizable buffers, or require that buffers implement lazy
8048024fb44cbbccd0c688949084ef249d3c1208abEric Anholt       * pagetable arrangements.
8148024fb44cbbccd0c688949084ef249d3c1208abEric Anholt       */
82ecfaab88b2577bd0395bc05d75a036126806a9c4Brian Paul      if ((intelObj->base.Sampler.MinFilter == GL_NEAREST ||
83ecfaab88b2577bd0395bc05d75a036126806a9c4Brian Paul	   intelObj->base.Sampler.MinFilter == GL_LINEAR) &&
84fa2c886863492cc3eeee6d2059ae24edc1cb2bffBrian Paul	  intelImage->base.Base.Level == firstLevel &&
8548024fb44cbbccd0c688949084ef249d3c1208abEric Anholt	  (intel->gen < 4 || firstLevel == 0)) {
8648024fb44cbbccd0c688949084ef249d3c1208abEric Anholt	 lastLevel = firstLevel;
877420c9dab4aaf87e6b840410226c296c4668a48fChad Versace      } else if (intelObj->base.Target == GL_TEXTURE_EXTERNAL_OES) {
887420c9dab4aaf87e6b840410226c296c4668a48fChad Versace	 lastLevel = firstLevel;
8948024fb44cbbccd0c688949084ef249d3c1208abEric Anholt      } else {
90c1090f3019bbe0ff92455e4a9268f8957af9cda0Roland Scheidegger	 lastLevel = firstLevel + _mesa_logbase2(MAX2(MAX2(width, height), depth));
9148024fb44cbbccd0c688949084ef249d3c1208abEric Anholt      }
9277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   }
9377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
9448024fb44cbbccd0c688949084ef249d3c1208abEric Anholt   return intel_miptree_create(intel,
9548024fb44cbbccd0c688949084ef249d3c1208abEric Anholt			       intelObj->base.Target,
96fa2c886863492cc3eeee6d2059ae24edc1cb2bffBrian Paul			       intelImage->base.Base.TexFormat,
9748024fb44cbbccd0c688949084ef249d3c1208abEric Anholt			       firstLevel,
9848024fb44cbbccd0c688949084ef249d3c1208abEric Anholt			       lastLevel,
9948024fb44cbbccd0c688949084ef249d3c1208abEric Anholt			       width,
10048024fb44cbbccd0c688949084ef249d3c1208abEric Anholt			       height,
10148024fb44cbbccd0c688949084ef249d3c1208abEric Anholt			       depth,
10219e9b24626c2b9d7abef054d57bb2a52106c545bPaul Berry			       expect_accelerated_upload,
103455ac562722f60ac9fb0c3d3c697fa339fa011adPaul Berry                               0 /* num_samples */,
1041bd4d456cdecf7bea55f4e3dac574af54efad994Paul Berry                               INTEL_MSAA_LAYOUT_NONE);
10577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt}
10677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
10777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt/* There are actually quite a few combinations this will work for,
10877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * more than what I've listed here.
10977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt */
1103bb536e4c7b7fb0c0a9b18f5ca2d111996b0ddebEric Anholtstatic bool
1113bb536e4c7b7fb0c0a9b18f5ca2d111996b0ddebEric Anholtcheck_pbo_format(GLenum format, GLenum type,
1121f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul                 gl_format mesa_format)
11377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{
1143bb536e4c7b7fb0c0a9b18f5ca2d111996b0ddebEric Anholt   switch (mesa_format) {
1153bb536e4c7b7fb0c0a9b18f5ca2d111996b0ddebEric Anholt   case MESA_FORMAT_ARGB8888:
1163bb536e4c7b7fb0c0a9b18f5ca2d111996b0ddebEric Anholt      return (format == GL_BGRA && (type == GL_UNSIGNED_BYTE ||
1173bb536e4c7b7fb0c0a9b18f5ca2d111996b0ddebEric Anholt				    type == GL_UNSIGNED_INT_8_8_8_8_REV));
1183bb536e4c7b7fb0c0a9b18f5ca2d111996b0ddebEric Anholt   case MESA_FORMAT_RGB565:
1193bb536e4c7b7fb0c0a9b18f5ca2d111996b0ddebEric Anholt      return (format == GL_RGB && type == GL_UNSIGNED_SHORT_5_6_5);
1203bb536e4c7b7fb0c0a9b18f5ca2d111996b0ddebEric Anholt   case MESA_FORMAT_L8:
1213bb536e4c7b7fb0c0a9b18f5ca2d111996b0ddebEric Anholt      return (format == GL_LUMINANCE && type == GL_UNSIGNED_BYTE);
1223bb536e4c7b7fb0c0a9b18f5ca2d111996b0ddebEric Anholt   case MESA_FORMAT_YCBCR:
12377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      return (type == GL_UNSIGNED_SHORT_8_8_MESA || type == GL_UNSIGNED_BYTE);
12477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   default:
1253bb536e4c7b7fb0c0a9b18f5ca2d111996b0ddebEric Anholt      return false;
12677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   }
12777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt}
12877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
12977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
13077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt/* XXX: Do this for TexSubImage also:
13177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt */
1320ba23909475c085d81a5b181744c167ccbe53482Eric Anholtstatic bool
1339aff2944a449f586e32f537350e590910d09d016Eric Anholttry_pbo_upload(struct gl_context *ctx,
1349aff2944a449f586e32f537350e590910d09d016Eric Anholt               struct gl_texture_image *image,
13577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt               const struct gl_pixelstore_attrib *unpack,
136c5af8891805fc4f590c1371c098cdbc704c44e00Pauli Nieminen	       GLenum format, GLenum type, const void *pixels)
13777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{
1389aff2944a449f586e32f537350e590910d09d016Eric Anholt   struct intel_texture_image *intelImage = intel_texture_image(image);
1399aff2944a449f586e32f537350e590910d09d016Eric Anholt   struct intel_context *intel = intel_context(ctx);
14077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   struct intel_buffer_object *pbo = intel_buffer_object(unpack->BufferObj);
14177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   GLuint src_offset, src_stride;
1422d17dbfb5346b6d75e87c839148cbe125bf5cd6dEric Anholt   GLuint dst_x, dst_y, dst_stride;
1430ba23909475c085d81a5b181744c167ccbe53482Eric Anholt   drm_intel_bo *dst_buffer, *src_buffer;
1440ba23909475c085d81a5b181744c167ccbe53482Eric Anholt
1450ba23909475c085d81a5b181744c167ccbe53482Eric Anholt   if (!_mesa_is_bufferobj(unpack->BufferObj))
1460ba23909475c085d81a5b181744c167ccbe53482Eric Anholt      return false;
1470ba23909475c085d81a5b181744c167ccbe53482Eric Anholt
1480ba23909475c085d81a5b181744c167ccbe53482Eric Anholt   DBG("trying pbo upload\n");
14977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
1500ba23909475c085d81a5b181744c167ccbe53482Eric Anholt   if (intel->ctx._ImageTransferState ||
15177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt       unpack->SkipPixels || unpack->SkipRows) {
1520ba23909475c085d81a5b181744c167ccbe53482Eric Anholt      DBG("%s: image transfer\n", __FUNCTION__);
1530ba23909475c085d81a5b181744c167ccbe53482Eric Anholt      return false;
15477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   }
15577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
1563bb536e4c7b7fb0c0a9b18f5ca2d111996b0ddebEric Anholt   if (!check_pbo_format(format, type, intelImage->base.Base.TexFormat)) {
1570ba23909475c085d81a5b181744c167ccbe53482Eric Anholt      DBG("%s: format mismatch (upload to %s with format 0x%x, type 0x%x)\n",
1580ba23909475c085d81a5b181744c167ccbe53482Eric Anholt	  __FUNCTION__, _mesa_get_format_name(intelImage->base.Base.TexFormat),
1590ba23909475c085d81a5b181744c167ccbe53482Eric Anholt	  format, type);
1600ba23909475c085d81a5b181744c167ccbe53482Eric Anholt      return false;
1610ba23909475c085d81a5b181744c167ccbe53482Eric Anholt   }
1620ba23909475c085d81a5b181744c167ccbe53482Eric Anholt
163c9a7dfcf92e6adb4b85338c2c8dbbfbaf39fbfe7Pauli Nieminen   ctx->Driver.AllocTextureImageBuffer(ctx, image);
1649aff2944a449f586e32f537350e590910d09d016Eric Anholt
1659aff2944a449f586e32f537350e590910d09d016Eric Anholt   if (!intelImage->mt) {
1669aff2944a449f586e32f537350e590910d09d016Eric Anholt      DBG("%s: no miptree\n", __FUNCTION__);
1679aff2944a449f586e32f537350e590910d09d016Eric Anholt      return false;
1689aff2944a449f586e32f537350e590910d09d016Eric Anholt   }
1699aff2944a449f586e32f537350e590910d09d016Eric Anholt
1708004a1cb95b8a195f3f4bbaa8d39d2f3297167deEric Anholt   dst_buffer = intelImage->mt->region->bo;
17186939e05d232d9b882f0b427b2efad9d754f463aEric Anholt   src_buffer = intel_bufferobj_source(intel, pbo, 64, &src_offset);
17236daee1c7bec44b9d3641f056c84b3b2f39fabd9Brian Paul   /* note: potential 64-bit ptr to 32-bit int cast */
17386939e05d232d9b882f0b427b2efad9d754f463aEric Anholt   src_offset += (GLuint) (unsigned long) pixels;
17477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
17577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   if (unpack->RowLength > 0)
17677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      src_stride = unpack->RowLength;
17777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   else
178c5af8891805fc4f590c1371c098cdbc704c44e00Pauli Nieminen      src_stride = image->Width;
17977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
180fa2c886863492cc3eeee6d2059ae24edc1cb2bffBrian Paul   intel_miptree_get_image_offset(intelImage->mt, intelImage->base.Base.Level,
181fa2c886863492cc3eeee6d2059ae24edc1cb2bffBrian Paul				  intelImage->base.Base.Face, 0,
1822d17dbfb5346b6d75e87c839148cbe125bf5cd6dEric Anholt				  &dst_x, &dst_y);
18377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
184362c1bf75eb74de5b4655c481b74f79718ed4a34Eric Anholt   dst_stride = intelImage->mt->region->pitch;
18577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
18686939e05d232d9b882f0b427b2efad9d754f463aEric Anholt   if (!intelEmitCopyBlit(intel,
18786939e05d232d9b882f0b427b2efad9d754f463aEric Anholt			  intelImage->mt->cpp,
18886939e05d232d9b882f0b427b2efad9d754f463aEric Anholt			  src_stride, src_buffer,
1892e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke			  src_offset, false,
19086939e05d232d9b882f0b427b2efad9d754f463aEric Anholt			  dst_stride, dst_buffer, 0,
19186939e05d232d9b882f0b427b2efad9d754f463aEric Anholt			  intelImage->mt->region->tiling,
192c5af8891805fc4f590c1371c098cdbc704c44e00Pauli Nieminen			  0, 0, dst_x, dst_y, image->Width, image->Height,
19386939e05d232d9b882f0b427b2efad9d754f463aEric Anholt			  GL_COPY)) {
19486939e05d232d9b882f0b427b2efad9d754f463aEric Anholt      DBG("%s: blit failed\n", __FUNCTION__);
19586939e05d232d9b882f0b427b2efad9d754f463aEric Anholt      return false;
19677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   }
19777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
1980ba23909475c085d81a5b181744c167ccbe53482Eric Anholt   DBG("%s: success\n", __FUNCTION__);
1990ba23909475c085d81a5b181744c167ccbe53482Eric Anholt   return true;
20077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt}
20177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
20277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtstatic void
203f9995b30756140724f41daf963fa06167912be7fKristian HøgsbergintelTexImage(struct gl_context * ctx,
2048f5fffe75d2f8ae7c7ee706b53379a25bc673ae4Brian Paul              GLuint dims,
20592c64624cd7533cde466dbec8722f7f72f275fd8Brian Paul              struct gl_texture_image *texImage,
20677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt              GLenum format, GLenum type, const void *pixels,
2078f5fffe75d2f8ae7c7ee706b53379a25bc673ae4Brian Paul              const struct gl_pixelstore_attrib *unpack)
20877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{
2094ad8a0adec588b4c2c5a8f93265ed46cee5d3ff6Eric Anholt   DBG("%s target %s level %d %dx%dx%d\n", __FUNCTION__,
21092c64624cd7533cde466dbec8722f7f72f275fd8Brian Paul       _mesa_lookup_enum_by_nr(texImage->TexObject->Target),
211c5af8891805fc4f590c1371c098cdbc704c44e00Pauli Nieminen       texImage->Level, texImage->Width, texImage->Height, texImage->Depth);
21277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
2130ba23909475c085d81a5b181744c167ccbe53482Eric Anholt   /* Attempt to use the blitter for PBO image uploads.
21477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt    */
21577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   if (dims <= 2 &&
216c5af8891805fc4f590c1371c098cdbc704c44e00Pauli Nieminen       try_pbo_upload(ctx, texImage, unpack, format, type, pixels)) {
2170ba23909475c085d81a5b181744c167ccbe53482Eric Anholt      return;
21877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   }
21977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
2209aff2944a449f586e32f537350e590910d09d016Eric Anholt   DBG("%s: upload image %dx%dx%d pixels %p\n",
221c5af8891805fc4f590c1371c098cdbc704c44e00Pauli Nieminen       __FUNCTION__, texImage->Width, texImage->Height, texImage->Depth,
222c5af8891805fc4f590c1371c098cdbc704c44e00Pauli Nieminen       pixels);
22377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
224c5af8891805fc4f590c1371c098cdbc704c44e00Pauli Nieminen   _mesa_store_teximage(ctx, dims, texImage,
2258f5fffe75d2f8ae7c7ee706b53379a25bc673ae4Brian Paul                        format, type, pixels, unpack);
22677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt}
22777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
22877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
229fdd4961443d0fbb968c07f5b693c45785ae416f5Eric Anholt/**
230fdd4961443d0fbb968c07f5b693c45785ae416f5Eric Anholt * Binds a region to a texture image, like it was uploaded by glTexImage2D().
231fdd4961443d0fbb968c07f5b693c45785ae416f5Eric Anholt *
232fdd4961443d0fbb968c07f5b693c45785ae416f5Eric Anholt * Used for GLX_EXT_texture_from_pixmap and EGL image extensions,
233fdd4961443d0fbb968c07f5b693c45785ae416f5Eric Anholt */
234fdd4961443d0fbb968c07f5b693c45785ae416f5Eric Anholtstatic void
235fdd4961443d0fbb968c07f5b693c45785ae416f5Eric Anholtintel_set_texture_image_region(struct gl_context *ctx,
236fdd4961443d0fbb968c07f5b693c45785ae416f5Eric Anholt			       struct gl_texture_image *image,
237fdd4961443d0fbb968c07f5b693c45785ae416f5Eric Anholt			       struct intel_region *region,
238fdd4961443d0fbb968c07f5b693c45785ae416f5Eric Anholt			       GLenum target,
239fdd4961443d0fbb968c07f5b693c45785ae416f5Eric Anholt			       GLenum internalFormat,
24002ebad900db4ef1ac42cbfb41b433919a4c857a2Kristian Høgsberg			       gl_format format,
24102ebad900db4ef1ac42cbfb41b433919a4c857a2Kristian Høgsberg                               uint32_t offset)
242fdd4961443d0fbb968c07f5b693c45785ae416f5Eric Anholt{
243fdd4961443d0fbb968c07f5b693c45785ae416f5Eric Anholt   struct intel_context *intel = intel_context(ctx);
244fdd4961443d0fbb968c07f5b693c45785ae416f5Eric Anholt   struct intel_texture_image *intel_image = intel_texture_image(image);
24515b58d8c2233f0e67257cb907c7d90fa23c723a5Eric Anholt   struct gl_texture_object *texobj = image->TexObject;
24615b58d8c2233f0e67257cb907c7d90fa23c723a5Eric Anholt   struct intel_texture_object *intel_texobj = intel_texture_object(texobj);
247fdd4961443d0fbb968c07f5b693c45785ae416f5Eric Anholt
248892a2542a3f0753a7064c710b96f077dd5490624Brian Paul   _mesa_init_teximage_fields(&intel->ctx, image,
249fdd4961443d0fbb968c07f5b693c45785ae416f5Eric Anholt			      region->width, region->height, 1,
250fdd4961443d0fbb968c07f5b693c45785ae416f5Eric Anholt			      0, internalFormat, format);
251fdd4961443d0fbb968c07f5b693c45785ae416f5Eric Anholt
252d430e81c3287eba4ee84ca1639a23f92bbe22c8eEric Anholt   ctx->Driver.FreeTextureImageBuffer(ctx, image);
253fdd4961443d0fbb968c07f5b693c45785ae416f5Eric Anholt
254fdd4961443d0fbb968c07f5b693c45785ae416f5Eric Anholt   intel_image->mt = intel_miptree_create_for_region(intel, target,
255fdd4961443d0fbb968c07f5b693c45785ae416f5Eric Anholt						     image->TexFormat,
256fdd4961443d0fbb968c07f5b693c45785ae416f5Eric Anholt						     region);
257fdd4961443d0fbb968c07f5b693c45785ae416f5Eric Anholt   if (intel_image->mt == NULL)
258fdd4961443d0fbb968c07f5b693c45785ae416f5Eric Anholt       return;
259fdd4961443d0fbb968c07f5b693c45785ae416f5Eric Anholt
26002ebad900db4ef1ac42cbfb41b433919a4c857a2Kristian Høgsberg   intel_image->mt->offset = offset;
2616e0f9001fe3fb191c2928bd09aa9e9d05ddf4ea9Brian Paul   intel_image->base.RowStride = region->pitch;
26215b58d8c2233f0e67257cb907c7d90fa23c723a5Eric Anholt
26315b58d8c2233f0e67257cb907c7d90fa23c723a5Eric Anholt   /* Immediately validate the image to the object. */
26415b58d8c2233f0e67257cb907c7d90fa23c723a5Eric Anholt   intel_miptree_reference(&intel_texobj->mt, intel_image->mt);
265fdd4961443d0fbb968c07f5b693c45785ae416f5Eric Anholt}
266fdd4961443d0fbb968c07f5b693c45785ae416f5Eric Anholt
2676d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsbergvoid
26866175aac7609ad314f25fbdff0d3958af310dc24Eric AnholtintelSetTexBuffer2(__DRIcontext *pDRICtx, GLint target,
269debf00e5fc3828f63e0f99d72c7fa6cd6ce012c5Kristian Høgsberg		   GLint texture_format,
27066175aac7609ad314f25fbdff0d3958af310dc24Eric Anholt		   __DRIdrawable *dPriv)
2716d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsberg{
272d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg   struct gl_framebuffer *fb = dPriv->driverPrivate;
273e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg   struct intel_context *intel = pDRICtx->driverPrivate;
274f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg   struct gl_context *ctx = &intel->ctx;
2756d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsberg   struct intel_texture_object *intelObj;
276dcbe215c015c8dc48440f578023c2b9d12b934e4Kristian Høgsberg   struct intel_renderbuffer *rb;
2776d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsberg   struct gl_texture_object *texObj;
2786d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsberg   struct gl_texture_image *texImage;
2791c1040dcf02898fe99316ea2bf5482a5bb2356cfEric Anholt   int level = 0, internalFormat = 0;
2801c1040dcf02898fe99316ea2bf5482a5bb2356cfEric Anholt   gl_format texFormat = MESA_FORMAT_NONE;
2816d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsberg
282ee7dfbbd6cc85f221b371bf512bd1571744158e8Eric Anholt   texObj = _mesa_get_current_tex_object(ctx, target);
2836d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsberg   intelObj = intel_texture_object(texObj);
2846d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsberg
2856d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsberg   if (!intelObj)
2866d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsberg      return;
2876d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsberg
288f829e76d8835382b8a52224dfbb2556360e41ffcKristian Høgsberg   if (dPriv->lastStamp != dPriv->dri2.stamp ||
289f829e76d8835382b8a52224dfbb2556360e41ffcKristian Høgsberg       !pDRICtx->driScreenPriv->dri2.useInvalidate)
290f829e76d8835382b8a52224dfbb2556360e41ffcKristian Høgsberg      intel_update_renderbuffers(pDRICtx, dPriv);
291dcbe215c015c8dc48440f578023c2b9d12b934e4Kristian Høgsberg
292d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg   rb = intel_get_renderbuffer(fb, BUFFER_FRONT_LEFT);
29334bba445a12f7b81654a416fd1630c8890cfc178Eric Anholt   /* If the region isn't set, then intel_update_renderbuffers was unable
29434bba445a12f7b81654a416fd1630c8890cfc178Eric Anholt    * to get the buffers for the drawable.
29534bba445a12f7b81654a416fd1630c8890cfc178Eric Anholt    */
296da2816a45e6e3a33246a341fee72e6f893f315d9Chad Versace   if (!rb || !rb->mt)
29734bba445a12f7b81654a416fd1630c8890cfc178Eric Anholt      return;
29834bba445a12f7b81654a416fd1630c8890cfc178Eric Anholt
2997b6424143d8bf572cadd46adcbaa91d2a5598635Dave Airlie   if (rb->mt->cpp == 4) {
3007b6424143d8bf572cadd46adcbaa91d2a5598635Dave Airlie      if (texture_format == __DRI_TEXTURE_FORMAT_RGB) {
3017b6424143d8bf572cadd46adcbaa91d2a5598635Dave Airlie         internalFormat = GL_RGB;
3027b6424143d8bf572cadd46adcbaa91d2a5598635Dave Airlie         texFormat = MESA_FORMAT_XRGB8888;
3037b6424143d8bf572cadd46adcbaa91d2a5598635Dave Airlie      }
3047b6424143d8bf572cadd46adcbaa91d2a5598635Dave Airlie      else {
3057b6424143d8bf572cadd46adcbaa91d2a5598635Dave Airlie         internalFormat = GL_RGBA;
3067b6424143d8bf572cadd46adcbaa91d2a5598635Dave Airlie         texFormat = MESA_FORMAT_ARGB8888;
3077b6424143d8bf572cadd46adcbaa91d2a5598635Dave Airlie      }
3087b6424143d8bf572cadd46adcbaa91d2a5598635Dave Airlie   } else if (rb->mt->cpp == 2) {
30966175aac7609ad314f25fbdff0d3958af310dc24Eric Anholt      internalFormat = GL_RGB;
3107b6424143d8bf572cadd46adcbaa91d2a5598635Dave Airlie      texFormat = MESA_FORMAT_RGB565;
31183e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul   }
3126d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsberg
3136d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsberg   _mesa_lock_texture(&intel->ctx, texObj);
314fdd4961443d0fbb968c07f5b693c45785ae416f5Eric Anholt   texImage = _mesa_get_tex_image(ctx, texObj, target, level);
315da2816a45e6e3a33246a341fee72e6f893f315d9Chad Versace   intel_set_texture_image_region(ctx, texImage, rb->mt->region, target,
31602ebad900db4ef1ac42cbfb41b433919a4c857a2Kristian Høgsberg				  internalFormat, texFormat, 0);
3176d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsberg   _mesa_unlock_texture(&intel->ctx, texObj);
3186d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsberg}
31966175aac7609ad314f25fbdff0d3958af310dc24Eric Anholt
32066175aac7609ad314f25fbdff0d3958af310dc24Eric Anholtvoid
32166175aac7609ad314f25fbdff0d3958af310dc24Eric AnholtintelSetTexBuffer(__DRIcontext *pDRICtx, GLint target, __DRIdrawable *dPriv)
32266175aac7609ad314f25fbdff0d3958af310dc24Eric Anholt{
32366175aac7609ad314f25fbdff0d3958af310dc24Eric Anholt   /* The old interface didn't have the format argument, so copy our
32466175aac7609ad314f25fbdff0d3958af310dc24Eric Anholt    * implementation's behavior at the time.
32566175aac7609ad314f25fbdff0d3958af310dc24Eric Anholt    */
326debf00e5fc3828f63e0f99d72c7fa6cd6ce012c5Kristian Høgsberg   intelSetTexBuffer2(pDRICtx, target, __DRI_TEXTURE_FORMAT_RGBA, dPriv);
32766175aac7609ad314f25fbdff0d3958af310dc24Eric Anholt}
32889205a8760b8a4651962b1ff0206699cbcd78d75Brian Paul
32910e79627414bc2bbc72d68ed25fb9999948a294fKristian Høgsberg#if FEATURE_OES_EGL_image
33010e79627414bc2bbc72d68ed25fb9999948a294fKristian Høgsbergstatic void
331f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergintel_image_target_texture_2d(struct gl_context *ctx, GLenum target,
33210e79627414bc2bbc72d68ed25fb9999948a294fKristian Høgsberg			      struct gl_texture_object *texObj,
33310e79627414bc2bbc72d68ed25fb9999948a294fKristian Høgsberg			      struct gl_texture_image *texImage,
33410e79627414bc2bbc72d68ed25fb9999948a294fKristian Høgsberg			      GLeglImageOES image_handle)
33510e79627414bc2bbc72d68ed25fb9999948a294fKristian Høgsberg{
33610e79627414bc2bbc72d68ed25fb9999948a294fKristian Høgsberg   struct intel_context *intel = intel_context(ctx);
33710e79627414bc2bbc72d68ed25fb9999948a294fKristian Høgsberg   __DRIscreen *screen;
33810e79627414bc2bbc72d68ed25fb9999948a294fKristian Høgsberg   __DRIimage *image;
33910e79627414bc2bbc72d68ed25fb9999948a294fKristian Høgsberg
34010e79627414bc2bbc72d68ed25fb9999948a294fKristian Høgsberg   screen = intel->intelScreen->driScrnPriv;
34117eace581d25a626a7d75d9d1205d012cbb14a6eKristian Høgsberg   image = screen->dri2.image->lookupEGLImage(screen, image_handle,
34217eace581d25a626a7d75d9d1205d012cbb14a6eKristian Høgsberg					      screen->loaderPrivate);
34310e79627414bc2bbc72d68ed25fb9999948a294fKristian Høgsberg   if (image == NULL)
34410e79627414bc2bbc72d68ed25fb9999948a294fKristian Høgsberg      return;
34510e79627414bc2bbc72d68ed25fb9999948a294fKristian Høgsberg
346fdd4961443d0fbb968c07f5b693c45785ae416f5Eric Anholt   intel_set_texture_image_region(ctx, texImage, image->region,
34702ebad900db4ef1ac42cbfb41b433919a4c857a2Kristian Høgsberg				  target, image->internal_format,
34895bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg                                  image->format, image->offset);
34910e79627414bc2bbc72d68ed25fb9999948a294fKristian Høgsberg}
35010e79627414bc2bbc72d68ed25fb9999948a294fKristian Høgsberg#endif
35189205a8760b8a4651962b1ff0206699cbcd78d75Brian Paul
35289205a8760b8a4651962b1ff0206699cbcd78d75Brian Paulvoid
35389205a8760b8a4651962b1ff0206699cbcd78d75Brian PaulintelInitTextureImageFuncs(struct dd_function_table *functions)
35489205a8760b8a4651962b1ff0206699cbcd78d75Brian Paul{
3558f5fffe75d2f8ae7c7ee706b53379a25bc673ae4Brian Paul   functions->TexImage = intelTexImage;
35689205a8760b8a4651962b1ff0206699cbcd78d75Brian Paul
35710e79627414bc2bbc72d68ed25fb9999948a294fKristian Høgsberg#if FEATURE_OES_EGL_image
35810e79627414bc2bbc72d68ed25fb9999948a294fKristian Høgsberg   functions->EGLImageTargetTexture2D = intel_image_target_texture_2d;
35910e79627414bc2bbc72d68ed25fb9999948a294fKristian Høgsberg#endif
36089205a8760b8a4651962b1ff0206699cbcd78d75Brian Paul}
361