1aea4ed41ed9b4d0442d1090ac1f01231a9859796Marek Olšák/************************************************************************** 2aea4ed41ed9b4d0442d1090ac1f01231a9859796Marek Olšák * 3aea4ed41ed9b4d0442d1090ac1f01231a9859796Marek Olšák * Copyright 2011 Marek Olšák <maraeo@gmail.com> 4aea4ed41ed9b4d0442d1090ac1f01231a9859796Marek Olšák * All Rights Reserved. 5aea4ed41ed9b4d0442d1090ac1f01231a9859796Marek Olšák * 6aea4ed41ed9b4d0442d1090ac1f01231a9859796Marek Olšák * Permission is hereby granted, free of charge, to any person obtaining a 7aea4ed41ed9b4d0442d1090ac1f01231a9859796Marek Olšák * copy of this software and associated documentation files (the 8aea4ed41ed9b4d0442d1090ac1f01231a9859796Marek Olšák * "Software"), to deal in the Software without restriction, including 9aea4ed41ed9b4d0442d1090ac1f01231a9859796Marek Olšák * without limitation the rights to use, copy, modify, merge, publish, 10aea4ed41ed9b4d0442d1090ac1f01231a9859796Marek Olšák * distribute, sub license, and/or sell copies of the Software, and to 11aea4ed41ed9b4d0442d1090ac1f01231a9859796Marek Olšák * permit persons to whom the Software is furnished to do so, subject to 12aea4ed41ed9b4d0442d1090ac1f01231a9859796Marek Olšák * the following conditions: 13aea4ed41ed9b4d0442d1090ac1f01231a9859796Marek Olšák * 14aea4ed41ed9b4d0442d1090ac1f01231a9859796Marek Olšák * The above copyright notice and this permission notice (including the 15aea4ed41ed9b4d0442d1090ac1f01231a9859796Marek Olšák * next paragraph) shall be included in all copies or substantial portions 16aea4ed41ed9b4d0442d1090ac1f01231a9859796Marek Olšák * of the Software. 17aea4ed41ed9b4d0442d1090ac1f01231a9859796Marek Olšák * 18aea4ed41ed9b4d0442d1090ac1f01231a9859796Marek Olšák * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 19aea4ed41ed9b4d0442d1090ac1f01231a9859796Marek Olšák * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20aea4ed41ed9b4d0442d1090ac1f01231a9859796Marek Olšák * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 21aea4ed41ed9b4d0442d1090ac1f01231a9859796Marek Olšák * IN NO EVENT SHALL THE AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR 22aea4ed41ed9b4d0442d1090ac1f01231a9859796Marek Olšák * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 23aea4ed41ed9b4d0442d1090ac1f01231a9859796Marek Olšák * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 24aea4ed41ed9b4d0442d1090ac1f01231a9859796Marek Olšák * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25aea4ed41ed9b4d0442d1090ac1f01231a9859796Marek Olšák * 26aea4ed41ed9b4d0442d1090ac1f01231a9859796Marek Olšák **************************************************************************/ 27aea4ed41ed9b4d0442d1090ac1f01231a9859796Marek Olšák 28aea4ed41ed9b4d0442d1090ac1f01231a9859796Marek Olšák 29aea4ed41ed9b4d0442d1090ac1f01231a9859796Marek Olšák/** 30aea4ed41ed9b4d0442d1090ac1f01231a9859796Marek Olšák * glTextureBarrierNV function 31aea4ed41ed9b4d0442d1090ac1f01231a9859796Marek Olšák * 32aea4ed41ed9b4d0442d1090ac1f01231a9859796Marek Olšák * \author Marek Olšák 33aea4ed41ed9b4d0442d1090ac1f01231a9859796Marek Olšák */ 34aea4ed41ed9b4d0442d1090ac1f01231a9859796Marek Olšák 35aea4ed41ed9b4d0442d1090ac1f01231a9859796Marek Olšák 36aea4ed41ed9b4d0442d1090ac1f01231a9859796Marek Olšák#include "main/imports.h" 37aea4ed41ed9b4d0442d1090ac1f01231a9859796Marek Olšák#include "main/context.h" 38aea4ed41ed9b4d0442d1090ac1f01231a9859796Marek Olšák 39aea4ed41ed9b4d0442d1090ac1f01231a9859796Marek Olšák#include "pipe/p_context.h" 40aea4ed41ed9b4d0442d1090ac1f01231a9859796Marek Olšák#include "pipe/p_defines.h" 41aea4ed41ed9b4d0442d1090ac1f01231a9859796Marek Olšák#include "st_context.h" 42aea4ed41ed9b4d0442d1090ac1f01231a9859796Marek Olšák#include "st_cb_texturebarrier.h" 43aea4ed41ed9b4d0442d1090ac1f01231a9859796Marek Olšák 44aea4ed41ed9b4d0442d1090ac1f01231a9859796Marek Olšák 45aea4ed41ed9b4d0442d1090ac1f01231a9859796Marek Olšák/** 46aea4ed41ed9b4d0442d1090ac1f01231a9859796Marek Olšák * Called via ctx->Driver.TextureBarrier() 47aea4ed41ed9b4d0442d1090ac1f01231a9859796Marek Olšák */ 48aea4ed41ed9b4d0442d1090ac1f01231a9859796Marek Olšákstatic void 49aea4ed41ed9b4d0442d1090ac1f01231a9859796Marek Olšákst_TextureBarrier(struct gl_context *ctx) 50aea4ed41ed9b4d0442d1090ac1f01231a9859796Marek Olšák{ 51aea4ed41ed9b4d0442d1090ac1f01231a9859796Marek Olšák struct pipe_context *pipe = st_context(ctx)->pipe; 52aea4ed41ed9b4d0442d1090ac1f01231a9859796Marek Olšák 53a1c84842710268793c4a8de3cad8db95b6f37a82Ilia Mirkin pipe->texture_barrier(pipe, PIPE_TEXTURE_BARRIER_SAMPLER); 54aea4ed41ed9b4d0442d1090ac1f01231a9859796Marek Olšák} 55aea4ed41ed9b4d0442d1090ac1f01231a9859796Marek Olšák 56aea4ed41ed9b4d0442d1090ac1f01231a9859796Marek Olšák 57dfa0b8d9b87ba1094ba12e6feb554a1b09da2de5Marek Olšák/** 586b7511c2f123014fe469a11d0b46fbff357335e4Ilia Mirkin * Called via ctx->Driver.BlendBarrier() 596b7511c2f123014fe469a11d0b46fbff357335e4Ilia Mirkin */ 606b7511c2f123014fe469a11d0b46fbff357335e4Ilia Mirkinstatic void 616b7511c2f123014fe469a11d0b46fbff357335e4Ilia Mirkinst_BlendBarrier(struct gl_context *ctx) 626b7511c2f123014fe469a11d0b46fbff357335e4Ilia Mirkin{ 636b7511c2f123014fe469a11d0b46fbff357335e4Ilia Mirkin struct pipe_context *pipe = st_context(ctx)->pipe; 646b7511c2f123014fe469a11d0b46fbff357335e4Ilia Mirkin 656b7511c2f123014fe469a11d0b46fbff357335e4Ilia Mirkin pipe->texture_barrier(pipe, PIPE_TEXTURE_BARRIER_FRAMEBUFFER); 666b7511c2f123014fe469a11d0b46fbff357335e4Ilia Mirkin} 676b7511c2f123014fe469a11d0b46fbff357335e4Ilia Mirkin 686b7511c2f123014fe469a11d0b46fbff357335e4Ilia Mirkin 696b7511c2f123014fe469a11d0b46fbff357335e4Ilia Mirkin/** 70dfa0b8d9b87ba1094ba12e6feb554a1b09da2de5Marek Olšák * Called via ctx->Driver.MemoryBarrier() 71dfa0b8d9b87ba1094ba12e6feb554a1b09da2de5Marek Olšák */ 72dfa0b8d9b87ba1094ba12e6feb554a1b09da2de5Marek Olšákstatic void 73dfa0b8d9b87ba1094ba12e6feb554a1b09da2de5Marek Olšákst_MemoryBarrier(struct gl_context *ctx, GLbitfield barriers) 74dfa0b8d9b87ba1094ba12e6feb554a1b09da2de5Marek Olšák{ 75dfa0b8d9b87ba1094ba12e6feb554a1b09da2de5Marek Olšák struct pipe_context *pipe = st_context(ctx)->pipe; 76dfa0b8d9b87ba1094ba12e6feb554a1b09da2de5Marek Olšák unsigned flags = 0; 77dfa0b8d9b87ba1094ba12e6feb554a1b09da2de5Marek Olšák 78137954408172a5104f0f5650bae943d2ebf0aa07Nicolai Hähnle if (barriers & GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT) 79137954408172a5104f0f5650bae943d2ebf0aa07Nicolai Hähnle flags |= PIPE_BARRIER_VERTEX_BUFFER; 80137954408172a5104f0f5650bae943d2ebf0aa07Nicolai Hähnle if (barriers & GL_ELEMENT_ARRAY_BARRIER_BIT) 81137954408172a5104f0f5650bae943d2ebf0aa07Nicolai Hähnle flags |= PIPE_BARRIER_INDEX_BUFFER; 82137954408172a5104f0f5650bae943d2ebf0aa07Nicolai Hähnle if (barriers & GL_UNIFORM_BARRIER_BIT) 83137954408172a5104f0f5650bae943d2ebf0aa07Nicolai Hähnle flags |= PIPE_BARRIER_CONSTANT_BUFFER; 84137954408172a5104f0f5650bae943d2ebf0aa07Nicolai Hähnle if (barriers & GL_TEXTURE_FETCH_BARRIER_BIT) 85137954408172a5104f0f5650bae943d2ebf0aa07Nicolai Hähnle flags |= PIPE_BARRIER_TEXTURE; 86137954408172a5104f0f5650bae943d2ebf0aa07Nicolai Hähnle if (barriers & GL_SHADER_IMAGE_ACCESS_BARRIER_BIT) 87137954408172a5104f0f5650bae943d2ebf0aa07Nicolai Hähnle flags |= PIPE_BARRIER_IMAGE; 88137954408172a5104f0f5650bae943d2ebf0aa07Nicolai Hähnle if (barriers & GL_COMMAND_BARRIER_BIT) 89137954408172a5104f0f5650bae943d2ebf0aa07Nicolai Hähnle flags |= PIPE_BARRIER_INDIRECT_BUFFER; 90fc94bc2986e6a46a45c643c2236f3e2ced4a2bf3Nicolai Hähnle if (barriers & GL_PIXEL_BUFFER_BARRIER_BIT) { 91fc94bc2986e6a46a45c643c2236f3e2ced4a2bf3Nicolai Hähnle /* The PBO may be 92fc94bc2986e6a46a45c643c2236f3e2ced4a2bf3Nicolai Hähnle * (1) bound as a texture for PBO uploads, or 93fc94bc2986e6a46a45c643c2236f3e2ced4a2bf3Nicolai Hähnle * (2) accessed by the CPU via transfer ops. 94fc94bc2986e6a46a45c643c2236f3e2ced4a2bf3Nicolai Hähnle * For case (2), we assume automatic flushing by the driver. 95fc94bc2986e6a46a45c643c2236f3e2ced4a2bf3Nicolai Hähnle */ 96137954408172a5104f0f5650bae943d2ebf0aa07Nicolai Hähnle flags |= PIPE_BARRIER_TEXTURE; 97fc94bc2986e6a46a45c643c2236f3e2ced4a2bf3Nicolai Hähnle } 98fc94bc2986e6a46a45c643c2236f3e2ced4a2bf3Nicolai Hähnle /* GL_TEXTURE_UPDATE_BARRIER_BIT: 99fc94bc2986e6a46a45c643c2236f3e2ced4a2bf3Nicolai Hähnle * Texture updates translate to: 100fc94bc2986e6a46a45c643c2236f3e2ced4a2bf3Nicolai Hähnle * (1) texture transfers to/from the CPU, 101fc94bc2986e6a46a45c643c2236f3e2ced4a2bf3Nicolai Hähnle * (2) texture as blit destination, or 102fc94bc2986e6a46a45c643c2236f3e2ced4a2bf3Nicolai Hähnle * (3) texture as framebuffer. 103fc94bc2986e6a46a45c643c2236f3e2ced4a2bf3Nicolai Hähnle * In all cases, we assume the driver does the required flushing 104fc94bc2986e6a46a45c643c2236f3e2ced4a2bf3Nicolai Hähnle * automatically. 105fc94bc2986e6a46a45c643c2236f3e2ced4a2bf3Nicolai Hähnle */ 106fc94bc2986e6a46a45c643c2236f3e2ced4a2bf3Nicolai Hähnle /* GL_BUFFER_UPDATE_BARRIER_BIT: 107fc94bc2986e6a46a45c643c2236f3e2ced4a2bf3Nicolai Hähnle * Buffer updates translate to 108fc94bc2986e6a46a45c643c2236f3e2ced4a2bf3Nicolai Hähnle * (1) buffer transfers to/from the CPU, 109fc94bc2986e6a46a45c643c2236f3e2ced4a2bf3Nicolai Hähnle * (2) resource copies and clears. 110fc94bc2986e6a46a45c643c2236f3e2ced4a2bf3Nicolai Hähnle * In all cases, we assume the driver does the required flushing 111fc94bc2986e6a46a45c643c2236f3e2ced4a2bf3Nicolai Hähnle * automatically. 112fc94bc2986e6a46a45c643c2236f3e2ced4a2bf3Nicolai Hähnle */ 113dfa0b8d9b87ba1094ba12e6feb554a1b09da2de5Marek Olšák if (barriers & GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT) 114dfa0b8d9b87ba1094ba12e6feb554a1b09da2de5Marek Olšák flags |= PIPE_BARRIER_MAPPED_BUFFER; 115137954408172a5104f0f5650bae943d2ebf0aa07Nicolai Hähnle if (barriers & GL_QUERY_BUFFER_BARRIER_BIT) 116137954408172a5104f0f5650bae943d2ebf0aa07Nicolai Hähnle flags |= PIPE_BARRIER_QUERY_BUFFER; 117137954408172a5104f0f5650bae943d2ebf0aa07Nicolai Hähnle if (barriers & GL_FRAMEBUFFER_BARRIER_BIT) 118137954408172a5104f0f5650bae943d2ebf0aa07Nicolai Hähnle flags |= PIPE_BARRIER_FRAMEBUFFER; 119fc94bc2986e6a46a45c643c2236f3e2ced4a2bf3Nicolai Hähnle if (barriers & GL_TRANSFORM_FEEDBACK_BARRIER_BIT) 120fc94bc2986e6a46a45c643c2236f3e2ced4a2bf3Nicolai Hähnle flags |= PIPE_BARRIER_STREAMOUT_BUFFER; 1216fb8fac853b09416b7462e61f00233844319a505Ilia Mirkin if (barriers & GL_ATOMIC_COUNTER_BARRIER_BIT) 1226fb8fac853b09416b7462e61f00233844319a505Ilia Mirkin flags |= PIPE_BARRIER_SHADER_BUFFER; 1236fb8fac853b09416b7462e61f00233844319a505Ilia Mirkin if (barriers & GL_SHADER_STORAGE_BARRIER_BIT) 1246fb8fac853b09416b7462e61f00233844319a505Ilia Mirkin flags |= PIPE_BARRIER_SHADER_BUFFER; 125dfa0b8d9b87ba1094ba12e6feb554a1b09da2de5Marek Olšák 126dfa0b8d9b87ba1094ba12e6feb554a1b09da2de5Marek Olšák if (flags && pipe->memory_barrier) 127dfa0b8d9b87ba1094ba12e6feb554a1b09da2de5Marek Olšák pipe->memory_barrier(pipe, flags); 128dfa0b8d9b87ba1094ba12e6feb554a1b09da2de5Marek Olšák} 129dfa0b8d9b87ba1094ba12e6feb554a1b09da2de5Marek Olšák 130aea4ed41ed9b4d0442d1090ac1f01231a9859796Marek Olšákvoid st_init_texture_barrier_functions(struct dd_function_table *functions) 131aea4ed41ed9b4d0442d1090ac1f01231a9859796Marek Olšák{ 132aea4ed41ed9b4d0442d1090ac1f01231a9859796Marek Olšák functions->TextureBarrier = st_TextureBarrier; 1336b7511c2f123014fe469a11d0b46fbff357335e4Ilia Mirkin functions->BlendBarrier = st_BlendBarrier; 134dfa0b8d9b87ba1094ba12e6feb554a1b09da2de5Marek Olšák functions->MemoryBarrier = st_MemoryBarrier; 135aea4ed41ed9b4d0442d1090ac1f01231a9859796Marek Olšák} 136