mesa: Move shader memory barrier functions into barrier.c.

Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
This commit is contained in:
Francisco Jerez 2016-07-05 23:18:18 -07:00
parent 83d2f9db29
commit 6a976bbf84
4 changed files with 57 additions and 57 deletions

View file

@ -57,3 +57,54 @@ _mesa_TextureBarrierNV(void)
ctx->Driver.TextureBarrier(ctx);
}
void GLAPIENTRY
_mesa_MemoryBarrier(GLbitfield barriers)
{
GET_CURRENT_CONTEXT(ctx);
if (ctx->Driver.MemoryBarrier)
ctx->Driver.MemoryBarrier(ctx, barriers);
}
void GLAPIENTRY
_mesa_MemoryBarrierByRegion(GLbitfield barriers)
{
GET_CURRENT_CONTEXT(ctx);
GLbitfield all_allowed_bits = GL_ATOMIC_COUNTER_BARRIER_BIT |
GL_FRAMEBUFFER_BARRIER_BIT |
GL_SHADER_IMAGE_ACCESS_BARRIER_BIT |
GL_SHADER_STORAGE_BARRIER_BIT |
GL_TEXTURE_FETCH_BARRIER_BIT |
GL_UNIFORM_BARRIER_BIT;
if (ctx->Driver.MemoryBarrier) {
/* From section 7.11.2 of the OpenGL ES 3.1 specification:
*
* "When barriers is ALL_BARRIER_BITS, shader memory accesses will be
* synchronized relative to all these barrier bits, but not to other
* barrier bits specific to MemoryBarrier."
*
* That is, if barriers is the special value GL_ALL_BARRIER_BITS, then all
* barriers allowed by glMemoryBarrierByRegion should be activated."
*/
if (barriers == GL_ALL_BARRIER_BITS) {
ctx->Driver.MemoryBarrier(ctx, all_allowed_bits);
return;
}
/* From section 7.11.2 of the OpenGL ES 3.1 specification:
*
* "An INVALID_VALUE error is generated if barriers is not the special
* value ALL_BARRIER_BITS, and has any bits set other than those
* described above."
*/
if ((barriers & ~all_allowed_bits) != 0) {
_mesa_error(ctx, GL_INVALID_VALUE,
"glMemoryBarrierByRegion(unsupported barrier bit");
}
ctx->Driver.MemoryBarrier(ctx, barriers);
}
}

View file

@ -41,4 +41,10 @@ _mesa_init_barrier_functions(struct dd_function_table *driver);
extern void GLAPIENTRY
_mesa_TextureBarrierNV(void);
void GLAPIENTRY
_mesa_MemoryBarrier(GLbitfield barriers);
void GLAPIENTRY
_mesa_MemoryBarrierByRegion(GLbitfield barriers);
#endif /* BARRIER_H */

View file

@ -753,54 +753,3 @@ _mesa_BindImageTextures(GLuint first, GLsizei count, const GLuint *textures)
_mesa_end_texture_lookups(ctx);
}
void GLAPIENTRY
_mesa_MemoryBarrier(GLbitfield barriers)
{
GET_CURRENT_CONTEXT(ctx);
if (ctx->Driver.MemoryBarrier)
ctx->Driver.MemoryBarrier(ctx, barriers);
}
void GLAPIENTRY
_mesa_MemoryBarrierByRegion(GLbitfield barriers)
{
GET_CURRENT_CONTEXT(ctx);
GLbitfield all_allowed_bits = GL_ATOMIC_COUNTER_BARRIER_BIT |
GL_FRAMEBUFFER_BARRIER_BIT |
GL_SHADER_IMAGE_ACCESS_BARRIER_BIT |
GL_SHADER_STORAGE_BARRIER_BIT |
GL_TEXTURE_FETCH_BARRIER_BIT |
GL_UNIFORM_BARRIER_BIT;
if (ctx->Driver.MemoryBarrier) {
/* From section 7.11.2 of the OpenGL ES 3.1 specification:
*
* "When barriers is ALL_BARRIER_BITS, shader memory accesses will be
* synchronized relative to all these barrier bits, but not to other
* barrier bits specific to MemoryBarrier."
*
* That is, if barriers is the special value GL_ALL_BARRIER_BITS, then all
* barriers allowed by glMemoryBarrierByRegion should be activated."
*/
if (barriers == GL_ALL_BARRIER_BITS) {
ctx->Driver.MemoryBarrier(ctx, all_allowed_bits);
return;
}
/* From section 7.11.2 of the OpenGL ES 3.1 specification:
*
* "An INVALID_VALUE error is generated if barriers is not the special
* value ALL_BARRIER_BITS, and has any bits set other than those
* described above."
*/
if ((barriers & ~all_allowed_bits) != 0) {
_mesa_error(ctx, GL_INVALID_VALUE,
"glMemoryBarrierByRegion(unsupported barrier bit");
}
ctx->Driver.MemoryBarrier(ctx, barriers);
}
}

View file

@ -87,12 +87,6 @@ _mesa_BindImageTexture(GLuint unit, GLuint texture, GLint level,
void GLAPIENTRY
_mesa_BindImageTextures(GLuint first, GLsizei count, const GLuint *textures);
void GLAPIENTRY
_mesa_MemoryBarrier(GLbitfield barriers);
void GLAPIENTRY
_mesa_MemoryBarrierByRegion(GLbitfield barriers);
#ifdef __cplusplus
}
#endif