瀏覽代碼

glsl: Add built-in functions and constants required for ARB_shader_atomic_counters.

v2: Represent atomics as GLSL intrinsics.

Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
tags/mesa-10.1-devel
Francisco Jerez 11 年之前
父節點
當前提交
bbded5b5fe

+ 58
- 0
src/glsl/builtin_functions.cpp 查看文件

@@ -326,6 +326,13 @@ tex3d_lod(const _mesa_glsl_parse_state *state)
{
return tex3d(state) && lod_exists_in_stage(state);
}

static bool
shader_atomic_counters(const _mesa_glsl_parse_state *state)
{
return state->ARB_shader_atomic_counters_enable;
}

/** @} */

/******************************************************************************/
@@ -556,6 +563,11 @@ private:
B1(uaddCarry)
B1(usubBorrow)
B1(mulExtended)

ir_function_signature *_atomic_intrinsic(builtin_available_predicate avail);
ir_function_signature *_atomic_op(const char *intrinsic,
builtin_available_predicate avail);

#undef B0
#undef B1
#undef B2
@@ -662,6 +674,15 @@ builtin_builder::create_shader()
void
builtin_builder::create_intrinsics()
{
add_function("__intrinsic_atomic_read",
_atomic_intrinsic(shader_atomic_counters),
NULL);
add_function("__intrinsic_atomic_increment",
_atomic_intrinsic(shader_atomic_counters),
NULL);
add_function("__intrinsic_atomic_predecrement",
_atomic_intrinsic(shader_atomic_counters),
NULL);
}

/**
@@ -2070,6 +2091,20 @@ builtin_builder::create_builtins()
_mulExtended(glsl_type::uvec3_type),
_mulExtended(glsl_type::uvec4_type),
NULL);

add_function("atomicCounter",
_atomic_op("__intrinsic_atomic_read",
shader_atomic_counters),
NULL);
add_function("atomicCounterIncrement",
_atomic_op("__intrinsic_atomic_increment",
shader_atomic_counters),
NULL);
add_function("atomicCounterDecrement",
_atomic_op("__intrinsic_atomic_predecrement",
shader_atomic_counters),
NULL);

#undef F
#undef FI
#undef FIU
@@ -3932,6 +3967,29 @@ builtin_builder::_mulExtended(const glsl_type *type)

return sig;
}

ir_function_signature *
builtin_builder::_atomic_intrinsic(builtin_available_predicate avail)
{
ir_variable *counter = in_var(glsl_type::atomic_uint_type, "counter");
MAKE_INTRINSIC(glsl_type::uint_type, avail, 1, counter);
return sig;
}

ir_function_signature *
builtin_builder::_atomic_op(const char *intrinsic,
builtin_available_predicate avail)
{
ir_variable *counter = in_var(glsl_type::atomic_uint_type, "atomic_counter");
MAKE_SIG(glsl_type::uint_type, avail, 1, counter);

ir_variable *retval = body.make_temp(glsl_type::uint_type, "atomic_retval");
body.emit(call(shader->symbols->get_function(intrinsic), retval,
sig->parameters));
body.emit(ret(retval));
return sig;
}

/** @} */

/******************************************************************************/

+ 15
- 0
src/glsl/builtin_variables.cpp 查看文件

@@ -638,6 +638,21 @@ builtin_variable_generator::generate_constants()
*/
add_const("gl_MaxTextureCoords", state->Const.MaxTextureCoords);
}

if (state->ARB_shader_atomic_counters_enable) {
add_const("gl_MaxVertexAtomicCounters",
state->Const.MaxVertexAtomicCounters);
add_const("gl_MaxGeometryAtomicCounters",
state->Const.MaxGeometryAtomicCounters);
add_const("gl_MaxFragmentAtomicCounters",
state->Const.MaxFragmentAtomicCounters);
add_const("gl_MaxCombinedAtomicCounters",
state->Const.MaxCombinedAtomicCounters);
add_const("gl_MaxAtomicCounterBindings",
state->Const.MaxAtomicBufferBindings);
add_const("gl_MaxTessControlAtomicCounters", 0);
add_const("gl_MaxTessEvaluationAtomicCounters", 0);
}
}



+ 3
- 0
src/glsl/glcpp/glcpp-parse.y 查看文件

@@ -1254,6 +1254,9 @@ glcpp_parser_create (const struct gl_extensions *extensions, int api)

if (extensions->ARB_texture_gather)
add_builtin_define(parser, "GL_ARB_texture_gather", 1);

if (extensions->ARB_shader_atomic_counters)
add_builtin_define(parser, "GL_ARB_shader_atomic_counters", 1);
}
}


+ 6
- 0
src/glsl/glsl_parser_extras.cpp 查看文件

@@ -118,6 +118,12 @@ _mesa_glsl_parse_state::_mesa_glsl_parse_state(struct gl_context *_ctx,
this->Const.MaxGeometryTotalOutputComponents = ctx->Const.MaxGeometryTotalOutputComponents;
this->Const.MaxGeometryUniformComponents = ctx->Const.GeometryProgram.MaxUniformComponents;

this->Const.MaxVertexAtomicCounters = ctx->Const.VertexProgram.MaxAtomicCounters;
this->Const.MaxGeometryAtomicCounters = ctx->Const.GeometryProgram.MaxAtomicCounters;
this->Const.MaxFragmentAtomicCounters = ctx->Const.FragmentProgram.MaxAtomicCounters;
this->Const.MaxCombinedAtomicCounters = ctx->Const.MaxCombinedAtomicCounters;
this->Const.MaxAtomicBufferBindings = ctx->Const.MaxAtomicBufferBindings;

this->current_function = NULL;
this->toplevel_ir = NULL;
this->found_return = false;

+ 7
- 0
src/glsl/glsl_parser_extras.h 查看文件

@@ -229,6 +229,13 @@ struct _mesa_glsl_parse_state {
unsigned MaxGeometryOutputVertices;
unsigned MaxGeometryTotalOutputComponents;
unsigned MaxGeometryUniformComponents;

/* ARB_shader_atomic_counters */
unsigned MaxVertexAtomicCounters;
unsigned MaxGeometryAtomicCounters;
unsigned MaxFragmentAtomicCounters;
unsigned MaxCombinedAtomicCounters;
unsigned MaxAtomicBufferBindings;
} Const;

/**

Loading…
取消
儲存