Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. /*
  2.  * Copyright 2013 Intel Corporation
  3.  *
  4.  * Permission is hereby granted, free of charge, to any person obtaining a
  5.  * copy of this software and associated documentation files (the "Software"),
  6.  * to deal in the Software without restriction, including without limitation
  7.  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  8.  * and/or sell copies of the Software, and to permit persons to whom the
  9.  * Software is furnished to do so, subject to the following conditions:
  10.  *
  11.  * The above copyright notice and this permission notice (including the next
  12.  * paragraph) shall be included in all copies or substantial portions of the
  13.  * Software.
  14.  *
  15.  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  16.  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  17.  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  18.  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  19.  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  20.  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  21.  * DEALINGS IN THE SOFTWARE.
  22.  *
  23.  * Authors:
  24.  *    Francisco Jerez <currojerez@riseup.net>
  25.  */
  26.  
  27. #include <assert.h>
  28.  
  29. #include "shaderimage.h"
  30. #include "mtypes.h"
  31. #include "formats.h"
  32. #include "errors.h"
  33. #include "context.h"
  34. #include "texobj.h"
  35. #include "teximage.h"
  36. #include "enums.h"
  37.  
  38. /*
  39.  * Define endian-invariant aliases for some mesa formats that are
  40.  * defined in terms of their channel layout from LSB to MSB in a
  41.  * 32-bit word.  The actual byte offsets matter here because the user
  42.  * is allowed to bit-cast one format into another and get predictable
  43.  * results.
  44.  */
  45. #ifdef MESA_BIG_ENDIAN
  46. # define MESA_FORMAT_RGBA_8 MESA_FORMAT_A8B8G8R8_UNORM
  47. # define MESA_FORMAT_RG_16 MESA_FORMAT_G16R16_UNORM
  48. # define MESA_FORMAT_RG_8 MESA_FORMAT_G8R8_UNORM
  49. # define MESA_FORMAT_SIGNED_RGBA_8 MESA_FORMAT_A8B8G8R8_SNORM
  50. # define MESA_FORMAT_SIGNED_RG_16 MESA_FORMAT_G16R16_SNORM
  51. # define MESA_FORMAT_SIGNED_RG_8 MESA_FORMAT_G8R8_SNORM
  52. #else
  53. # define MESA_FORMAT_RGBA_8 MESA_FORMAT_R8G8B8A8_UNORM
  54. # define MESA_FORMAT_RG_16 MESA_FORMAT_R16G16_UNORM
  55. # define MESA_FORMAT_RG_8 MESA_FORMAT_R8G8_UNORM
  56. # define MESA_FORMAT_SIGNED_RGBA_8 MESA_FORMAT_R8G8B8A8_SNORM
  57. # define MESA_FORMAT_SIGNED_RG_16 MESA_FORMAT_R16G16_SNORM
  58. # define MESA_FORMAT_SIGNED_RG_8 MESA_FORMAT_R8G8_SNORM
  59. #endif
  60.  
  61. mesa_format
  62. _mesa_get_shader_image_format(GLenum format)
  63. {
  64.    switch (format) {
  65.    case GL_RGBA32F:
  66.       return MESA_FORMAT_RGBA_FLOAT32;
  67.  
  68.    case GL_RGBA16F:
  69.       return MESA_FORMAT_RGBA_FLOAT16;
  70.  
  71.    case GL_RG32F:
  72.       return MESA_FORMAT_RG_FLOAT32;
  73.  
  74.    case GL_RG16F:
  75.       return MESA_FORMAT_RG_FLOAT16;
  76.  
  77.    case GL_R11F_G11F_B10F:
  78.       return MESA_FORMAT_R11G11B10_FLOAT;
  79.  
  80.    case GL_R32F:
  81.       return MESA_FORMAT_R_FLOAT32;
  82.  
  83.    case GL_R16F:
  84.       return MESA_FORMAT_R_FLOAT16;
  85.  
  86.    case GL_RGBA32UI:
  87.       return MESA_FORMAT_RGBA_UINT32;
  88.  
  89.    case GL_RGBA16UI:
  90.       return MESA_FORMAT_RGBA_UINT16;
  91.  
  92.    case GL_RGB10_A2UI:
  93.       return MESA_FORMAT_R10G10B10A2_UINT;
  94.  
  95.    case GL_RGBA8UI:
  96.       return MESA_FORMAT_RGBA_UINT8;
  97.  
  98.    case GL_RG32UI:
  99.       return MESA_FORMAT_RG_UINT32;
  100.  
  101.    case GL_RG16UI:
  102.       return MESA_FORMAT_RG_UINT16;
  103.  
  104.    case GL_RG8UI:
  105.       return MESA_FORMAT_RG_UINT8;
  106.  
  107.    case GL_R32UI:
  108.       return MESA_FORMAT_R_UINT32;
  109.  
  110.    case GL_R16UI:
  111.       return MESA_FORMAT_R_UINT16;
  112.  
  113.    case GL_R8UI:
  114.       return MESA_FORMAT_R_UINT8;
  115.  
  116.    case GL_RGBA32I:
  117.       return MESA_FORMAT_RGBA_SINT32;
  118.  
  119.    case GL_RGBA16I:
  120.       return MESA_FORMAT_RGBA_SINT16;
  121.  
  122.    case GL_RGBA8I:
  123.       return MESA_FORMAT_RGBA_SINT8;
  124.  
  125.    case GL_RG32I:
  126.       return MESA_FORMAT_RG_SINT32;
  127.  
  128.    case GL_RG16I:
  129.       return MESA_FORMAT_RG_SINT16;
  130.  
  131.    case GL_RG8I:
  132.       return MESA_FORMAT_RG_SINT8;
  133.  
  134.    case GL_R32I:
  135.       return MESA_FORMAT_R_SINT32;
  136.  
  137.    case GL_R16I:
  138.       return MESA_FORMAT_R_SINT16;
  139.  
  140.    case GL_R8I:
  141.       return MESA_FORMAT_R_SINT8;
  142.  
  143.    case GL_RGBA16:
  144.       return MESA_FORMAT_RGBA_UNORM16;
  145.  
  146.    case GL_RGB10_A2:
  147.       return MESA_FORMAT_R10G10B10A2_UNORM;
  148.  
  149.    case GL_RGBA8:
  150.       return MESA_FORMAT_RGBA_8;
  151.  
  152.    case GL_RG16:
  153.       return MESA_FORMAT_RG_16;
  154.  
  155.    case GL_RG8:
  156.       return MESA_FORMAT_RG_8;
  157.  
  158.    case GL_R16:
  159.       return MESA_FORMAT_R_UNORM16;
  160.  
  161.    case GL_R8:
  162.       return MESA_FORMAT_R_UNORM8;
  163.  
  164.    case GL_RGBA16_SNORM:
  165.       return MESA_FORMAT_RGBA_SNORM16;
  166.  
  167.    case GL_RGBA8_SNORM:
  168.       return MESA_FORMAT_SIGNED_RGBA_8;
  169.  
  170.    case GL_RG16_SNORM:
  171.       return MESA_FORMAT_SIGNED_RG_16;
  172.  
  173.    case GL_RG8_SNORM:
  174.       return MESA_FORMAT_SIGNED_RG_8;
  175.  
  176.    case GL_R16_SNORM:
  177.       return MESA_FORMAT_R_SNORM16;
  178.  
  179.    case GL_R8_SNORM:
  180.       return MESA_FORMAT_R_SNORM8;
  181.  
  182.    default:
  183.       return MESA_FORMAT_NONE;
  184.    }
  185. }
  186.  
  187. enum image_format_class
  188. {
  189.    /** Not a valid image format. */
  190.    IMAGE_FORMAT_CLASS_NONE = 0,
  191.  
  192.    /** Classes of image formats you can cast into each other. */
  193.    /** \{ */
  194.    IMAGE_FORMAT_CLASS_1X8,
  195.    IMAGE_FORMAT_CLASS_1X16,
  196.    IMAGE_FORMAT_CLASS_1X32,
  197.    IMAGE_FORMAT_CLASS_2X8,
  198.    IMAGE_FORMAT_CLASS_2X16,
  199.    IMAGE_FORMAT_CLASS_2X32,
  200.    IMAGE_FORMAT_CLASS_10_11_11,
  201.    IMAGE_FORMAT_CLASS_4X8,
  202.    IMAGE_FORMAT_CLASS_4X16,
  203.    IMAGE_FORMAT_CLASS_4X32,
  204.    IMAGE_FORMAT_CLASS_2_10_10_10
  205.    /** \} */
  206. };
  207.  
  208. static enum image_format_class
  209. get_image_format_class(mesa_format format)
  210. {
  211.    switch (format) {
  212.    case MESA_FORMAT_RGBA_FLOAT32:
  213.       return IMAGE_FORMAT_CLASS_4X32;
  214.  
  215.    case MESA_FORMAT_RGBA_FLOAT16:
  216.       return IMAGE_FORMAT_CLASS_4X16;
  217.  
  218.    case MESA_FORMAT_RG_FLOAT32:
  219.       return IMAGE_FORMAT_CLASS_2X32;
  220.  
  221.    case MESA_FORMAT_RG_FLOAT16:
  222.       return IMAGE_FORMAT_CLASS_2X16;
  223.  
  224.    case MESA_FORMAT_R11G11B10_FLOAT:
  225.       return IMAGE_FORMAT_CLASS_10_11_11;
  226.  
  227.    case MESA_FORMAT_R_FLOAT32:
  228.       return IMAGE_FORMAT_CLASS_1X32;
  229.  
  230.    case MESA_FORMAT_R_FLOAT16:
  231.       return IMAGE_FORMAT_CLASS_1X16;
  232.  
  233.    case MESA_FORMAT_RGBA_UINT32:
  234.       return IMAGE_FORMAT_CLASS_4X32;
  235.  
  236.    case MESA_FORMAT_RGBA_UINT16:
  237.       return IMAGE_FORMAT_CLASS_4X16;
  238.  
  239.    case MESA_FORMAT_R10G10B10A2_UINT:
  240.       return IMAGE_FORMAT_CLASS_2_10_10_10;
  241.  
  242.    case MESA_FORMAT_RGBA_UINT8:
  243.       return IMAGE_FORMAT_CLASS_4X8;
  244.  
  245.    case MESA_FORMAT_RG_UINT32:
  246.       return IMAGE_FORMAT_CLASS_2X32;
  247.  
  248.    case MESA_FORMAT_RG_UINT16:
  249.       return IMAGE_FORMAT_CLASS_2X16;
  250.  
  251.    case MESA_FORMAT_RG_UINT8:
  252.       return IMAGE_FORMAT_CLASS_2X8;
  253.  
  254.    case MESA_FORMAT_R_UINT32:
  255.       return IMAGE_FORMAT_CLASS_1X32;
  256.  
  257.    case MESA_FORMAT_R_UINT16:
  258.       return IMAGE_FORMAT_CLASS_1X16;
  259.  
  260.    case MESA_FORMAT_R_UINT8:
  261.       return IMAGE_FORMAT_CLASS_1X8;
  262.  
  263.    case MESA_FORMAT_RGBA_SINT32:
  264.       return IMAGE_FORMAT_CLASS_4X32;
  265.  
  266.    case MESA_FORMAT_RGBA_SINT16:
  267.       return IMAGE_FORMAT_CLASS_4X16;
  268.  
  269.    case MESA_FORMAT_RGBA_SINT8:
  270.       return IMAGE_FORMAT_CLASS_4X8;
  271.  
  272.    case MESA_FORMAT_RG_SINT32:
  273.       return IMAGE_FORMAT_CLASS_2X32;
  274.  
  275.    case MESA_FORMAT_RG_SINT16:
  276.       return IMAGE_FORMAT_CLASS_2X16;
  277.  
  278.    case MESA_FORMAT_RG_SINT8:
  279.       return IMAGE_FORMAT_CLASS_2X8;
  280.  
  281.    case MESA_FORMAT_R_SINT32:
  282.       return IMAGE_FORMAT_CLASS_1X32;
  283.  
  284.    case MESA_FORMAT_R_SINT16:
  285.       return IMAGE_FORMAT_CLASS_1X16;
  286.  
  287.    case MESA_FORMAT_R_SINT8:
  288.       return IMAGE_FORMAT_CLASS_1X8;
  289.  
  290.    case MESA_FORMAT_RGBA_UNORM16:
  291.       return IMAGE_FORMAT_CLASS_4X16;
  292.  
  293.    case MESA_FORMAT_R10G10B10A2_UNORM:
  294.       return IMAGE_FORMAT_CLASS_2_10_10_10;
  295.  
  296.    case MESA_FORMAT_RGBA_8:
  297.       return IMAGE_FORMAT_CLASS_4X8;
  298.  
  299.    case MESA_FORMAT_RG_16:
  300.       return IMAGE_FORMAT_CLASS_2X16;
  301.  
  302.    case MESA_FORMAT_RG_8:
  303.       return IMAGE_FORMAT_CLASS_2X8;
  304.  
  305.    case MESA_FORMAT_R_UNORM16:
  306.       return IMAGE_FORMAT_CLASS_1X16;
  307.  
  308.    case MESA_FORMAT_R_UNORM8:
  309.       return IMAGE_FORMAT_CLASS_1X8;
  310.  
  311.    case MESA_FORMAT_RGBA_SNORM16:
  312.       return IMAGE_FORMAT_CLASS_4X16;
  313.  
  314.    case MESA_FORMAT_SIGNED_RGBA_8:
  315.       return IMAGE_FORMAT_CLASS_4X8;
  316.  
  317.    case MESA_FORMAT_SIGNED_RG_16:
  318.       return IMAGE_FORMAT_CLASS_2X16;
  319.  
  320.    case MESA_FORMAT_SIGNED_RG_8:
  321.       return IMAGE_FORMAT_CLASS_2X8;
  322.  
  323.    case MESA_FORMAT_R_SNORM16:
  324.       return IMAGE_FORMAT_CLASS_1X16;
  325.  
  326.    case MESA_FORMAT_R_SNORM8:
  327.       return IMAGE_FORMAT_CLASS_1X8;
  328.  
  329.    default:
  330.       return IMAGE_FORMAT_CLASS_NONE;
  331.    }
  332. }
  333.  
  334. void
  335. _mesa_init_image_units(struct gl_context *ctx)
  336. {
  337.    unsigned i;
  338.  
  339.    for (i = 0; i < ARRAY_SIZE(ctx->ImageUnits); ++i) {
  340.       struct gl_image_unit *u = &ctx->ImageUnits[i];
  341.       u->Access = GL_READ_ONLY;
  342.       u->Format = GL_R8;
  343.       u->_ActualFormat = _mesa_get_shader_image_format(u->Format);
  344.    }
  345. }
  346.  
  347. static GLboolean
  348. validate_image_unit(struct gl_context *ctx, struct gl_image_unit *u)
  349. {
  350.    struct gl_texture_object *t = u->TexObj;
  351.    mesa_format tex_format;
  352.  
  353.    if (!t)
  354.       return GL_FALSE;
  355.  
  356.    _mesa_test_texobj_completeness(ctx, t);
  357.  
  358.    if (u->Level < t->BaseLevel ||
  359.        u->Level > t->_MaxLevel ||
  360.        (u->Level == t->BaseLevel && !t->_BaseComplete) ||
  361.        (u->Level != t->BaseLevel && !t->_MipmapComplete))
  362.       return GL_FALSE;
  363.  
  364.    if (_mesa_tex_target_is_layered(t->Target) &&
  365.        u->Layer >= _mesa_get_texture_layers(t, u->Level))
  366.       return GL_FALSE;
  367.  
  368.    if (t->Target == GL_TEXTURE_BUFFER) {
  369.       tex_format = _mesa_get_shader_image_format(t->BufferObjectFormat);
  370.  
  371.    } else {
  372.       struct gl_texture_image *img = (t->Target == GL_TEXTURE_CUBE_MAP ?
  373.                                       t->Image[u->Layer][u->Level] :
  374.                                       t->Image[0][u->Level]);
  375.  
  376.       if (!img || img->Border || img->NumSamples > ctx->Const.MaxImageSamples)
  377.          return GL_FALSE;
  378.  
  379.       tex_format = _mesa_get_shader_image_format(img->InternalFormat);
  380.    }
  381.  
  382.    if (!tex_format)
  383.       return GL_FALSE;
  384.  
  385.    switch (t->ImageFormatCompatibilityType) {
  386.    case GL_IMAGE_FORMAT_COMPATIBILITY_BY_SIZE:
  387.       if (_mesa_get_format_bytes(tex_format) !=
  388.           _mesa_get_format_bytes(u->_ActualFormat))
  389.          return GL_FALSE;
  390.       break;
  391.  
  392.    case GL_IMAGE_FORMAT_COMPATIBILITY_BY_CLASS:
  393.       if (get_image_format_class(tex_format) !=
  394.           get_image_format_class(u->_ActualFormat))
  395.          return GL_FALSE;
  396.       break;
  397.  
  398.    default:
  399.       assert(!"Unexpected image format compatibility type");
  400.    }
  401.  
  402.    return GL_TRUE;
  403. }
  404.  
  405. void
  406. _mesa_validate_image_units(struct gl_context *ctx)
  407. {
  408.    unsigned i;
  409.  
  410.    for (i = 0; i < ctx->Const.MaxImageUnits; ++i) {
  411.       struct gl_image_unit *u = &ctx->ImageUnits[i];
  412.       u->_Valid = validate_image_unit(ctx, u);
  413.    }
  414. }
  415.  
  416. static GLboolean
  417. validate_bind_image_texture(struct gl_context *ctx, GLuint unit,
  418.                             GLuint texture, GLint level, GLboolean layered,
  419.                             GLint layer, GLenum access, GLenum format)
  420. {
  421.    assert(ctx->Const.MaxImageUnits <= MAX_IMAGE_UNITS);
  422.  
  423.    if (unit >= ctx->Const.MaxImageUnits) {
  424.       _mesa_error(ctx, GL_INVALID_VALUE, "glBindImageTexture(unit)");
  425.       return GL_FALSE;
  426.    }
  427.  
  428.    if (level < 0) {
  429.       _mesa_error(ctx, GL_INVALID_VALUE, "glBindImageTexture(level)");
  430.       return GL_FALSE;
  431.    }
  432.  
  433.    if (layer < 0) {
  434.       _mesa_error(ctx, GL_INVALID_VALUE, "glBindImageTexture(layer)");
  435.       return GL_FALSE;
  436.    }
  437.  
  438.    if (access != GL_READ_ONLY &&
  439.        access != GL_WRITE_ONLY &&
  440.        access != GL_READ_WRITE) {
  441.       _mesa_error(ctx, GL_INVALID_VALUE, "glBindImageTexture(access)");
  442.       return GL_FALSE;
  443.    }
  444.  
  445.    if (!_mesa_get_shader_image_format(format)) {
  446.       _mesa_error(ctx, GL_INVALID_VALUE, "glBindImageTexture(format)");
  447.       return GL_FALSE;
  448.    }
  449.  
  450.    return GL_TRUE;
  451. }
  452.  
  453. void GLAPIENTRY
  454. _mesa_BindImageTexture(GLuint unit, GLuint texture, GLint level,
  455.                        GLboolean layered, GLint layer, GLenum access,
  456.                        GLenum format)
  457. {
  458.    GET_CURRENT_CONTEXT(ctx);
  459.    struct gl_image_unit *u;
  460.  
  461.    if (!validate_bind_image_texture(ctx, unit, texture, level,
  462.                                     layered, layer, access, format))
  463.       return;
  464.  
  465.    u = &ctx->ImageUnits[unit];
  466.  
  467.    FLUSH_VERTICES(ctx, 0);
  468.    ctx->NewDriverState |= ctx->DriverFlags.NewImageUnits;
  469.  
  470.    if (texture) {
  471.       struct gl_texture_object *t = _mesa_lookup_texture(ctx, texture);
  472.  
  473.       if (!t) {
  474.          _mesa_error(ctx, GL_INVALID_VALUE, "glBindImageTexture(texture)");
  475.          return;
  476.       }
  477.  
  478.       _mesa_reference_texobj(&u->TexObj, t);
  479.    } else {
  480.       _mesa_reference_texobj(&u->TexObj, NULL);
  481.    }
  482.  
  483.    u->Level = level;
  484.    u->Access = access;
  485.    u->Format = format;
  486.    u->_ActualFormat = _mesa_get_shader_image_format(format);
  487.    u->_Valid = validate_image_unit(ctx, u);
  488.  
  489.    if (u->TexObj && _mesa_tex_target_is_layered(u->TexObj->Target)) {
  490.       u->Layered = layered;
  491.       u->Layer = (layered ? 0 : layer);
  492.    } else {
  493.       u->Layered = GL_FALSE;
  494.       u->Layer = 0;
  495.    }
  496.  
  497.    if (ctx->Driver.BindImageTexture)
  498.       ctx->Driver.BindImageTexture(ctx, u, u->TexObj, level, layered,
  499.                                    layer, access, format);
  500. }
  501.  
  502. void GLAPIENTRY
  503. _mesa_BindImageTextures(GLuint first, GLsizei count, const GLuint *textures)
  504. {
  505.    GET_CURRENT_CONTEXT(ctx);
  506.    int i;
  507.  
  508.    if (!ctx->Extensions.ARB_shader_image_load_store) {
  509.       _mesa_error(ctx, GL_INVALID_OPERATION, "glBindImageTextures()");
  510.       return;
  511.    }
  512.  
  513.    if (first + count > ctx->Const.MaxImageUnits) {
  514.       /* The ARB_multi_bind spec says:
  515.        *
  516.        *    "An INVALID_OPERATION error is generated if <first> + <count>
  517.        *     is greater than the number of image units supported by
  518.        *     the implementation."
  519.        */
  520.       _mesa_error(ctx, GL_INVALID_OPERATION,
  521.                   "glBindImageTextures(first=%u + count=%d > the value of "
  522.                   "GL_MAX_IMAGE_UNITS=%u)",
  523.                   first, count, ctx->Const.MaxImageUnits);
  524.       return;
  525.    }
  526.  
  527.    /* Assume that at least one binding will be changed */
  528.    FLUSH_VERTICES(ctx, 0);
  529.    ctx->NewDriverState |= ctx->DriverFlags.NewImageUnits;
  530.  
  531.    /* Note that the error semantics for multi-bind commands differ from
  532.     * those of other GL commands.
  533.     *
  534.     * The Issues section in the ARB_multi_bind spec says:
  535.     *
  536.     *    "(11) Typically, OpenGL specifies that if an error is generated by
  537.     *          a command, that command has no effect.  This is somewhat
  538.     *          unfortunate for multi-bind commands, because it would require
  539.     *          a first pass to scan the entire list of bound objects for
  540.     *          errors and then a second pass to actually perform the
  541.     *          bindings.  Should we have different error semantics?
  542.     *
  543.     *       RESOLVED:  Yes.  In this specification, when the parameters for
  544.     *       one of the <count> binding points are invalid, that binding
  545.     *       point is not updated and an error will be generated.  However,
  546.     *       other binding points in the same command will be updated if
  547.     *       their parameters are valid and no other error occurs."
  548.     */
  549.  
  550.    _mesa_begin_texture_lookups(ctx);
  551.  
  552.    for (i = 0; i < count; i++) {
  553.       struct gl_image_unit *u = &ctx->ImageUnits[first + i];
  554.       const GLuint texture = textures ? textures[i] : 0;
  555.  
  556.       if (texture != 0) {
  557.          struct gl_texture_object *texObj;
  558.          GLenum tex_format;
  559.  
  560.          if (!u->TexObj || u->TexObj->Name != texture) {
  561.             texObj = _mesa_lookup_texture_locked(ctx, texture);
  562.             if (!texObj) {
  563.                /* The ARB_multi_bind spec says:
  564.                 *
  565.                 *    "An INVALID_OPERATION error is generated if any value
  566.                 *     in <textures> is not zero or the name of an existing
  567.                 *     texture object (per binding)."
  568.                 */
  569.                _mesa_error(ctx, GL_INVALID_OPERATION,
  570.                            "glBindImageTextures(textures[%d]=%u "
  571.                            "is not zero or the name of an existing texture "
  572.                            "object)", i, texture);
  573.                continue;
  574.             }
  575.          } else {
  576.             texObj = u->TexObj;
  577.          }
  578.  
  579.          if (texObj->Target == GL_TEXTURE_BUFFER) {
  580.             tex_format = texObj->BufferObjectFormat;
  581.          } else {
  582.             struct gl_texture_image *image = texObj->Image[0][0];
  583.  
  584.             if (!image || image->Width == 0 || image->Height == 0 ||
  585.                 image->Depth == 0) {
  586.                /* The ARB_multi_bind spec says:
  587.                 *
  588.                 *    "An INVALID_OPERATION error is generated if the width,
  589.                 *     height, or depth of the level zero texture image of
  590.                 *     any texture in <textures> is zero (per binding)."
  591.                 */
  592.                _mesa_error(ctx, GL_INVALID_OPERATION,
  593.                            "glBindImageTextures(the width, height or depth "
  594.                            "of the level zero texture image of "
  595.                            "textures[%d]=%u is zero)", i, texture);
  596.                continue;
  597.             }
  598.  
  599.             tex_format = image->InternalFormat;
  600.          }
  601.  
  602.          if (_mesa_get_shader_image_format(tex_format) == MESA_FORMAT_NONE) {
  603.             /* The ARB_multi_bind spec says:
  604.              *
  605.              *   "An INVALID_OPERATION error is generated if the internal
  606.              *    format of the level zero texture image of any texture
  607.              *    in <textures> is not found in table 8.33 (per binding)."
  608.              */
  609.             _mesa_error(ctx, GL_INVALID_OPERATION,
  610.                         "glBindImageTextures(the internal format %s of "
  611.                         "the level zero texture image of textures[%d]=%u "
  612.                         "is not supported)",
  613.                         _mesa_lookup_enum_by_nr(tex_format),
  614.                         i, texture);
  615.             continue;
  616.          }
  617.  
  618.          /* Update the texture binding */
  619.          _mesa_reference_texobj(&u->TexObj, texObj);
  620.          u->Level = 0;
  621.          u->Layered = _mesa_tex_target_is_layered(texObj->Target);
  622.          u->Layer = 0;
  623.          u->Access = GL_READ_WRITE;
  624.          u->Format = tex_format;
  625.          u->_ActualFormat = _mesa_get_shader_image_format(tex_format);
  626.          u->_Valid = validate_image_unit(ctx, u);
  627.       } else {
  628.          /* Unbind the texture from the unit */
  629.          _mesa_reference_texobj(&u->TexObj, NULL);
  630.          u->Level = 0;
  631.          u->Layered = GL_FALSE;
  632.          u->Layer = 0;
  633.          u->Access = GL_READ_ONLY;
  634.          u->Format = GL_R8;
  635.          u->_ActualFormat = MESA_FORMAT_R_UNORM8;
  636.          u->_Valid = GL_FALSE;
  637.       }
  638.  
  639.       /* Pass the BindImageTexture call down to the device driver */
  640.       if (ctx->Driver.BindImageTexture)
  641.          ctx->Driver.BindImageTexture(ctx, u, u->TexObj, u->Level, u->Layered,
  642.                                       u->Layer, u->Access, u->Format);
  643.    }
  644.  
  645.    _mesa_end_texture_lookups(ctx);
  646. }
  647.  
  648. void GLAPIENTRY
  649. _mesa_MemoryBarrier(GLbitfield barriers)
  650. {
  651.    GET_CURRENT_CONTEXT(ctx);
  652.  
  653.    if (ctx->Driver.MemoryBarrier)
  654.       ctx->Driver.MemoryBarrier(ctx, barriers);
  655. }
  656.