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