1/************************************************************************** 2 * 3 * Copyright 2011 Marek Olšák <maraeo@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 Olšák 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 */ 48static void 49st_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.FramebufferFetchBarrier() 59 */ 60static void 61st_FramebufferFetchBarrier(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 */ 72static void 73st_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 if (barriers & GL_TEXTURE_UPDATE_BARRIER_BIT) { 99 /* GL_TEXTURE_UPDATE_BARRIER_BIT: 100 * Texture updates translate to: 101 * (1) texture transfers to/from the CPU, 102 * (2) texture as blit destination, or 103 * (3) texture as framebuffer. 104 * Some drivers may handle these automatically, and can ignore the bit. 105 */ 106 flags |= PIPE_BARRIER_UPDATE_TEXTURE; 107 } 108 if (barriers & GL_BUFFER_UPDATE_BARRIER_BIT) { 109 /* GL_BUFFER_UPDATE_BARRIER_BIT: 110 * Buffer updates translate to 111 * (1) buffer transfers to/from the CPU, 112 * (2) resource copies and clears. 113 * Some drivers may handle these automatically, and can ignore the bit. 114 */ 115 flags |= PIPE_BARRIER_UPDATE_BUFFER; 116 } 117 if (barriers & GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT) 118 flags |= PIPE_BARRIER_MAPPED_BUFFER; 119 if (barriers & GL_QUERY_BUFFER_BARRIER_BIT) 120 flags |= PIPE_BARRIER_QUERY_BUFFER; 121 if (barriers & GL_FRAMEBUFFER_BARRIER_BIT) 122 flags |= PIPE_BARRIER_FRAMEBUFFER; 123 if (barriers & GL_TRANSFORM_FEEDBACK_BARRIER_BIT) 124 flags |= PIPE_BARRIER_STREAMOUT_BUFFER; 125 if (barriers & GL_ATOMIC_COUNTER_BARRIER_BIT) 126 flags |= PIPE_BARRIER_SHADER_BUFFER; 127 if (barriers & GL_SHADER_STORAGE_BARRIER_BIT) 128 flags |= PIPE_BARRIER_SHADER_BUFFER; 129 130 if (flags && pipe->memory_barrier) 131 pipe->memory_barrier(pipe, flags); 132} 133 134void st_init_texture_barrier_functions(struct dd_function_table *functions) 135{ 136 functions->TextureBarrier = st_TextureBarrier; 137 functions->FramebufferFetchBarrier = st_FramebufferFetchBarrier; 138 functions->MemoryBarrier = st_MemoryBarrier; 139} 140