1 /************************************************************************** 2 * 3 * Copyright 2011 Marek Olk <maraeo (at) gmail.com> 4 * All Rights Reserved. 5 * 6 * Permission is hereby granted, free of charge, to any person obtaining a 7 * copy of this software and associated documentation files (the 8 * "Software"), to deal in the Software without restriction, including 9 * without limitation the rights to use, copy, modify, merge, publish, 10 * distribute, sub license, and/or sell copies of the Software, and to 11 * permit persons to whom the Software is furnished to do so, subject to 12 * the following conditions: 13 * 14 * The above copyright notice and this permission notice (including the 15 * next paragraph) shall be included in all copies or substantial portions 16 * of the Software. 17 * 18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 19 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 21 * IN NO EVENT SHALL THE AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR 22 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 23 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 24 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25 * 26 **************************************************************************/ 27 28 29 /** 30 * glTextureBarrierNV function 31 * 32 * \author Marek Olk 33 */ 34 35 36 #include "main/imports.h" 37 #include "main/context.h" 38 39 #include "pipe/p_context.h" 40 #include "pipe/p_defines.h" 41 #include "st_context.h" 42 #include "st_cb_texturebarrier.h" 43 44 45 /** 46 * Called via ctx->Driver.TextureBarrier() 47 */ 48 static void 49 st_TextureBarrier(struct gl_context *ctx) 50 { 51 struct pipe_context *pipe = st_context(ctx)->pipe; 52 53 pipe->texture_barrier(pipe, PIPE_TEXTURE_BARRIER_SAMPLER); 54 } 55 56 57 /** 58 * Called via ctx->Driver.BlendBarrier() 59 */ 60 static void 61 st_BlendBarrier(struct gl_context *ctx) 62 { 63 struct pipe_context *pipe = st_context(ctx)->pipe; 64 65 pipe->texture_barrier(pipe, PIPE_TEXTURE_BARRIER_FRAMEBUFFER); 66 } 67 68 69 /** 70 * Called via ctx->Driver.MemoryBarrier() 71 */ 72 static void 73 st_MemoryBarrier(struct gl_context *ctx, GLbitfield barriers) 74 { 75 struct pipe_context *pipe = st_context(ctx)->pipe; 76 unsigned flags = 0; 77 78 if (barriers & GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT) 79 flags |= PIPE_BARRIER_VERTEX_BUFFER; 80 if (barriers & GL_ELEMENT_ARRAY_BARRIER_BIT) 81 flags |= PIPE_BARRIER_INDEX_BUFFER; 82 if (barriers & GL_UNIFORM_BARRIER_BIT) 83 flags |= PIPE_BARRIER_CONSTANT_BUFFER; 84 if (barriers & GL_TEXTURE_FETCH_BARRIER_BIT) 85 flags |= PIPE_BARRIER_TEXTURE; 86 if (barriers & GL_SHADER_IMAGE_ACCESS_BARRIER_BIT) 87 flags |= PIPE_BARRIER_IMAGE; 88 if (barriers & GL_COMMAND_BARRIER_BIT) 89 flags |= PIPE_BARRIER_INDIRECT_BUFFER; 90 if (barriers & GL_PIXEL_BUFFER_BARRIER_BIT) { 91 /* The PBO may be 92 * (1) bound as a texture for PBO uploads, or 93 * (2) accessed by the CPU via transfer ops. 94 * For case (2), we assume automatic flushing by the driver. 95 */ 96 flags |= PIPE_BARRIER_TEXTURE; 97 } 98 /* GL_TEXTURE_UPDATE_BARRIER_BIT: 99 * Texture updates translate to: 100 * (1) texture transfers to/from the CPU, 101 * (2) texture as blit destination, or 102 * (3) texture as framebuffer. 103 * In all cases, we assume the driver does the required flushing 104 * automatically. 105 */ 106 /* GL_BUFFER_UPDATE_BARRIER_BIT: 107 * Buffer updates translate to 108 * (1) buffer transfers to/from the CPU, 109 * (2) resource copies and clears. 110 * In all cases, we assume the driver does the required flushing 111 * automatically. 112 */ 113 if (barriers & GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT) 114 flags |= PIPE_BARRIER_MAPPED_BUFFER; 115 if (barriers & GL_QUERY_BUFFER_BARRIER_BIT) 116 flags |= PIPE_BARRIER_QUERY_BUFFER; 117 if (barriers & GL_FRAMEBUFFER_BARRIER_BIT) 118 flags |= PIPE_BARRIER_FRAMEBUFFER; 119 if (barriers & GL_TRANSFORM_FEEDBACK_BARRIER_BIT) 120 flags |= PIPE_BARRIER_STREAMOUT_BUFFER; 121 if (barriers & GL_ATOMIC_COUNTER_BARRIER_BIT) 122 flags |= PIPE_BARRIER_SHADER_BUFFER; 123 if (barriers & GL_SHADER_STORAGE_BARRIER_BIT) 124 flags |= PIPE_BARRIER_SHADER_BUFFER; 125 126 if (flags && pipe->memory_barrier) 127 pipe->memory_barrier(pipe, flags); 128 } 129 130 void st_init_texture_barrier_functions(struct dd_function_table *functions) 131 { 132 functions->TextureBarrier = st_TextureBarrier; 133 functions->BlendBarrier = st_BlendBarrier; 134 functions->MemoryBarrier = st_MemoryBarrier; 135 } 136