10b96a086cbb4bcf0a5aab1fee6d77c1e40295297Eric Anholt/*
20b96a086cbb4bcf0a5aab1fee6d77c1e40295297Eric Anholt * Copyright © 2011 Marek Olšák <maraeo@gmail.com>
30b96a086cbb4bcf0a5aab1fee6d77c1e40295297Eric Anholt *
40b96a086cbb4bcf0a5aab1fee6d77c1e40295297Eric Anholt * Permission is hereby granted, free of charge, to any person obtaining a
50b96a086cbb4bcf0a5aab1fee6d77c1e40295297Eric Anholt * copy of this software and associated documentation files (the "Software"),
60b96a086cbb4bcf0a5aab1fee6d77c1e40295297Eric Anholt * to deal in the Software without restriction, including without limitation
70b96a086cbb4bcf0a5aab1fee6d77c1e40295297Eric Anholt * the rights to use, copy, modify, merge, publish, distribute, sublicense,
80b96a086cbb4bcf0a5aab1fee6d77c1e40295297Eric Anholt * and/or sell copies of the Software, and to permit persons to whom the
90b96a086cbb4bcf0a5aab1fee6d77c1e40295297Eric Anholt * Software is furnished to do so, subject to the following conditions:
100b96a086cbb4bcf0a5aab1fee6d77c1e40295297Eric Anholt *
110b96a086cbb4bcf0a5aab1fee6d77c1e40295297Eric Anholt * The above copyright notice and this permission notice (including the next
120b96a086cbb4bcf0a5aab1fee6d77c1e40295297Eric Anholt * paragraph) shall be included in all copies or substantial portions of the
130b96a086cbb4bcf0a5aab1fee6d77c1e40295297Eric Anholt * Software.
140b96a086cbb4bcf0a5aab1fee6d77c1e40295297Eric Anholt *
150b96a086cbb4bcf0a5aab1fee6d77c1e40295297Eric Anholt * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
160b96a086cbb4bcf0a5aab1fee6d77c1e40295297Eric Anholt * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
170b96a086cbb4bcf0a5aab1fee6d77c1e40295297Eric Anholt * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
180b96a086cbb4bcf0a5aab1fee6d77c1e40295297Eric Anholt * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
190b96a086cbb4bcf0a5aab1fee6d77c1e40295297Eric Anholt * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
200b96a086cbb4bcf0a5aab1fee6d77c1e40295297Eric Anholt * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
210b96a086cbb4bcf0a5aab1fee6d77c1e40295297Eric Anholt * DEALINGS IN THE SOFTWARE.
220b96a086cbb4bcf0a5aab1fee6d77c1e40295297Eric Anholt */
230b96a086cbb4bcf0a5aab1fee6d77c1e40295297Eric Anholt
240b96a086cbb4bcf0a5aab1fee6d77c1e40295297Eric Anholt/**
250b96a086cbb4bcf0a5aab1fee6d77c1e40295297Eric Anholt * \file barrier.c
260b96a086cbb4bcf0a5aab1fee6d77c1e40295297Eric Anholt * Implementation of various pipeline barrier entry points.
270b96a086cbb4bcf0a5aab1fee6d77c1e40295297Eric Anholt *
280b96a086cbb4bcf0a5aab1fee6d77c1e40295297Eric Anholt * \author Marek Olšák <maraeo@gmail.com>
2949d3c6a8e63ead43fafb7d52e2c770a1320eb2eeEric Anholt */
3049d3c6a8e63ead43fafb7d52e2c770a1320eb2eeEric Anholt
3149d3c6a8e63ead43fafb7d52e2c770a1320eb2eeEric Anholt#include "context.h"
3249d3c6a8e63ead43fafb7d52e2c770a1320eb2eeEric Anholt#include "barrier.h"
330b96a086cbb4bcf0a5aab1fee6d77c1e40295297Eric Anholt
340b96a086cbb4bcf0a5aab1fee6d77c1e40295297Eric Anholt
350b96a086cbb4bcf0a5aab1fee6d77c1e40295297Eric Anholtstatic void
360b96a086cbb4bcf0a5aab1fee6d77c1e40295297Eric Anholt_mesa_texture_barrier(struct gl_context *ctx)
370b96a086cbb4bcf0a5aab1fee6d77c1e40295297Eric Anholt{
380b96a086cbb4bcf0a5aab1fee6d77c1e40295297Eric Anholt   /* no-op */
391f5e070dd7ddd344a913f2f5daddebb4c51abb8aEric Anholt}
400b96a086cbb4bcf0a5aab1fee6d77c1e40295297Eric Anholt
410b96a086cbb4bcf0a5aab1fee6d77c1e40295297Eric Anholtvoid
426dd55b49090da22d3a8e9226507a95e914eaf10fEric Anholt_mesa_init_barrier_functions(struct dd_function_table *driver)
436dd55b49090da22d3a8e9226507a95e914eaf10fEric Anholt{
446dd55b49090da22d3a8e9226507a95e914eaf10fEric Anholt   driver->TextureBarrier = _mesa_texture_barrier;
456dd55b49090da22d3a8e9226507a95e914eaf10fEric Anholt}
466dd55b49090da22d3a8e9226507a95e914eaf10fEric Anholt
470b96a086cbb4bcf0a5aab1fee6d77c1e40295297Eric Anholtvoid GLAPIENTRY
480b96a086cbb4bcf0a5aab1fee6d77c1e40295297Eric Anholt_mesa_TextureBarrierNV(void)
490b96a086cbb4bcf0a5aab1fee6d77c1e40295297Eric Anholt{
500b96a086cbb4bcf0a5aab1fee6d77c1e40295297Eric Anholt   GET_CURRENT_CONTEXT(ctx);
510b96a086cbb4bcf0a5aab1fee6d77c1e40295297Eric Anholt
520b96a086cbb4bcf0a5aab1fee6d77c1e40295297Eric Anholt   if (!ctx->Extensions.NV_texture_barrier) {
530b96a086cbb4bcf0a5aab1fee6d77c1e40295297Eric Anholt      _mesa_error(ctx, GL_INVALID_OPERATION,
540b96a086cbb4bcf0a5aab1fee6d77c1e40295297Eric Anholt                  "glTextureBarrier(not supported)");
550b96a086cbb4bcf0a5aab1fee6d77c1e40295297Eric Anholt      return;
560b96a086cbb4bcf0a5aab1fee6d77c1e40295297Eric Anholt   }
570b96a086cbb4bcf0a5aab1fee6d77c1e40295297Eric Anholt
580b96a086cbb4bcf0a5aab1fee6d77c1e40295297Eric Anholt   ctx->Driver.TextureBarrier(ctx);
590b96a086cbb4bcf0a5aab1fee6d77c1e40295297Eric Anholt}
600b96a086cbb4bcf0a5aab1fee6d77c1e40295297Eric Anholt
610b96a086cbb4bcf0a5aab1fee6d77c1e40295297Eric Anholtvoid GLAPIENTRY
620b96a086cbb4bcf0a5aab1fee6d77c1e40295297Eric Anholt_mesa_MemoryBarrier(GLbitfield barriers)
630b96a086cbb4bcf0a5aab1fee6d77c1e40295297Eric Anholt{
640b96a086cbb4bcf0a5aab1fee6d77c1e40295297Eric Anholt   GET_CURRENT_CONTEXT(ctx);
650b96a086cbb4bcf0a5aab1fee6d77c1e40295297Eric Anholt
660b96a086cbb4bcf0a5aab1fee6d77c1e40295297Eric Anholt   if (ctx->Driver.MemoryBarrier)
670b96a086cbb4bcf0a5aab1fee6d77c1e40295297Eric Anholt      ctx->Driver.MemoryBarrier(ctx, barriers);
680b96a086cbb4bcf0a5aab1fee6d77c1e40295297Eric Anholt}
690b96a086cbb4bcf0a5aab1fee6d77c1e40295297Eric Anholt
700b96a086cbb4bcf0a5aab1fee6d77c1e40295297Eric Anholtvoid GLAPIENTRY
710b96a086cbb4bcf0a5aab1fee6d77c1e40295297Eric Anholt_mesa_MemoryBarrierByRegion(GLbitfield barriers)
720b96a086cbb4bcf0a5aab1fee6d77c1e40295297Eric Anholt{
730b96a086cbb4bcf0a5aab1fee6d77c1e40295297Eric Anholt   GET_CURRENT_CONTEXT(ctx);
740b96a086cbb4bcf0a5aab1fee6d77c1e40295297Eric Anholt
750b96a086cbb4bcf0a5aab1fee6d77c1e40295297Eric Anholt   GLbitfield all_allowed_bits = GL_ATOMIC_COUNTER_BARRIER_BIT |
760b96a086cbb4bcf0a5aab1fee6d77c1e40295297Eric Anholt                                 GL_FRAMEBUFFER_BARRIER_BIT |
770b96a086cbb4bcf0a5aab1fee6d77c1e40295297Eric Anholt                                 GL_SHADER_IMAGE_ACCESS_BARRIER_BIT |
7882e919d33bbe508b3e1ba883a01ef2512dbc8f72Eric Anholt                                 GL_SHADER_STORAGE_BARRIER_BIT |
79cbb7477e8a796211b664ff7e47334cb1b642556dEric Anholt                                 GL_TEXTURE_FETCH_BARRIER_BIT |
800b96a086cbb4bcf0a5aab1fee6d77c1e40295297Eric Anholt                                 GL_UNIFORM_BARRIER_BIT;
811d45e44b2f9e52d6eebe84ab08da6b7393011f95Eric Anholt
821d45e44b2f9e52d6eebe84ab08da6b7393011f95Eric Anholt   if (ctx->Driver.MemoryBarrier) {
830b96a086cbb4bcf0a5aab1fee6d77c1e40295297Eric Anholt      /* From section 7.11.2 of the OpenGL ES 3.1 specification:
84876c64719472bf81d2d2a4b46fb406f91caa6ac4Eric Anholt       *
85876c64719472bf81d2d2a4b46fb406f91caa6ac4Eric Anholt       *    "When barriers is ALL_BARRIER_BITS, shader memory accesses will be
860b96a086cbb4bcf0a5aab1fee6d77c1e40295297Eric Anholt       *     synchronized relative to all these barrier bits, but not to other
870b96a086cbb4bcf0a5aab1fee6d77c1e40295297Eric Anholt       *     barrier bits specific to MemoryBarrier."
880b96a086cbb4bcf0a5aab1fee6d77c1e40295297Eric Anholt       *
890b96a086cbb4bcf0a5aab1fee6d77c1e40295297Eric Anholt       * That is, if barriers is the special value GL_ALL_BARRIER_BITS, then all
900b96a086cbb4bcf0a5aab1fee6d77c1e40295297Eric Anholt       * barriers allowed by glMemoryBarrierByRegion should be activated."
910b96a086cbb4bcf0a5aab1fee6d77c1e40295297Eric Anholt       */
920b96a086cbb4bcf0a5aab1fee6d77c1e40295297Eric Anholt      if (barriers == GL_ALL_BARRIER_BITS) {
93cbb7477e8a796211b664ff7e47334cb1b642556dEric Anholt         ctx->Driver.MemoryBarrier(ctx, all_allowed_bits);
94cbb7477e8a796211b664ff7e47334cb1b642556dEric Anholt         return;
95cbb7477e8a796211b664ff7e47334cb1b642556dEric Anholt      }
960b96a086cbb4bcf0a5aab1fee6d77c1e40295297Eric Anholt
970b96a086cbb4bcf0a5aab1fee6d77c1e40295297Eric Anholt      /* From section 7.11.2 of the OpenGL ES 3.1 specification:
980b96a086cbb4bcf0a5aab1fee6d77c1e40295297Eric Anholt       *
990b96a086cbb4bcf0a5aab1fee6d77c1e40295297Eric Anholt       *    "An INVALID_VALUE error is generated if barriers is not the special
1000b96a086cbb4bcf0a5aab1fee6d77c1e40295297Eric Anholt       *     value ALL_BARRIER_BITS, and has any bits set other than those
1010b96a086cbb4bcf0a5aab1fee6d77c1e40295297Eric Anholt       *     described above."
1020b96a086cbb4bcf0a5aab1fee6d77c1e40295297Eric Anholt       */
1030b96a086cbb4bcf0a5aab1fee6d77c1e40295297Eric Anholt      if ((barriers & ~all_allowed_bits) != 0) {
1040b96a086cbb4bcf0a5aab1fee6d77c1e40295297Eric Anholt         _mesa_error(ctx, GL_INVALID_VALUE,
1050b96a086cbb4bcf0a5aab1fee6d77c1e40295297Eric Anholt                     "glMemoryBarrierByRegion(unsupported barrier bit");
1060b96a086cbb4bcf0a5aab1fee6d77c1e40295297Eric Anholt      }
1070b96a086cbb4bcf0a5aab1fee6d77c1e40295297Eric Anholt
1080b96a086cbb4bcf0a5aab1fee6d77c1e40295297Eric Anholt      ctx->Driver.MemoryBarrier(ctx, barriers);
1090b96a086cbb4bcf0a5aab1fee6d77c1e40295297Eric Anholt   }
1100b96a086cbb4bcf0a5aab1fee6d77c1e40295297Eric Anholt}
1110b96a086cbb4bcf0a5aab1fee6d77c1e40295297Eric Anholt
1120b96a086cbb4bcf0a5aab1fee6d77c1e40295297Eric Anholtvoid GLAPIENTRY
1130b96a086cbb4bcf0a5aab1fee6d77c1e40295297Eric Anholt_mesa_BlendBarrier(void)
1140b96a086cbb4bcf0a5aab1fee6d77c1e40295297Eric Anholt{
1150b96a086cbb4bcf0a5aab1fee6d77c1e40295297Eric Anholt   GET_CURRENT_CONTEXT(ctx);
1160b96a086cbb4bcf0a5aab1fee6d77c1e40295297Eric Anholt
1170b96a086cbb4bcf0a5aab1fee6d77c1e40295297Eric Anholt   if (!ctx->Extensions.MESA_shader_framebuffer_fetch_non_coherent &&
1180b96a086cbb4bcf0a5aab1fee6d77c1e40295297Eric Anholt       !ctx->Extensions.KHR_blend_equation_advanced) {
1190b96a086cbb4bcf0a5aab1fee6d77c1e40295297Eric Anholt      _mesa_error(ctx, GL_INVALID_OPERATION,
1200b96a086cbb4bcf0a5aab1fee6d77c1e40295297Eric Anholt                  "glBlendBarrier(not supported)");
1210b96a086cbb4bcf0a5aab1fee6d77c1e40295297Eric Anholt      return;
1220b96a086cbb4bcf0a5aab1fee6d77c1e40295297Eric Anholt   }
1230b96a086cbb4bcf0a5aab1fee6d77c1e40295297Eric Anholt
1240b96a086cbb4bcf0a5aab1fee6d77c1e40295297Eric Anholt   ctx->Driver.BlendBarrier(ctx);
1250b96a086cbb4bcf0a5aab1fee6d77c1e40295297Eric Anholt}
1260b96a086cbb4bcf0a5aab1fee6d77c1e40295297Eric Anholt