[Mesa-dev] [PATCH 2/2] i965: Clean up context constant initialization code.
Jordan Justen
jordan.l.justen at intel.com
Mon Nov 16 11:35:35 PST 2015
On 2015-11-12 15:38:52, Kenneth Graunke wrote:
> This was getting pretty out of hand, and with compute partially in place
> and tessellation on the way, it was only going to get worse.
>
> This patch makes a "stage exists?" predicate and a "number of stages"
> count and uses them to clean up a lot of calculations. We can just
> loop over shader stages and set things for the ones that exist. For
> combined counts, we can just multiply by the number of stages.
>
> It also tries to organize a little bit.
>
> We should probably use _mesa_has_geometry_shaders/tessellation/compute
> here, but we can't because ctx->Version isn't initialized yet. Perhaps
> that could be fixed in the future.
>
> No change in "glxinfo -l" on Broadwell.
>
> Signed-off-by: Kenneth Graunke <kenneth at whitecape.org>
> ---
> src/mesa/drivers/dri/i965/brw_context.c | 138 ++++++++++++++------------------
> 1 file changed, 58 insertions(+), 80 deletions(-)
>
> diff --git a/src/mesa/drivers/dri/i965/brw_context.c b/src/mesa/drivers/dri/i965/brw_context.c
> index 2db99c7..89533ae 100644
> --- a/src/mesa/drivers/dri/i965/brw_context.c
> +++ b/src/mesa/drivers/dri/i965/brw_context.c
> @@ -322,64 +322,85 @@ static void
> brw_initialize_context_constants(struct brw_context *brw)
> {
> struct gl_context *ctx = &brw->ctx;
> + const struct brw_compiler *compiler = brw->intelScreen->compiler;
> +
> + bool stage_exists[MESA_SHADER_STAGES] = {
> + [MESA_SHADER_VERTEX] = true,
> + [MESA_SHADER_TESS_CTRL] = false,
> + [MESA_SHADER_TESS_EVAL] = false,
> + [MESA_SHADER_GEOMETRY] = brw->gen >= 6,
> + [MESA_SHADER_FRAGMENT] = true,
> + [MESA_SHADER_COMPUTE] = _mesa_extension_override_enables.ARB_compute_shader,
> + };
> +
> + unsigned num_stages = 0;
> + for (int i = 0; i < MESA_SHADER_STAGES; i++) {
> + if (stage_exists[i])
> + num_stages++;
> + }
>
> unsigned max_samplers =
> brw->gen >= 8 || brw->is_haswell ? BRW_MAX_TEX_UNIT : 16;
>
> + ctx->Const.MaxDualSourceDrawBuffers = 1;
> + ctx->Const.MaxDrawBuffers = BRW_MAX_DRAW_BUFFERS;
> + ctx->Const.MaxCombinedShaderOutputResources =
> + MAX_IMAGE_UNITS + BRW_MAX_DRAW_BUFFERS;
> +
> ctx->Const.QueryCounterBits.Timestamp = 36;
>
> + ctx->Const.MaxTextureCoordUnits = 8; /* Mesa limit */
> + ctx->Const.MaxImageUnits = MAX_IMAGE_UNITS;
> + ctx->Const.MaxRenderbufferSize = 8192;
> + ctx->Const.MaxTextureLevels = MIN2(14 /* 8192 */, MAX_TEXTURE_LEVELS);
> + ctx->Const.Max3DTextureLevels = 12; /* 2048 */
> + ctx->Const.MaxCubeTextureLevels = 14; /* 8192 */
> + ctx->Const.MaxArrayTextureLayers = brw->gen >= 7 ? 2048 : 512;
> + ctx->Const.MaxTextureMbytes = 1536;
> + ctx->Const.MaxTextureRectSize = 1 << 12;
> + ctx->Const.MaxTextureMaxAnisotropy = 16.0;
> ctx->Const.StripTextureBorder = true;
> + if (brw->gen >= 7)
> + ctx->Const.MaxProgramTextureGatherComponents = 4;
> + else if (brw->gen == 6)
> + ctx->Const.MaxProgramTextureGatherComponents = 1;
>
> ctx->Const.MaxUniformBlockSize = 65536;
> +
> for (int i = 0; i < MESA_SHADER_STAGES; i++) {
> struct gl_program_constants *prog = &ctx->Const.Program[i];
> +
> + if (!stage_exists[i])
> + continue;
> +
> + prog->MaxTextureImageUnits = max_samplers;
> +
> prog->MaxUniformBlocks = BRW_MAX_UBO;
> prog->MaxCombinedUniformComponents =
> prog->MaxUniformComponents +
> ctx->Const.MaxUniformBlockSize / 4 * prog->MaxUniformBlocks;
> +
> + prog->MaxAtomicCounters = MAX_ATOMIC_COUNTERS;
> + prog->MaxAtomicBuffers = BRW_MAX_ABO;
> + prog->MaxImageUniforms = compiler->scalar_stage[i] ? BRW_MAX_IMAGES : 0;
> + prog->MaxShaderStorageBlocks = BRW_MAX_SSBO;
> }
>
> - ctx->Const.MaxDualSourceDrawBuffers = 1;
> - ctx->Const.MaxDrawBuffers = BRW_MAX_DRAW_BUFFERS;
> - ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxTextureImageUnits = max_samplers;
> - ctx->Const.MaxTextureCoordUnits = 8; /* Mesa limit */
> + if (ctx->Extensions.ARB_compute_shader)
> + ctx->Const.MaxShaderStorageBufferBindings += BRW_MAX_SSBO;
I think you should instead check stage_exists. We have some hardware
that supports ES 3.1, but not the desktop extension.
Reviewed-by: Jordan Justen <jordan.l.justen at intel.com>
> +
> +
> ctx->Const.MaxTextureUnits =
> MIN2(ctx->Const.MaxTextureCoordUnits,
> ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxTextureImageUnits);
> - ctx->Const.Program[MESA_SHADER_VERTEX].MaxTextureImageUnits = max_samplers;
> - if (brw->gen >= 6)
> - ctx->Const.Program[MESA_SHADER_GEOMETRY].MaxTextureImageUnits = max_samplers;
> - else
> - ctx->Const.Program[MESA_SHADER_GEOMETRY].MaxTextureImageUnits = 0;
> - if (_mesa_extension_override_enables.ARB_compute_shader) {
> - ctx->Const.Program[MESA_SHADER_COMPUTE].MaxTextureImageUnits = BRW_MAX_TEX_UNIT;
> - ctx->Const.MaxUniformBufferBindings += BRW_MAX_UBO;
> - } else {
> - ctx->Const.Program[MESA_SHADER_COMPUTE].MaxTextureImageUnits = 0;
> - }
> - ctx->Const.MaxCombinedTextureImageUnits =
> - ctx->Const.Program[MESA_SHADER_VERTEX].MaxTextureImageUnits +
> - ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxTextureImageUnits +
> - ctx->Const.Program[MESA_SHADER_GEOMETRY].MaxTextureImageUnits +
> - ctx->Const.Program[MESA_SHADER_COMPUTE].MaxTextureImageUnits;
> -
> - ctx->Const.MaxTextureLevels = 14; /* 8192 */
> - if (ctx->Const.MaxTextureLevels > MAX_TEXTURE_LEVELS)
> - ctx->Const.MaxTextureLevels = MAX_TEXTURE_LEVELS;
> - ctx->Const.Max3DTextureLevels = 12; /* 2048 */
> - ctx->Const.MaxCubeTextureLevels = 14; /* 8192 */
> - ctx->Const.MaxTextureMbytes = 1536;
>
> - if (brw->gen >= 7)
> - ctx->Const.MaxArrayTextureLayers = 2048;
> - else
> - ctx->Const.MaxArrayTextureLayers = 512;
> + ctx->Const.MaxUniformBufferBindings = num_stages * BRW_MAX_UBO;
> + ctx->Const.MaxCombinedAtomicBuffers = num_stages * BRW_MAX_ABO;
> + ctx->Const.MaxCombinedShaderStorageBlocks = num_stages * BRW_MAX_SSBO;
> + ctx->Const.MaxShaderStorageBufferBindings = num_stages * BRW_MAX_SSBO;
> + ctx->Const.MaxCombinedTextureImageUnits = num_stages * max_samplers;
> + ctx->Const.MaxCombinedImageUniforms = num_stages * BRW_MAX_IMAGES;
>
> - ctx->Const.MaxTextureRectSize = 1 << 12;
> -
> - ctx->Const.MaxTextureMaxAnisotropy = 16.0;
> -
> - ctx->Const.MaxRenderbufferSize = 8192;
>
> /* Hardware only supports a limited number of transform feedback buffers.
> * So we need to override the Mesa default (which is based only on software
> @@ -427,6 +448,7 @@ brw_initialize_context_constants(struct brw_context *brw)
> ctx->Const.MaxColorTextureSamples = max_samples;
> ctx->Const.MaxDepthTextureSamples = max_samples;
> ctx->Const.MaxIntegerSamples = max_samples;
> + ctx->Const.MaxImageSamples = 0;
>
> /* gen6_set_sample_maps() sets SampleMap{2,4,8}x variables which are used
> * to map indices of rectangular grid to sample numbers within a pixel.
> @@ -436,11 +458,6 @@ brw_initialize_context_constants(struct brw_context *brw)
> */
> gen6_set_sample_maps(ctx);
>
> - if (brw->gen >= 7)
> - ctx->Const.MaxProgramTextureGatherComponents = 4;
> - else if (brw->gen == 6)
> - ctx->Const.MaxProgramTextureGatherComponents = 1;
> -
> ctx->Const.MinLineWidth = 1.0;
> ctx->Const.MinLineWidthAA = 1.0;
> if (brw->gen >= 6) {
> @@ -511,30 +528,6 @@ brw_initialize_context_constants(struct brw_context *brw)
> ctx->Const.Program[MESA_SHADER_VERTEX].HighInt = ctx->Const.Program[MESA_SHADER_VERTEX].LowInt;
> ctx->Const.Program[MESA_SHADER_VERTEX].MediumInt = ctx->Const.Program[MESA_SHADER_VERTEX].LowInt;
>
> - if (brw->gen >= 7) {
> - ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxAtomicCounters = MAX_ATOMIC_COUNTERS;
> - ctx->Const.Program[MESA_SHADER_VERTEX].MaxAtomicCounters = MAX_ATOMIC_COUNTERS;
> - ctx->Const.Program[MESA_SHADER_GEOMETRY].MaxAtomicCounters = MAX_ATOMIC_COUNTERS;
> - ctx->Const.Program[MESA_SHADER_COMPUTE].MaxAtomicCounters = MAX_ATOMIC_COUNTERS;
> - ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxAtomicBuffers = BRW_MAX_ABO;
> - ctx->Const.Program[MESA_SHADER_VERTEX].MaxAtomicBuffers = BRW_MAX_ABO;
> - ctx->Const.Program[MESA_SHADER_GEOMETRY].MaxAtomicBuffers = BRW_MAX_ABO;
> - ctx->Const.Program[MESA_SHADER_COMPUTE].MaxAtomicBuffers = BRW_MAX_ABO;
> - ctx->Const.MaxCombinedAtomicBuffers = 3 * BRW_MAX_ABO;
> -
> - ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxImageUniforms =
> - BRW_MAX_IMAGES;
> - ctx->Const.Program[MESA_SHADER_VERTEX].MaxImageUniforms =
> - (brw->intelScreen->compiler->scalar_stage[MESA_SHADER_VERTEX] ? BRW_MAX_IMAGES : 0);
> - ctx->Const.Program[MESA_SHADER_COMPUTE].MaxImageUniforms =
> - BRW_MAX_IMAGES;
> - ctx->Const.MaxImageUnits = MAX_IMAGE_UNITS;
> - ctx->Const.MaxCombinedShaderOutputResources =
> - MAX_IMAGE_UNITS + BRW_MAX_DRAW_BUFFERS;
> - ctx->Const.MaxImageSamples = 0;
> - ctx->Const.MaxCombinedImageUniforms = 3 * BRW_MAX_IMAGES;
> - }
> -
> /* Gen6 converts quads to polygon in beginning of 3D pipeline,
> * but we're not sure how it's actually done for vertex order,
> * that affect provoking vertex decision. Always use last vertex
> @@ -586,21 +579,6 @@ brw_initialize_context_constants(struct brw_context *brw)
> ctx->Const.TextureBufferOffsetAlignment = 16;
> ctx->Const.MaxTextureBufferSize = 128 * 1024 * 1024;
>
> - /* FIXME: Tessellation stages are not yet supported in i965, so
> - * MaxCombinedShaderStorageBlocks doesn't take them into account.
> - */
> - ctx->Const.Program[MESA_SHADER_VERTEX].MaxShaderStorageBlocks = BRW_MAX_SSBO;
> - ctx->Const.Program[MESA_SHADER_GEOMETRY].MaxShaderStorageBlocks = BRW_MAX_SSBO;
> - ctx->Const.Program[MESA_SHADER_TESS_EVAL].MaxShaderStorageBlocks = 0;
> - ctx->Const.Program[MESA_SHADER_TESS_CTRL].MaxShaderStorageBlocks = 0;
> - ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxShaderStorageBlocks = BRW_MAX_SSBO;
> - ctx->Const.Program[MESA_SHADER_COMPUTE].MaxShaderStorageBlocks = BRW_MAX_SSBO;
> - ctx->Const.MaxCombinedShaderStorageBlocks = BRW_MAX_SSBO * 3;
> - ctx->Const.MaxShaderStorageBufferBindings = BRW_MAX_SSBO * 3;
> -
> - if (_mesa_extension_override_enables.ARB_compute_shader)
> - ctx->Const.MaxShaderStorageBufferBindings += BRW_MAX_SSBO;
> -
> if (brw->gen >= 6) {
> ctx->Const.MaxVarying = 32;
> ctx->Const.Program[MESA_SHADER_VERTEX].MaxOutputComponents = 128;
> --
> 2.6.2
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list