Mesa (master): nir: add opt_if_loop_terminator()
Module: Mesa Branch: master Commit: 2a74296f24ba15b14602286a680ca5f344a71059 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=2a74296f24ba15b14602286a680ca5f344a71059 Author: Timothy Arceri Date: Fri Jun 1 15:37:28 2018 +1000 nir: add opt_if_loop_terminator() This pass detects potential loop terminators and moves intructions from the non breaking branch after the if-statement. This enables both the new opt_if_simplification() pass and loop unrolling to potentially progress further. Unexpectedly this change speed up shader-db run times by ~3% Ivy Bridge shader-db results (all changes in dolphin/ubershaders): total instructions in shared programs: 9995662 -> 9995338 (-0.00%) instructions in affected programs: 87845 -> 87521 (-0.37%) helped: 27 HURT: 0 total cycles in shared programs: 230931495 -> 230925015 (-0.00%) cycles in affected programs: 56391385 -> 56384905 (-0.01%) helped: 27 HURT: 0 Reviewed-by: Ian Romanick --- src/compiler/nir/nir_opt_if.c | 68 +++ 1 file changed, 68 insertions(+) diff --git a/src/compiler/nir/nir_opt_if.c b/src/compiler/nir/nir_opt_if.c index b03657a424..863ca630fb 100644 --- a/src/compiler/nir/nir_opt_if.c +++ b/src/compiler/nir/nir_opt_if.c @@ -24,6 +24,7 @@ #include "nir.h" #include "nir/nir_builder.h" #include "nir_control_flow.h" +#include "nir_loop_analyze.h" /** * This optimization detects if statements at the tops of loops where the @@ -283,6 +284,72 @@ opt_if_simplification(nir_builder *b, nir_if *nif) return true; } +/** + * This optimization simplifies potential loop terminators which then allows + * other passes such as opt_if_simplification() and loop unrolling to progress + * further: + * + * if (cond) { + *... then block instructions ... + * } else { + * ... + *break; + * } + * + * into: + * + * if (cond) { + * } else { + * ... + *break; + * } + * ... then block instructions ... + */ +static bool +opt_if_loop_terminator(nir_if *nif) +{ + nir_block *break_blk = NULL; + nir_block *continue_from_blk = NULL; + bool continue_from_then = true; + + nir_block *last_then = nir_if_last_then_block(nif); + nir_block *last_else = nir_if_last_else_block(nif); + + if (nir_block_ends_in_break(last_then)) { + break_blk = last_then; + continue_from_blk = last_else; + continue_from_then = false; + } else if (nir_block_ends_in_break(last_else)) { + break_blk = last_else; + continue_from_blk = last_then; + } + + /* Continue if the if-statement contained no jumps at all */ + if (!break_blk) + return false; + + /* If the continue from block is empty then return as there is nothing to +* move. +*/ + nir_block *first_continue_from_blk = continue_from_then ? + nir_if_first_then_block(nif) : + nir_if_first_else_block(nif); + if (is_block_empty(first_continue_from_blk)) + return false; + + if (!nir_is_trivial_loop_if(nif, break_blk)) + return false; + + /* Finally, move the continue from branch after the if-statement. */ + nir_cf_list tmp; + nir_cf_extract(, nir_before_block(first_continue_from_blk), +nir_after_block(continue_from_blk)); + nir_cf_reinsert(, nir_after_cf_node(>cf_node)); + nir_cf_delete(); + + return true; +} + static bool opt_if_cf_list(nir_builder *b, struct exec_list *cf_list) { @@ -296,6 +363,7 @@ opt_if_cf_list(nir_builder *b, struct exec_list *cf_list) nir_if *nif = nir_cf_node_as_if(cf_node); progress |= opt_if_cf_list(b, >then_list); progress |= opt_if_cf_list(b, >else_list); + progress |= opt_if_loop_terminator(nif); progress |= opt_if_simplification(b, nif); break; } ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): radv: fix Coverity no effect control flow issue
Module: Mesa Branch: master Commit: 186988e28f9fe31ad4d08626586d5167051a14e7 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=186988e28f9fe31ad4d08626586d5167051a14e7 Author: Timothy Arceri Date: Thu Jun 7 09:49:37 2018 +1000 radv: fix Coverity no effect control flow issue swizzle is unsigned so "desc->swizzle[c] < 0" is never true. Reviewed-by: Bas Nieuwenhuizen --- src/amd/vulkan/radv_formats.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/amd/vulkan/radv_formats.c b/src/amd/vulkan/radv_formats.c index 50ec904d51..958f2a2c82 100644 --- a/src/amd/vulkan/radv_formats.c +++ b/src/amd/vulkan/radv_formats.c @@ -921,7 +921,7 @@ bool radv_format_pack_clear_color(VkFormat format, uint64_t clear_val = 0; for (unsigned c = 0; c < 4; ++c) { - if (desc->swizzle[c] < 0 || desc->swizzle[c] >= 4) + if (desc->swizzle[c] >= 4) continue; const struct vk_format_channel_description *channel = >channel[desc->swizzle[c]]; ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): nir: move ends_in_break() helper to nir_loop_analyze.h
Module: Mesa Branch: master Commit: 1098bc5e854a1253e050fa30d16eda6ca676d4b3 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=1098bc5e854a1253e050fa30d16eda6ca676d4b3 Author: Timothy Arceri Date: Fri Jun 1 15:37:27 2018 +1000 nir: move ends_in_break() helper to nir_loop_analyze.h We will use the helper while simplifying potential loop terminators in the following patch. Reviewed-by: Ian Romanick --- src/compiler/nir/nir_loop_analyze.c | 15 ++- src/compiler/nir/nir_loop_analyze.h | 11 +++ 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/compiler/nir/nir_loop_analyze.c b/src/compiler/nir/nir_loop_analyze.c index 84da035052..d5281a5faa 100644 --- a/src/compiler/nir/nir_loop_analyze.c +++ b/src/compiler/nir/nir_loop_analyze.c @@ -290,17 +290,6 @@ initialize_ssa_def(nir_ssa_def *def, void *void_state) return true; } -static inline bool -ends_in_break(nir_block *block) -{ - if (exec_list_is_empty(>instr_list)) - return false; - - nir_instr *instr = nir_block_last_instr(block); - return instr->type == nir_instr_type_jump && - nir_instr_as_jump(instr)->type == nir_jump_break; -} - static bool find_loop_terminators(loop_info_state *state) { @@ -315,11 +304,11 @@ find_loop_terminators(loop_info_state *state) nir_block *last_then = nir_if_last_then_block(nif); nir_block *last_else = nir_if_last_else_block(nif); - if (ends_in_break(last_then)) { + if (nir_block_ends_in_break(last_then)) { break_blk = last_then; continue_from_blk = last_else; continue_from_then = false; - } else if (ends_in_break(last_else)) { + } else if (nir_block_ends_in_break(last_else)) { break_blk = last_else; continue_from_blk = last_then; } diff --git a/src/compiler/nir/nir_loop_analyze.h b/src/compiler/nir/nir_loop_analyze.h index 18c2305171..7b4ed66ee5 100644 --- a/src/compiler/nir/nir_loop_analyze.h +++ b/src/compiler/nir/nir_loop_analyze.h @@ -92,4 +92,15 @@ nir_is_trivial_loop_if(nir_if *nif, nir_block *break_block) return true; } +static inline bool +nir_block_ends_in_break(nir_block *block) +{ + if (exec_list_is_empty(>instr_list)) + return false; + + nir_instr *instr = nir_block_last_instr(block); + return instr->type == nir_instr_type_jump && + nir_instr_as_jump(instr)->type == nir_jump_break; +} + #endif /* NIR_LOOP_ANALYZE_H */ ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): nir: add unsigned comparison simplifications
Module: Mesa Branch: master Commit: e8b368ad1c4bdafc32505b722617b8ab19296fbe URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=e8b368ad1c4bdafc32505b722617b8ab19296fbe Author: Timothy Arceri Date: Wed May 30 20:32:24 2018 +1000 nir: add unsigned comparison simplifications This avoids loop unrolling regressions in Wolfenstein II on DXVK with an upcoming optimisation series from Samuel. Reviewed-by: Bas Nieuwenhuizen --- src/compiler/nir/nir_opt_algebraic.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/compiler/nir/nir_opt_algebraic.py b/src/compiler/nir/nir_opt_algebraic.py index 909ea3daf4..21b9acecbe 100644 --- a/src/compiler/nir/nir_opt_algebraic.py +++ b/src/compiler/nir/nir_opt_algebraic.py @@ -149,7 +149,9 @@ optimizations = [ (('~inot', ('feq', a, b)), ('fne', a, b)), (('~inot', ('fne', a, b)), ('feq', a, b)), (('inot', ('ilt', a, b)), ('ige', a, b)), + (('inot', ('ult', a, b)), ('uge', a, b)), (('inot', ('ige', a, b)), ('ilt', a, b)), + (('inot', ('uge', a, b)), ('ult', a, b)), (('inot', ('ieq', a, b)), ('ine', a, b)), (('inot', ('ine', a, b)), ('ieq', a, b)), ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): mesa: add display list support for glPatchParameter{i,fv}()
Module: Mesa Branch: master Commit: 1f7a3a11025b18d46d46f7e3f5c45eda9e825dcd URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=1f7a3a11025b18d46d46f7e3f5c45eda9e825dcd Author: Timothy Arceri Date: Mon May 28 20:57:37 2018 +1000 mesa: add display list support for glPatchParameter{i,fv}() This is required for tessellation shader Compat profile support. Reviewed-by: Marek Olšák --- src/mesa/main/dlist.c | 78 +++ 1 file changed, 78 insertions(+) diff --git a/src/mesa/main/dlist.c b/src/mesa/main/dlist.c index 8be223559a..4fc451000b 100644 --- a/src/mesa/main/dlist.c +++ b/src/mesa/main/dlist.c @@ -365,6 +365,11 @@ typedef enum OPCODE_UNIFORM_3UIV, OPCODE_UNIFORM_4UIV, + /* OpenGL 4.0 / GL_ARB_tessellation_shader */ + OPCODE_PATCH_PARAMETER_I, + OPCODE_PATCH_PARAMETER_FV_INNER, + OPCODE_PATCH_PARAMETER_FV_OUTER, + /* OpenGL 4.2 / GL_ARB_separate_shader_objects */ OPCODE_USE_PROGRAM_STAGES, OPCODE_PROGRAM_UNIFORM_1F, @@ -3272,6 +3277,54 @@ save_Ortho(GLdouble left, GLdouble right, static void GLAPIENTRY +save_PatchParameteri(GLenum pname, const GLint value) +{ + GET_CURRENT_CONTEXT(ctx); + Node *n; + ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); + n = alloc_instruction(ctx, OPCODE_PATCH_PARAMETER_I, 2); + if (n) { + n[1].e = pname; + n[2].i = value; + } + if (ctx->ExecuteFlag) { + CALL_PatchParameteri(ctx->Exec, (pname, value)); + } +} + + +static void GLAPIENTRY +save_PatchParameterfv(GLenum pname, const GLfloat *params) +{ + GET_CURRENT_CONTEXT(ctx); + Node *n; + ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); + + if (pname == GL_PATCH_DEFAULT_OUTER_LEVEL) { + n = alloc_instruction(ctx, OPCODE_PATCH_PARAMETER_FV_OUTER, 5); + } else { + assert(pname == GL_PATCH_DEFAULT_INNER_LEVEL); + n = alloc_instruction(ctx, OPCODE_PATCH_PARAMETER_FV_INNER, 3); + } + if (n) { + n[1].e = pname; + if (pname == GL_PATCH_DEFAULT_OUTER_LEVEL) { + n[2].f = params[0]; + n[3].f = params[1]; + n[4].f = params[2]; + n[5].f = params[3]; + } else { + n[2].f = params[0]; + n[3].f = params[1]; + } + } + if (ctx->ExecuteFlag) { + CALL_PatchParameterfv(ctx->Exec, (pname, params)); + } +} + + +static void GLAPIENTRY save_PixelMapfv(GLenum map, GLint mapsize, const GLfloat *values) { GET_CURRENT_CONTEXT(ctx); @@ -8401,6 +8454,27 @@ execute_list(struct gl_context *ctx, GLuint list) case OPCODE_PASSTHROUGH: CALL_PassThrough(ctx->Exec, (n[1].f)); break; + case OPCODE_PATCH_PARAMETER_I: +CALL_PatchParameteri(ctx->Exec, (n[1].e, n[2].i)); +break; + case OPCODE_PATCH_PARAMETER_FV_INNER: +{ + GLfloat params[2]; + params[0] = n[2].f; + params[1] = n[3].f; + CALL_PatchParameterfv(ctx->Exec, (n[1].e, params)); +} +break; + case OPCODE_PATCH_PARAMETER_FV_OUTER: +{ + GLfloat params[4]; + params[0] = n[2].f; + params[1] = n[3].f; + params[2] = n[4].f; + params[3] = n[5].f; + CALL_PatchParameterfv(ctx->Exec, (n[1].e, params)); +} +break; case OPCODE_PIXEL_MAP: CALL_PixelMapfv(ctx->Exec, (n[1].e, n[2].i, get_pointer([3]))); @@ -9847,6 +9921,10 @@ _mesa_initialize_save_table(const struct gl_context *ctx) SET_PointParameterf(table, save_PointParameterfEXT); SET_PointParameterfv(table, save_PointParameterfvEXT); + /* 91. GL_ARB_tessellation_shader */ + SET_PatchParameteri(table, save_PatchParameteri); + SET_PatchParameterfv(table, save_PatchParameterfv); + /* 173. GL_EXT_blend_func_separate */ SET_BlendFuncSeparate(table, save_BlendFuncSeparateEXT); ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): Revert "st/nir: use NIR for asm programs"
Module: Mesa Branch: master Commit: 3b6dfcf7ae0abd65c0db8a71e55977a0e20ea94f URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=3b6dfcf7ae0abd65c0db8a71e55977a0e20ea94f Author: Eric Anholt <e...@anholt.net> Date: Thu May 17 15:53:40 2018 +0100 Revert "st/nir: use NIR for asm programs" This reverts commit 5c33e8c7729edd5e16020ebb8703be96523e04f2. It broke fixed function vertex programs on vc4 and v3d, and apparently caused trouble for radeonsi's NIR paths as well. Acked-by: Timothy Arceri <tarc...@itsqueeze.com> https://bugs.freedesktop.org/show_bug.cgi?id=106673 --- src/mesa/state_tracker/st_program.c | 65 - 1 file changed, 7 insertions(+), 58 deletions(-) diff --git a/src/mesa/state_tracker/st_program.c b/src/mesa/state_tracker/st_program.c index a7671b7fd1..8117f4ff8d 100644 --- a/src/mesa/state_tracker/st_program.c +++ b/src/mesa/state_tracker/st_program.c @@ -37,7 +37,6 @@ #include "main/mtypes.h" #include "program/prog_parameter.h" #include "program/prog_print.h" -#include "program/prog_to_nir.h" #include "program/programopt.h" #include "compiler/nir/nir.h" @@ -379,28 +378,6 @@ st_release_cp_variants(struct st_context *st, struct st_compute_program *stcp) } /** - * Translate ARB (asm) program to NIR - */ -static nir_shader * -st_translate_prog_to_nir(struct st_context *st, struct gl_program *prog, - gl_shader_stage stage) -{ - const struct gl_shader_compiler_options *options = - >ctx->Const.ShaderCompilerOptions[stage]; - - /* Translate to NIR */ - nir_shader *nir = prog_to_nir(prog, options->NirOptions); - NIR_PASS_V(nir, nir_lower_regs_to_ssa); /* turn registers into SSA */ - nir_validate_shader(nir); - - /* Optimise NIR */ - st_nir_opts(nir); - nir_validate_shader(nir); - - return nir; -} - -/** * Translate a vertex program. */ bool @@ -481,28 +458,15 @@ st_translate_vertex_program(struct st_context *st, /* No samplers are allowed in ARB_vp. */ } - enum pipe_shader_ir preferred_ir = (enum pipe_shader_ir) - st->pipe->screen->get_shader_param(st->pipe->screen, PIPE_SHADER_VERTEX, - PIPE_SHADER_CAP_PREFERRED_IR); - - if (preferred_ir == PIPE_SHADER_IR_NIR) { - if (stvp->shader_program) { - struct gl_program *prog = stvp->shader_program->last_vert_prog; - if (prog) { -st_translate_stream_output_info2(prog->sh.LinkedTransformFeedback, - stvp->result_to_output, - >tgsi.stream_output); - } - - st_store_ir_in_disk_cache(st, >Base, true); - } else { - nir_shader *nir = st_translate_prog_to_nir(st, >Base, -MESA_SHADER_VERTEX); - - stvp->tgsi.type = PIPE_SHADER_IR_NIR; - stvp->tgsi.ir.nir = nir; + if (stvp->shader_program) { + struct gl_program *prog = stvp->shader_program->last_vert_prog; + if (prog) { + st_translate_stream_output_info2(prog->sh.LinkedTransformFeedback, + stvp->result_to_output, + >tgsi.stream_output); } + st_store_ir_in_disk_cache(st, >Base, true); return true; } @@ -742,21 +706,6 @@ st_translate_fragment_program(struct st_context *st, } } - enum pipe_shader_ir preferred_ir = (enum pipe_shader_ir) - st->pipe->screen->get_shader_param(st->pipe->screen, - PIPE_SHADER_FRAGMENT, - PIPE_SHADER_CAP_PREFERRED_IR); - - if (preferred_ir == PIPE_SHADER_IR_NIR) { - nir_shader *nir = st_translate_prog_to_nir(st, >Base, - MESA_SHADER_FRAGMENT); - - stfp->tgsi.type = PIPE_SHADER_IR_NIR; - stfp->tgsi.ir.nir = nir; - - return true; - } - /* * Convert Mesa program inputs to TGSI input register semantics. */ ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): mesa: do not leak ctx->Shader.ReferencedProgram references
Module: Mesa Branch: master Commit: 6c61c31dc2fe52ad8a56ebe0b3aa10c223b635ba URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=6c61c31dc2fe52ad8a56ebe0b3aa10c223b635ba Author: Jose Dapena Paz <jose.dap...@lge.com> Date: Thu May 24 19:56:24 2018 +0200 mesa: do not leak ctx->Shader.ReferencedProgram references When glUseProgram is used, references to the included shaders are added in ctx->Shader.ReferencedProgram. But those references are not decreased when the shader data is deallocated. Thus, those shaders are leaked. Explicitely remove the pending references to these shaders. Fixes: e6506b3cd23 ("mesa: retain gl_shader_programs after glDeleteProgram if they are in use") Reviewed-by: Timothy Arceri <tarc...@itsqueeze.com> --- src/mesa/main/shaderapi.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/mesa/main/shaderapi.c b/src/mesa/main/shaderapi.c index caa42541ca..f7080847cc 100644 --- a/src/mesa/main/shaderapi.c +++ b/src/mesa/main/shaderapi.c @@ -159,6 +159,9 @@ _mesa_free_shader_state(struct gl_context *ctx) { for (int i = 0; i < MESA_SHADER_STAGES; i++) { _mesa_reference_program(ctx, >Shader.CurrentProgram[i], NULL); + _mesa_reference_shader_program(ctx, + >Shader.ReferencedPrograms[i], + NULL); } _mesa_reference_shader_program(ctx, >Shader.ActiveProgram, NULL); ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): mesa: stop hiding query parameters from OpenGL compat
Module: Mesa Branch: master Commit: 2e6c987a85f96dd96da17b50526e7c0cb5adb5f1 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=2e6c987a85f96dd96da17b50526e7c0cb5adb5f1 Author: Timothy Arceri <tarc...@itsqueeze.com> Date: Fri May 18 12:36:05 2018 +1000 mesa: stop hiding query parameters from OpenGL compat Just let the extension detection do its job as we will be adding compat profile support in future, also we want these to work with compat profile version overrides. Reviewed-by: Marek Olšák <marek.ol...@amd.com> --- src/mesa/main/get_hash_params.py | 21 +++-- 1 file changed, 7 insertions(+), 14 deletions(-) diff --git a/src/mesa/main/get_hash_params.py b/src/mesa/main/get_hash_params.py index 4bbda93b31..7e14cf51f5 100644 --- a/src/mesa/main/get_hash_params.py +++ b/src/mesa/main/get_hash_params.py @@ -451,6 +451,11 @@ descriptor=[ [ "MAX_WINDOW_RECTANGLES_EXT", "CONTEXT_INT(Const.MaxWindowRectangles), extra_EXT_window_rectangles" ], [ "NUM_WINDOW_RECTANGLES_EXT", "CONTEXT_INT(Scissor.NumWindowRects), extra_EXT_window_rectangles" ], [ "WINDOW_RECTANGLE_MODE_EXT", "CONTEXT_ENUM16(Scissor.WindowRectMode), extra_EXT_window_rectangles" ], + + # GL_ARB_gpu_shader5 / GL_OES_shader_multisample_interpolation + [ "MIN_FRAGMENT_INTERPOLATION_OFFSET", "CONTEXT_FLOAT(Const.MinFragmentInterpolationOffset), extra_ARB_gpu_shader5_or_OES_sample_variables" ], + [ "MAX_FRAGMENT_INTERPOLATION_OFFSET", "CONTEXT_FLOAT(Const.MaxFragmentInterpolationOffset), extra_ARB_gpu_shader5_or_OES_sample_variables" ], + [ "FRAGMENT_INTERPOLATION_OFFSET_BITS", "CONST(FRAGMENT_INTERPOLATION_OFFSET_BITS), extra_ARB_gpu_shader5_or_OES_sample_variables" ], ]}, { "apis": ["GLES", "GLES2"], "params": [ @@ -558,18 +563,7 @@ descriptor=[ # GL_NUM_SHADING_LANGUAGE_VERSIONS [ "NUM_SHADING_LANGUAGE_VERSIONS", "LOC_CUSTOM, TYPE_INT, 0, extra_version_43" ], -]}, -# Enums in OpenGL Core profile and ES 3.0 -{ "apis": ["GL_CORE", "GLES3"], "params": [ - # GL_ARB_gpu_shader5 / GL_OES_shader_multisample_interpolation - [ "MIN_FRAGMENT_INTERPOLATION_OFFSET", "CONTEXT_FLOAT(Const.MinFragmentInterpolationOffset), extra_ARB_gpu_shader5_or_OES_sample_variables" ], - [ "MAX_FRAGMENT_INTERPOLATION_OFFSET", "CONTEXT_FLOAT(Const.MaxFragmentInterpolationOffset), extra_ARB_gpu_shader5_or_OES_sample_variables" ], - [ "FRAGMENT_INTERPOLATION_OFFSET_BITS", "CONST(FRAGMENT_INTERPOLATION_OFFSET_BITS), extra_ARB_gpu_shader5_or_OES_sample_variables" ], -]}, - -# Enums in OpenGL Core profile and ES 3.1 -{ "apis": ["GL_CORE", "GLES31"], "params": [ # GL_ARB_draw_indirect / GLES 3.1 [ "DRAW_INDIRECT_BUFFER_BINDING", "LOC_CUSTOM, TYPE_INT, 0, extra_ARB_draw_indirect" ], @@ -650,12 +644,11 @@ descriptor=[ [ "CONSERVATIVE_RASTERIZATION_INTEL", "CONTEXT_BOOL(IntelConservativeRasterization), extra_INTEL_conservative_rasterization" ], ]}, -{ "apis": ["GL_CORE", "GLES32"], "params": [ +# Enums in OpenGL and ES 3.2 +{ "apis": ["GL", "GL_CORE", "GLES32"], "params": [ [ "MULTISAMPLE_LINE_WIDTH_RANGE_ARB", "CONTEXT_FLOAT2(Const.MinLineWidthAA), extra_ES32" ], [ "MULTISAMPLE_LINE_WIDTH_GRANULARITY_ARB", "CONTEXT_FLOAT(Const.LineWidthGranularity), extra_ES32" ], -]}, -{ "apis": ["GL", "GL_CORE", "GLES32"], "params": [ # GL 3.0 or ES 3.2 [ "CONTEXT_FLAGS", "CONTEXT_INT(Const.ContextFlags), extra_version_30" ], ]}, ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): mesa: drop GL_EXT_polygon_offset support
Module: Mesa Branch: master Commit: c0c69bd8ddf384379863d8b4bcbc670e86984ae5 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=c0c69bd8ddf384379863d8b4bcbc670e86984ae5 Author: Timothy Arceri <tarc...@itsqueeze.com> Date: Fri May 11 15:33:22 2018 +1000 mesa: drop GL_EXT_polygon_offset support glPolygonOffset() has been part of the GL standard since 1.1. Also niether AMD or Nvidia support this in their binary drivers. Reviewed-by: Marek Olšák <marek.ol...@amd.com> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=61761 --- docs/relnotes/18.2.0.html | 64 + src/mapi/glapi/gen/gl_API.xml | 10 -- src/mapi/glapi/tests/check_table.cpp| 1 - src/mesa/main/dlist.c | 11 -- src/mesa/main/extensions_table.h| 1 - src/mesa/main/get_hash_params.py| 1 - src/mesa/main/polygon.c | 8 - src/mesa/main/polygon.h | 3 -- src/mesa/main/tests/dispatch_sanity.cpp | 1 - 9 files changed, 64 insertions(+), 36 deletions(-) diff --git a/docs/relnotes/18.2.0.html b/docs/relnotes/18.2.0.html new file mode 100644 index 00..f3bdb6605c --- /dev/null +++ b/docs/relnotes/18.2.0.html @@ -0,0 +1,64 @@ +http://www.w3.org/TR/html4/loose.dtd;> + + + + Mesa Release Notes + + + + + + The Mesa 3D Graphics Library + + + + + +Mesa 18.2.0 Release Notes / TBD + + +Mesa 18.2.0 is a new development release. People who are concerned +with stability and reliability should stick with a previous release or +wait for Mesa 18.2.1. + + +Mesa 18.2.0 implements the OpenGL 4.5 API, but the version reported by +glGetString(GL_VERSION) or glGetIntegerv(GL_MAJOR_VERSION) / +glGetIntegerv(GL_MINOR_VERSION) depends on the particular driver being used. +Some drivers don't support all the features required in OpenGL 4.5. OpenGL +4.5 is only available if requested at context creation. +Compatibility contexts may report a lower version depending on each driver. + + + +SHA256 checksums + +TBD. + + + +New features + + +Note: some of the new features are only available with certain drivers. + + + +TBD + + +Bug fixes + + +TBD + + +Changes + + +Removed GL_EXT_polygon_offset applications should use glPolygonOffset instead. + + + + + diff --git a/src/mapi/glapi/gen/gl_API.xml b/src/mapi/glapi/gen/gl_API.xml index db312370b1..8ad45970c9 100644 --- a/src/mapi/glapi/gen/gl_API.xml +++ b/src/mapi/glapi/gen/gl_API.xml @@ -8423,16 +8423,6 @@ - - - - - - - - - - diff --git a/src/mapi/glapi/tests/check_table.cpp b/src/mapi/glapi/tests/check_table.cpp index 6230f1273f..761f2a24e0 100644 --- a/src/mapi/glapi/tests/check_table.cpp +++ b/src/mapi/glapi/tests/check_table.cpp @@ -1260,7 +1260,6 @@ const struct name_offset known_dispatch[] = { { "glTextureStorage1DEXT", _O(TextureStorage1DEXT) }, { "glTextureStorage2DEXT", _O(TextureStorage2DEXT) }, { "glTextureStorage3DEXT", _O(TextureStorage3DEXT) }, - { "glPolygonOffsetEXT", _O(PolygonOffsetEXT) }, { "glSampleMaskSGIS", _O(SampleMaskSGIS) }, { "glSamplePatternSGIS", _O(SamplePatternSGIS) }, { "glColorPointerEXT", _O(ColorPointerEXT) }, diff --git a/src/mesa/main/dlist.c b/src/mesa/main/dlist.c index 9e6cb725f5..8be223559a 100644 --- a/src/mesa/main/dlist.c +++ b/src/mesa/main/dlist.c @@ -3486,14 +3486,6 @@ save_PolygonOffset(GLfloat factor, GLfloat units) static void GLAPIENTRY -save_PolygonOffsetEXT(GLfloat factor, GLfloat bias) -{ - GET_CURRENT_CONTEXT(ctx); - /* XXX mult by DepthMaxF here??? */ - save_PolygonOffset(factor, ctx->DrawBuffer->_DepthMaxF * bias); -} - -static void GLAPIENTRY save_PolygonOffsetClampEXT(GLfloat factor, GLfloat units, GLfloat clamp) { GET_CURRENT_CONTEXT(ctx); @@ -9839,9 +9831,6 @@ _mesa_initialize_save_table(const struct gl_context *ctx) SET_BlendColorEXT(table, save_BlendColorEXT); #endif - /* 3. GL_EXT_polygon_offset */ - SET_PolygonOffsetEXT(table, save_PolygonOffsetEXT); - /* 6. GL_EXT_texture3d */ #if 0 SET_CopyTexSubImage3DEXT(table, save_CopyTexSubImage3D); diff --git a/src/mesa/main/extensions_table.h b/src/mesa/main/extensions_table.h index 945b462122..38d241db52 100644 --- a/src/mesa/main/extensions_table.h +++ b/src/mesa/main/extensions_table.h @@ -240,7 +240,6 @@ EXT(EXT_packed_float, EXT_packed_float EXT(EXT_packed_pixels , dummy_true , GLL, x , x , x , 1997) EXT(EXT_pixel_buffer_object , EXT_pixel_buffer_object , GLL, GLC, x , x , 2004) EXT(EXT_point_parameters, EXT_point_parameters , GLL, x , x , x , 1997) -EXT(EXT_polygon_offset , dummy_true , GLL, x , x , x , 1995) EXT(EXT_polygon_offset_clam
Mesa (master): mesa: add glUniform*ui{v} support to display lists
Module: Mesa Branch: master Commit: f71714022b2cd26bb1892e6a7f3d7308515f210e URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=f71714022b2cd26bb1892e6a7f3d7308515f210e Author: Timothy Arceri <tarc...@itsqueeze.com> Date: Thu May 10 13:42:16 2018 +1000 mesa: add glUniform*ui{v} support to display lists Fixes: a017c7ecb7ae "mesa: display list support for uint uniforms" Reviewed-by: Marek Olšák <marek.ol...@amd.com> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=78097 --- src/mesa/main/dlist.c | 50 +- 1 file changed, 17 insertions(+), 33 deletions(-) diff --git a/src/mesa/main/dlist.c b/src/mesa/main/dlist.c index 01df4693f9..9e6cb725f5 100644 --- a/src/mesa/main/dlist.c +++ b/src/mesa/main/dlist.c @@ -6596,7 +6596,7 @@ save_Uniform1ui(GLint location, GLuint x) n[2].i = x; } if (ctx->ExecuteFlag) { - /*CALL_Uniform1ui(ctx->Exec, (location, x));*/ + CALL_Uniform1ui(ctx->Exec, (location, x)); } } @@ -6613,7 +6613,7 @@ save_Uniform2ui(GLint location, GLuint x, GLuint y) n[3].i = y; } if (ctx->ExecuteFlag) { - /*CALL_Uniform2ui(ctx->Exec, (location, x, y));*/ + CALL_Uniform2ui(ctx->Exec, (location, x, y)); } } @@ -6631,7 +6631,7 @@ save_Uniform3ui(GLint location, GLuint x, GLuint y, GLuint z) n[4].i = z; } if (ctx->ExecuteFlag) { - /*CALL_Uniform3ui(ctx->Exec, (location, x, y, z));*/ + CALL_Uniform3ui(ctx->Exec, (location, x, y, z)); } } @@ -6650,7 +6650,7 @@ save_Uniform4ui(GLint location, GLuint x, GLuint y, GLuint z, GLuint w) n[5].i = w; } if (ctx->ExecuteFlag) { - /*CALL_Uniform4ui(ctx->Exec, (location, x, y, z, w));*/ + CALL_Uniform4ui(ctx->Exec, (location, x, y, z, w)); } } @@ -6669,7 +6669,7 @@ save_Uniform1uiv(GLint location, GLsizei count, const GLuint *v) save_pointer([3], memdup(v, count * 1 * sizeof(*v))); } if (ctx->ExecuteFlag) { - /*CALL_Uniform1uiv(ctx->Exec, (location, count, v));*/ + CALL_Uniform1uiv(ctx->Exec, (location, count, v)); } } @@ -6686,7 +6686,7 @@ save_Uniform2uiv(GLint location, GLsizei count, const GLuint *v) save_pointer([3], memdup(v, count * 2 * sizeof(*v))); } if (ctx->ExecuteFlag) { - /*CALL_Uniform2uiv(ctx->Exec, (location, count, v));*/ + CALL_Uniform2uiv(ctx->Exec, (location, count, v)); } } @@ -6703,7 +6703,7 @@ save_Uniform3uiv(GLint location, GLsizei count, const GLuint *v) save_pointer([3], memdup(v, count * 3 * sizeof(*v))); } if (ctx->ExecuteFlag) { - /*CALL_Uniform3uiv(ctx->Exec, (location, count, v));*/ + CALL_Uniform3uiv(ctx->Exec, (location, count, v)); } } @@ -6720,7 +6720,7 @@ save_Uniform4uiv(GLint location, GLsizei count, const GLuint *v) save_pointer([3], memdup(v, count * 4 * sizeof(*v))); } if (ctx->ExecuteFlag) { - /*CALL_Uniform4uiv(ctx->Exec, (location, count, v));*/ + CALL_Uniform4uiv(ctx->Exec, (location, count, v)); } } @@ -8785,34 +8785,29 @@ execute_list(struct gl_context *ctx, GLuint list) CALL_Uniform4iv(ctx->Exec, (n[1].i, n[2].i, get_pointer([3]))); break; case OPCODE_UNIFORM_1UI: -/*CALL_Uniform1uiARB(ctx->Exec, (n[1].i, n[2].i));*/ +CALL_Uniform1ui(ctx->Exec, (n[1].i, n[2].i)); break; case OPCODE_UNIFORM_2UI: -/*CALL_Uniform2uiARB(ctx->Exec, (n[1].i, n[2].i, n[3].i));*/ +CALL_Uniform2ui(ctx->Exec, (n[1].i, n[2].i, n[3].i)); break; case OPCODE_UNIFORM_3UI: -/*CALL_Uniform3uiARB(ctx->Exec, (n[1].i, n[2].i, n[3].i, n[4].i));*/ +CALL_Uniform3ui(ctx->Exec, (n[1].i, n[2].i, n[3].i, n[4].i)); break; case OPCODE_UNIFORM_4UI: -/*CALL_Uniform4uiARB(ctx->Exec, - (n[1].i, n[2].i, n[3].i, n[4].i, n[5].i)); -*/ +CALL_Uniform4ui(ctx->Exec, +(n[1].i, n[2].i, n[3].i, n[4].i, n[5].i)); break; case OPCODE_UNIFORM_1UIV: -/*CALL_Uniform1uivARB(ctx->Exec, (n[1].i, n[2].i, - get_pointer([3])));*/ +CALL_Uniform1uiv(ctx->Exec, (n[1].i, n[2].i, get_pointer([3]))); break; case OPCODE_UNIFORM_2UIV: -/*CALL_Uniform2uivARB(ctx->Exec, (n[1].i, n[2].i, - get_pointer([3])));*/ +CALL_Uniform2uiv(ctx->Exec, (n[1].i, n[2].i, get_pointer([3]))); break; case OPCODE_UNIFORM_3UIV: -/*CALL_Uniform3uivARB(ctx->Exec, (n[1].i, n[2].i, - get_pointer([3])));*/ +CALL_Uniform3uiv(ctx-&g
Mesa (master): radv: add initial support for VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT
Module: Mesa Branch: master Commit: ce188813bfe63068119cbf3d0f76e1ea3d27b722 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=ce188813bfe63068119cbf3d0f76e1ea3d27b722 Author: Timothy Arceri <tarc...@itsqueeze.com> Date: Tue May 8 14:57:55 2018 +1000 radv: add initial support for VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT When VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT is set we skip NIR linking optimisations and only run over the NIR optimisation loop once similar to the GLSLOptimizeConservatively constant used by some GL drivers. We need to run over the opts at least once to avoid errors in LLVM (e.g. dead vars it can't handle) and also to reduce the time spent compiling the IR in LLVM. With this change the Blacksmith Unity demos compilation times go from 329760 ms -> 299881 ms when using Wine and DXVK. V2: add bit to radv_pipeline_key Reviewed-by: Bas Nieuwenhuizen <b...@basnieuwenhuizen.nl> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=106246 --- src/amd/vulkan/radv_pipeline.c | 26 +- src/amd/vulkan/radv_private.h | 1 + src/amd/vulkan/radv_shader.c | 12 +++- src/amd/vulkan/radv_shader.h | 5 +++-- 4 files changed, 28 insertions(+), 16 deletions(-) diff --git a/src/amd/vulkan/radv_pipeline.c b/src/amd/vulkan/radv_pipeline.c index b4e4f3211e..d443f8271e 100644 --- a/src/amd/vulkan/radv_pipeline.c +++ b/src/amd/vulkan/radv_pipeline.c @@ -1724,13 +1724,13 @@ radv_link_shaders(struct radv_pipeline *pipeline, nir_shader **shaders) ac_lower_indirect_derefs(ordered_shaders[i], pipeline->device->physical_device->rad_info.chip_class); } - radv_optimize_nir(ordered_shaders[i]); + radv_optimize_nir(ordered_shaders[i], false); if (nir_lower_global_vars_to_local(ordered_shaders[i - 1])) { ac_lower_indirect_derefs(ordered_shaders[i - 1], pipeline->device->physical_device->rad_info.chip_class); } - radv_optimize_nir(ordered_shaders[i - 1]); + radv_optimize_nir(ordered_shaders[i - 1], false); } } } @@ -1750,6 +1750,9 @@ radv_generate_graphics_pipeline_key(struct radv_pipeline *pipeline, struct radv_pipeline_key key; memset(, 0, sizeof(key)); + if (pCreateInfo->flags & VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT) + key.optimisations_disabled = 1; + key.has_multiview_view_index = has_view_index; uint32_t binding_input_rate = 0; @@ -1878,7 +1881,8 @@ void radv_create_shaders(struct radv_pipeline *pipeline, struct radv_device *device, struct radv_pipeline_cache *cache, struct radv_pipeline_key key, - const VkPipelineShaderStageCreateInfo **pStages) + const VkPipelineShaderStageCreateInfo **pStages, + const VkPipelineCreateFlags flags) { struct radv_shader_module fs_m = {0}; struct radv_shader_module *modules[MESA_SHADER_STAGES] = { 0, }; @@ -1944,7 +1948,8 @@ void radv_create_shaders(struct radv_pipeline *pipeline, nir[i] = radv_shader_compile_to_nir(device, modules[i], stage ? stage->pName : "main", i, - stage ? stage->pSpecializationInfo : NULL); + stage ? stage->pSpecializationInfo : NULL, + flags); pipeline->active_stages |= mesa_to_vk_shader_stage(i); /* We don't want to alter meta shaders IR directly so clone it @@ -1963,8 +1968,10 @@ void radv_create_shaders(struct radv_pipeline *pipeline, if (i != last) mask = mask | nir_var_shader_out; - nir_lower_io_to_scalar_early(nir[i], mask); - radv_optimize_nir(nir[i]); + if (!(flags & VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT)) { + nir_lower_io_to_scalar_early(nir[i], mask); + radv_optimize_nir(nir[i], false); + } } } @@ -1973,7 +1980,8 @@ void radv_create_shaders(struct radv_pipeline *pipeline, merge_tess_info([MESA_SHADER_TESS_EVAL]->info, [MESA_SHADER_TESS_CTRL]->info); } - radv_link_shaders(pipeline, nir); + if (!(flags & VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT)) + radv_link_s
Mesa (master): st/nir: make st_nir_opts() available externally
Module: Mesa Branch: master Commit: 0b3e9564bdda575c3956f338454f4f632041e151 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=0b3e9564bdda575c3956f338454f4f632041e151 Author: Timothy Arceri <tarc...@itsqueeze.com> Date: Wed May 9 13:25:46 2018 +1000 st/nir: make st_nir_opts() available externally The following patch will make use of this for asm style programs. Reviewed-by: Eric Anholt <e...@anholt.net> --- src/mesa/state_tracker/st_glsl_to_nir.cpp | 2 +- src/mesa/state_tracker/st_nir.h | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/mesa/state_tracker/st_glsl_to_nir.cpp b/src/mesa/state_tracker/st_glsl_to_nir.cpp index 3b261cf1b2..de906e60c3 100644 --- a/src/mesa/state_tracker/st_glsl_to_nir.cpp +++ b/src/mesa/state_tracker/st_glsl_to_nir.cpp @@ -314,7 +314,7 @@ st_nir_assign_uniform_locations(struct gl_context *ctx, *size = max; } -static void +void st_nir_opts(nir_shader *nir) { bool progress; diff --git a/src/mesa/state_tracker/st_nir.h b/src/mesa/state_tracker/st_nir.h index 1c2e32a5e6..15f1ce93e5 100644 --- a/src/mesa/state_tracker/st_nir.h +++ b/src/mesa/state_tracker/st_nir.h @@ -42,6 +42,8 @@ void st_finalize_nir(struct st_context *st, struct gl_program *prog, struct gl_shader_program *shader_program, struct nir_shader *nir); +void st_nir_opts(struct nir_shader *nir); + bool st_link_nir(struct gl_context *ctx, struct gl_shader_program *shader_program); ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): st/nir: use NIR for asm programs
Module: Mesa Branch: master Commit: 5c33e8c7729edd5e16020ebb8703be96523e04f2 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=5c33e8c7729edd5e16020ebb8703be96523e04f2 Author: Timothy Arceri <tarc...@itsqueeze.com> Date: Wed May 9 13:28:05 2018 +1000 st/nir: use NIR for asm programs Reviewed-by: Eric Anholt <e...@anholt.net> --- src/mesa/state_tracker/st_program.c | 65 + 1 file changed, 58 insertions(+), 7 deletions(-) diff --git a/src/mesa/state_tracker/st_program.c b/src/mesa/state_tracker/st_program.c index f256e2e862..a52c9f8256 100644 --- a/src/mesa/state_tracker/st_program.c +++ b/src/mesa/state_tracker/st_program.c @@ -37,6 +37,7 @@ #include "main/mtypes.h" #include "program/prog_parameter.h" #include "program/prog_print.h" +#include "program/prog_to_nir.h" #include "program/programopt.h" #include "compiler/nir/nir.h" @@ -378,6 +379,28 @@ st_release_cp_variants(struct st_context *st, struct st_compute_program *stcp) } /** + * Translate ARB (asm) program to NIR + */ +static nir_shader * +st_translate_prog_to_nir(struct st_context *st, struct gl_program *prog, + gl_shader_stage stage) +{ + const struct gl_shader_compiler_options *options = + >ctx->Const.ShaderCompilerOptions[stage]; + + /* Translate to NIR */ + nir_shader *nir = prog_to_nir(prog, options->NirOptions); + NIR_PASS_V(nir, nir_lower_regs_to_ssa); /* turn registers into SSA */ + nir_validate_shader(nir); + + /* Optimise NIR */ + st_nir_opts(nir); + nir_validate_shader(nir); + + return nir; +} + +/** * Translate a vertex program. */ bool @@ -458,15 +481,28 @@ st_translate_vertex_program(struct st_context *st, /* No samplers are allowed in ARB_vp. */ } - if (stvp->shader_program) { - struct gl_program *prog = stvp->shader_program->last_vert_prog; - if (prog) { - st_translate_stream_output_info2(prog->sh.LinkedTransformFeedback, - stvp->result_to_output, - >tgsi.stream_output); + enum pipe_shader_ir preferred_ir = (enum pipe_shader_ir) + st->pipe->screen->get_shader_param(st->pipe->screen, PIPE_SHADER_VERTEX, + PIPE_SHADER_CAP_PREFERRED_IR); + + if (preferred_ir == PIPE_SHADER_IR_NIR) { + if (stvp->shader_program) { + struct gl_program *prog = stvp->shader_program->last_vert_prog; + if (prog) { +st_translate_stream_output_info2(prog->sh.LinkedTransformFeedback, + stvp->result_to_output, + >tgsi.stream_output); + } + + st_store_ir_in_disk_cache(st, >Base, true); + } else { + nir_shader *nir = st_translate_prog_to_nir(st, >Base, +MESA_SHADER_VERTEX); + + stvp->tgsi.type = PIPE_SHADER_IR_NIR; + stvp->tgsi.ir.nir = nir; } - st_store_ir_in_disk_cache(st, >Base, true); return true; } @@ -706,6 +742,21 @@ st_translate_fragment_program(struct st_context *st, } } + enum pipe_shader_ir preferred_ir = (enum pipe_shader_ir) + st->pipe->screen->get_shader_param(st->pipe->screen, + PIPE_SHADER_FRAGMENT, + PIPE_SHADER_CAP_PREFERRED_IR); + + if (preferred_ir == PIPE_SHADER_IR_NIR) { + nir_shader *nir = st_translate_prog_to_nir(st, >Base, + MESA_SHADER_FRAGMENT); + + stfp->tgsi.type = PIPE_SHADER_IR_NIR; + stfp->tgsi.ir.nir = nir; + + return true; + } + /* * Convert Mesa program inputs to TGSI input register semantics. */ ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): main: return 0 length when the queried program object's not linked
Module: Mesa Branch: master Commit: 08c1444c9582f8654f9c688b79230ba2acbc2027 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=08c1444c9582f8654f9c688b79230ba2acbc2027 Author: Xiong, James <james.xi...@intel.com> Date: Thu Apr 26 18:39:57 2018 -0700 main: return 0 length when the queried program object's not linked Signed-off-by: Xiong, James <james.xi...@intel.com> Reviewed-by: Timothy Arceri <tarc...@itsqueeze.com> --- src/mesa/main/shaderapi.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mesa/main/shaderapi.c b/src/mesa/main/shaderapi.c index 44b18af492..caa42541ca 100644 --- a/src/mesa/main/shaderapi.c +++ b/src/mesa/main/shaderapi.c @@ -837,7 +837,7 @@ get_programiv(struct gl_context *ctx, GLuint program, GLenum pname, *params = shProg->BinaryRetreivableHint; return; case GL_PROGRAM_BINARY_LENGTH: - if (ctx->Const.NumProgramBinaryFormats == 0) { + if (ctx->Const.NumProgramBinaryFormats == 0 || !shProg->data->LinkStatus) { *params = 0; } else { _mesa_get_program_binary_length(ctx, shProg, params); ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): main: fail texture_storage() call if the size is not okay
Module: Mesa Branch: master Commit: 0ab266dc1ba10ec13601e3bdb5b949e610eca5de URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=0ab266dc1ba10ec13601e3bdb5b949e610eca5de Author: Xiong, JamesDate: Fri Apr 27 08:34:47 2018 -0700 main: fail texture_storage() call if the size is not okay Signed-off-by: Xiong, James Reviewed-by: Nicolai Hähnle --- src/mesa/main/texstorage.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/mesa/main/texstorage.c b/src/mesa/main/texstorage.c index 44edba3323..9cb8b90065 100644 --- a/src/mesa/main/texstorage.c +++ b/src/mesa/main/texstorage.c @@ -445,6 +445,7 @@ texture_storage(struct gl_context *ctx, GLuint dims, _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTex%sStorage%uD(texture too large)", suffix, dims); +return; } } ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): mesa: remove hard-coded OpenGL 3.2 compat limit
Module: Mesa Branch: master Commit: e7a7b712fe81aac96eaae267ad6cb5444f02e7f6 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=e7a7b712fe81aac96eaae267ad6cb5444f02e7f6 Author: Timothy Arceri <tarc...@itsqueeze.com> Date: Tue May 8 10:35:40 2018 +1000 mesa: remove hard-coded OpenGL 3.2 compat limit Just let validate_context_version() do it instead. This fixes MESA_GL_VERSION_OVERRIDE for compat, it will also allow us to enable new compat versions on a per driver bases in future. Reviewed-by: Marek Olšák <marek.ol...@amd.com> --- src/mesa/drivers/dri/common/dri_util.c | 8 1 file changed, 8 deletions(-) diff --git a/src/mesa/drivers/dri/common/dri_util.c b/src/mesa/drivers/dri/common/dri_util.c index 7cb6248b13..75d124097b 100644 --- a/src/mesa/drivers/dri/common/dri_util.c +++ b/src/mesa/drivers/dri/common/dri_util.c @@ -389,14 +389,6 @@ driCreateContextAttribs(__DRIscreen *screen, int api, screen->max_gl_compat_version < 31) mesa_api = API_OPENGL_CORE; -if (mesa_api == API_OPENGL_COMPAT -&& ((ctx_config.major_version > 3) -|| (ctx_config.major_version == 3 && -ctx_config.minor_version >= 2))) { - *error = __DRI_CTX_ERROR_BAD_API; - return NULL; -} - /* The latest version of EGL_KHR_create_context spec says: * * "If the EGL_CONTEXT_OPENGL_DEBUG_BIT_KHR flag bit is set in ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): mesa: dont call _mesa_override_glsl_version() in _mesa_init_constants()
Module: Mesa Branch: master Commit: be3ee9d141b958d41378fa8fd61255b14f5b6e74 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=be3ee9d141b958d41378fa8fd61255b14f5b6e74 Author: Timothy Arceri <tarc...@itsqueeze.com> Date: Tue May 8 09:22:41 2018 +1000 mesa: dont call _mesa_override_glsl_version() in _mesa_init_constants() All drivers that support GLSL will later set their default GLSL versions overriding this override call. They currently all call _mesa_override_glsl_version() again later in order to support overrides. Reviewed-by: Marek Olšák <marek.ol...@amd.com> --- src/mesa/main/context.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/mesa/main/context.c b/src/mesa/main/context.c index 9bd4661bd8..4243e03c5c 100644 --- a/src/mesa/main/context.c +++ b/src/mesa/main/context.c @@ -638,9 +638,6 @@ _mesa_init_constants(struct gl_constants *consts, gl_api api) consts->MaxGeometryOutputVertices = MAX_GEOMETRY_OUTPUT_VERTICES; consts->MaxGeometryTotalOutputComponents = MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS; - /* Shading language version */ - _mesa_override_glsl_version(consts); - #ifdef DEBUG consts->GenerateTemporaryNames = true; #else ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): mesa: add GLSLVersionCompat constant
Module: Mesa Branch: master Commit: 4560aad780b851f855a8adc72ea34ca4eb17634a URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=4560aad780b851f855a8adc72ea34ca4eb17634a Author: Timothy Arceri <tarc...@itsqueeze.com> Date: Tue May 8 10:10:39 2018 +1000 mesa: add GLSLVersionCompat constant This allows drivers to define what version of GLSL they support in compat. This will be needed in order to support compat 3.2 without breaking drivers that wont support it. Reviewed-by: Marek Olšák <marek.ol...@amd.com> --- src/mesa/drivers/dri/i915/intel_extensions.c | 1 + src/mesa/drivers/dri/i965/intel_extensions.c | 6 ++ src/mesa/main/mtypes.h | 1 + src/mesa/main/version.c | 4 +--- src/mesa/state_tracker/st_extensions.c | 1 + 5 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/mesa/drivers/dri/i915/intel_extensions.c b/src/mesa/drivers/dri/i915/intel_extensions.c index c85bd787fe..c385153013 100644 --- a/src/mesa/drivers/dri/i915/intel_extensions.c +++ b/src/mesa/drivers/dri/i915/intel_extensions.c @@ -78,6 +78,7 @@ intelInitExtensions(struct gl_context *ctx) ctx->Extensions.OES_draw_texture = true; ctx->Const.GLSLVersion = 120; + ctx->Const.GLSLVersionCompat = 120; _mesa_override_glsl_version(>Const); if (intel->gen >= 3) { diff --git a/src/mesa/drivers/dri/i965/intel_extensions.c b/src/mesa/drivers/dri/i965/intel_extensions.c index e1e19217bc..b5860f13cb 100644 --- a/src/mesa/drivers/dri/i965/intel_extensions.c +++ b/src/mesa/drivers/dri/i965/intel_extensions.c @@ -148,6 +148,12 @@ intelInitExtensions(struct gl_context *ctx) ctx->Const.GLSLVersion = 330; else ctx->Const.GLSLVersion = 120; + + if (devinfo->gen >= 6) + ctx->Const.GLSLVersionCompat = 130; + else + ctx->Const.GLSLVersionCompat = 120; + _mesa_override_glsl_version(>Const); ctx->Extensions.EXT_shader_integer_mix = ctx->Const.GLSLVersion >= 130; diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h index 2d3eb457f9..2c87308dd7 100644 --- a/src/mesa/main/mtypes.h +++ b/src/mesa/main/mtypes.h @@ -3649,6 +3649,7 @@ struct gl_constants GLuint MaxGeometryTotalOutputComponents; GLuint GLSLVersion; /**< Desktop GLSL version supported (ex: 120 = 1.20) */ + GLuint GLSLVersionCompat; /**< Desktop compat GLSL version supported */ /** * Changes default GLSL extension behavior from "error" to "warn". It's out diff --git a/src/mesa/main/version.c b/src/mesa/main/version.c index 84babd69e2..3f3dff0bde 100644 --- a/src/mesa/main/version.c +++ b/src/mesa/main/version.c @@ -588,9 +588,7 @@ _mesa_get_version(const struct gl_extensions *extensions, /* Disable higher GLSL versions for legacy contexts. * This disallows creation of higher compatibility contexts. */ if (!consts->AllowHigherCompatVersion) { - if (consts->GLSLVersion > 140) { -consts->GLSLVersion = 140; - } + consts->GLSLVersion = consts->GLSLVersionCompat; } /* fall through */ case API_OPENGL_CORE: diff --git a/src/mesa/state_tracker/st_extensions.c b/src/mesa/state_tracker/st_extensions.c index 5479e637af..19ef736e5b 100644 --- a/src/mesa/state_tracker/st_extensions.c +++ b/src/mesa/state_tracker/st_extensions.c @@ -936,6 +936,7 @@ void st_init_extensions(struct pipe_screen *screen, /* Figure out GLSL support and set GLSLVersion to it. */ consts->GLSLVersion = screen->get_param(screen, PIPE_CAP_GLSL_FEATURE_LEVEL); + consts->GLSLVersionCompat = 140; _mesa_override_glsl_version(consts); ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): mesa: dont set GLSLVersion in _mesa_init_constants()
Module: Mesa Branch: master Commit: 2a621acc8d31702a4c7e09d567c8dbc1c9231cd8 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=2a621acc8d31702a4c7e09d567c8dbc1c9231cd8 Author: Timothy Arceri <tarc...@itsqueeze.com> Date: Tue May 8 09:19:04 2018 +1000 mesa: dont set GLSLVersion in _mesa_init_constants() Just leave it as 0 and let the drivers set it (as they already do) to avoid redundantly initialising it. Reviewed-by: Marek Olšák <marek.ol...@amd.com> --- src/mesa/main/context.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/mesa/main/context.c b/src/mesa/main/context.c index 9a4bf8d394..9bd4661bd8 100644 --- a/src/mesa/main/context.c +++ b/src/mesa/main/context.c @@ -639,7 +639,6 @@ _mesa_init_constants(struct gl_constants *consts, gl_api api) consts->MaxGeometryTotalOutputComponents = MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS; /* Shading language version */ - consts->GLSLVersion = 120; _mesa_override_glsl_version(consts); #ifdef DEBUG ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): mesa: enable geom shaders in OpenGL 3.2 Compat profile
Module: Mesa Branch: master Commit: 58c05ede965614834577bbfa5854b59a168ae25e URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=58c05ede965614834577bbfa5854b59a168ae25e Author: Timothy Arceri <tarc...@itsqueeze.com> Date: Wed May 2 19:55:59 2018 +1000 mesa: enable geom shaders in OpenGL 3.2 Compat profile Reviewed-by: Marek Olšák <marek.ol...@amd.com> --- src/mapi/glapi/gen/apiexec.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/mapi/glapi/gen/apiexec.py b/src/mapi/glapi/gen/apiexec.py index b5e0ad4a17..20d6239ba1 100644 --- a/src/mapi/glapi/gen/apiexec.py +++ b/src/mapi/glapi/gen/apiexec.py @@ -46,7 +46,6 @@ class exec_info(): if compatibility is not None: assert isinstance(compatibility, int) assert compatibility >= 10 -assert compatibility <= 30 if core is not None: assert isinstance(core, int) @@ -70,7 +69,7 @@ functions = { "TexBuffer": exec_info(compatibility=20, core=31, es2=31), # OpenGL 3.2 / GL_OES_geometry_shader. -"FramebufferTexture": exec_info(core=32, es2=31), +"FramebufferTexture": exec_info(compatibility=32, core=32, es2=31), # OpenGL 4.0 / GL_ARB_shader_subroutines. Mesa only exposes this # extension with core profile. ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): nir: move GL specific passes to src/compiler/glsl
Module: Mesa Branch: master Commit: 6487e7a30c9e4c2a417ddfe632d5f68e065e21eb URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=6487e7a30c9e4c2a417ddfe632d5f68e065e21eb Author: Timothy Arceri <tarc...@itsqueeze.com> Date: Mon Apr 30 20:39:43 2018 +1000 nir: move GL specific passes to src/compiler/glsl With this we should have no passes in src/compiler/nir with any dependencies on headers from core GL Mesa. Reviewed-by: Alejandro Piñeiro <apinhe...@igalia.com> --- src/compiler/Makefile.sources | 7 ++-- src/compiler/glsl/gl_nir.h | 47 ++ .../gl_nir_lower_atomics.c}| 12 +++--- .../gl_nir_lower_samplers.c} | 11 ++--- .../gl_nir_lower_samplers_as_deref.c} | 11 ++--- src/compiler/glsl/meson.build | 4 ++ src/compiler/nir/meson.build | 3 -- src/compiler/nir/nir.h | 11 - src/gallium/drivers/freedreno/ir3/ir3_cmdline.c| 2 +- src/mesa/drivers/dri/i965/brw_link.cpp | 5 ++- src/mesa/main/glspirv.h| 1 + src/mesa/state_tracker/st_glsl_to_nir.cpp | 7 ++-- 12 files changed, 83 insertions(+), 38 deletions(-) diff --git a/src/compiler/Makefile.sources b/src/compiler/Makefile.sources index aca9dab476..b98ea67370 100644 --- a/src/compiler/Makefile.sources +++ b/src/compiler/Makefile.sources @@ -25,6 +25,10 @@ LIBGLSL_FILES = \ glsl/builtin_types.cpp \ glsl/builtin_variables.cpp \ glsl/generate_ir.cpp \ + glsl/gl_nir_lower_atomics.c \ + glsl/gl_nir_lower_samplers.c \ + glsl/gl_nir_lower_samplers_as_deref.c \ + glsl/gl_nir.h \ glsl/glsl_parser_extras.cpp \ glsl/glsl_parser_extras.h \ glsl/glsl_symbol_table.cpp \ @@ -211,7 +215,6 @@ NIR_FILES = \ nir/nir_lower_64bit_packing.c \ nir/nir_lower_alpha_test.c \ nir/nir_lower_alu_to_scalar.c \ - nir/nir_lower_atomics.c \ nir/nir_lower_atomics_to_ssbo.c \ nir/nir_lower_bitmap.c \ nir/nir_lower_clamp_color_outputs.c \ @@ -237,8 +240,6 @@ NIR_FILES = \ nir/nir_lower_phis_to_scalar.c \ nir/nir_lower_regs_to_ssa.c \ nir/nir_lower_returns.c \ - nir/nir_lower_samplers.c \ - nir/nir_lower_samplers_as_deref.c \ nir/nir_lower_subgroups.c \ nir/nir_lower_system_values.c \ nir/nir_lower_tex.c \ diff --git a/src/compiler/glsl/gl_nir.h b/src/compiler/glsl/gl_nir.h new file mode 100644 index 00..59d5f65e65 --- /dev/null +++ b/src/compiler/glsl/gl_nir.h @@ -0,0 +1,47 @@ +/* + * Copyright © 2018 Timothy Arceri + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#ifndef GL_NIR_H +#define GL_NIR_H + +#ifdef __cplusplus +extern "C" { +#endif + +struct nir_shader; +struct gl_shader_program; + +bool gl_nir_lower_atomics(nir_shader *shader, + const struct gl_shader_program *shader_program, + bool use_binding_as_idx); + +bool gl_nir_lower_samplers(nir_shader *shader, + const struct gl_shader_program *shader_program); +bool gl_nir_lower_samplers_as_deref(nir_shader *shader, +const struct gl_shader_program *shader_program); + +#ifdef __cplusplus +} +#endif + +#endif /* GL_NIR_H */ diff --git a/src/compiler/nir/nir_lower_atomics.c b/src/compiler/glsl/gl_nir_lower_atomics.c similarity index 96% rename from src/compiler/nir/nir_lower_atomics.c rename to src/compiler/glsl/gl_nir_lower_atomics.c index 383e323610..e203b390b4 100644 --- a/src/compiler/nir/nir_lower_atomics.c +++ b/src/compiler/glsl/gl_nir_lower_atomics.c @@ -25,8 +25,10 @@ * */ -#include "compiler/glsl/ir_uniform.h" -#include "nir.h"
Mesa (master): glsl: replace some asserts with unreachable when processing the ast
Module: Mesa Branch: master Commit: 79b0556f292b813c4c7139f75cf0c9c6e2d3e7bb URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=79b0556f292b813c4c7139f75cf0c9c6e2d3e7bb Author: Timothy Arceri <tarc...@itsqueeze.com> Date: Tue Apr 10 14:34:26 2018 +1000 glsl: replace some asserts with unreachable when processing the ast Reviewed-by: Matt Turner <matts...@gmail.com> --- src/compiler/glsl/ast_to_hir.cpp | 9 +++-- 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/compiler/glsl/ast_to_hir.cpp b/src/compiler/glsl/ast_to_hir.cpp index 94ce3c45d0..3bf581571e 100644 --- a/src/compiler/glsl/ast_to_hir.cpp +++ b/src/compiler/glsl/ast_to_hir.cpp @@ -1397,8 +1397,7 @@ ast_expression::do_hir(exec_list *instructions, switch (this->oper) { case ast_aggregate: - assert(!"ast_aggregate: Should never get here."); - break; + unreachable("ast_aggregate: Should never get here."); case ast_assign: { this->subexpressions[0]->set_is_lhs(true); @@ -1974,15 +1973,13 @@ ast_expression::do_hir(exec_list *instructions, } case ast_unsized_array_dim: - assert(!"ast_unsized_array_dim: Should never get here."); - break; + unreachable("ast_unsized_array_dim: Should never get here."); case ast_function_call: /* Should *NEVER* get here. ast_function_call should always be handled * by ast_function_expression::hir. */ - assert(0); - break; + unreachable("ast_function_call: handled elsewhere "); case ast_identifier: { /* ast_identifier can appear several places in a full abstract syntax ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): mesa: drop the buffer mode param from the DrawBuffer driver function
Module: Mesa Branch: master Commit: 410f901beed8f6f041716396b1f27fd61518e231 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=410f901beed8f6f041716396b1f27fd61518e231 Author: Timothy Arceri <tarc...@itsqueeze.com> Date: Fri Apr 27 10:03:56 2018 +1000 mesa: drop the buffer mode param from the DrawBuffer driver function No drivers used it. Reviewed-by: Brian Paul <bri...@vmware.com> --- src/mesa/drivers/common/driverfuncs.c| 2 +- src/mesa/drivers/dri/i915/intel_buffers.c| 2 +- src/mesa/drivers/dri/i965/intel_buffers.c| 2 +- src/mesa/drivers/dri/nouveau/nouveau_state.c | 2 +- src/mesa/drivers/dri/radeon/radeon_common.c | 5 ++--- src/mesa/drivers/dri/radeon/radeon_common.h | 2 +- src/mesa/main/buffers.c | 4 ++-- src/mesa/main/dd.h | 2 +- 8 files changed, 10 insertions(+), 11 deletions(-) diff --git a/src/mesa/drivers/common/driverfuncs.c b/src/mesa/drivers/common/driverfuncs.c index b7ac2b5b43..e783262773 100644 --- a/src/mesa/drivers/common/driverfuncs.c +++ b/src/mesa/drivers/common/driverfuncs.c @@ -306,5 +306,5 @@ _mesa_init_driver_state(struct gl_context *ctx) ctx->Stencil.ZPassFunc[1]); - ctx->Driver.DrawBuffer(ctx, ctx->Color.DrawBuffer[0]); + ctx->Driver.DrawBuffer(ctx); } diff --git a/src/mesa/drivers/dri/i915/intel_buffers.c b/src/mesa/drivers/dri/i915/intel_buffers.c index 386e032443..83d59edb6f 100644 --- a/src/mesa/drivers/dri/i915/intel_buffers.c +++ b/src/mesa/drivers/dri/i915/intel_buffers.c @@ -53,7 +53,7 @@ intel_check_front_buffer_rendering(struct intel_context *intel) } static void -intelDrawBuffer(struct gl_context * ctx, GLenum mode) +intelDrawBuffer(struct gl_context * ctx) { if (_mesa_is_front_buffer_drawing(ctx->DrawBuffer)) { struct intel_context *const intel = intel_context(ctx); diff --git a/src/mesa/drivers/dri/i965/intel_buffers.c b/src/mesa/drivers/dri/i965/intel_buffers.c index fd522cc4f4..dae56e3362 100644 --- a/src/mesa/drivers/dri/i965/intel_buffers.c +++ b/src/mesa/drivers/dri/i965/intel_buffers.c @@ -33,7 +33,7 @@ #include "main/renderbuffer.h" static void -intelDrawBuffer(struct gl_context * ctx, GLenum mode) +intelDrawBuffer(struct gl_context *ctx) { if (_mesa_is_front_buffer_drawing(ctx->DrawBuffer)) { struct brw_context *const brw = brw_context(ctx); diff --git a/src/mesa/drivers/dri/nouveau/nouveau_state.c b/src/mesa/drivers/dri/nouveau/nouveau_state.c index debbd38080..a05c8be854 100644 --- a/src/mesa/drivers/dri/nouveau/nouveau_state.c +++ b/src/mesa/drivers/dri/nouveau/nouveau_state.c @@ -115,7 +115,7 @@ nouveau_read_buffer(struct gl_context *ctx, GLenum buffer) } static void -nouveau_draw_buffer(struct gl_context *ctx, GLenum buffer) +nouveau_draw_buffer(struct gl_context *ctx) { nouveau_validate_framebuffer(ctx); context_dirty(ctx, FRAMEBUFFER); diff --git a/src/mesa/drivers/dri/radeon/radeon_common.c b/src/mesa/drivers/dri/radeon/radeon_common.c index 61cbf599f8..a3bf00b09f 100644 --- a/src/mesa/drivers/dri/radeon/radeon_common.c +++ b/src/mesa/drivers/dri/radeon/radeon_common.c @@ -317,11 +317,10 @@ void radeon_draw_buffer(struct gl_context *ctx, struct gl_framebuffer *fb) /** * Called via glDrawBuffer. */ -void radeonDrawBuffer( struct gl_context *ctx, GLenum mode ) +void radeonDrawBuffer(struct gl_context *ctx) { if (RADEON_DEBUG & RADEON_DRI) - fprintf(stderr, "%s %s\n", __func__, - _mesa_enum_to_string( mode )); + fprintf(stderr, "%s\n", __func__); if (_mesa_is_front_buffer_drawing(ctx->DrawBuffer)) { radeonContextPtr radeon = RADEON_CONTEXT(ctx); diff --git a/src/mesa/drivers/dri/radeon/radeon_common.h b/src/mesa/drivers/dri/radeon/radeon_common.h index ada4956066..a39b9360ef 100644 --- a/src/mesa/drivers/dri/radeon/radeon_common.h +++ b/src/mesa/drivers/dri/radeon/radeon_common.h @@ -21,7 +21,7 @@ void radeon_clear_tris(struct gl_context *ctx, GLbitfield mask); void radeon_window_moved(radeonContextPtr radeon); void radeon_draw_buffer(struct gl_context *ctx, struct gl_framebuffer *fb); -void radeonDrawBuffer( struct gl_context *ctx, GLenum mode ); +void radeonDrawBuffer(struct gl_context *ctx); void radeonReadBuffer( struct gl_context *ctx, GLenum mode ); void radeon_viewport(struct gl_context *ctx); void radeon_fbo_init(struct radeon_context *radeon); diff --git a/src/mesa/main/buffers.c b/src/mesa/main/buffers.c index ba970d87da..bb856882da 100644 --- a/src/mesa/main/buffers.c +++ b/src/mesa/main/buffers.c @@ -305,7 +305,7 @@ draw_buffer(struct gl_context *ctx, struct gl_framebuffer *fb, /* Call device driver function only if fb is the bound draw buffer */ if (fb == ctx->DrawBuffer) { if (ctx->Driver.DrawBuffer) - ctx->Driver.DrawBuffer(ctx, buffer); +
Mesa (master): mesa: call DrawBufferAllocate driver hook in update_framebuffer for windows-system FB
Module: Mesa Branch: master Commit: 6695f9d5c5c94df080efc720ed532217618a28c3 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=6695f9d5c5c94df080efc720ed532217618a28c3 Author: Boyan Ding <boyan.j.d...@gmail.com> Date: Sat Apr 14 14:45:23 2018 +1000 mesa: call DrawBufferAllocate driver hook in update_framebuffer for windows-system FB When draw buffers are changed on a bound framebuffer, DrawBufferAllocate() hook should be called. However, it is missing in update_framebuffer with window-system framebuffer, in which FB's draw buffer state should match context state, potentially resulting in a change. Note: This is needed because gallium delays creating the front buffer, i965 works fine without this change. V2 (Timothy Arceri): - Rebased on merged/simplified DrawBuffer driver function - Move DrawBuffer call outside fb->ColorDrawBuffer[0] != ctx->Color.DrawBuffer[0] check to make piglit pass. v3 (Timothy Arceri): - Call new DrawBuffaerAllocate() driver function. Tested-by: Dieter Nützel <die...@nuetzel-hh.de> (v2) Reviewed-by: Brian Paul <bri...@vmware.com> (v2) Reviewed-by: Marek Olšák <marek.ol...@amd.com> Reviewed-by: Ian Romanick <ian.d.roman...@intel.com> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=99116 --- src/mesa/main/framebuffer.c | 6 ++ 1 file changed, 6 insertions(+) diff --git a/src/mesa/main/framebuffer.c b/src/mesa/main/framebuffer.c index 211e97c33b..4ea18f6858 100644 --- a/src/mesa/main/framebuffer.c +++ b/src/mesa/main/framebuffer.c @@ -617,6 +617,12 @@ update_framebuffer(struct gl_context *ctx, struct gl_framebuffer *fb) _mesa_drawbuffers(ctx, fb, ctx->Const.MaxDrawBuffers, ctx->Color.DrawBuffer, NULL); } + + /* Call device driver function if fb is the bound draw buffer. */ + if (fb == ctx->DrawBuffer) { + if (ctx->Driver.DrawBufferAllocate) +ctx->Driver.DrawBufferAllocate(ctx); + } } else { /* This is a user-created framebuffer. ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): mesa: some C99 tidy ups for framebuffer.c
Module: Mesa Branch: master Commit: 2554b8cb006d5466736333ab7b75aa34501278bb URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=2554b8cb006d5466736333ab7b75aa34501278bb Author: Timothy Arceri <tarc...@itsqueeze.com> Date: Tue Apr 24 14:06:00 2018 +1000 mesa: some C99 tidy ups for framebuffer.c Reviewed-by: Marek Olšák <marek.ol...@amd.com> Reviewed-by: Ian Romanick <ian.d.roman...@intel.com> --- src/mesa/main/framebuffer.c | 18 +- 1 file changed, 5 insertions(+), 13 deletions(-) diff --git a/src/mesa/main/framebuffer.c b/src/mesa/main/framebuffer.c index 249e775f8c..211e97c33b 100644 --- a/src/mesa/main/framebuffer.c +++ b/src/mesa/main/framebuffer.c @@ -210,14 +210,12 @@ _mesa_destroy_framebuffer(struct gl_framebuffer *fb) void _mesa_free_framebuffer_data(struct gl_framebuffer *fb) { - GLuint i; - assert(fb); assert(fb->RefCount == 0); simple_mtx_destroy(>Mutex); - for (i = 0; i < BUFFER_COUNT; i++) { + for (unsigned i = 0; i < BUFFER_COUNT; i++) { struct gl_renderbuffer_attachment *att = >Attachment[i]; if (att->Renderbuffer) { _mesa_reference_renderbuffer(>Renderbuffer, NULL); @@ -280,8 +278,6 @@ void _mesa_resize_framebuffer(struct gl_context *ctx, struct gl_framebuffer *fb, GLuint width, GLuint height) { - GLuint i; - /* XXX I think we could check if the size is not changing * and return early. */ @@ -289,7 +285,7 @@ _mesa_resize_framebuffer(struct gl_context *ctx, struct gl_framebuffer *fb, /* Can only resize win-sys framebuffer objects */ assert(_mesa_is_winsys_fbo(fb)); - for (i = 0; i < BUFFER_COUNT; i++) { + for (unsigned i = 0; i < BUFFER_COUNT; i++) { struct gl_renderbuffer_attachment *att = >Attachment[i]; if (att->Type == GL_RENDERBUFFER_EXT && att->Renderbuffer) { struct gl_renderbuffer *rb = att->Renderbuffer; @@ -427,13 +423,11 @@ void _mesa_update_framebuffer_visual(struct gl_context *ctx, struct gl_framebuffer *fb) { - GLuint i; - memset(>Visual, 0, sizeof(fb->Visual)); fb->Visual.rgbMode = GL_TRUE; /* assume this */ /* find first RGB renderbuffer */ - for (i = 0; i < BUFFER_COUNT; i++) { + for (unsigned i = 0; i < BUFFER_COUNT; i++) { if (fb->Attachment[i].Renderbuffer) { const struct gl_renderbuffer *rb = fb->Attachment[i].Renderbuffer; const GLenum baseFormat = _mesa_get_format_base_format(rb->Format); @@ -461,7 +455,7 @@ _mesa_update_framebuffer_visual(struct gl_context *ctx, } fb->Visual.floatMode = GL_FALSE; - for (i = 0; i < BUFFER_COUNT; i++) { + for (unsigned i = 0; i < BUFFER_COUNT; i++) { if (fb->Attachment[i].Renderbuffer) { const struct gl_renderbuffer *rb = fb->Attachment[i].Renderbuffer; const mesa_format fmt = rb->Format; @@ -936,14 +930,12 @@ _mesa_get_read_renderbuffer_for_format(const struct gl_context *ctx, void _mesa_print_framebuffer(const struct gl_framebuffer *fb) { - GLuint i; - fprintf(stderr, "Mesa Framebuffer %u at %p\n", fb->Name, (void *) fb); fprintf(stderr, " Size: %u x %u Status: %s\n", fb->Width, fb->Height, _mesa_enum_to_string(fb->_Status)); fprintf(stderr, " Attachments:\n"); - for (i = 0; i < BUFFER_COUNT; i++) { + for (unsigned i = 0; i < BUFFER_COUNT; i++) { const struct gl_renderbuffer_attachment *att = >Attachment[i]; if (att->Type == GL_TEXTURE) { const struct gl_texture_image *texImage = att->Renderbuffer->TexImage; ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): st/mesa: add new driver function DrawBufferAllocate
Module: Mesa Branch: master Commit: 6ca09f3a608c10f6d2a9f80d2497ac1628188ac9 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=6ca09f3a608c10f6d2a9f80d2497ac1628188ac9 Author: Timothy Arceri <tarc...@itsqueeze.com> Date: Tue Apr 24 14:19:48 2018 +1000 st/mesa: add new driver function DrawBufferAllocate Unlike some of the classic drivers the st was only using DrawBuffer() to allocated some buffers on-demand. Creating a separate function will allow us to call it from update_framebuffer() in the following patch without regressing some of the older classic drivers. Reviewed-by: Marek Olšák <marek.ol...@amd.com> --- src/mesa/main/buffers.c| 4 src/mesa/main/dd.h | 4 +++- src/mesa/state_tracker/st_cb_fbo.c | 10 -- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/mesa/main/buffers.c b/src/mesa/main/buffers.c index 7bb5725d08..ba970d87da 100644 --- a/src/mesa/main/buffers.c +++ b/src/mesa/main/buffers.c @@ -306,6 +306,8 @@ draw_buffer(struct gl_context *ctx, struct gl_framebuffer *fb, if (fb == ctx->DrawBuffer) { if (ctx->Driver.DrawBuffer) ctx->Driver.DrawBuffer(ctx, buffer); + if (ctx->Driver.DrawBufferAllocate) + ctx->Driver.DrawBufferAllocate(ctx); } } @@ -587,6 +589,8 @@ draw_buffers(struct gl_context *ctx, struct gl_framebuffer *fb, GLsizei n, if (fb == ctx->DrawBuffer) { if (ctx->Driver.DrawBuffer) ctx->Driver.DrawBuffer(ctx, n > 0 ? buffers[0] : GL_NONE); + if (ctx->Driver.DrawBufferAllocate) + ctx->Driver.DrawBufferAllocate(ctx); } } diff --git a/src/mesa/main/dd.h b/src/mesa/main/dd.h index d85d89ef50..5ee6902d3f 100644 --- a/src/mesa/main/dd.h +++ b/src/mesa/main/dd.h @@ -611,7 +611,9 @@ struct dd_function_table { /** Specify mapping of depth values from NDC to window coordinates */ void (*DepthRange)(struct gl_context *ctx); /** Specify the current buffer for writing */ - void (*DrawBuffer)( struct gl_context *ctx, GLenum buffer ); + void (*DrawBuffer)(struct gl_context *ctx, GLenum buffer); + /** Used to allocated any buffers with on-demand creation */ + void (*DrawBufferAllocate)(struct gl_context *ctx); /** Enable or disable server-side gl capabilities */ void (*Enable)(struct gl_context *ctx, GLenum cap, GLboolean state); /** Specify fog parameters */ diff --git a/src/mesa/state_tracker/st_cb_fbo.c b/src/mesa/state_tracker/st_cb_fbo.c index 696a08fd65..5eeec08655 100644 --- a/src/mesa/state_tracker/st_cb_fbo.c +++ b/src/mesa/state_tracker/st_cb_fbo.c @@ -714,13 +714,11 @@ st_validate_framebuffer(struct gl_context *ctx, struct gl_framebuffer *fb) * created FBOs. */ static void -st_DrawBuffer(struct gl_context *ctx, GLenum buffer) +st_DrawBufferAllocate(struct gl_context *ctx) { struct st_context *st = st_context(ctx); struct gl_framebuffer *fb = ctx->DrawBuffer; - (void) buffer; - if (_mesa_is_winsys_fbo(fb)) { GLuint i; /* add the renderbuffers on demand */ @@ -736,8 +734,8 @@ st_DrawBuffer(struct gl_context *ctx, GLenum buffer) /** - * Called via glReadBuffer. As with st_DrawBuffer, we use this function - * to check if we need to allocate a renderbuffer on demand. + * Called via glReadBuffer. As with st_DrawBufferAllocate, we use this + * function to check if we need to allocate a renderbuffer on demand. */ static void st_ReadBuffer(struct gl_context *ctx, GLenum buffer) @@ -868,7 +866,7 @@ st_init_fbo_functions(struct dd_function_table *functions) functions->FinishRenderTexture = st_finish_render_texture; functions->ValidateFramebuffer = st_validate_framebuffer; - functions->DrawBuffer = st_DrawBuffer; + functions->DrawBufferAllocate = st_DrawBufferAllocate; functions->ReadBuffer = st_ReadBuffer; functions->MapRenderbuffer = st_MapRenderbuffer; ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): glsl/glcpp: Handle hex constants with 0X prefix
Module: Mesa Branch: master Commit: 1ff1dc1c631b97430b46dc84f5806e13ea4c524f URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=1ff1dc1c631b97430b46dc84f5806e13ea4c524f Author: Vlad Golovkin <vlad.golovkin.m...@gmail.com> Date: Thu Apr 19 23:08:01 2018 +0300 glsl/glcpp: Handle hex constants with 0X prefix GLSL 4.6 spec describes hex constant as: hexadecimal-constant: 0x hexadecimal-digit 0X hexadecimal-digit hexadecimal-constant hexadecimal-digit Right now if you have a shader with the following structure: #if 0X1 // or any hex number with the 0X prefix // some code #endif the code between #if and #endif gets removed because the checking is performed only for "0x" prefix which results in strtoll being called with the base 8 and after encountering the 'X' char the strtoll returns 0. Letting strtoll detect the base makes this limitation go away and also makes code easier to read. From the strtoll Linux man page: "If base is zero or 16, the string may then include a "0x" prefix, and the number will be read in base 16; otherwise, a zero base is taken as 10 (decimal) unless the next character is '0', in which case it is taken as 8 (octal)." This matches the behaviour in the GLSL spec. This patch also adds a test for uppercase hex prefix. Reviewed-by: Timothy Arceri <tarc...@itsqueeze.com> --- src/compiler/glsl/glcpp/glcpp-parse.y| 9 ++--- src/compiler/glsl/glcpp/tests/149-hex-const-uppercase-prefix.c | 5 + .../glsl/glcpp/tests/149-hex-const-uppercase-prefix.c.expected | 5 + 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/src/compiler/glsl/glcpp/glcpp-parse.y b/src/compiler/glsl/glcpp/glcpp-parse.y index ccb3aa18d3..d83f99f1c7 100644 --- a/src/compiler/glsl/glcpp/glcpp-parse.y +++ b/src/compiler/glsl/glcpp/glcpp-parse.y @@ -462,13 +462,8 @@ control_line_error: integer_constant: INTEGER_STRING { - if (strlen ($1) >= 3 && strncmp ($1, "0x", 2) == 0) { - $$ = strtoll ($1 + 2, NULL, 16); - } else if ($1[0] == '0') { - $$ = strtoll ($1, NULL, 8); - } else { - $$ = strtoll ($1, NULL, 10); - } + /* let strtoll detect the base */ + $$ = strtoll ($1, NULL, 0); } | INTEGER { $$ = $1; diff --git a/src/compiler/glsl/glcpp/tests/149-hex-const-uppercase-prefix.c b/src/compiler/glsl/glcpp/tests/149-hex-const-uppercase-prefix.c new file mode 100644 index 00..1be9b28eb7 --- /dev/null +++ b/src/compiler/glsl/glcpp/tests/149-hex-const-uppercase-prefix.c @@ -0,0 +1,5 @@ +#if 0x1234abcd == 0X1234abcd +success +#else +failure +#endif diff --git a/src/compiler/glsl/glcpp/tests/149-hex-const-uppercase-prefix.c.expected b/src/compiler/glsl/glcpp/tests/149-hex-const-uppercase-prefix.c.expected new file mode 100644 index 00..4cf250f6bb --- /dev/null +++ b/src/compiler/glsl/glcpp/tests/149-hex-const-uppercase-prefix.c.expected @@ -0,0 +1,5 @@ + +success + + + ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): mesa: rename api_validate.{c,h} -> draw_validate.{c,h}
Module: Mesa Branch: master Commit: 295f57e09a8b67da07dd96609591dc5144031a62 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=295f57e09a8b67da07dd96609591dc5144031a62 Author: Timothy Arceri <tarc...@itsqueeze.com> Date: Mon Apr 23 13:46:15 2018 +1000 mesa: rename api_validate.{c,h} -> draw_validate.{c,h} Reviewed-by: Mathias Fröhlich <mathias.froehl...@web.de> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=65422 --- src/mesa/Makefile.sources | 4 ++-- src/mesa/main/dlist.c | 2 +- src/mesa/main/{api_validate.c => draw_validate.c} | 2 +- src/mesa/main/{api_validate.h => draw_validate.h} | 0 src/mesa/main/drawpix.c | 2 +- src/mesa/meson.build | 4 ++-- src/mesa/vbo/vbo_exec_api.c | 2 +- src/mesa/vbo/vbo_exec_array.c | 2 +- src/mesa/vbo/vbo_save_api.c | 2 +- 9 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/mesa/Makefile.sources b/src/mesa/Makefile.sources index d78493ed9d..f910b41d0a 100644 --- a/src/mesa/Makefile.sources +++ b/src/mesa/Makefile.sources @@ -14,8 +14,6 @@ MAIN_FILES = \ main/api_exec.h \ main/api_loopback.c \ main/api_loopback.h \ - main/api_validate.c \ - main/api_validate.h \ main/arbprogram.c \ main/arbprogram.h \ main/arrayobj.c \ @@ -70,6 +68,8 @@ MAIN_FILES = \ main/drawpix.h \ main/drawtex.c \ main/drawtex.h \ + main/draw_validate.c \ + main/draw_validate.h \ main/enable.c \ main/enable.h \ main/enums.c \ diff --git a/src/mesa/main/dlist.c b/src/mesa/main/dlist.c index 2086611aa3..1b003c81a6 100644 --- a/src/mesa/main/dlist.c +++ b/src/mesa/main/dlist.c @@ -35,7 +35,7 @@ #include "api_arrayelt.h" #include "api_exec.h" #include "api_loopback.h" -#include "api_validate.h" +#include "draw_validate.h" #include "atifragshader.h" #include "config.h" #include "bufferobj.h" diff --git a/src/mesa/main/api_validate.c b/src/mesa/main/draw_validate.c similarity index 99% rename from src/mesa/main/api_validate.c rename to src/mesa/main/draw_validate.c index 7b91fdff55..bcb2d91306 100644 --- a/src/mesa/main/api_validate.c +++ b/src/mesa/main/draw_validate.c @@ -24,7 +24,7 @@ #include #include "glheader.h" -#include "api_validate.h" +#include "draw_validate.h" #include "arrayobj.h" #include "bufferobj.h" #include "context.h" diff --git a/src/mesa/main/api_validate.h b/src/mesa/main/draw_validate.h similarity index 100% rename from src/mesa/main/api_validate.h rename to src/mesa/main/draw_validate.h diff --git a/src/mesa/main/drawpix.c b/src/mesa/main/drawpix.c index 4bf14fc4f2..2f55dde7b8 100644 --- a/src/mesa/main/drawpix.c +++ b/src/mesa/main/drawpix.c @@ -24,7 +24,7 @@ #include "glheader.h" #include "imports.h" -#include "api_validate.h" +#include "draw_validate.h" #include "bufferobj.h" #include "context.h" #include "drawpix.h" diff --git a/src/mesa/meson.build b/src/mesa/meson.build index 30954beac5..c1334c9637 100644 --- a/src/mesa/meson.build +++ b/src/mesa/meson.build @@ -63,8 +63,6 @@ files_libmesa_common = files( 'main/api_exec.h', 'main/api_loopback.c', 'main/api_loopback.h', - 'main/api_validate.c', - 'main/api_validate.h', 'main/arbprogram.c', 'main/arbprogram.h', 'main/arrayobj.c', @@ -119,6 +117,8 @@ files_libmesa_common = files( 'main/drawpix.h', 'main/drawtex.c', 'main/drawtex.h', + 'main/draw_validate.c', + 'main/draw_validate.h', 'main/enable.c', 'main/enable.h', 'main/enums.h', diff --git a/src/mesa/vbo/vbo_exec_api.c b/src/mesa/vbo/vbo_exec_api.c index b3971715b5..20148acce3 100644 --- a/src/mesa/vbo/vbo_exec_api.c +++ b/src/mesa/vbo/vbo_exec_api.c @@ -40,7 +40,7 @@ USE OR OTHER DEALINGS IN THE SOFTWARE. #include "main/state.h" #include "main/light.h" #include "main/api_arrayelt.h" -#include "main/api_validate.h" +#include "main/draw_validate.h" #include "main/dispatch.h" #include "util/bitscan.h" diff --git a/src/mesa/vbo/vbo_exec_array.c b/src/mesa/vbo/vbo_exec_array.c index b3ce138a09..e74e1bd458 100644 --- a/src/mesa/vbo/vbo_exec_array.c +++ b/src/mesa/vbo/vbo_exec_array.c @@ -31,7 +31,7 @@ #include "main/glheader.h" #include "main/context.h" #include "main/state.h" -#include "main/api_validate.h" +#include "main/draw_validate.h" #include "main/dispatch.h" #include "main/varray.h" #include "main/bufferobj.h" diff --git a/src/mesa/vbo/vbo_save_api.c b/src/mesa/vbo/vbo_save_api.c inde
Mesa (master): mesa: merge the driver functions DrawBuffers and DrawBuffer
Module: Mesa Branch: master Commit: d3cafc18fced872ce60060e792f6faf2b97cc3a9 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=d3cafc18fced872ce60060e792f6faf2b97cc3a9 Author: Timothy Arceri <tarc...@itsqueeze.com> Date: Sat Apr 14 13:42:31 2018 +1000 mesa: merge the driver functions DrawBuffers and DrawBuffer The extra params we unused by the drivers that used DrawBuffers. Tested-by: Dieter Nützel <die...@nuetzel-hh.de> Reviewed-by: Brian Paul <bri...@vmware.com> --- src/mesa/drivers/common/driverfuncs.c| 1 - src/mesa/drivers/dri/nouveau/nouveau_state.c | 4 ++-- src/mesa/main/buffers.c | 8 ++-- src/mesa/main/dd.h | 2 -- src/mesa/state_tracker/st_cb_fbo.c | 9 - 5 files changed, 8 insertions(+), 16 deletions(-) diff --git a/src/mesa/drivers/common/driverfuncs.c b/src/mesa/drivers/common/driverfuncs.c index 11134b69e9..b7ac2b5b43 100644 --- a/src/mesa/drivers/common/driverfuncs.c +++ b/src/mesa/drivers/common/driverfuncs.c @@ -134,7 +134,6 @@ _mesa_init_driver_functions(struct dd_function_table *driver) driver->ColorMaterial = NULL; driver->CullFace = NULL; driver->DrawBuffer = NULL; - driver->DrawBuffers = NULL; driver->FrontFace = NULL; driver->DepthFunc = NULL; driver->DepthMask = NULL; diff --git a/src/mesa/drivers/dri/nouveau/nouveau_state.c b/src/mesa/drivers/dri/nouveau/nouveau_state.c index e2b0104367..debbd38080 100644 --- a/src/mesa/drivers/dri/nouveau/nouveau_state.c +++ b/src/mesa/drivers/dri/nouveau/nouveau_state.c @@ -115,7 +115,7 @@ nouveau_read_buffer(struct gl_context *ctx, GLenum buffer) } static void -nouveau_draw_buffers(struct gl_context *ctx, GLsizei n, const GLenum *buffers) +nouveau_draw_buffer(struct gl_context *ctx, GLenum buffer) { nouveau_validate_framebuffer(ctx); context_dirty(ctx, FRAMEBUFFER); @@ -519,7 +519,7 @@ nouveau_state_init(struct gl_context *ctx) ctx->Driver.DepthFunc = nouveau_depth_func; ctx->Driver.DepthMask = nouveau_depth_mask; ctx->Driver.ReadBuffer = nouveau_read_buffer; - ctx->Driver.DrawBuffers = nouveau_draw_buffers; + ctx->Driver.DrawBuffer = nouveau_draw_buffer; ctx->Driver.Enable = nouveau_enable; ctx->Driver.Fogfv = nouveau_fog; ctx->Driver.Lightfv = nouveau_light; diff --git a/src/mesa/main/buffers.c b/src/mesa/main/buffers.c index 5492227de0..7bb5725d08 100644 --- a/src/mesa/main/buffers.c +++ b/src/mesa/main/buffers.c @@ -304,9 +304,7 @@ draw_buffer(struct gl_context *ctx, struct gl_framebuffer *fb, /* Call device driver function only if fb is the bound draw buffer */ if (fb == ctx->DrawBuffer) { - if (ctx->Driver.DrawBuffers) - ctx->Driver.DrawBuffers(ctx, 1, ); - else if (ctx->Driver.DrawBuffer) + if (ctx->Driver.DrawBuffer) ctx->Driver.DrawBuffer(ctx, buffer); } } @@ -587,9 +585,7 @@ draw_buffers(struct gl_context *ctx, struct gl_framebuffer *fb, GLsizei n, * may not be valid. */ if (fb == ctx->DrawBuffer) { - if (ctx->Driver.DrawBuffers) - ctx->Driver.DrawBuffers(ctx, n, buffers); - else if (ctx->Driver.DrawBuffer) + if (ctx->Driver.DrawBuffer) ctx->Driver.DrawBuffer(ctx, n > 0 ? buffers[0] : GL_NONE); } } diff --git a/src/mesa/main/dd.h b/src/mesa/main/dd.h index 64ddd81883..d85d89ef50 100644 --- a/src/mesa/main/dd.h +++ b/src/mesa/main/dd.h @@ -612,8 +612,6 @@ struct dd_function_table { void (*DepthRange)(struct gl_context *ctx); /** Specify the current buffer for writing */ void (*DrawBuffer)( struct gl_context *ctx, GLenum buffer ); - /** Specify the buffers for writing for fragment programs*/ - void (*DrawBuffers)(struct gl_context *ctx, GLsizei n, const GLenum *buffers); /** Enable or disable server-side gl capabilities */ void (*Enable)(struct gl_context *ctx, GLenum cap, GLboolean state); /** Specify fog parameters */ diff --git a/src/mesa/state_tracker/st_cb_fbo.c b/src/mesa/state_tracker/st_cb_fbo.c index f859133e39..696a08fd65 100644 --- a/src/mesa/state_tracker/st_cb_fbo.c +++ b/src/mesa/state_tracker/st_cb_fbo.c @@ -714,13 +714,12 @@ st_validate_framebuffer(struct gl_context *ctx, struct gl_framebuffer *fb) * created FBOs. */ static void -st_DrawBuffers(struct gl_context *ctx, GLsizei count, const GLenum *buffers) +st_DrawBuffer(struct gl_context *ctx, GLenum buffer) { struct st_context *st = st_context(ctx); struct gl_framebuffer *fb = ctx->DrawBuffer; - (void) count; - (void) buffers; + (void) buffer; if (_mesa_is_winsys_fbo(fb)) { GLuint i; @@ -737,7 +736,7 @@ st_DrawBuffers(struct gl_context *ctx, GLsizei count, const GLenum *buffers) /** - * Called via glReadBuffer. As with st_DrawBuffers, we use this function + * Called via glReadBuffer.
Mesa (master): nir: return early when lowering a return at the end of a function
Module: Mesa Branch: master Commit: 6e22ad6edc34dc07a08b41a781f1c37ff3c536e7 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=6e22ad6edc34dc07a08b41a781f1c37ff3c536e7 Author: Timothy Arceri <tarc...@itsqueeze.com> Date: Sun Apr 8 21:47:32 2018 +1000 nir: return early when lowering a return at the end of a function Otherwise we create unused conditional return flags and things get unnecessarily ugly fast when lowering nested functions. Reviewed-by: Jason Ekstrand <ja...@jlekstrand.net> --- src/compiler/nir/nir_lower_returns.c | 6 ++ 1 file changed, 6 insertions(+) diff --git a/src/compiler/nir/nir_lower_returns.c b/src/compiler/nir/nir_lower_returns.c index 423192adb8..3ea69e2520 100644 --- a/src/compiler/nir/nir_lower_returns.c +++ b/src/compiler/nir/nir_lower_returns.c @@ -180,6 +180,12 @@ lower_returns_in_block(nir_block *block, struct lower_returns_state *state) nir_instr_remove(>instr); + /* If this is a return in the last block of the function there is nothing +* more to do once its removed. +*/ + if (block == nir_impl_last_block(state->builder.impl)) + return true; + nir_builder *b = >builder; /* Set the return flag */ ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): glsl: fix gcc 8 parenthesis warning
Module: Mesa Branch: master Commit: 268d8f244b3450461de5448f3f9a2ed2aa05e223 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=268d8f244b3450461de5448f3f9a2ed2aa05e223 Author: Marc Dietrich <marvi...@gmx.de> Date: Fri Mar 23 11:01:23 2018 +0100 glsl: fix gcc 8 parenthesis warning fixes warnings like this: [184/1137] Compiling C++ object 'src/compiler/glsl/glsl@sta/lower_jumps.cpp.o'. In file included from ../src/mesa/main/mtypes.h:48, from ../src/compiler/glsl_types.h:149, from ../src/compiler/glsl/lower_jumps.cpp:59: ../src/compiler/glsl/lower_jumps.cpp: In member function '{anonymous}::block_record {anonymous}::ir_lower_jumps_visitor::visit_block(exec_list*)': ../src/compiler/glsl/list.h:650:17: warning: unnecessary parentheses in declaration of 'node' [-Wparentheses] for (__type *(__inst) = (__type *)(__list)->head_sentinel.next; \ ^ ../src/compiler/glsl/lower_jumps.cpp:510:7: note: in expansion of macro 'foreach_in_list' foreach_in_list(ir_instruction, node, list) { ^~~ Signed-off-by: Marc Dietrich <marvi...@gmx.de> Reviewed-by: Emil Velikov <emil.veli...@collabora.com> Reviewed-by: Timothy Arceri <tarc...@itsqueeze.com> --- src/compiler/glsl/list.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/compiler/glsl/list.h b/src/compiler/glsl/list.h index f77fe12991..2bfa273554 100644 --- a/src/compiler/glsl/list.h +++ b/src/compiler/glsl/list.h @@ -647,12 +647,12 @@ inline void exec_node::insert_before(exec_list *before) #endif #define foreach_in_list(__type, __inst, __list) \ - for (__type *(__inst) = (__type *)(__list)->head_sentinel.next; \ + for (__type *__inst = (__type *)(__list)->head_sentinel.next; \ !(__inst)->is_tail_sentinel(); \ (__inst) = (__type *)(__inst)->next) #define foreach_in_list_reverse(__type, __inst, __list) \ - for (__type *(__inst) = (__type *)(__list)->tail_sentinel.prev; \ + for (__type *__inst = (__type *)(__list)->tail_sentinel.prev; \ !(__inst)->is_head_sentinel();\ (__inst) = (__type *)(__inst)->prev) ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): mesa: free debug messages when destroying the debug state
Module: Mesa Branch: master Commit: a63e69f5f0b4d960bd106068d8c7d13b82fea759 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=a63e69f5f0b4d960bd106068d8c7d13b82fea759 Author: Timothy Arceri <tarc...@itsqueeze.com> Date: Fri Apr 13 15:23:57 2018 +1000 mesa: free debug messages when destroying the debug state Fixes: 04a8baad3721 "mesa: refactor _mesa_PopDebugGroup and _mesa_free_errors_data" Reviewed-by: Iago Toral Quiroga <ito...@igalia.com> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=98281 --- src/mesa/main/debug_output.c | 45 ++-- 1 file changed, 23 insertions(+), 22 deletions(-) diff --git a/src/mesa/main/debug_output.c b/src/mesa/main/debug_output.c index 3d6cc18c2f..b2a4fb5c2d 100644 --- a/src/mesa/main/debug_output.c +++ b/src/mesa/main/debug_output.c @@ -501,6 +501,28 @@ debug_clear_group(struct gl_debug_state *debug) } /** + * Delete the oldest debug messages out of the log. + */ +static void +debug_delete_messages(struct gl_debug_state *debug, int count) +{ + struct gl_debug_log *log = >Log; + + if (count > log->NumMessages) + count = log->NumMessages; + + while (count--) { + struct gl_debug_message *msg = >Messages[log->NextMessage]; + + debug_message_clear(msg); + + log->NumMessages--; + log->NextMessage++; + log->NextMessage %= MAX_DEBUG_LOGGED_MESSAGES; + } +} + +/** * Loop through debug group stack tearing down states for * filtering debug messages. Then free debug output state. */ @@ -513,6 +535,7 @@ debug_destroy(struct gl_debug_state *debug) } debug_clear_group(debug); + debug_delete_messages(debug, debug->Log.NumMessages); free(debug); } @@ -647,28 +670,6 @@ debug_fetch_message(const struct gl_debug_state *debug) return (log->NumMessages) ? >Messages[log->NextMessage] : NULL; } -/** - * Delete the oldest debug messages out of the log. - */ -static void -debug_delete_messages(struct gl_debug_state *debug, int count) -{ - struct gl_debug_log *log = >Log; - - if (count > log->NumMessages) - count = log->NumMessages; - - while (count--) { - struct gl_debug_message *msg = >Messages[log->NextMessage]; - - debug_message_clear(msg); - - log->NumMessages--; - log->NextMessage++; - log->NextMessage %= MAX_DEBUG_LOGGED_MESSAGES; - } -} - static struct gl_debug_message * debug_get_group_message(struct gl_debug_state *debug) { ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): mesa: fix x86 builds
Module: Mesa Branch: master Commit: c500ab2735df0b7020b44d24449ffb1d2e29275b URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=c500ab2735df0b7020b44d24449ffb1d2e29275b Author: Timothy Arceri <tarc...@itsqueeze.com> Date: Fri Apr 13 22:11:13 2018 +1000 mesa: fix x86 builds Fixes: 43d66c8c2d4d "mesa: include mtypes.h less" --- src/mesa/x86/common_x86.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/mesa/x86/common_x86.c b/src/mesa/x86/common_x86.c index 5cf919fd59..36b2e82fb6 100644 --- a/src/mesa/x86/common_x86.c +++ b/src/mesa/x86/common_x86.c @@ -54,6 +54,7 @@ #endif #endif +#include "main/errors.h" #include "main/imports.h" #include "common_x86_asm.h" ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): glsl: fix compat shaders in GLSL 1.40
Module: Mesa Branch: master Commit: c7e3d31b0b5f22299a6bd72655502ce8427b40bf URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=c7e3d31b0b5f22299a6bd72655502ce8427b40bf Author: Timothy Arceri <tarc...@itsqueeze.com> Date: Thu Apr 12 09:23:02 2018 +1000 glsl: fix compat shaders in GLSL 1.40 The compatibility and core tokens were not added until GLSL 1.50, for GLSL 1.40 just assume all shaders built with a compat profile are compat shaders. Fixes rendering issues in Dawn of War II on radeonsi which has enabled OpenGL 3.1 compat support. Fixes: a0c8b49284ef "mesa: enable OpenGL 3.1 with ARB_compatibility" Reviewed-by: Marek Olšák <marek.ol...@amd.com> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=105807 --- src/compiler/glsl/glsl_parser_extras.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/compiler/glsl/glsl_parser_extras.cpp b/src/compiler/glsl/glsl_parser_extras.cpp index 0cc57f5a88..5dd362b3e3 100644 --- a/src/compiler/glsl/glsl_parser_extras.cpp +++ b/src/compiler/glsl/glsl_parser_extras.cpp @@ -429,6 +429,8 @@ _mesa_glsl_parse_state::process_version_directive(YYLTYPE *locp, int version, this->language_version = version; this->compat_shader = compat_token_present || + (this->ctx->API == API_OPENGL_COMPAT && + this->language_version == 140) || (!this->es_shader && this->language_version < 140); bool supported = false; ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): mesa: fix glsl version mismatch in compat profile
Module: Mesa Branch: master Commit: a05faf80c380a03347604e79136627267ff9f893 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=a05faf80c380a03347604e79136627267ff9f893 Author: Timothy Arceri <tarc...@itsqueeze.com> Date: Tue Apr 10 21:40:11 2018 +1000 mesa: fix glsl version mismatch in compat profile Drivers that only support compat 3.0 were reporting GLSL 1.40 support. This fixes issues with the menu of Dawn of War II. Fixes: a0c8b49284ef "mesa: enable OpenGL 3.1 with ARB_compatibility" Reviewed-by: Marek Olšák <marek.ol...@amd.com> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=105807 --- src/mesa/main/version.c | 8 ++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/mesa/main/version.c b/src/mesa/main/version.c index 0a4e7630da..84babd69e2 100644 --- a/src/mesa/main/version.c +++ b/src/mesa/main/version.c @@ -620,8 +620,11 @@ _mesa_compute_version(struct gl_context *ctx) /* Make sure that the GLSL version lines up with the GL version. In some * cases it can be too high, e.g. if an extension is missing. */ - if (_mesa_is_desktop_gl(ctx) && ctx->Version >= 31) { + if (_mesa_is_desktop_gl(ctx)) { switch (ctx->Version) { + case 30: + ctx->Const.GLSLVersion = 130; + break; case 31: ctx->Const.GLSLVersion = 140; break; @@ -629,7 +632,8 @@ _mesa_compute_version(struct gl_context *ctx) ctx->Const.GLSLVersion = 150; break; default: - ctx->Const.GLSLVersion = ctx->Version * 10; + if (ctx->Version >= 33) +ctx->Const.GLSLVersion = ctx->Version * 10; break; } } ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): st/mesa: exit st_translate_fragment_program() earlier for NIR path
Module: Mesa Branch: master Commit: bc71e20993a456ab17e1775bf905fa000aae4c71 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=bc71e20993a456ab17e1775bf905fa000aae4c71 Author: Timothy Arceri <tarc...@itsqueeze.com> Date: Thu Apr 5 16:20:23 2018 +1000 st/mesa: exit st_translate_fragment_program() earlier for NIR path This avoids a bunch of scanning that is only used by the TGSI path. Reviewed-by: Marek Olšák <marek.ol...@amd.com> --- src/mesa/state_tracker/st_program.c | 12 ++-- 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/mesa/state_tracker/st_program.c b/src/mesa/state_tracker/st_program.c index 5bf76e1b88..a740c874c9 100644 --- a/src/mesa/state_tracker/st_program.c +++ b/src/mesa/state_tracker/st_program.c @@ -645,6 +645,12 @@ bool st_translate_fragment_program(struct st_context *st, struct st_fragment_program *stfp) { + /* We have already compiled to NIR so just return */ + if (stfp->shader_program) { + st_store_ir_in_disk_cache(st, >Base, true); + return true; + } + ubyte outputMapping[2 * FRAG_RESULT_MAX]; ubyte inputMapping[VARYING_SLOT_MAX]; ubyte inputSlotToAttr[VARYING_SLOT_MAX]; @@ -900,12 +906,6 @@ st_translate_fragment_program(struct st_context *st, } } - /* We have already compiled to NIR so just return */ - if (stfp->shader_program) { - st_store_ir_in_disk_cache(st, >Base, true); - return true; - } - ureg = ureg_create_with_screen(PIPE_SHADER_FRAGMENT, st->pipe->screen); if (ureg == NULL) return false; ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): st/mesa: finalise tcs/tes/geom NIR before storing it to the cache
Module: Mesa Branch: master Commit: 6066f08ee937ad73dd06ec763dff0223d5268874 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=6066f08ee937ad73dd06ec763dff0223d5268874 Author: Timothy Arceri <tarc...@itsqueeze.com> Date: Thu Apr 5 16:36:09 2018 +1000 st/mesa: finalise tcs/tes/geom NIR before storing it to the cache We don't create variants of the NIR so here we finalise it before caching to avoid unnecessary processing when restoring it. Reviewed-by: Marek Olšák <marek.ol...@amd.com> --- src/mesa/state_tracker/st_program.c | 11 +-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/mesa/state_tracker/st_program.c b/src/mesa/state_tracker/st_program.c index a740c874c9..3f8df31da1 100644 --- a/src/mesa/state_tracker/st_program.c +++ b/src/mesa/state_tracker/st_program.c @@ -1473,6 +1473,9 @@ st_translate_geometry_program(struct st_context *st, /* We have already compiled to NIR so just return */ if (stgp->shader_program) { + /* No variants */ + st_finalize_nir(st, >Base, stgp->shader_program, + stgp->tgsi.ir.nir); st_translate_program_stream_output(>Base, >tgsi.stream_output); st_store_ir_in_disk_cache(st, >Base, true); return true; @@ -1530,8 +1533,6 @@ st_get_basic_variant(struct st_context *st, if (prog->tgsi.type == PIPE_SHADER_IR_NIR) { tgsi.type = PIPE_SHADER_IR_NIR; tgsi.ir.nir = nir_shader_clone(NULL, prog->tgsi.ir.nir); - st_finalize_nir(st, >Base, prog->shader_program, -tgsi.ir.nir); tgsi.stream_output = prog->tgsi.stream_output; } else tgsi = prog->tgsi; @@ -1575,6 +1576,9 @@ st_translate_tessctrl_program(struct st_context *st, /* We have already compiled to NIR so just return */ if (sttcp->shader_program) { + /* No variants */ + st_finalize_nir(st, >Base, sttcp->shader_program, + sttcp->tgsi.ir.nir); st_store_ir_in_disk_cache(st, >Base, true); return true; } @@ -1606,6 +1610,9 @@ st_translate_tesseval_program(struct st_context *st, /* We have already compiled to NIR so just return */ if (sttep->shader_program) { + /* No variants */ + st_finalize_nir(st, >Base, sttep->shader_program, + sttep->tgsi.ir.nir); st_translate_program_stream_output(>Base, >tgsi.stream_output); st_store_ir_in_disk_cache(st, >Base, true); return true; ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): st/mesa: stop calling _mesa_init_shader_object_functions()
Module: Mesa Branch: master Commit: f33d9036b9145e3ff015e14537398d79c40fcf3f URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=f33d9036b9145e3ff015e14537398d79c40fcf3f Author: Timothy Arceri <tarc...@itsqueeze.com> Date: Wed Apr 4 16:29:59 2018 +1000 st/mesa: stop calling _mesa_init_shader_object_functions() This sets the LinkShader function for the driver, but for the st we set it properly with the following call to st_init_program_functions(). Reviewed-by: Marek Olšák <marek.ol...@amd.com> --- src/mesa/state_tracker/st_context.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/mesa/state_tracker/st_context.c b/src/mesa/state_tracker/st_context.c index a3da0f8f1f..b0266bef8b 100644 --- a/src/mesa/state_tracker/st_context.c +++ b/src/mesa/state_tracker/st_context.c @@ -714,7 +714,6 @@ void st_init_driver_functions(struct pipe_screen *screen, struct dd_function_table *functions) { - _mesa_init_shader_object_functions(functions); _mesa_init_sampler_object_functions(functions); st_init_draw_functions(functions); ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): nir: dont lower bindless samplers
Module: Mesa Branch: master Commit: 74b3fc2ce0f854bbe4b1d5e052e59b61a49f62ba URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=74b3fc2ce0f854bbe4b1d5e052e59b61a49f62ba Author: Timothy Arceri <tarc...@itsqueeze.com> Date: Thu Mar 22 14:28:22 2018 +1100 nir: dont lower bindless samplers We neeed to skip the var if its not a uniform here as well as checking the bindless flag since UBOs can contain bindless samplers. Reviewed-by: Marek Olšák <marek.ol...@amd.com> --- src/compiler/nir/nir_lower_samplers_as_deref.c | 8 +++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/compiler/nir/nir_lower_samplers_as_deref.c b/src/compiler/nir/nir_lower_samplers_as_deref.c index b1272e25a9..2a2fb5b093 100644 --- a/src/compiler/nir/nir_lower_samplers_as_deref.c +++ b/src/compiler/nir/nir_lower_samplers_as_deref.c @@ -157,7 +157,8 @@ static bool lower_sampler(nir_tex_instr *instr, struct lower_samplers_as_deref_state *state, nir_builder *b) { - if (!instr->texture) + if (!instr->texture || instr->texture->var->data.bindless || + instr->texture->var->data.mode != nir_var_uniform) return false; /* In GLSL, we only fill out the texture field. The sampler is inferred */ @@ -195,6 +196,11 @@ lower_intrinsic(nir_intrinsic_instr *instr, instr->intrinsic == nir_intrinsic_image_var_atomic_comp_swap || instr->intrinsic == nir_intrinsic_image_var_size) { b->cursor = nir_before_instr(>instr); + + if (instr->variables[0]->var->data.bindless || + instr->variables[0]->var->data.mode != nir_var_uniform) + return false; + lower_deref(instr->variables[0], state, b); return true; } ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): radeonsi/nir: don't add bindless samplers/images to declared bitmasks
Module: Mesa Branch: master Commit: 222d862cd332dba3c2bd8b28270c3a0d0aed6ec6 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=222d862cd332dba3c2bd8b28270c3a0d0aed6ec6 Author: Timothy Arceri <tarc...@itsqueeze.com> Date: Wed Mar 28 12:31:01 2018 +1100 radeonsi/nir: don't add bindless samplers/images to declared bitmasks Reviewed-by: Marek Olšák <marek.ol...@amd.com> --- src/gallium/drivers/radeonsi/si_shader_nir.c | 12 ++-- 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/gallium/drivers/radeonsi/si_shader_nir.c b/src/gallium/drivers/radeonsi/si_shader_nir.c index 47f9ef2945..80c436247c 100644 --- a/src/gallium/drivers/radeonsi/si_shader_nir.c +++ b/src/gallium/drivers/radeonsi/si_shader_nir.c @@ -657,22 +657,22 @@ void si_nir_scan_shader(const struct nir_shader *nir, * eliminated struct dereferences. */ if (base_type == GLSL_TYPE_SAMPLER) { - info->samplers_declared |= - u_bit_consecutive(variable->data.binding, aoa_size); - if (variable->data.bindless) { info->const_buffers_declared |= 1; info->const_file_max[0] += glsl_count_attribute_slots(type, false); + } else { + info->samplers_declared |= + u_bit_consecutive(variable->data.binding, aoa_size); } } else if (base_type == GLSL_TYPE_IMAGE) { - info->images_declared |= - u_bit_consecutive(variable->data.binding, aoa_size); - if (variable->data.bindless) { info->const_buffers_declared |= 1; info->const_file_max[0] += glsl_count_attribute_slots(type, false); + } else { + info->images_declared |= + u_bit_consecutive(variable->data.binding, aoa_size); } } else if (base_type != GLSL_TYPE_ATOMIC_UINT) { if (strncmp(variable->name, "state.", 6) == 0 || ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): radeonsi/nir: set uses_bindless_images for images
Module: Mesa Branch: master Commit: d7cbe795edefb616c2df9d3bda0a2dc80a2c3405 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=d7cbe795edefb616c2df9d3bda0a2dc80a2c3405 Author: Timothy Arceri <tarc...@itsqueeze.com> Date: Mon Feb 19 08:44:50 2018 +1100 radeonsi/nir: set uses_bindless_images for images V2: add missing intrinsics (Spotted-by: Samuel Pitoiset) Reviewed-by: Marek Olšák <marek.ol...@amd.com> --- src/gallium/drivers/radeonsi/si_shader_nir.c | 17 - 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/gallium/drivers/radeonsi/si_shader_nir.c b/src/gallium/drivers/radeonsi/si_shader_nir.c index 80c436247c..45cbf1ce7f 100644 --- a/src/gallium/drivers/radeonsi/si_shader_nir.c +++ b/src/gallium/drivers/radeonsi/si_shader_nir.c @@ -124,6 +124,15 @@ static void scan_instruction(struct tgsi_shader_info *info, case nir_intrinsic_load_tess_level_outer: info->reads_tess_factors = true; break; + case nir_intrinsic_image_var_load: + case nir_intrinsic_image_var_size: + case nir_intrinsic_image_var_samples: { + nir_variable *var = intr->variables[0]->var; + if (var->data.bindless) + info->uses_bindless_images = true; + + break; + } case nir_intrinsic_image_var_store: case nir_intrinsic_image_var_atomic_add: case nir_intrinsic_image_var_atomic_min: @@ -132,7 +141,13 @@ static void scan_instruction(struct tgsi_shader_info *info, case nir_intrinsic_image_var_atomic_or: case nir_intrinsic_image_var_atomic_xor: case nir_intrinsic_image_var_atomic_exchange: - case nir_intrinsic_image_var_atomic_comp_swap: + case nir_intrinsic_image_var_atomic_comp_swap: { + nir_variable *var = intr->variables[0]->var; + if (var->data.bindless) + info->uses_bindless_images = true; + + /* fall-through */ + } case nir_intrinsic_store_ssbo: case nir_intrinsic_ssbo_atomic_add: case nir_intrinsic_ssbo_atomic_imin: ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): st/glsl_to_nir: set paramater value offset as driver location for packed uniforms
Module: Mesa Branch: master Commit: bd4cc54c8bcad0836b92cf60c4d221e5dda38e9b URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=bd4cc54c8bcad0836b92cf60c4d221e5dda38e9b Author: Timothy Arceri <tarc...@itsqueeze.com> Date: Thu Mar 22 11:52:19 2018 +1100 st/glsl_to_nir: set paramater value offset as driver location for packed uniforms This allows us to simplify the code and will also be useful for supporting bindless textures. Reviewed-by: Marek Olšák <marek.ol...@amd.com> --- src/mesa/state_tracker/st_glsl_to_nir.cpp | 7 ++- src/mesa/state_tracker/st_nir.h | 3 +-- src/mesa/state_tracker/st_nir_lower_uniforms_to_ubo.c | 12 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/mesa/state_tracker/st_glsl_to_nir.cpp b/src/mesa/state_tracker/st_glsl_to_nir.cpp index a5a284fb22..bcf6a7ceb6 100644 --- a/src/mesa/state_tracker/st_glsl_to_nir.cpp +++ b/src/mesa/state_tracker/st_glsl_to_nir.cpp @@ -294,11 +294,16 @@ st_nir_assign_uniform_locations(struct gl_context *ctx, if (ctx->Const.PackedDriverUniformStorage) { loc = _mesa_add_sized_state_reference(prog->Parameters, stateTokens, comps, false); +loc = prog->Parameters->ParameterValueOffset[loc]; } else { loc = _mesa_add_state_reference(prog->Parameters, stateTokens); } } else { loc = st_nir_lookup_parameter_index(prog->Parameters, uniform->name); + + if (ctx->Const.PackedDriverUniformStorage) { +loc = prog->Parameters->ParameterValueOffset[loc]; + } } uniform->data.driver_location = loc; @@ -804,7 +809,7 @@ st_finalize_nir(struct st_context *st, struct gl_program *prog, if (st->ctx->Const.PackedDriverUniformStorage) { NIR_PASS_V(nir, nir_lower_io, nir_var_uniform, st_glsl_type_dword_size, (nir_lower_io_options)0); - NIR_PASS_V(nir, st_nir_lower_uniforms_to_ubo, prog->Parameters); + NIR_PASS_V(nir, st_nir_lower_uniforms_to_ubo); } if (screen->get_param(screen, PIPE_CAP_NIR_SAMPLERS_AS_DEREF)) diff --git a/src/mesa/state_tracker/st_nir.h b/src/mesa/state_tracker/st_nir.h index 3dd78fb115..1c2e32a5e6 100644 --- a/src/mesa/state_tracker/st_nir.h +++ b/src/mesa/state_tracker/st_nir.h @@ -36,8 +36,7 @@ struct nir_shader; void st_nir_lower_builtin(struct nir_shader *shader); void st_nir_lower_tex_src_plane(struct nir_shader *shader, unsigned free_slots, unsigned lower_2plane, unsigned lower_3plane); -bool st_nir_lower_uniforms_to_ubo(struct nir_shader *shader, - const struct gl_program_parameter_list *params); +bool st_nir_lower_uniforms_to_ubo(struct nir_shader *shader); void st_finalize_nir(struct st_context *st, struct gl_program *prog, struct gl_shader_program *shader_program, diff --git a/src/mesa/state_tracker/st_nir_lower_uniforms_to_ubo.c b/src/mesa/state_tracker/st_nir_lower_uniforms_to_ubo.c index b2f8f833bb..1727f8214a 100644 --- a/src/mesa/state_tracker/st_nir_lower_uniforms_to_ubo.c +++ b/src/mesa/state_tracker/st_nir_lower_uniforms_to_ubo.c @@ -36,8 +36,7 @@ #include "program/prog_parameter.h" static bool -lower_instr(nir_intrinsic_instr *instr, nir_builder *b, -const struct gl_program_parameter_list *params) +lower_instr(nir_intrinsic_instr *instr, nir_builder *b) { b->cursor = nir_before_instr(>instr); @@ -50,11 +49,9 @@ lower_instr(nir_intrinsic_instr *instr, nir_builder *b, } if (instr->intrinsic == nir_intrinsic_load_uniform) { - unsigned pvo = params->ParameterValueOffset[nir_intrinsic_base(instr)]; - nir_ssa_def *ubo_idx = nir_imm_int(b, 0); nir_ssa_def *ubo_offset = - nir_iadd(b, nir_imm_int(b, 4 * pvo), + nir_iadd(b, nir_imm_int(b, 4 * nir_intrinsic_base(instr)), nir_imul(b, nir_imm_int(b, 4), nir_ssa_for_src(b, instr->src[0], 1))); @@ -77,8 +74,7 @@ lower_instr(nir_intrinsic_instr *instr, nir_builder *b, } bool -st_nir_lower_uniforms_to_ubo(nir_shader *shader, - const struct gl_program_parameter_list *params) +st_nir_lower_uniforms_to_ubo(nir_shader *shader) { bool progress = false; @@ -90,7 +86,7 @@ st_nir_lower_uniforms_to_ubo(nir_shader *shader, nir_foreach_instr_safe(instr, block) { if (instr->type == nir_instr_type_intrinsic) progress |= lower_instr(nir_instr_as_intrinsic(instr), - , params); + ); } } ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): radeonsi/nir: tidy up si_nir_load_sampler_desc()
Module: Mesa Branch: master Commit: 494a5c350126268c45f3055687e22593a3fd74f4 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=494a5c350126268c45f3055687e22593a3fd74f4 Author: Timothy Arceri <tarc...@itsqueeze.com> Date: Thu Mar 22 11:55:20 2018 +1100 radeonsi/nir: tidy up si_nir_load_sampler_desc() This makes it easier to follow the code, and also initialises dynamic_index which will be useful for adding bindless textures support. Reviewed-by: Marek Olšák <marek.ol...@amd.com> --- src/gallium/drivers/radeonsi/si_shader_nir.c | 8 +++- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/gallium/drivers/radeonsi/si_shader_nir.c b/src/gallium/drivers/radeonsi/si_shader_nir.c index 45cbf1ce7f..c0e08c79a5 100644 --- a/src/gallium/drivers/radeonsi/si_shader_nir.c +++ b/src/gallium/drivers/radeonsi/si_shader_nir.c @@ -885,14 +885,12 @@ si_nir_load_sampler_desc(struct ac_shader_abi *abi, struct si_shader_context *ctx = si_shader_context_from_abi(abi); LLVMBuilderRef builder = ctx->ac.builder; LLVMValueRef list = LLVMGetParam(ctx->main_fn, ctx->param_samplers_and_images); - LLVMValueRef index = dynamic_index; + LLVMValueRef index; assert(!descriptor_set); - if (!index) - index = ctx->ac.i32_0; - - index = LLVMBuildAdd(builder, index, + dynamic_index = dynamic_index ? dynamic_index : ctx->ac.i32_0; + index = LLVMBuildAdd(builder, dynamic_index, LLVMConstInt(ctx->ac.i32, base_index + constant_index, false), ""); ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): glsl: always call do_lower_jumps() after loop unrolling
Module: Mesa Branch: master Commit: b42633db8e3711e54a5bd10495b1436b8e362801 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=b42633db8e3711e54a5bd10495b1436b8e362801 Author: Timothy Arceri <tarc...@itsqueeze.com> Date: Tue Apr 3 11:38:13 2018 +1000 glsl: always call do_lower_jumps() after loop unrolling This fixes a bug in radeonsi where LLVM cannot handle the case where a break exists but its not the last instruction in the block. LLVM would fail with: Terminator found in the middle of a basic block! LLVM ERROR: Broken function found, compilation aborted! Fixes: 96fe8834f539 "glsl_to_tgsi: do fewer optimizations with GLSLOptimizeConservatively" Reviewed-by: Matt Turner <matts...@gmail.com> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=105317 --- src/compiler/glsl/glsl_parser_extras.cpp | 18 ++ 1 file changed, 18 insertions(+) diff --git a/src/compiler/glsl/glsl_parser_extras.cpp b/src/compiler/glsl/glsl_parser_extras.cpp index 275c4d7571..0cc57f5a88 100644 --- a/src/compiler/glsl/glsl_parser_extras.cpp +++ b/src/compiler/glsl/glsl_parser_extras.cpp @@ -2242,6 +2242,24 @@ do_common_optimization(exec_list *ir, bool linked, loop_progress = false; loop_progress |= do_constant_propagation(ir); loop_progress |= do_if_simplification(ir); + +/* Some drivers only call do_common_optimization() once rather + * than in a loop. So we must call do_lower_jumps() after + * unrolling a loop because for drivers that use LLVM validation + * will fail if a jump is not the last instruction in the block. + * For example the following will fail LLVM validation: + * + * (loop ( + * ... + * break + * (assign (x) (var_ref v124) (expression int + (var_ref v124) + * (constant int (1)) ) ) + * )) + */ +loop_progress |= do_lower_jumps(ir, true, true, +options->EmitNoMainReturn, +options->EmitNoCont, +options->EmitNoLoops); } progress |= loop_progress; } ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): gallium/pipebuffer: fix parenthesis location
Module: Mesa Branch: master Commit: 7e9b7ec094500f1245eed518592f99244e54a753 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=7e9b7ec094500f1245eed518592f99244e54a753 Author: Timothy Arceri <tarc...@itsqueeze.com> Date: Sun Apr 1 09:32:28 2018 +1000 gallium/pipebuffer: fix parenthesis location Without this the return value will never get set to -1. This was first added in 49866c8f3457 and copied in 2b396eeed983. Fixes: 2b396eeed983 "gallium/pb_cache: add a copy of cache bufmgr independent of pb_manager" Reviewed-by: Marek Olšák <marek.ol...@amd.com> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=102342 --- src/gallium/auxiliary/pipebuffer/pb_cache.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gallium/auxiliary/pipebuffer/pb_cache.c b/src/gallium/auxiliary/pipebuffer/pb_cache.c index 0aaedbfae4..2b9ad49804 100644 --- a/src/gallium/auxiliary/pipebuffer/pb_cache.c +++ b/src/gallium/auxiliary/pipebuffer/pb_cache.c @@ -169,7 +169,7 @@ pb_cache_reclaim_buffer(struct pb_cache *mgr, pb_size size, cur_entry = LIST_ENTRY(struct pb_cache_entry, cur, head); if (!entry && (ret = pb_cache_is_buffer_compat(cur_entry, size, - alignment, usage) > 0)) + alignment, usage)) > 0) entry = cur_entry; else if (os_time_timeout(cur_entry->start, cur_entry->end, now)) destroy_buffer_locked(cur_entry); ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): radeonsi: create load_const_buffer_desc_fast_path() helper
Module: Mesa Branch: master Commit: 56017d81004072fd00979f3a987ff2e94e3b6315 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=56017d81004072fd00979f3a987ff2e94e3b6315 Author: Timothy Arceri <tarc...@itsqueeze.com> Date: Tue Mar 27 10:26:16 2018 +1100 radeonsi: create load_const_buffer_desc_fast_path() helper This will be shared by the TGSI and NIR backends. For simplicity we leave the SI LLVM 5.0 and lower work around only in the TGSI backend. Reviewed-by: Marek Olšák <marek.ol...@amd.com> --- src/gallium/drivers/radeonsi/si_shader.c | 88 ++-- 1 file changed, 49 insertions(+), 39 deletions(-) diff --git a/src/gallium/drivers/radeonsi/si_shader.c b/src/gallium/drivers/radeonsi/si_shader.c index 00ebbb9b0f..1661b54d05 100644 --- a/src/gallium/drivers/radeonsi/si_shader.c +++ b/src/gallium/drivers/radeonsi/si_shader.c @@ -2319,6 +2319,49 @@ void si_tgsi_declare_compute_memory(struct si_shader_context *ctx, si_declare_compute_memory(ctx); } +static LLVMValueRef load_const_buffer_desc_fast_path(struct si_shader_context *ctx) +{ + LLVMValueRef ptr = + LLVMGetParam(ctx->main_fn, ctx->param_const_and_shader_buffers); + struct si_shader_selector *sel = ctx->shader->selector; + + /* Do the bounds checking with a descriptor, because +* doing computation and manual bounds checking of 64-bit +* addresses generates horrible VALU code with very high +* VGPR usage and very low SIMD occupancy. +*/ + ptr = LLVMBuildPtrToInt(ctx->ac.builder, ptr, ctx->ac.intptr, ""); + + LLVMValueRef desc0, desc1; + if (HAVE_32BIT_POINTERS) { + desc0 = ptr; + desc1 = LLVMConstInt(ctx->i32, + S_008F04_BASE_ADDRESS_HI(ctx->screen->info.address32_hi), 0); + } else { + ptr = LLVMBuildBitCast(ctx->ac.builder, ptr, ctx->v2i32, ""); + desc0 = LLVMBuildExtractElement(ctx->ac.builder, ptr, ctx->i32_0, ""); + desc1 = LLVMBuildExtractElement(ctx->ac.builder, ptr, ctx->i32_1, ""); + /* Mask out all bits except BASE_ADDRESS_HI. */ + desc1 = LLVMBuildAnd(ctx->ac.builder, desc1, +LLVMConstInt(ctx->i32, ~C_008F04_BASE_ADDRESS_HI, 0), ""); + } + + LLVMValueRef desc_elems[] = { + desc0, + desc1, + LLVMConstInt(ctx->i32, (sel->info.const_file_max[0] + 1) * 16, 0), + LLVMConstInt(ctx->i32, + S_008F0C_DST_SEL_X(V_008F0C_SQ_SEL_X) | + S_008F0C_DST_SEL_Y(V_008F0C_SQ_SEL_Y) | + S_008F0C_DST_SEL_Z(V_008F0C_SQ_SEL_Z) | + S_008F0C_DST_SEL_W(V_008F0C_SQ_SEL_W) | + S_008F0C_NUM_FORMAT(V_008F0C_BUF_NUM_FORMAT_FLOAT) | + S_008F0C_DATA_FORMAT(V_008F0C_BUF_DATA_FORMAT_32), 0) + }; + + return ac_build_gather_values(>ac, desc_elems, 4); +} + static LLVMValueRef load_const_buffer_desc(struct si_shader_context *ctx, int i) { LLVMValueRef list_ptr = LLVMGetParam(ctx->main_fn, @@ -2397,8 +2440,6 @@ static LLVMValueRef fetch_constant( /* Fast path when user data SGPRs point to constant buffer 0 directly. */ if (sel->info.const_buffers_declared == 1 && sel->info.shader_buffers_declared == 0) { - LLVMValueRef ptr = - LLVMGetParam(ctx->main_fn, ctx->param_const_and_shader_buffers); /* This enables use of s_load_dword and flat_load_dword for const buffer 0 * loads, and up to x4 load opcode merging. However, it leads to horrible @@ -2413,48 +2454,17 @@ static LLVMValueRef fetch_constant( * s_buffer_load_dword (that we have to prevent) is when we use use * a literal offset where we don't need bounds checking. */ - if (ctx->screen->info.chip_class == SI && -HAVE_LLVM < 0x0600 && -!reg->Register.Indirect) { + if (ctx->screen->info.chip_class == SI && HAVE_LLVM < 0x0600 && + !reg->Register.Indirect) { + LLVMValueRef ptr = + LLVMGetParam(ctx->main_fn, ctx->param_const_and_shader_buffers); + addr = LLVMBuildLShr(ctx->ac.builder, addr, LLVMConstInt(ctx->i32, 2, 0), ""); LLVMValueRef result = ac_build_load_invariant(>ac, ptr, addr); return bitcast(bld_base, type, result); } - /* Do the bounds checking wi
Mesa (master): radeonsi/nir: gather buffers declared more accurately and use const fast path
Module: Mesa Branch: master Commit: dd3d3cc877423027562087261a6e47226b69df84 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=dd3d3cc877423027562087261a6e47226b69df84 Author: Timothy Arceri <tarc...@itsqueeze.com> Date: Tue Mar 27 10:39:49 2018 +1100 radeonsi/nir: gather buffers declared more accurately and use const fast path For now we skip SI && HAVE_LLVM < 0x0600 for simplicity. We also skip setting the more accurate masks for builtin uniforms for now as it causes some piglit regressions. Reviewed-by: Marek Olšák <marek.ol...@amd.com> --- src/gallium/drivers/radeonsi/si_shader.c | 7 +++ src/gallium/drivers/radeonsi/si_shader_nir.c | 89 ++-- 2 files changed, 90 insertions(+), 6 deletions(-) diff --git a/src/gallium/drivers/radeonsi/si_shader.c b/src/gallium/drivers/radeonsi/si_shader.c index 1661b54d05..18d5afe6ff 100644 --- a/src/gallium/drivers/radeonsi/si_shader.c +++ b/src/gallium/drivers/radeonsi/si_shader.c @@ -2374,8 +2374,15 @@ static LLVMValueRef load_const_buffer_desc(struct si_shader_context *ctx, int i) static LLVMValueRef load_ubo(struct ac_shader_abi *abi, LLVMValueRef index) { struct si_shader_context *ctx = si_shader_context_from_abi(abi); + struct si_shader_selector *sel = ctx->shader->selector; + LLVMValueRef ptr = LLVMGetParam(ctx->main_fn, ctx->param_const_and_shader_buffers); + if (sel->info.const_buffers_declared == 1 && + sel->info.shader_buffers_declared == 0) { + return load_const_buffer_desc_fast_path(ctx); + } + index = si_llvm_bound_index(ctx, index, ctx->num_const_buffers); index = LLVMBuildAdd(ctx->ac.builder, index, LLVMConstInt(ctx->i32, SI_NUM_SHADER_BUFFERS, 0), ""); diff --git a/src/gallium/drivers/radeonsi/si_shader_nir.c b/src/gallium/drivers/radeonsi/si_shader_nir.c index 437eefc54d..7dd8314d4b 100644 --- a/src/gallium/drivers/radeonsi/si_shader_nir.c +++ b/src/gallium/drivers/radeonsi/si_shader_nir.c @@ -600,23 +600,97 @@ void si_nir_scan_shader(const struct nir_shader *nir, info->num_outputs = num_outputs; + struct set *ubo_set = _mesa_set_create(NULL, _mesa_hash_pointer, + _mesa_key_pointer_equal); + + /* Intialise const_file_max[0] */ + info->const_file_max[0] = -1; + + unsigned ubo_idx = 1; nir_foreach_variable(variable, >uniforms) { const struct glsl_type *type = variable->type; enum glsl_base_type base_type = glsl_get_base_type(glsl_without_array(type)); unsigned aoa_size = MAX2(1, glsl_get_aoa_size(type)); + /* Gather buffers declared bitmasks. Note: radeonsi doesn't +* really use the mask (other than ubo_idx == 1 for regular +* uniforms) its really only used for getting the buffer count +* so we don't need to worry about the ordering. +*/ + if (variable->interface_type != NULL) { + if (variable->data.mode == nir_var_uniform) { + + unsigned block_count; + if (base_type != GLSL_TYPE_INTERFACE) { + struct set_entry *entry = + _mesa_set_search(ubo_set, variable->interface_type); + + /* Check if we have already processed +* a member from this ubo. +*/ + if (entry) + continue; + + block_count = 1; + } else { + block_count = aoa_size; + } + + info->const_buffers_declared |= u_bit_consecutive(ubo_idx, block_count); + ubo_idx += block_count; + + _mesa_set_add(ubo_set, variable->interface_type); + } + + if (variable->data.mode == nir_var_shader_storage) { + /* TODO: make this more accurate */ + info->shader_buffers_declared = + u_bit_consecutive(0, SI_NUM_SHADER_BUFFERS); + } + + continue; + } + /* We rely on the fact that nir_lower_samplers_as_deref has * eliminated struct dereferences. */ - if (base_type == GLSL_TYPE_SAMPLER) + if (base_type == GLSL_TYPE_SAMPLER) {
Mesa (master): radeonsi/nir: set TGSI_PROPERTY_NEXT_SHADER
Module: Mesa Branch: master Commit: 7aad5e15f61b20d994919ae5fc0aab4999ad4045 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=7aad5e15f61b20d994919ae5fc0aab4999ad4045 Author: Timothy Arceri <tarc...@itsqueeze.com> Date: Mon Feb 26 20:42:35 2018 +1100 radeonsi/nir: set TGSI_PROPERTY_NEXT_SHADER Reviewed-by: Marek Olšák <marek.ol...@amd.com> --- src/gallium/drivers/radeonsi/si_shader_nir.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/gallium/drivers/radeonsi/si_shader_nir.c b/src/gallium/drivers/radeonsi/si_shader_nir.c index 994fee0b02..437eefc54d 100644 --- a/src/gallium/drivers/radeonsi/si_shader_nir.c +++ b/src/gallium/drivers/radeonsi/si_shader_nir.c @@ -244,6 +244,9 @@ void si_nir_scan_shader(const struct nir_shader *nir, info->num_tokens = 2; /* indicate that the shader is non-empty */ info->num_instructions = 2; + info->properties[TGSI_PROPERTY_NEXT_SHADER] = + pipe_shader_type_from_mesa(nir->info.next_stage); + if (nir->info.stage == MESA_SHADER_TESS_CTRL) { info->properties[TGSI_PROPERTY_TCS_VERTICES_OUT] = nir->info.tess.tcs_vertices_out; ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): st/glsl_to_nir: gather next_stage in shader_info
Module: Mesa Branch: master Commit: 2ca5d9548fc42bfb19c21dd119845b941ada63a6 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=2ca5d9548fc42bfb19c21dd119845b941ada63a6 Author: Timothy Arceri <tarc...@itsqueeze.com> Date: Mon Feb 26 20:40:38 2018 +1100 st/glsl_to_nir: gather next_stage in shader_info Reviewed-by: Marek Olšák <marek.ol...@amd.com> --- src/compiler/shader_info.h| 5 + src/mesa/state_tracker/st_glsl_to_nir.cpp | 15 +++ 2 files changed, 20 insertions(+) diff --git a/src/compiler/shader_info.h b/src/compiler/shader_info.h index 737e9cffa8..ababe520b2 100644 --- a/src/compiler/shader_info.h +++ b/src/compiler/shader_info.h @@ -64,6 +64,11 @@ typedef struct shader_info { /** The shader stage, such as MESA_SHADER_VERTEX. */ gl_shader_stage stage; + /** The shader stage in a non SSO linked program that follows this stage, + * such as MESA_SHADER_FRAGMENT. + */ + gl_shader_stage next_stage; + /* Number of textures used by this shader */ unsigned num_textures; /* Number of uniform buffers used by this shader */ diff --git a/src/mesa/state_tracker/st_glsl_to_nir.cpp b/src/mesa/state_tracker/st_glsl_to_nir.cpp index 2cd1d97bae..f2d4b184d6 100644 --- a/src/mesa/state_tracker/st_glsl_to_nir.cpp +++ b/src/mesa/state_tracker/st_glsl_to_nir.cpp @@ -362,6 +362,21 @@ st_glsl_to_nir(struct st_context *st, struct gl_program *prog, nir_shader *nir = glsl_to_nir(shader_program, stage, options); + /* Set the next shader stage hint for VS and TES. */ + if (!nir->info.separate_shader && + (nir->info.stage == MESA_SHADER_VERTEX || +nir->info.stage == MESA_SHADER_TESS_EVAL)) { + + unsigned prev_stages = (1 << (prog->info.stage + 1)) - 1; + unsigned stages_mask = + ~prev_stages & shader_program->data->linked_stages; + + nir->info.next_stage = stages_mask ? + (gl_shader_stage) ffs(stages_mask) : MESA_SHADER_FRAGMENT; + } else { + nir->info.next_stage = MESA_SHADER_FRAGMENT; + } + nir_variable_mode mask = (nir_variable_mode) (nir_var_shader_in | nir_var_shader_out); nir_remove_dead_variables(nir, mask); ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): radeonsi/nir: fix explicit component packing for geom/tess doubles
Module: Mesa Branch: master Commit: c88e7fe29ec7ddab5dc26664b9770066c790ceb5 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=c88e7fe29ec7ddab5dc26664b9770066c790ceb5 Author: Timothy Arceri <tarc...@itsqueeze.com> Date: Wed Mar 21 13:22:52 2018 +1100 radeonsi/nir: fix explicit component packing for geom/tess doubles Reviewed-by: Marek Olšák <marek.ol...@amd.com> --- src/gallium/drivers/radeonsi/si_shader.c | 19 +++ 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/src/gallium/drivers/radeonsi/si_shader.c b/src/gallium/drivers/radeonsi/si_shader.c index 18d5afe6ff..e261d74b72 100644 --- a/src/gallium/drivers/radeonsi/si_shader.c +++ b/src/gallium/drivers/radeonsi/si_shader.c @@ -1290,12 +1290,13 @@ static LLVMValueRef si_nir_load_tcs_varyings(struct ac_shader_abi *abi, is_patch); LLVMValueRef value[4]; - for (unsigned i = 0; i < num_components + component; i++) { + for (unsigned i = 0; i < num_components; i++) { unsigned offset = i; if (llvm_type_is_64bit(ctx, type)) offset *= 2; - value[i] = lds_load(bld_base, type, offset, dw_addr); + offset += component; + value[i + component] = lds_load(bld_base, type, offset, dw_addr); } return ac_build_varying_gather_values(>ac, value, num_components, component); @@ -1377,13 +1378,14 @@ LLVMValueRef si_nir_load_input_tes(struct ac_shader_abi *abi, * between the NIR and TGSI backends. */ LLVMValueRef value[4]; - for (unsigned i = component; i < num_components + component; i++) { + for (unsigned i = 0; i < num_components; i++) { unsigned offset = i; if (llvm_type_is_64bit(ctx, type)) offset *= 2; - value[i] = buffer_load(>bld_base, type, offset, - ctx->tess_offchip_ring, base, addr, true); + offset += component; + value[i + component] = buffer_load(>bld_base, type, offset, + ctx->tess_offchip_ring, base, addr, true); } return ac_build_varying_gather_values(>ac, value, num_components, component); @@ -1693,13 +1695,14 @@ static LLVMValueRef si_nir_load_input_gs(struct ac_shader_abi *abi, struct si_shader_context *ctx = si_shader_context_from_abi(abi); LLVMValueRef value[4]; - for (unsigned i = component; i < num_components + component; i++) { + for (unsigned i = 0; i < num_components; i++) { unsigned offset = i; if (llvm_type_is_64bit(ctx, type)) offset *= 2; - value[i] = si_llvm_load_input_gs(>abi, driver_location / 4, -vertex_index, type, offset); + offset += component; + value[i + component] = si_llvm_load_input_gs(>abi, driver_location / 4, +vertex_index, type, offset); } return ac_build_varying_gather_values(>ac, value, num_components, component); ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): radeonsi/nir: set uses_bindless_samplers for samplers
Module: Mesa Branch: master Commit: f94b6b79be8e86be6908c7e7b93380b082433277 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=f94b6b79be8e86be6908c7e7b93380b082433277 Author: Timothy Arceri <tarc...@itsqueeze.com> Date: Tue Feb 20 14:06:27 2018 +1100 radeonsi/nir: set uses_bindless_samplers for samplers Reviewed-by: Samuel Pitoiset <samuel.pitoi...@gmail.com> Reviewed-by: Marek Olšák <marek.ol...@amd.com> --- src/gallium/drivers/radeonsi/si_shader_nir.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/gallium/drivers/radeonsi/si_shader_nir.c b/src/gallium/drivers/radeonsi/si_shader_nir.c index 6444a8b5dd..2245b39fe0 100644 --- a/src/gallium/drivers/radeonsi/si_shader_nir.c +++ b/src/gallium/drivers/radeonsi/si_shader_nir.c @@ -56,6 +56,9 @@ static void scan_instruction(struct tgsi_shader_info *info, if (!tex->texture) { info->samplers_declared |= u_bit_consecutive(tex->sampler_index, 1); + } else { + if (tex->texture->var->data.bindless) + info->uses_bindless_samplers = true; } switch (tex->op) { ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): ac/radeonsi: pass bindless bool to load_sampler_desc()
Module: Mesa Branch: master Commit: 92fa89a08d1e9905897dfb5cd30b8d572f83e941 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=92fa89a08d1e9905897dfb5cd30b8d572f83e941 Author: Timothy Arceri <tarc...@itsqueeze.com> Date: Tue Feb 20 11:08:11 2018 +1100 ac/radeonsi: pass bindless bool to load_sampler_desc() We also fix the base_index for bindless by using the driver location. Reviewed-by: Samuel Pitoiset <samuel.pitoi...@gmail.com> Reviewed-by: Marek Olšák <marek.ol...@amd.com> --- src/amd/common/ac_nir_to_llvm.c | 11 +-- src/amd/common/ac_shader_abi.h | 3 ++- src/amd/vulkan/radv_nir_to_llvm.c| 3 ++- src/gallium/drivers/radeonsi/si_shader_nir.c | 2 +- 4 files changed, 14 insertions(+), 5 deletions(-) diff --git a/src/amd/common/ac_nir_to_llvm.c b/src/amd/common/ac_nir_to_llvm.c index 0d85d047cd..7de59efcff 100644 --- a/src/amd/common/ac_nir_to_llvm.c +++ b/src/amd/common/ac_nir_to_llvm.c @@ -3030,6 +3030,7 @@ static LLVMValueRef get_sampler_desc(struct ac_nir_context *ctx, unsigned constant_index = 0; unsigned descriptor_set; unsigned base_index; + bool bindless = false; if (!deref) { assert(tex_instr && !image); @@ -3063,14 +3064,20 @@ static LLVMValueRef get_sampler_desc(struct ac_nir_context *ctx, tail = >deref; } descriptor_set = deref->var->data.descriptor_set; - base_index = deref->var->data.binding; + + if (deref->var->data.bindless) { + bindless = deref->var->data.bindless; + base_index = deref->var->data.driver_location; + } else { + base_index = deref->var->data.binding; + } } return ctx->abi->load_sampler_desc(ctx->abi, descriptor_set, base_index, constant_index, index, - desc_type, image, write); + desc_type, image, write, bindless); } static void set_tex_fetch_args(struct ac_llvm_context *ctx, diff --git a/src/amd/common/ac_shader_abi.h b/src/amd/common/ac_shader_abi.h index 0737d697ff..2f222cf8d6 100644 --- a/src/amd/common/ac_shader_abi.h +++ b/src/amd/common/ac_shader_abi.h @@ -157,7 +157,8 @@ struct ac_shader_abi { unsigned constant_index, LLVMValueRef index, enum ac_descriptor_type desc_type, - bool image, bool write); + bool image, bool write, + bool bindless); /** * Load a Vulkan-specific resource. diff --git a/src/amd/vulkan/radv_nir_to_llvm.c b/src/amd/vulkan/radv_nir_to_llvm.c index c8d383e021..23b58c37b2 100644 --- a/src/amd/vulkan/radv_nir_to_llvm.c +++ b/src/amd/vulkan/radv_nir_to_llvm.c @@ -1699,7 +1699,8 @@ static LLVMValueRef radv_get_sampler_desc(struct ac_shader_abi *abi, unsigned constant_index, LLVMValueRef index, enum ac_descriptor_type desc_type, - bool image, bool write) + bool image, bool write, + bool bindless) { struct radv_shader_context *ctx = radv_shader_context_from_abi(abi); LLVMValueRef list = ctx->descriptor_sets[descriptor_set]; diff --git a/src/gallium/drivers/radeonsi/si_shader_nir.c b/src/gallium/drivers/radeonsi/si_shader_nir.c index 2245b39fe0..994fee0b02 100644 --- a/src/gallium/drivers/radeonsi/si_shader_nir.c +++ b/src/gallium/drivers/radeonsi/si_shader_nir.c @@ -784,7 +784,7 @@ si_nir_load_sampler_desc(struct ac_shader_abi *abi, unsigned descriptor_set, unsigned base_index, unsigned constant_index, LLVMValueRef dynamic_index, enum ac_descriptor_type desc_type, bool image, -bool write) +bool write, bool bindless) { struct si_shader_context *ctx = si_shader_context_from_abi(abi); LLVMBuilderRef builder = ctx->ac.builder; ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): st/glsl_to_nir: set driver location for bindless images and samplers
Module: Mesa Branch: master Commit: 5411b98d5249e6ceb79f0b9923dd142fbbce8852 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=5411b98d5249e6ceb79f0b9923dd142fbbce8852 Author: Timothy Arceri <tarc...@itsqueeze.com> Date: Tue Feb 20 11:06:27 2018 +1100 st/glsl_to_nir: set driver location for bindless images and samplers Reviewed-by: Marek Olšák <marek.ol...@amd.com> --- src/mesa/state_tracker/st_glsl_to_nir.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/mesa/state_tracker/st_glsl_to_nir.cpp b/src/mesa/state_tracker/st_glsl_to_nir.cpp index d80b8318c1..2cd1d97bae 100644 --- a/src/mesa/state_tracker/st_glsl_to_nir.cpp +++ b/src/mesa/state_tracker/st_glsl_to_nir.cpp @@ -271,7 +271,8 @@ st_nir_assign_uniform_locations(struct gl_context *ctx, uniform->interface_type != NULL) continue; - if (uniform->type->is_sampler() || uniform->type->is_image()) { + if (!uniform->data.bindless && + (uniform->type->is_sampler() || uniform->type->is_image())) { if (uniform->type->is_sampler()) loc = shaderidx++; else ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): radeonsi/nir: fix scanning of multi-slot output varyings
Module: Mesa Branch: master Commit: 47eee04556c75075145fbdd0ec50844dcf080d17 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=47eee04556c75075145fbdd0ec50844dcf080d17 Author: Timothy Arceri <tarc...@itsqueeze.com> Date: Wed Feb 21 16:53:54 2018 +1100 radeonsi/nir: fix scanning of multi-slot output varyings This fixes tcs/tes varying arrays where we dont lower indirects and therefore don't split arrays. Here we also fix useagemask for dual slot doubles. Fixes a number of arb_tessellation_shader piglit tests. Reviewed-by: Marek Olšák <marek.ol...@amd.com> --- src/gallium/drivers/radeonsi/si_shader_nir.c | 236 ++- 1 file changed, 127 insertions(+), 109 deletions(-) diff --git a/src/gallium/drivers/radeonsi/si_shader_nir.c b/src/gallium/drivers/radeonsi/si_shader_nir.c index 8b5cc13f31..82b2440d0b 100644 --- a/src/gallium/drivers/radeonsi/si_shader_nir.c +++ b/src/gallium/drivers/radeonsi/si_shader_nir.c @@ -426,32 +426,48 @@ void si_nir_scan_shader(const struct nir_shader *nir, nir_foreach_variable(variable, >outputs) { unsigned semantic_name, semantic_index; - if (nir->info.stage == MESA_SHADER_FRAGMENT) { - tgsi_get_gl_frag_result_semantic(variable->data.location, - _name, _index); + i = variable->data.driver_location; - /* Adjust for dual source blending */ - if (variable->data.index > 0) { - semantic_index++; - } - } else { - tgsi_get_gl_varying_semantic(variable->data.location, true, -_name, _index); + const struct glsl_type *type = variable->type; + if (nir_is_per_vertex_io(variable, nir->info.stage)) { + assert(glsl_type_is_array(type)); + type = glsl_get_array_element(type); } - i = variable->data.driver_location; + unsigned attrib_count = glsl_count_attribute_slots(type, false); + for (unsigned k = 0; k < attrib_count; k++, i++) { - unsigned num_components = 4; - unsigned vector_elements = glsl_get_vector_elements(glsl_without_array(variable->type)); - if (vector_elements) - num_components = vector_elements; + if (nir->info.stage == MESA_SHADER_FRAGMENT) { + tgsi_get_gl_frag_result_semantic(variable->data.location + k, + _name, _index); - if (glsl_type_is_64bit(glsl_without_array(variable->type))) - num_components = MIN2(num_components * 2, 4); + /* Adjust for dual source blending */ + if (variable->data.index > 0) { + semantic_index++; + } + } else { + tgsi_get_gl_varying_semantic(variable->data.location + k, true, +_name, _index); + } + + unsigned num_components = 4; + unsigned vector_elements = glsl_get_vector_elements(glsl_without_array(variable->type)); + if (vector_elements) + num_components = vector_elements; + + unsigned component = variable->data.location_frac; + if (glsl_type_is_64bit(glsl_without_array(variable->type))) { + if (glsl_type_is_dual_slot(glsl_without_array(variable->type)) && k % 2) { + num_components = (num_components * 2) - 4; + component = 0; + } else { + num_components = MIN2(num_components * 2, 4); + } + } - ubyte usagemask = 0; - for (unsigned j = 0; j < num_components; j++) { - switch (j + variable->data.location_frac) { + ubyte usagemask = 0; + for (unsigned j = component; j < num_components + component; j++) { + switch (j) { case 0: usagemask |= TGSI_WRITEMASK_X; break; @@ -466,110 +482,112 @@ void si_nir_scan_shader(const struct nir_shader *nir, break; d
Mesa (master): st/glsl_to_nir: fix driver location for dual-slot packed doubles
Module: Mesa Branch: master Commit: fc51fdbcdec60f96b9bf593d74beb42e465cc277 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=fc51fdbcdec60f96b9bf593d74beb42e465cc277 Author: Timothy Arceri <tarc...@itsqueeze.com> Date: Wed Mar 21 11:27:19 2018 +1100 st/glsl_to_nir: fix driver location for dual-slot packed doubles Reviewed-by: Marek Olšák <marek.ol...@amd.com> --- src/mesa/state_tracker/st_glsl_to_nir.cpp | 22 -- 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/src/mesa/state_tracker/st_glsl_to_nir.cpp b/src/mesa/state_tracker/st_glsl_to_nir.cpp index 9bb99f3061..acc8942bfe 100644 --- a/src/mesa/state_tracker/st_glsl_to_nir.cpp +++ b/src/mesa/state_tracker/st_glsl_to_nir.cpp @@ -141,16 +141,23 @@ st_nir_assign_var_locations(struct exec_list *var_list, unsigned *size, type = glsl_get_array_element(type); } + unsigned var_size = type_size(type); + /* Builtins don't allow component packing so we only need to worry about * user defined varyings sharing the same location. */ bool processed = false; if (var->data.location >= base) { unsigned glsl_location = var->data.location - base; - if (processed_locs[var->data.index] & ((uint64_t)1 << glsl_location)) -processed = true; - else -processed_locs[var->data.index] |= ((uint64_t)1 << glsl_location); + + for (unsigned i = 0; i < var_size; i++) { +if (processed_locs[var->data.index] & +((uint64_t)1 << (glsl_location + i))) + processed = true; +else + processed_locs[var->data.index] |= + ((uint64_t)1 << (glsl_location + i)); + } } /* Because component packing allows varyings to share the same location @@ -162,9 +169,12 @@ st_nir_assign_var_locations(struct exec_list *var_list, unsigned *size, continue; } - assigned_locations[var->data.location] = location; + for (unsigned i = 0; i < var_size; i++) { + assigned_locations[var->data.location + i] = location + i; + } + var->data.driver_location = location; - location += type_size(type); + location += var_size; } *size += location; ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): st/glsl_to_nir: correctly handle arrays packed across multiple vars
Module: Mesa Branch: master Commit: 48f6014903454dcb0e8e05afb41cabf2dbac0585 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=48f6014903454dcb0e8e05afb41cabf2dbac0585 Author: Timothy Arceri <tarc...@itsqueeze.com> Date: Fri Mar 23 12:17:07 2018 +1100 st/glsl_to_nir: correctly handle arrays packed across multiple vars Fixes piglit test: tests/spec/arb_enhanced_layouts/execution/component-layout/vs-fs-array-interleave-range.shader_test Reviewed-by: Marek Olšák <marek.ol...@amd.com> --- src/mesa/state_tracker/st_glsl_to_nir.cpp | 24 +++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/src/mesa/state_tracker/st_glsl_to_nir.cpp b/src/mesa/state_tracker/st_glsl_to_nir.cpp index acc8942bfe..d80b8318c1 100644 --- a/src/mesa/state_tracker/st_glsl_to_nir.cpp +++ b/src/mesa/state_tracker/st_glsl_to_nir.cpp @@ -133,6 +133,7 @@ st_nir_assign_var_locations(struct exec_list *var_list, unsigned *size, const int base = stage == MESA_SHADER_FRAGMENT ? (int) FRAG_RESULT_DATA0 : (int) VARYING_SLOT_VAR0; + int UNUSED last_loc = 0; nir_foreach_variable(var, var_list) { const struct glsl_type *type = var->type; @@ -164,8 +165,29 @@ st_nir_assign_var_locations(struct exec_list *var_list, unsigned *size, * we may have already have processed this location. */ if (processed) { - var->data.driver_location = assigned_locations[var->data.location]; + unsigned driver_location = assigned_locations[var->data.location]; + var->data.driver_location = driver_location; *size += type_size(type); + + /* An array may be packed such that is crosses multiple other arrays + * or variables, we need to make sure we have allocated the elements + * consecutively if the previously proccessed var was shorter than + * the current array we are processing. + * + * NOTE: The code below assumes the var list is ordered in ascending + * location order. + */ + assert(last_loc <= var->data.location); + last_loc = var->data.location; + unsigned last_slot_location = driver_location + var_size; + if (last_slot_location > location) { +unsigned num_unallocated_slots = last_slot_location - location; +unsigned first_unallocated_slot = var_size - num_unallocated_slots; +for (unsigned i = first_unallocated_slot; i < num_unallocated_slots; i++) { + assigned_locations[var->data.location + i] = location; + location++; +} + } continue; } ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): nir: fix crash in loop unroll corner case
Module: Mesa Branch: master Commit: 629ee690addad9b3dc8f68cfff5ae09858f31caf URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=629ee690addad9b3dc8f68cfff5ae09858f31caf Author: Timothy Arceri <tarc...@itsqueeze.com> Date: Mon Mar 26 11:41:51 2018 +1100 nir: fix crash in loop unroll corner case When an if nesting inside anouther if is optimised away we can end up with a loop terminator and following block that looks like this: if ssa_596 { block block_5: /* preds: block_4 */ vec1 32 ssa_601 = load_const (0x /* -nan */) break /* succs: block_8 */ } else { block block_6: /* preds: block_4 */ /* succs: block_7 */ } block block_7: /* preds: block_6 */ vec1 32 ssa_602 = phi block_6: ssa_552 vec1 32 ssa_603 = phi block_6: ssa_553 vec1 32 ssa_604 = iadd ssa_551, ssa_66 The problem is the phis. Loop unrolling expects the last block in the loop to be empty once we splice the instructions in the last block into the continue branch. The problem is we cant move phis so here we lower the phis to regs when preparing the loop for unrolling. As it could be possible to have multiple additional blocks/ifs following the terminator we just convert all phis at the top level of the loop body for simplicity. We also add some comments to loop_prepare_for_unroll() while we are here. Fixes: 51daccb289eb "nir: add a loop unrolling pass" Reviewed-by: Jason Ekstrand <ja...@jlekstrand.net> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=105670 --- src/compiler/nir/nir_opt_loop_unroll.c | 17 - 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/compiler/nir/nir_opt_loop_unroll.c b/src/compiler/nir/nir_opt_loop_unroll.c index 79d04f978b..ff27c06cc0 100644 --- a/src/compiler/nir/nir_opt_loop_unroll.c +++ b/src/compiler/nir/nir_opt_loop_unroll.c @@ -37,10 +37,10 @@ #define LOOP_UNROLL_LIMIT 26 /* Prepare this loop for unrolling by first converting to lcssa and then - * converting the phis from the loops first block and the block that follows - * the loop into regs. Partially converting out of SSA allows us to unroll - * the loop without having to keep track of and update phis along the way - * which gets tricky and doesn't add much value over conveting to regs. + * converting the phis from the top level of the loop body to regs. + * Partially converting out of SSA allows us to unroll the loop without having + * to keep track of and update phis along the way which gets tricky and + * doesn't add much value over converting to regs. * * The loop may have a continue instruction at the end of the loop which does * nothing. Once we're out of SSA, we can safely delete it so we don't have @@ -51,13 +51,20 @@ loop_prepare_for_unroll(nir_loop *loop) { nir_convert_loop_to_lcssa(loop); - nir_lower_phis_to_regs_block(nir_loop_first_block(loop)); + /* Lower phis at the top level of the loop body */ + foreach_list_typed_safe(nir_cf_node, node, node, >body) { + if (nir_cf_node_block == node->type) { + nir_lower_phis_to_regs_block(nir_cf_node_as_block(node)); + } + } + /* Lower phis after the loop */ nir_block *block_after_loop = nir_cf_node_as_block(nir_cf_node_next(>cf_node)); nir_lower_phis_to_regs_block(block_after_loop); + /* Remove continue if its the last instruction in the loop */ nir_instr *last_instr = nir_block_last_instr(nir_loop_last_block(loop)); if (last_instr && last_instr->type == nir_instr_type_jump) { assert(nir_instr_as_jump(last_instr)->type == nir_jump_continue); ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): ac/nir_to_llvm: fix component packing for double outputs
Module: Mesa Branch: master Commit: 51f175028dcc69e055d7e612024f7bfe79d7ed5d URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=51f175028dcc69e055d7e612024f7bfe79d7ed5d Author: Timothy Arceri <tarc...@itsqueeze.com> Date: Wed Mar 21 12:23:08 2018 +1100 ac/nir_to_llvm: fix component packing for double outputs We need to wait until after the writemask is widened before we adjust it for component packing. Together with the previous patch this fixes a number of arb_enhanced_layouts component layout piglit tests. Reviewed-by: Marek Olšák <marek.ol...@amd.com> --- src/amd/common/ac_nir_to_llvm.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/amd/common/ac_nir_to_llvm.c b/src/amd/common/ac_nir_to_llvm.c index b7d29ef0b5..0d85d047cd 100644 --- a/src/amd/common/ac_nir_to_llvm.c +++ b/src/amd/common/ac_nir_to_llvm.c @@ -1793,7 +1793,7 @@ visit_store_var(struct ac_nir_context *ctx, int idx = instr->variables[0]->var->data.driver_location; unsigned comp = instr->variables[0]->var->data.location_frac; LLVMValueRef src = ac_to_float(>ac, get_src(ctx, instr->src[0])); - int writemask = instr->const_index[0] << comp; + int writemask = instr->const_index[0]; LLVMValueRef indir_index; unsigned const_index; get_deref_offset(ctx, instr->variables[0], false, @@ -1808,6 +1808,8 @@ visit_store_var(struct ac_nir_context *ctx, writemask = widen_mask(writemask, 2); } + writemask = writemask << comp; + switch (instr->variables[0]->var->data.mode) { case nir_var_shader_out: ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): radeonsi/nir: fix input processing for packed varyings
Module: Mesa Branch: master Commit: b260efbd5eed4fd89e7928cfc2103f058a1e86d2 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=b260efbd5eed4fd89e7928cfc2103f058a1e86d2 Author: Timothy Arceri <tarc...@itsqueeze.com> Date: Fri Mar 23 12:10:42 2018 +1100 radeonsi/nir: fix input processing for packed varyings The location was only being incremented the first time we processed a location. This meant we would incorrectly skip some elements of an array if the first element was packed and proccessed previously but other elements were not. Reviewed-by: Marek Olšák <marek.ol...@amd.com> --- src/gallium/drivers/radeonsi/si_shader_nir.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/gallium/drivers/radeonsi/si_shader_nir.c b/src/gallium/drivers/radeonsi/si_shader_nir.c index 82b2440d0b..6444a8b5dd 100644 --- a/src/gallium/drivers/radeonsi/si_shader_nir.c +++ b/src/gallium/drivers/radeonsi/si_shader_nir.c @@ -852,7 +852,7 @@ bool si_nir_build_llvm(struct si_shader_context *ctx, struct nir_shader *nir) /* Packed components share the same location so skip * them if we have already processed the location. */ - if (processed_inputs & ((uint64_t)1 << loc)) { + if (processed_inputs & ((uint64_t)1 << (loc + i))) { input_idx += 4; continue; } @@ -870,8 +870,7 @@ bool si_nir_build_llvm(struct si_shader_context *ctx, struct nir_shader *nir) bitcast_inputs(ctx, data, input_idx); } - processed_inputs |= ((uint64_t)1 << loc); - loc++; + processed_inputs |= ((uint64_t)1 << (loc + i)); input_idx += 4; } } ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): glsl: fix infinite loop caused by bug in loop unrolling pass
Module: Mesa Branch: master Commit: 56b867395dee1a48594b27987d3bf68a4e745dda URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=56b867395dee1a48594b27987d3bf68a4e745dda Author: Timothy Arceri <tarc...@itsqueeze.com> Date: Mon Mar 26 10:31:26 2018 +1100 glsl: fix infinite loop caused by bug in loop unrolling pass Just checking for 2 jumps is not enough to be sure we can do a complex loop unroll. We need to make sure we also have also found 2 loop terminators. Without this we were attempting to unroll a loop where the second jump was nested inside multiple ifs which loop analysis is unable to detect as a terminator. We ended up splicing out the first terminator but failed to actually unroll the loop, this resulted in the creation of a possible infinite loop. Fixes: 646621c66da9 "glsl: make loop unrolling more like the nir unrolling path" Tested-by: Gert Wollny <gw.foss...@gmail.com> Reviewed-by: Ian Romanick <ian.d.roman...@intel.com> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=105670 --- src/compiler/glsl/loop_unroll.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/compiler/glsl/loop_unroll.cpp b/src/compiler/glsl/loop_unroll.cpp index 6e06a30fb9..f6efe6475a 100644 --- a/src/compiler/glsl/loop_unroll.cpp +++ b/src/compiler/glsl/loop_unroll.cpp @@ -519,7 +519,7 @@ loop_unroll_visitor::visit_leave(ir_loop *ir) * isn't any additional unknown terminators, or any other jumps nested * inside futher ifs. */ - if (ls->num_loop_jumps != 2) + if (ls->num_loop_jumps != 2 || ls->terminators.length() != 2) return visit_continue; ir_instruction *first_ir = ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): nir: add frexp_exp and frexp_sig opcodes
Module: Mesa Branch: master Commit: cca214174549af3d608e252d8642c2e194c910ed URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=cca214174549af3d608e252d8642c2e194c910ed Author: Timothy Arceri <tarc...@itsqueeze.com> Date: Tue Mar 20 13:06:23 2018 +1100 nir: add frexp_exp and frexp_sig opcodes Reviewed-by: Bas Nieuwenhuizen <b...@basnieuwenhuizen.nl> --- src/compiler/glsl/glsl_to_nir.cpp | 2 ++ src/compiler/nir/nir_opcodes.py | 3 +++ 2 files changed, 5 insertions(+) diff --git a/src/compiler/glsl/glsl_to_nir.cpp b/src/compiler/glsl/glsl_to_nir.cpp index 80eb15f1ab..be8cc33e06 100644 --- a/src/compiler/glsl/glsl_to_nir.cpp +++ b/src/compiler/glsl/glsl_to_nir.cpp @@ -1612,6 +1612,8 @@ nir_visitor::visit(ir_expression *ir) case ir_unop_ceil: result = nir_fceil(, srcs[0]); break; case ir_unop_floor: result = nir_ffloor(, srcs[0]); break; case ir_unop_fract: result = nir_ffract(, srcs[0]); break; + case ir_unop_frexp_exp: result = nir_frexp_exp(, srcs[0]); break; + case ir_unop_frexp_sig: result = nir_frexp_sig(, srcs[0]); break; case ir_unop_round_even: result = nir_fround_even(, srcs[0]); break; case ir_unop_sin: result = nir_fsin(, srcs[0]); break; case ir_unop_cos: result = nir_fcos(, srcs[0]); break; diff --git a/src/compiler/nir/nir_opcodes.py b/src/compiler/nir/nir_opcodes.py index 65d1320062..04edffc6c0 100644 --- a/src/compiler/nir/nir_opcodes.py +++ b/src/compiler/nir/nir_opcodes.py @@ -214,6 +214,9 @@ unop("fquantize2f16", tfloat, "(fabs(src0) < ldexpf(1.0, -14)) ? copysignf(0.0f, unop("fsin", tfloat, "bit_size == 64 ? sin(src0) : sinf(src0)") unop("fcos", tfloat, "bit_size == 64 ? cos(src0) : cosf(src0)") +# dfrexp +unop_convert("frexp_exp", tint32, tfloat64, "frexp(src0, );") +unop_convert("frexp_sig", tfloat64, tfloat64, "int n; dst = frexp(src0, );") # Partial derivatives. ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): ac/nir_to_llvm: add frexp support
Module: Mesa Branch: master Commit: c135316555ccd052da544e79166f81dece55cebb URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=c135316555ccd052da544e79166f81dece55cebb Author: Timothy Arceri <tarc...@itsqueeze.com> Date: Tue Mar 20 13:07:22 2018 +1100 ac/nir_to_llvm: add frexp support Fixes CTS tests: KHR-GL40.gpu_shader_fp64.builtin.frexp_double KHR-GL40.gpu_shader_fp64.builtin.frexp_dvec2 KHR-GL40.gpu_shader_fp64.builtin.frexp_dvec3 KHR-GL40.gpu_shader_fp64.builtin.frexp_dvec4 And piglit test: tests/spec/arb_gpu_shader_fp64/execution/built-in-functions/fs-frexp-dvec4.shader_test Reviewed-by: Bas Nieuwenhuizen <b...@basnieuwenhuizen.nl> Reviewed-by: Marek Olšák <marek.ol...@amd.com> --- src/amd/common/ac_nir_to_llvm.c | 11 +++ 1 file changed, 11 insertions(+) diff --git a/src/amd/common/ac_nir_to_llvm.c b/src/amd/common/ac_nir_to_llvm.c index b0c0d76b47..d23f4fc1e8 100644 --- a/src/amd/common/ac_nir_to_llvm.c +++ b/src/amd/common/ac_nir_to_llvm.c @@ -728,6 +728,17 @@ static void visit_alu(struct ac_nir_context *ctx, const nir_alu_instr *instr) result = ac_build_fdiv(>ac, instr->dest.dest.ssa.bit_size == 32 ? ctx->ac.f32_1 : ctx->ac.f64_1, result); break; + case nir_op_frexp_exp: + src[0] = ac_to_float(>ac, src[0]); + result = ac_build_intrinsic(>ac, "llvm.amdgcn.frexp.exp.i32.f64", + ctx->ac.i32, src, 1, AC_FUNC_ATTR_READNONE); + + break; + case nir_op_frexp_sig: + src[0] = ac_to_float(>ac, src[0]); + result = ac_build_intrinsic(>ac, "llvm.amdgcn.frexp.mant.f64", + ctx->ac.f64, src, 1, AC_FUNC_ATTR_READNONE); + break; case nir_op_fmax: result = emit_intrin_2f_param(>ac, "llvm.maxnum", ac_to_float_type(>ac, def_type), src[0], src[1]); ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): radv: don't lower indirects until after opts have run
Module: Mesa Branch: master Commit: 9a243eccae618e85aa7af762a4c40ecd8a2e4882 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=9a243eccae618e85aa7af762a4c40ecd8a2e4882 Author: Timothy Arceri <tarc...@itsqueeze.com> Date: Thu Mar 8 16:20:48 2018 +1100 radv: don't lower indirects until after opts have run Noticed while passing by. Not sure if it impacts anything, but likely to impact GFX9 more than anything else since we lower inputs, outputs and locals there. Reviewed-by: Bas Nieuwenhuizen <b...@basnieuwenhuizen.nl> --- src/amd/vulkan/radv_shader.c | 9 - 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/amd/vulkan/radv_shader.c b/src/amd/vulkan/radv_shader.c index ac577c36e9..c6935805c7 100644 --- a/src/amd/vulkan/radv_shader.c +++ b/src/amd/vulkan/radv_shader.c @@ -275,7 +275,6 @@ radv_shader_compile_to_nir(struct radv_device *device, nir_lower_var_copies(nir); nir_lower_global_vars_to_local(nir); nir_remove_dead_variables(nir, nir_var_local); - ac_lower_indirect_derefs(nir, device->physical_device->rad_info.chip_class); nir_lower_subgroups(nir, &(struct nir_lower_subgroups_options) { .subgroup_size = 64, .ballot_bit_size = 64, @@ -287,6 +286,14 @@ radv_shader_compile_to_nir(struct radv_device *device, radv_optimize_nir(nir); + /* Indirect lowering must be called after the radv_optimize_nir() loop +* has been called at least once. Otherwise indirect lowering can +* bloat the instruction count of the loop and cause it to be +* considered too large for unrolling. +*/ + ac_lower_indirect_derefs(nir, device->physical_device->rad_info.chip_class); + radv_optimize_nir(nir); + return nir; } ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): st/nir: fix atomic lowering for gallium drivers
Module: Mesa Branch: master Commit: dfe2f198550b262186e2882d7e573f1f3759deb7 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=dfe2f198550b262186e2882d7e573f1f3759deb7 Author: Timothy Arceri <tarc...@itsqueeze.com> Date: Mon Mar 19 22:23:55 2018 +1100 st/nir: fix atomic lowering for gallium drivers i965 and gallium handle the atomic buffer index differently. It was just by luck that the single piglit test for this was passing. For gallium we use the atomic binding so that we match the handling in st_bind_atomics(). On radeonsi this fixes the CTS test: KHR-GL43.shader_storage_buffer_object.advanced-write-fragment It also fixes tressfx hair rendering in Tomb Raider. Reviewed-by: Marek Olšák <marek.ol...@amd.com> --- src/compiler/nir/nir.h| 3 ++- src/compiler/nir/nir_lower_atomics.c | 15 ++- src/mesa/drivers/dri/i965/brw_link.cpp| 2 +- src/mesa/state_tracker/st_glsl_to_nir.cpp | 2 +- 4 files changed, 14 insertions(+), 8 deletions(-) diff --git a/src/compiler/nir/nir.h b/src/compiler/nir/nir.h index d7baabd6f6..0d207d0ea5 100644 --- a/src/compiler/nir/nir.h +++ b/src/compiler/nir/nir.h @@ -2710,7 +2710,8 @@ typedef struct nir_lower_bitmap_options { void nir_lower_bitmap(nir_shader *shader, const nir_lower_bitmap_options *options); bool nir_lower_atomics(nir_shader *shader, - const struct gl_shader_program *shader_program); + const struct gl_shader_program *shader_program, + bool use_binding_as_idx); bool nir_lower_atomics_to_ssbo(nir_shader *shader, unsigned ssbo_offset); bool nir_lower_to_source_mods(nir_shader *shader); diff --git a/src/compiler/nir/nir_lower_atomics.c b/src/compiler/nir/nir_lower_atomics.c index bdab4b8737..6b046bc426 100644 --- a/src/compiler/nir/nir_lower_atomics.c +++ b/src/compiler/nir/nir_lower_atomics.c @@ -38,7 +38,7 @@ static bool lower_instr(nir_intrinsic_instr *instr, const struct gl_shader_program *shader_program, -nir_shader *shader) +nir_shader *shader, bool use_binding_as_idx) { nir_intrinsic_op op; switch (instr->intrinsic) { @@ -98,9 +98,12 @@ lower_instr(nir_intrinsic_instr *instr, void *mem_ctx = ralloc_parent(instr); unsigned uniform_loc = instr->variables[0]->var->data.location; + unsigned idx = use_binding_as_idx ? + instr->variables[0]->var->data.binding : + shader_program->data->UniformStorage[uniform_loc].opaque[shader->info.stage].index; + nir_intrinsic_instr *new_instr = nir_intrinsic_instr_create(mem_ctx, op); - nir_intrinsic_set_base(new_instr, - shader_program->data->UniformStorage[uniform_loc].opaque[shader->info.stage].index); + nir_intrinsic_set_base(new_instr, idx); nir_load_const_instr *offset_const = nir_load_const_instr_create(mem_ctx, 1, 32); @@ -174,7 +177,8 @@ lower_instr(nir_intrinsic_instr *instr, bool nir_lower_atomics(nir_shader *shader, - const struct gl_shader_program *shader_program) + const struct gl_shader_program *shader_program, + bool use_binding_as_idx) { bool progress = false; @@ -184,7 +188,8 @@ nir_lower_atomics(nir_shader *shader, nir_foreach_instr_safe(instr, block) { if (instr->type == nir_instr_type_intrinsic) progress |= lower_instr(nir_instr_as_intrinsic(instr), - shader_program, shader); + shader_program, shader, + use_binding_as_idx); } } diff --git a/src/mesa/drivers/dri/i965/brw_link.cpp b/src/mesa/drivers/dri/i965/brw_link.cpp index b08b56a935..274a738cbb 100644 --- a/src/mesa/drivers/dri/i965/brw_link.cpp +++ b/src/mesa/drivers/dri/i965/brw_link.cpp @@ -299,7 +299,7 @@ brw_link_shader(struct gl_context *ctx, struct gl_shader_program *shProg) brw_shader_gather_info(prog->nir, prog); NIR_PASS_V(prog->nir, nir_lower_samplers, shProg); - NIR_PASS_V(prog->nir, nir_lower_atomics, shProg); + NIR_PASS_V(prog->nir, nir_lower_atomics, shProg, false); NIR_PASS_V(prog->nir, nir_lower_atomics_to_ssbo, prog->nir->info.num_abos); diff --git a/src/mesa/state_tracker/st_glsl_to_nir.cpp b/src/mesa/state_tracker/st_glsl_to_nir.cpp index 2eb2ece5b1..9bb99f3061 100644 --- a/src/mesa/state_tracker/st_glsl_to_nir.cpp +++ b/src/mesa/state_tracker/st_glsl_to_nir.cpp @@ -414,7 +414,7 @@ st_glsl_to_nir_post_opts(struct st_context *st, struct gl_program *prog, st_set_prog_affected_state_flags(prog); NIR_PASS_V(nir, st_nir_lower_builtin); - NIR_PASS_V(nir, nir_lower_atomics, shader_program); + NIR_PASS_V(nir, nir_lower_atomics, shader_program, true); if (st->ctx->_Shader->Flags & GLSL_DUMP) {
Mesa (master): mesa: rework ParameterList to allow packing
Module: Mesa Branch: master Commit: edded1237607348683f492db313e823dc2e380c3 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=edded1237607348683f492db313e823dc2e380c3 Author: Timothy Arceri <tarc...@itsqueeze.com> Date: Fri Jun 16 10:17:56 2017 +1000 mesa: rework ParameterList to allow packing Currently everything is padded to 4 components. Making the list more flexible will allow us to do uniform packing. V2 (suggestions from Nicolai): - always pass existing calls to _mesa_add_parameter() true for padd_and_align - fix bindless param value offsets - remove left over wip logic from pad and align code - zero out param value padding - whitespace fix Reviewed-by: Marek Olšák <marek.ol...@amd.com> --- src/compiler/glsl/serialize.cpp | 14 +-- src/mesa/drivers/dri/i915/i915_fragprog.c | 9 +++-- src/mesa/drivers/dri/i965/gen6_constant_state.c | 3 +- src/mesa/drivers/dri/r200/r200_vertprog.c | 10 +++-- src/mesa/main/uniform_query.cpp | 14 --- src/mesa/program/ir_to_mesa.cpp | 9 +++-- src/mesa/program/prog_execute.c | 6 ++- src/mesa/program/prog_opt_constant_fold.c | 3 +- src/mesa/program/prog_parameter.c | 52 ++--- src/mesa/program/prog_parameter.h | 9 +++-- src/mesa/program/prog_parameter_layout.c| 21 +++--- src/mesa/program/prog_print.c | 4 +- src/mesa/program/prog_statevars.c | 3 +- src/mesa/program/prog_to_nir.c | 3 +- src/mesa/program/program_parse.y| 2 +- src/mesa/state_tracker/st_atifs_to_tgsi.c | 6 ++- src/mesa/state_tracker/st_atom_constbuf.c | 5 ++- src/mesa/state_tracker/st_glsl_to_tgsi.cpp | 4 +- src/mesa/state_tracker/st_mesa_to_tgsi.c| 8 ++-- 19 files changed, 125 insertions(+), 60 deletions(-) diff --git a/src/compiler/glsl/serialize.cpp b/src/compiler/glsl/serialize.cpp index 1fdbaa990f..727822633d 100644 --- a/src/compiler/glsl/serialize.cpp +++ b/src/compiler/glsl/serialize.cpp @@ -950,6 +950,7 @@ write_shader_parameters(struct blob *metadata, struct gl_program_parameter_list *params) { blob_write_uint32(metadata, params->NumParameters); + blob_write_uint32(metadata, params->NumParameterValues); uint32_t i = 0; while (i < params->NumParameters) { @@ -966,7 +967,10 @@ write_shader_parameters(struct blob *metadata, } blob_write_bytes(metadata, params->ParameterValues, -sizeof(gl_constant_value) * 4 * params->NumParameters); +sizeof(gl_constant_value) * params->NumParameterValues); + + blob_write_bytes(metadata, params->ParameterValueOffset, +sizeof(uint32_t) * params->NumParameters); blob_write_uint32(metadata, params->StateFlags); } @@ -978,6 +982,7 @@ read_shader_parameters(struct blob_reader *metadata, gl_state_index16 state_indexes[STATE_LENGTH]; uint32_t i = 0; uint32_t num_parameters = blob_read_uint32(metadata); + uint32_t num_parameters_values = blob_read_uint32(metadata); _mesa_reserve_parameter_storage(params, num_parameters); while (i < num_parameters) { @@ -989,13 +994,16 @@ read_shader_parameters(struct blob_reader *metadata, sizeof(state_indexes)); _mesa_add_parameter(params, type, name, size, data_type, - NULL, state_indexes); + NULL, state_indexes, false); i++; } blob_copy_bytes(metadata, (uint8_t *) params->ParameterValues, -sizeof(gl_constant_value) * 4 * params->NumParameters); + sizeof(gl_constant_value) * num_parameters_values); + + blob_copy_bytes(metadata, (uint8_t *) params->ParameterValueOffset, + sizeof(uint32_t) * num_parameters); params->StateFlags = blob_read_uint32(metadata); } diff --git a/src/mesa/drivers/dri/i915/i915_fragprog.c b/src/mesa/drivers/dri/i915/i915_fragprog.c index 2e04319512..6493ab99b1 100644 --- a/src/mesa/drivers/dri/i915/i915_fragprog.c +++ b/src/mesa/drivers/dri/i915/i915_fragprog.c @@ -184,11 +184,12 @@ src_vector(struct i915_fragment_program *p, */ case PROGRAM_CONSTANT: case PROGRAM_STATE_VAR: - case PROGRAM_UNIFORM: - src = i915_emit_param4fv(p, ->Parameters->ParameterValues[source->Index][0].f); + case PROGRAM_UNIFORM: { + struct gl_program_parameter_list *params = program->Parameters; + unsigned offset = params->ParameterValueOffset[source->Index]; + src = i915_emit_param4fv(p, >ParameterValues[offset].f); break; - + } default: i915_program_error(p, "Bad source->File: %d", source->File); return 0; diff --git a/src/mesa/drivers/dri/i965/gen6_constant_state.c b/src/mesa/drivers/dri/
Mesa (master): mesa: add packing support for setting uniform handles
Module: Mesa Branch: master Commit: a2198d4fdb7d93568ba0792a326971abb6d6b3a9 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=a2198d4fdb7d93568ba0792a326971abb6d6b3a9 Author: Timothy Arceri <tarc...@itsqueeze.com> Date: Tue Jun 20 10:31:32 2017 +1000 mesa: add packing support for setting uniform handles Reviewed-by: Nicolai Hähnle <nicolai.haeh...@amd.com> --- src/mesa/main/uniform_query.cpp | 16 +--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/mesa/main/uniform_query.cpp b/src/mesa/main/uniform_query.cpp index 14ecfdca2f..f901fcb3e5 100644 --- a/src/mesa/main/uniform_query.cpp +++ b/src/mesa/main/uniform_query.cpp @@ -1523,10 +1523,20 @@ _mesa_uniform_handle(GLint location, GLsizei count, const GLvoid *values, /* Store the data in the "actual type" backing storage for the uniform. */ - memcpy(>storage[size_mul * components * offset], values, - sizeof(uni->storage[0]) * components * count * size_mul); + gl_constant_value *storage; + if (ctx->Const.PackedDriverUniformStorage) { + for (unsigned s = 0; s < uni->num_driver_storage; s++) { + storage = (gl_constant_value *) +uni->driver_storage[s].data + (size_mul * offset * components); + memcpy(storage, values, +sizeof(uni->storage[0]) * components * count * size_mul); + } + } else { + memcpy(>storage[size_mul * components * offset], values, + sizeof(uni->storage[0]) * components * count * size_mul); - _mesa_propagate_uniforms_to_driver_storage(uni, offset, count); + _mesa_propagate_uniforms_to_driver_storage(uni, offset, count); + } if (uni->type->is_sampler()) { /* Mark this bindless sampler as not bound to a texture unit because ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): st: add st_glsl_type_dword_size() helper
Module: Mesa Branch: master Commit: a80cf442d939212da40951a0a57a0978de6f39a6 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=a80cf442d939212da40951a0a57a0978de6f39a6 Author: Timothy Arceri <tarc...@itsqueeze.com> Date: Tue Mar 13 12:34:50 2018 +1100 st: add st_glsl_type_dword_size() helper This will be used to support uniform packing. Reviewed-by: Marek Olšák <marek.ol...@amd.com> --- src/mesa/state_tracker/st_glsl_types.cpp | 43 src/mesa/state_tracker/st_glsl_types.h | 1 + 2 files changed, 44 insertions(+) diff --git a/src/mesa/state_tracker/st_glsl_types.cpp b/src/mesa/state_tracker/st_glsl_types.cpp index d4d2139d9d..ef7b7fa777 100644 --- a/src/mesa/state_tracker/st_glsl_types.cpp +++ b/src/mesa/state_tracker/st_glsl_types.cpp @@ -108,3 +108,46 @@ st_glsl_storage_type_size(const struct glsl_type *type, bool is_bindless) } return 0; } + +int +st_glsl_type_dword_size(const struct glsl_type *type) +{ + unsigned int size, i; + + switch (type->base_type) { + case GLSL_TYPE_UINT: + case GLSL_TYPE_INT: + case GLSL_TYPE_FLOAT: + case GLSL_TYPE_BOOL: + return type->components(); + case GLSL_TYPE_UINT16: + case GLSL_TYPE_INT16: + case GLSL_TYPE_FLOAT16: + return DIV_ROUND_UP(type->components(), 2); + case GLSL_TYPE_DOUBLE: + case GLSL_TYPE_UINT64: + case GLSL_TYPE_INT64: + return type->components() * 2; + case GLSL_TYPE_ARRAY: + return st_glsl_type_dword_size(type->fields.array) * type->length; + case GLSL_TYPE_STRUCT: + size = 0; + for (i = 0; i < type->length; i++) { + size += st_glsl_type_dword_size(type->fields.structure[i].type); + } + return size; + case GLSL_TYPE_IMAGE: + case GLSL_TYPE_SAMPLER: + case GLSL_TYPE_ATOMIC_UINT: + return 0; + case GLSL_TYPE_SUBROUTINE: + return 1; + case GLSL_TYPE_VOID: + case GLSL_TYPE_ERROR: + case GLSL_TYPE_INTERFACE: + case GLSL_TYPE_FUNCTION: + unreachable("not reached"); + } + + return 0; +} diff --git a/src/mesa/state_tracker/st_glsl_types.h b/src/mesa/state_tracker/st_glsl_types.h index 915816d1fa..16b31b684f 100644 --- a/src/mesa/state_tracker/st_glsl_types.h +++ b/src/mesa/state_tracker/st_glsl_types.h @@ -36,6 +36,7 @@ extern "C" { int st_glsl_storage_type_size(const struct glsl_type *type, bool is_bindless); +int st_glsl_type_dword_size(const struct glsl_type *type); #ifdef __cplusplus } ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): mesa: allow for uniform packing when adding uniforms to param list
Module: Mesa Branch: master Commit: 40711a7a6063eb6b5069c5f7849fe3cefb70526a URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=40711a7a6063eb6b5069c5f7849fe3cefb70526a Author: Timothy Arceri <tarc...@itsqueeze.com> Date: Tue Jun 20 10:44:08 2017 +1000 mesa: allow for uniform packing when adding uniforms to param list Reviewed-by: Nicolai Hähnle <nicolai.haeh...@amd.com> --- src/mesa/program/ir_to_mesa.cpp | 32 +++- 1 file changed, 27 insertions(+), 5 deletions(-) diff --git a/src/mesa/program/ir_to_mesa.cpp b/src/mesa/program/ir_to_mesa.cpp index f26eddc900..0dad6f9c71 100644 --- a/src/mesa/program/ir_to_mesa.cpp +++ b/src/mesa/program/ir_to_mesa.cpp @@ -2449,10 +2449,26 @@ add_uniform_to_shader::visit_field(const glsl_type *type, const char *name, _mesa_reserve_parameter_storage(params, num_params); index = params->NumParameters; - for (unsigned i = 0; i < num_params; i++) { - unsigned comps = 4; - _mesa_add_parameter(params, PROGRAM_UNIFORM, name, comps, - type->gl_type, NULL, NULL, true); + + if (ctx->Const.PackedDriverUniformStorage) { + for (unsigned i = 0; i < num_params; i++) { + unsigned dmul = type->without_array()->is_64bit() ? 2 : 1; + unsigned comps = type->without_array()->vector_elements * dmul; + if (is_dual_slot) { +if (i & 0x1) + comps -= 4; +else + comps = 4; + } + + _mesa_add_parameter(params, PROGRAM_UNIFORM, name, comps, + type->gl_type, NULL, NULL, false); + } + } else { + for (unsigned i = 0; i < num_params; i++) { + _mesa_add_parameter(params, PROGRAM_UNIFORM, name, 4, + type->gl_type, NULL, NULL, true); + } } /* The first part of the uniform that's processed determines the base @@ -2527,7 +2543,13 @@ _mesa_associate_uniform_storage(struct gl_context *ctx, if (location != last_location) { enum gl_uniform_driver_format format = uniform_native; unsigned columns = 0; - int dmul = 4 * sizeof(float); + + int dmul; + if (ctx->Const.PackedDriverUniformStorage && !prog->is_arb_asm) { +dmul = storage->type->vector_elements * sizeof(float); + } else { +dmul = 4 * sizeof(float); + } switch (storage->type->base_type) { case GLSL_TYPE_UINT64: ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): st/radeonsi: enable uniform packing in NIR backend
Module: Mesa Branch: master Commit: 632d5e97efa3d38155d290fa397af7a729de8682 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=632d5e97efa3d38155d290fa397af7a729de8682 Author: Timothy Arceri <tarc...@itsqueeze.com> Date: Wed Mar 14 09:51:23 2018 +1100 st/radeonsi: enable uniform packing in NIR backend Reviewed-by: Marek Olšák <marek.ol...@amd.com> --- src/gallium/drivers/radeonsi/si_get.c | 6 +- src/mesa/state_tracker/st_glsl_to_nir.cpp | 10 ++ 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/src/gallium/drivers/radeonsi/si_get.c b/src/gallium/drivers/radeonsi/si_get.c index 323700d425..b4ca5bea94 100644 --- a/src/gallium/drivers/radeonsi/si_get.c +++ b/src/gallium/drivers/radeonsi/si_get.c @@ -251,6 +251,11 @@ static int si_get_param(struct pipe_screen *pscreen, enum pipe_cap param) return RADEON_SPARSE_PAGE_SIZE; return 0; + case PIPE_CAP_PACKED_UNIFORMS: + if (sscreen->debug_flags & DBG(NIR)) + return 1; + return 0; + /* Unsupported features. */ case PIPE_CAP_BUFFER_SAMPLER_VIEW_RGBA_ONLY: case PIPE_CAP_TGSI_FS_COORD_ORIGIN_LOWER_LEFT: @@ -269,7 +274,6 @@ static int si_get_param(struct pipe_screen *pscreen, enum pipe_cap param) case PIPE_CAP_TILE_RASTER_ORDER: case PIPE_CAP_MAX_COMBINED_SHADER_OUTPUT_RESOURCES: case PIPE_CAP_CONTEXT_PRIORITY_MASK: - case PIPE_CAP_PACKED_UNIFORMS: return 0; case PIPE_CAP_FENCE_SIGNAL: diff --git a/src/mesa/state_tracker/st_glsl_to_nir.cpp b/src/mesa/state_tracker/st_glsl_to_nir.cpp index 9006650517..2eb2ece5b1 100644 --- a/src/mesa/state_tracker/st_glsl_to_nir.cpp +++ b/src/mesa/state_tracker/st_glsl_to_nir.cpp @@ -753,14 +753,8 @@ st_finalize_nir(struct st_context *st, struct gl_program *prog, st_nir_assign_uniform_locations(st->ctx, prog, shader_program, >uniforms, >num_uniforms); - /* Below is a quick hack so that uniform lowering only runs on radeonsi -* (the only NIR backend that currently supports tess) once we enable -* uniform packing support we will just use -* ctx->Const.PackedDriverUniformStorage for this check. -*/ - if (screen->get_shader_param(screen, PIPE_SHADER_TESS_CTRL, -PIPE_SHADER_CAP_MAX_INSTRUCTIONS) > 0) { - NIR_PASS_V(nir, nir_lower_io, nir_var_uniform, type_size, + if (st->ctx->Const.PackedDriverUniformStorage) { + NIR_PASS_V(nir, nir_lower_io, nir_var_uniform, st_glsl_type_dword_size, (nir_lower_io_options)0); NIR_PASS_V(nir, st_nir_lower_uniforms_to_ubo, prog->Parameters); } ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): mesa: add _mesa_add_sized_state_reference() helper
Module: Mesa Branch: master Commit: 57ebab64c0dd1abd646f4f274d01f19c8e0e7293 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=57ebab64c0dd1abd646f4f274d01f19c8e0e7293 Author: Timothy Arceri <tarc...@itsqueeze.com> Date: Tue Mar 13 20:47:48 2018 +1100 mesa: add _mesa_add_sized_state_reference() helper This will be used for adding packed builtin uniforms. Reviewed-by: Marek Olšák <marek.ol...@amd.com> --- src/mesa/program/prog_parameter.c | 36 ++-- src/mesa/program/prog_parameter.h | 5 + 2 files changed, 27 insertions(+), 14 deletions(-) diff --git a/src/mesa/program/prog_parameter.c b/src/mesa/program/prog_parameter.c index af9bb37cd5..88821cfba1 100644 --- a/src/mesa/program/prog_parameter.c +++ b/src/mesa/program/prog_parameter.c @@ -362,21 +362,11 @@ _mesa_add_typed_unnamed_constant(struct gl_program_parameter_list *paramList, return pos; } - -/** - * Add a new state reference to the parameter list. - * This will be used when the program contains something like this: - *PARAM ambient = state.material.front.ambient; - * - * \param paramList the parameter list - * \param stateTokens an array of 5 (STATE_LENGTH) state tokens - * \return index of the new parameter. - */ GLint -_mesa_add_state_reference(struct gl_program_parameter_list *paramList, - const gl_state_index16 stateTokens[STATE_LENGTH]) +_mesa_add_sized_state_reference(struct gl_program_parameter_list *paramList, +const gl_state_index16 stateTokens[STATE_LENGTH], +const unsigned size, bool pad_and_align) { - const GLuint size = 4; /* XXX fix */ char *name; GLint index; @@ -391,7 +381,8 @@ _mesa_add_state_reference(struct gl_program_parameter_list *paramList, name = _mesa_program_state_string(stateTokens); index = _mesa_add_parameter(paramList, PROGRAM_STATE_VAR, name, - size, GL_NONE, NULL, stateTokens, true); + size, GL_NONE, NULL, stateTokens, + pad_and_align); paramList->StateFlags |= _mesa_program_state_flags(stateTokens); /* free name string here since we duplicated it in add_parameter() */ @@ -399,3 +390,20 @@ _mesa_add_state_reference(struct gl_program_parameter_list *paramList, return index; } + + +/** + * Add a new state reference to the parameter list. + * This will be used when the program contains something like this: + *PARAM ambient = state.material.front.ambient; + * + * \param paramList the parameter list + * \param stateTokens an array of 5 (STATE_LENGTH) state tokens + * \return index of the new parameter. + */ +GLint +_mesa_add_state_reference(struct gl_program_parameter_list *paramList, + const gl_state_index16 stateTokens[STATE_LENGTH]) +{ + return _mesa_add_sized_state_reference(paramList, stateTokens, 4, true); +} diff --git a/src/mesa/program/prog_parameter.h b/src/mesa/program/prog_parameter.h index 83eb0c5613..8e36a1c590 100644 --- a/src/mesa/program/prog_parameter.h +++ b/src/mesa/program/prog_parameter.h @@ -128,6 +128,11 @@ _mesa_add_unnamed_constant(struct gl_program_parameter_list *paramList, } extern GLint +_mesa_add_sized_state_reference(struct gl_program_parameter_list *paramList, +const gl_state_index16 stateTokens[STATE_LENGTH], +const unsigned size, bool pad_and_align); + +extern GLint _mesa_add_state_reference(struct gl_program_parameter_list *paramList, const gl_state_index16 stateTokens[]); ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): mesa: create copy uniform to storage helpers
Module: Mesa Branch: master Commit: 4a7c5c079b8b9df3ed28ba8fc10aa64e13d17413 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=4a7c5c079b8b9df3ed28ba8fc10aa64e13d17413 Author: Timothy Arceri <tarc...@itsqueeze.com> Date: Fri Jun 16 15:45:00 2017 +1000 mesa: create copy uniform to storage helpers These will be used in the following patch to allow copying directly to the param list when packing is enabled. Reviewed-by: Nicolai Hähnle <nicolai.haeh...@amd.com> Reviewed-by: Marek Olšák <marek.ol...@amd.com> --- src/mesa/main/uniform_query.cpp | 154 1 file changed, 91 insertions(+), 63 deletions(-) diff --git a/src/mesa/main/uniform_query.cpp b/src/mesa/main/uniform_query.cpp index 52b04c9243..eaed536f68 100644 --- a/src/mesa/main/uniform_query.cpp +++ b/src/mesa/main/uniform_query.cpp @@ -1029,6 +1029,42 @@ _mesa_flush_vertices_for_uniforms(struct gl_context *ctx, ctx->NewDriverState |= new_driver_state; } +static void +copy_uniforms_to_storage(struct gl_uniform_storage *uni, + struct gl_context *ctx, GLsizei count, + const GLvoid *values, const int size_mul, + const unsigned offset, const unsigned components, + enum glsl_base_type basicType) +{ + if (!uni->type->is_boolean() && !uni->is_bindless) { + memcpy(>storage[size_mul * components * offset], values, + sizeof(uni->storage[0]) * components * count * size_mul); + } else if (uni->is_bindless) { + const union gl_constant_value *src = + (const union gl_constant_value *) values; + GLuint64 *dst = (GLuint64 *)>storage[components * offset].i; + const unsigned elems = components * count; + + for (unsigned i = 0; i < elems; i++) { + dst[i] = src[i].i; + } + } else { + const union gl_constant_value *src = + (const union gl_constant_value *) values; + union gl_constant_value *dst = >storage[components * offset]; + const unsigned elems = components * count; + + for (unsigned i = 0; i < elems; i++) { + if (basicType == GLSL_TYPE_FLOAT) { +dst[i].i = src[i].f != 0.0f ? ctx->Const.UniformBooleanTrue : 0; + } else { +dst[i].i = src[i].i != 0? ctx->Const.UniformBooleanTrue : 0; + } + } + } +} + + /** * Called via glUniform*() functions. */ @@ -1091,32 +1127,8 @@ _mesa_uniform(GLint location, GLsizei count, const GLvoid *values, /* Store the data in the "actual type" backing storage for the uniform. */ - if (!uni->type->is_boolean() && !uni->is_bindless) { - memcpy(>storage[size_mul * components * offset], values, - sizeof(uni->storage[0]) * components * count * size_mul); - } else if (uni->is_bindless) { - const union gl_constant_value *src = - (const union gl_constant_value *) values; - GLuint64 *dst = (GLuint64 *)>storage[components * offset].i; - const unsigned elems = components * count; - - for (unsigned i = 0; i < elems; i++) { - dst[i] = src[i].i; - } - } else { - const union gl_constant_value *src = - (const union gl_constant_value *) values; - union gl_constant_value *dst = >storage[components * offset]; - const unsigned elems = components * count; - - for (unsigned i = 0; i < elems; i++) { - if (basicType == GLSL_TYPE_FLOAT) { -dst[i].i = src[i].f != 0.0f ? ctx->Const.UniformBooleanTrue : 0; - } else { -dst[i].i = src[i].i != 0? ctx->Const.UniformBooleanTrue : 0; - } - } - } + copy_uniforms_to_storage(uni, ctx, count, values, size_mul, offset, +components, basicType); _mesa_propagate_uniforms_to_driver_storage(uni, offset, count); @@ -1208,6 +1220,56 @@ _mesa_uniform(GLint location, GLsizei count, const GLvoid *values, } } + +static void +copy_uniform_matrix_to_storage(struct gl_uniform_storage *const uni, + GLsizei count, const void *values, + const unsigned size_mul, const unsigned offset, + const unsigned components, + const unsigned vectors, bool transpose, + unsigned cols, unsigned rows, + enum glsl_base_type basicType) +{ + const unsigned elements = components * vectors; + + if (!transpose) { + memcpy(>storage[size_mul * elements * offset], values, + sizeof(uni->storage[0]) * elements * count * size_mul); + } else if (basicType == GLSL_TYPE_FLOAT) { + /* Copy and transpose the matrix. + */ + const float *src = (const float *)values; + float *dst = >storage[elements * offset].f; + +
Mesa (master): mesa: add support propagate uniform support for packed uniforms
Module: Mesa Branch: master Commit: 23777543290b9dfa17bfecb5b389ad3fc8e75820 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=23777543290b9dfa17bfecb5b389ad3fc8e75820 Author: Timothy Arceri <tarc...@itsqueeze.com> Date: Tue Mar 13 16:44:06 2018 +1100 mesa: add support propagate uniform support for packed uniforms Reviewed-by: Marek Olšák <marek.ol...@amd.com> --- src/mesa/program/ir_to_mesa.cpp | 20 ++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/src/mesa/program/ir_to_mesa.cpp b/src/mesa/program/ir_to_mesa.cpp index 0dad6f9c71..b0b322865b 100644 --- a/src/mesa/program/ir_to_mesa.cpp +++ b/src/mesa/program/ir_to_mesa.cpp @@ -2639,8 +2639,24 @@ _mesa_associate_uniform_storage(struct gl_context *ctx, */ if (propagate_to_storage) { unsigned array_elements = MAX2(1, storage->array_elements); -_mesa_propagate_uniforms_to_driver_storage(storage, 0, - array_elements); +if (ctx->Const.PackedDriverUniformStorage && !prog->is_arb_asm && +(storage->is_bindless || !storage->type->contains_opaque())) { + const int dmul = storage->type->is_64bit() ? 2 : 1; + const unsigned components = + storage->type->vector_elements * + storage->type->matrix_columns; + + for (unsigned s = 0; s < storage->num_driver_storage; s++) { + gl_constant_value *uni_storage = (gl_constant_value *) + storage->driver_storage[s].data; + memcpy(uni_storage, storage->storage, + sizeof(storage->storage[0]) * components * + array_elements * dmul); + } +} else { + _mesa_propagate_uniforms_to_driver_storage(storage, 0, + array_elements); +} } last_location = location; ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): mesa: add packing support for setting uniforms
Module: Mesa Branch: master Commit: 6cfa15b8031b30b987b7c62fcdbc5813765e692c URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=6cfa15b8031b30b987b7c62fcdbc5813765e692c Author: Timothy Arceri <tarc...@itsqueeze.com> Date: Tue Jun 20 10:38:05 2017 +1000 mesa: add packing support for setting uniforms Reviewed-by: Nicolai Hähnle <nicolai.haeh...@amd.com> --- src/mesa/main/uniform_query.cpp | 72 ++--- 1 file changed, 53 insertions(+), 19 deletions(-) diff --git a/src/mesa/main/uniform_query.cpp b/src/mesa/main/uniform_query.cpp index eaed536f68..14ecfdca2f 100644 --- a/src/mesa/main/uniform_query.cpp +++ b/src/mesa/main/uniform_query.cpp @@ -336,8 +336,14 @@ _mesa_get_uniform(struct gl_context *ctx, GLuint program, GLint location, /* Calculate the source base address *BEFORE* modifying elements to * account for the size of the user's buffer. */ - const union gl_constant_value *const src = - >storage[offset * elements * dmul]; + const union gl_constant_value *src; + if (ctx->Const.PackedDriverUniformStorage && + (uni->is_bindless || !uni->type->contains_opaque())) { + src = (gl_constant_value *) uni->driver_storage[0].data + +(offset * elements * dmul); + } else { + src = >storage[offset * elements * dmul]; + } assert(returnType == GLSL_TYPE_FLOAT || returnType == GLSL_TYPE_INT || returnType == GLSL_TYPE_UINT || returnType == GLSL_TYPE_DOUBLE || @@ -1030,19 +1036,20 @@ _mesa_flush_vertices_for_uniforms(struct gl_context *ctx, } static void -copy_uniforms_to_storage(struct gl_uniform_storage *uni, +copy_uniforms_to_storage(gl_constant_value *storage, + struct gl_uniform_storage *uni, struct gl_context *ctx, GLsizei count, const GLvoid *values, const int size_mul, const unsigned offset, const unsigned components, enum glsl_base_type basicType) { if (!uni->type->is_boolean() && !uni->is_bindless) { - memcpy(>storage[size_mul * components * offset], values, - sizeof(uni->storage[0]) * components * count * size_mul); + memcpy(storage, values, + sizeof(storage[0]) * components * count * size_mul); } else if (uni->is_bindless) { const union gl_constant_value *src = (const union gl_constant_value *) values; - GLuint64 *dst = (GLuint64 *)>storage[components * offset].i; + GLuint64 *dst = (GLuint64 *)>i; const unsigned elems = components * count; for (unsigned i = 0; i < elems; i++) { @@ -1051,7 +1058,7 @@ copy_uniforms_to_storage(struct gl_uniform_storage *uni, } else { const union gl_constant_value *src = (const union gl_constant_value *) values; - union gl_constant_value *dst = >storage[components * offset]; + union gl_constant_value *dst = storage; const unsigned elems = components * count; for (unsigned i = 0; i < elems; i++) { @@ -1127,10 +1134,23 @@ _mesa_uniform(GLint location, GLsizei count, const GLvoid *values, /* Store the data in the "actual type" backing storage for the uniform. */ - copy_uniforms_to_storage(uni, ctx, count, values, size_mul, offset, -components, basicType); + gl_constant_value *storage; + if (ctx->Const.PackedDriverUniformStorage && + (uni->is_bindless || !uni->type->contains_opaque())) { + for (unsigned s = 0; s < uni->num_driver_storage; s++) { + storage = (gl_constant_value *) +uni->driver_storage[s].data + (size_mul * offset * components); + + copy_uniforms_to_storage(storage, uni, ctx, count, values, size_mul, + offset, components, basicType); + } + } else { + storage = >storage[size_mul * components * offset]; + copy_uniforms_to_storage(storage, uni, ctx, count, values, size_mul, + offset, components, basicType); - _mesa_propagate_uniforms_to_driver_storage(uni, offset, count); + _mesa_propagate_uniforms_to_driver_storage(uni, offset, count); + } /* If the uniform is a sampler, do the extra magic necessary to propagate * the changes through. @@ -1222,7 +1242,7 @@ _mesa_uniform(GLint location, GLsizei count, const GLvoid *values, static void -copy_uniform_matrix_to_storage(struct gl_uniform_storage *const uni, +copy_uniform_matrix_to_storage(gl_constant_value *storage, GLsizei count, const void *values, const unsigned size_mul, const unsigned offset, const unsigned components, @@ -1233,13 +1253,13 @@ copy_uniform_matrix_to_storage(struct gl_un
Mesa (master): st/nir/radeonsi: move nir_lower_uniforms_to_ubo() to the state tracker
Module: Mesa Branch: master Commit: ffa4bbe4665f95bab7779ded57d6a4de13cb8ffc URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=ffa4bbe4665f95bab7779ded57d6a4de13cb8ffc Author: Timothy Arceri <tarc...@itsqueeze.com> Date: Fri Mar 9 11:57:52 2018 +1100 st/nir/radeonsi: move nir_lower_uniforms_to_ubo() to the state tracker This will only ever be used by gallium drivers so it probably doesn't belong in the nir toolkit. Also we want to pass it some non NIR things in the following patch. To avoid regressions we wrap the lowering calls that have been moved to st_glsl_to_nir with a quick hack so that they are only called for radeonsi, we will replace the hack with a check for uniform packing in a following patch. Reviewed-by: Marek Olšák <marek.ol...@amd.com> --- src/compiler/Makefile.sources | 1 - src/compiler/nir/meson.build| 1 - src/compiler/nir/nir.h | 1 - src/gallium/drivers/radeonsi/si_shader_nir.c| 10 -- src/mesa/Makefile.sources | 1 + src/mesa/meson.build| 1 + src/mesa/state_tracker/st_glsl_to_nir.cpp | 13 + src/mesa/state_tracker/st_nir.h | 1 + .../state_tracker/st_nir_lower_uniforms_to_ubo.c} | 3 ++- 9 files changed, 18 insertions(+), 14 deletions(-) diff --git a/src/compiler/Makefile.sources b/src/compiler/Makefile.sources index 55143dbc66..b231f2fa97 100644 --- a/src/compiler/Makefile.sources +++ b/src/compiler/Makefile.sources @@ -244,7 +244,6 @@ NIR_FILES = \ nir/nir_lower_tex.c \ nir/nir_lower_to_source_mods.c \ nir/nir_lower_two_sided_color.c \ - nir/nir_lower_uniforms_to_ubo.c \ nir/nir_lower_vars_to_ssa.c \ nir/nir_lower_var_copies.c \ nir/nir_lower_vec_to_movs.c \ diff --git a/src/compiler/nir/meson.build b/src/compiler/nir/meson.build index 289bb9ea78..e97ce0d1e2 100644 --- a/src/compiler/nir/meson.build +++ b/src/compiler/nir/meson.build @@ -138,7 +138,6 @@ files_libnir = files( 'nir_lower_tex.c', 'nir_lower_to_source_mods.c', 'nir_lower_two_sided_color.c', - 'nir_lower_uniforms_to_ubo.c', 'nir_lower_vars_to_ssa.c', 'nir_lower_var_copies.c', 'nir_lower_vec_to_movs.c', diff --git a/src/compiler/nir/nir.h b/src/compiler/nir/nir.h index 7ad19b42c1..d7baabd6f6 100644 --- a/src/compiler/nir/nir.h +++ b/src/compiler/nir/nir.h @@ -2712,7 +2712,6 @@ void nir_lower_bitmap(nir_shader *shader, const nir_lower_bitmap_options *option bool nir_lower_atomics(nir_shader *shader, const struct gl_shader_program *shader_program); bool nir_lower_atomics_to_ssbo(nir_shader *shader, unsigned ssbo_offset); -bool nir_lower_uniforms_to_ubo(nir_shader *shader); bool nir_lower_to_source_mods(nir_shader *shader); bool nir_lower_gs_intrinsics(nir_shader *shader); diff --git a/src/gallium/drivers/radeonsi/si_shader_nir.c b/src/gallium/drivers/radeonsi/si_shader_nir.c index acb796b331..7f17affa4d 100644 --- a/src/gallium/drivers/radeonsi/si_shader_nir.c +++ b/src/gallium/drivers/radeonsi/si_shader_nir.c @@ -32,12 +32,6 @@ #include "compiler/nir_types.h" -static int -type_size(const struct glsl_type *type) -{ - return glsl_count_attribute_slots(type, false); -} - static void scan_instruction(struct tgsi_shader_info *info, nir_instr *instr) { @@ -650,10 +644,6 @@ si_lower_nir(struct si_shader_selector* sel) * - ensure constant offsets for texture instructions are folded * and copy-propagated */ - NIR_PASS_V(sel->nir, nir_lower_io, nir_var_uniform, type_size, - (nir_lower_io_options)0); - NIR_PASS_V(sel->nir, nir_lower_uniforms_to_ubo); - NIR_PASS_V(sel->nir, nir_lower_returns); NIR_PASS_V(sel->nir, nir_lower_vars_to_ssa); NIR_PASS_V(sel->nir, nir_lower_alu_to_scalar); diff --git a/src/mesa/Makefile.sources b/src/mesa/Makefile.sources index 0a9aad52d0..0446078136 100644 --- a/src/mesa/Makefile.sources +++ b/src/mesa/Makefile.sources @@ -532,6 +532,7 @@ STATETRACKER_FILES = \ state_tracker/st_nir.h \ state_tracker/st_nir_lower_builtin.c \ state_tracker/st_nir_lower_tex_src_plane.c \ + state_tracker/st_nir_lower_uniforms_to_ubo.c \ state_tracker/st_pbo.c \ state_tracker/st_pbo.h \ state_tracker/st_program.c \ diff --git a/src/mesa/meson.build b/src/mesa/meson.build index aa27d59264..b74d169377 100644 --- a/src/mesa/meson.build +++ b/src/mesa/meson.build @@ -579,6 +579,7 @@ files_libmesa_gallium = files( 'state_tracker/st_nir.h', 'state_tracker/st_nir_lower_builtin.c', 'state_tracker/st_nir_lower_tex_src_plane.c', + 'state_tracker/st_nir_lower_uniforms_to_ubo.c', 'state_tracker/st_pbo.c', 'state_tracker/st_p
Mesa (master): st: add uniform packing support to lower_uniforms_to_ubo()
Module: Mesa Branch: master Commit: 231333a20d88336cd0474c573b46a2509b43245e URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=231333a20d88336cd0474c573b46a2509b43245e Author: Timothy Arceri <tarc...@itsqueeze.com> Date: Fri Mar 9 12:30:01 2018 +1100 st: add uniform packing support to lower_uniforms_to_ubo() Reviewed-by: Marek Olšák <marek.ol...@amd.com> --- src/mesa/state_tracker/st_glsl_to_nir.cpp | 2 +- src/mesa/state_tracker/st_nir.h | 3 ++- src/mesa/state_tracker/st_nir_lower_uniforms_to_ubo.c | 16 +++- 3 files changed, 14 insertions(+), 7 deletions(-) diff --git a/src/mesa/state_tracker/st_glsl_to_nir.cpp b/src/mesa/state_tracker/st_glsl_to_nir.cpp index 2ca64231e0..9006650517 100644 --- a/src/mesa/state_tracker/st_glsl_to_nir.cpp +++ b/src/mesa/state_tracker/st_glsl_to_nir.cpp @@ -762,7 +762,7 @@ st_finalize_nir(struct st_context *st, struct gl_program *prog, PIPE_SHADER_CAP_MAX_INSTRUCTIONS) > 0) { NIR_PASS_V(nir, nir_lower_io, nir_var_uniform, type_size, (nir_lower_io_options)0); - NIR_PASS_V(nir, st_nir_lower_uniforms_to_ubo); + NIR_PASS_V(nir, st_nir_lower_uniforms_to_ubo, prog->Parameters); } if (screen->get_param(screen, PIPE_CAP_NIR_SAMPLERS_AS_DEREF)) diff --git a/src/mesa/state_tracker/st_nir.h b/src/mesa/state_tracker/st_nir.h index 1c2e32a5e6..3dd78fb115 100644 --- a/src/mesa/state_tracker/st_nir.h +++ b/src/mesa/state_tracker/st_nir.h @@ -36,7 +36,8 @@ struct nir_shader; void st_nir_lower_builtin(struct nir_shader *shader); void st_nir_lower_tex_src_plane(struct nir_shader *shader, unsigned free_slots, unsigned lower_2plane, unsigned lower_3plane); -bool st_nir_lower_uniforms_to_ubo(struct nir_shader *shader); +bool st_nir_lower_uniforms_to_ubo(struct nir_shader *shader, + const struct gl_program_parameter_list *params); void st_finalize_nir(struct st_context *st, struct gl_program *prog, struct gl_shader_program *shader_program, diff --git a/src/mesa/state_tracker/st_nir_lower_uniforms_to_ubo.c b/src/mesa/state_tracker/st_nir_lower_uniforms_to_ubo.c index 1d2cca065b..e2a477ecc7 100644 --- a/src/mesa/state_tracker/st_nir_lower_uniforms_to_ubo.c +++ b/src/mesa/state_tracker/st_nir_lower_uniforms_to_ubo.c @@ -33,8 +33,11 @@ #include "nir_builder.h" #include "st_nir.h" +#include "program/prog_parameter.h" + static bool -lower_instr(nir_intrinsic_instr *instr, nir_builder *b) +lower_instr(nir_intrinsic_instr *instr, nir_builder *b, +const struct gl_program_parameter_list *params) { b->cursor = nir_before_instr(>instr); @@ -47,10 +50,12 @@ lower_instr(nir_intrinsic_instr *instr, nir_builder *b) } if (instr->intrinsic == nir_intrinsic_load_uniform) { + unsigned pvo = params->ParameterValueOffset[nir_intrinsic_base(instr)]; + nir_ssa_def *ubo_idx = nir_imm_int(b, 0); nir_ssa_def *ubo_offset = - nir_imul(b, nir_imm_int(b, 16), - nir_iadd(b, nir_imm_int(b, nir_intrinsic_base(instr)), + nir_iadd(b, nir_imm_int(b, 4 * pvo), + nir_imul(b, nir_imm_int(b, 4), nir_ssa_for_src(b, instr->src[0], 1))); nir_intrinsic_instr *load = @@ -72,7 +77,8 @@ lower_instr(nir_intrinsic_instr *instr, nir_builder *b) } bool -st_nir_lower_uniforms_to_ubo(nir_shader *shader) +st_nir_lower_uniforms_to_ubo(nir_shader *shader, + const struct gl_program_parameter_list *params) { bool progress = false; @@ -84,7 +90,7 @@ st_nir_lower_uniforms_to_ubo(nir_shader *shader) nir_foreach_instr_safe(instr, block) { if (instr->type == nir_instr_type_intrinsic) progress |= lower_instr(nir_instr_as_intrinsic(instr), - ); + , params); } } ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): mesa: add PackedDriverUniformStorage const
Module: Mesa Branch: master Commit: b13b9eb432a3b67efb29ca25c3e244b467c3c4af URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=b13b9eb432a3b67efb29ca25c3e244b467c3c4af Author: Timothy Arceri <tarc...@itsqueeze.com> Date: Wed Jun 14 15:48:45 2017 +1000 mesa: add PackedDriverUniformStorage const Will be used to determine whether to take packing code paths or not. Reviewed-by: Nicolai Hähnle <nicolai.haeh...@amd.com> Reviewed-by: Marek Olšák <marek.ol...@amd.com> --- src/mesa/main/mtypes.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h index 5ee27d9977..08db8062ec 100644 --- a/src/mesa/main/mtypes.h +++ b/src/mesa/main/mtypes.h @@ -4132,6 +4132,9 @@ struct gl_constants /** GL_ARB_get_program_binary */ GLuint NumProgramBinaryFormats; + + /** Is the drivers uniform storage packed or padded to 16 bytes. */ + bool PackedDriverUniformStorage; }; ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): st/glsl_to_nir: add support for packed builtin uniforms
Module: Mesa Branch: master Commit: 54881667308aea17f7f21720f5e8b41cf45f2020 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=54881667308aea17f7f21720f5e8b41cf45f2020 Author: Timothy Arceri <tarc...@itsqueeze.com> Date: Tue Mar 13 20:50:27 2018 +1100 st/glsl_to_nir: add support for packed builtin uniforms Reviewed-by: Marek Olšák <marek.ol...@amd.com> --- src/mesa/state_tracker/st_glsl_to_nir.cpp | 42 +++ 1 file changed, 37 insertions(+), 5 deletions(-) diff --git a/src/mesa/state_tracker/st_glsl_to_nir.cpp b/src/mesa/state_tracker/st_glsl_to_nir.cpp index 0bd9c4e4e3..1fd553fdf8 100644 --- a/src/mesa/state_tracker/st_glsl_to_nir.cpp +++ b/src/mesa/state_tracker/st_glsl_to_nir.cpp @@ -218,7 +218,8 @@ st_nir_lookup_parameter_index(const struct gl_program_parameter_list *params, } static void -st_nir_assign_uniform_locations(struct gl_program *prog, +st_nir_assign_uniform_locations(struct gl_context *ctx, +struct gl_program *prog, struct gl_shader_program *shader_program, struct exec_list *uniform_list, unsigned *size) { @@ -247,7 +248,21 @@ st_nir_assign_uniform_locations(struct gl_program *prog, /* This state reference has already been setup by ir_to_mesa, but we'll * get the same index back here. */ - loc = _mesa_add_state_reference(prog->Parameters, stateTokens); + + unsigned comps; + const struct glsl_type *type = glsl_without_array(uniform->type); + if (glsl_type_is_struct(type)) { +comps = 4; + } else { +comps = glsl_get_vector_elements(type); + } + + if (ctx->Const.PackedDriverUniformStorage) { +loc = _mesa_add_sized_state_reference(prog->Parameters, + stateTokens, comps, false); + } else { +loc = _mesa_add_state_reference(prog->Parameters, stateTokens); + } } else { loc = st_nir_lookup_parameter_index(prog->Parameters, uniform->name); } @@ -359,9 +374,26 @@ st_glsl_to_nir_post_opts(struct st_context *st, struct gl_program *prog, const nir_state_slot *const slots = var->state_slots; assert(var->state_slots != NULL); + const struct glsl_type *type = glsl_without_array(var->type); for (unsigned int i = 0; i < var->num_state_slots; i++) { -_mesa_add_state_reference(prog->Parameters, - slots[i].tokens); +unsigned comps; +if (glsl_type_is_struct(type)) { + /* Builtin struct require specical handling for now we just +* make all members vec4. See st_nir_lower_builtin. +*/ + comps = 4; +} else { + comps = glsl_get_vector_elements(type); +} + +if (st->ctx->Const.PackedDriverUniformStorage) { + _mesa_add_sized_state_reference(prog->Parameters, + slots[i].tokens, + comps, false); +} else { + _mesa_add_state_reference(prog->Parameters, + slots[i].tokens); +} } } } @@ -717,7 +749,7 @@ st_finalize_nir(struct st_context *st, struct gl_program *prog, NIR_PASS_V(nir, nir_lower_atomics_to_ssbo, st->ctx->Const.Program[nir->info.stage].MaxAtomicBuffers); - st_nir_assign_uniform_locations(prog, shader_program, + st_nir_assign_uniform_locations(st->ctx, prog, shader_program, >uniforms, >num_uniforms); if (screen->get_param(screen, PIPE_CAP_NIR_SAMPLERS_AS_DEREF)) ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): gallium: add packed uniform CAP
Module: Mesa Branch: master Commit: 9c51a7ea2956495fd15d0ee6fc47fe99e14b9f36 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=9c51a7ea2956495fd15d0ee6fc47fe99e14b9f36 Author: Timothy Arceri <tarc...@itsqueeze.com> Date: Fri Aug 18 15:51:48 2017 +1000 gallium: add packed uniform CAP Reviewed-by: Marek Olšák <marek.ol...@amd.com> --- src/gallium/docs/source/screen.rst | 2 ++ src/gallium/drivers/etnaviv/etnaviv_screen.c | 1 + src/gallium/drivers/freedreno/freedreno_screen.c | 1 + src/gallium/drivers/i915/i915_screen.c | 1 + src/gallium/drivers/llvmpipe/lp_screen.c | 1 + src/gallium/drivers/nouveau/nv30/nv30_screen.c | 1 + src/gallium/drivers/nouveau/nv50/nv50_screen.c | 1 + src/gallium/drivers/nouveau/nvc0/nvc0_screen.c | 1 + src/gallium/drivers/r300/r300_screen.c | 1 + src/gallium/drivers/r600/r600_pipe.c | 1 + src/gallium/drivers/radeonsi/si_get.c| 1 + src/gallium/drivers/softpipe/sp_screen.c | 1 + src/gallium/drivers/svga/svga_screen.c | 1 + src/gallium/drivers/swr/swr_screen.cpp | 1 + src/gallium/drivers/vc4/vc4_screen.c | 1 + src/gallium/drivers/vc5/vc5_screen.c | 1 + src/gallium/drivers/virgl/virgl_screen.c | 1 + src/gallium/include/pipe/p_defines.h | 1 + src/mesa/state_tracker/st_context.c | 3 +++ 19 files changed, 22 insertions(+) diff --git a/src/gallium/docs/source/screen.rst b/src/gallium/docs/source/screen.rst index e375d67a4b..3837360fb4 100644 --- a/src/gallium/docs/source/screen.rst +++ b/src/gallium/docs/source/screen.rst @@ -418,6 +418,8 @@ The integer capabilities: set when binding that buffer as constant buffer 0. If the buffer doesn't have those bits set, pipe_context::set_constant_buffer(.., 0, ..) is ignored by the driver, and the driver can throw assertion failures. +* ``PIPE_CAP_PACKED_UNIFORMS``: True if the driver supports packed uniforms + as opposed to padding to vec4s. .. _pipe_capf: diff --git a/src/gallium/drivers/etnaviv/etnaviv_screen.c b/src/gallium/drivers/etnaviv/etnaviv_screen.c index 6c5c00bf2d..2ae4e86c63 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_screen.c +++ b/src/gallium/drivers/etnaviv/etnaviv_screen.c @@ -269,6 +269,7 @@ etna_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param) case PIPE_CAP_CONTEXT_PRIORITY_MASK: case PIPE_CAP_FENCE_SIGNAL: case PIPE_CAP_CONSTBUF0_FLAGS: + case PIPE_CAP_PACKED_UNIFORMS: return 0; /* Stream output. */ diff --git a/src/gallium/drivers/freedreno/freedreno_screen.c b/src/gallium/drivers/freedreno/freedreno_screen.c index f9cafbabeb..f338d756df 100644 --- a/src/gallium/drivers/freedreno/freedreno_screen.c +++ b/src/gallium/drivers/freedreno/freedreno_screen.c @@ -339,6 +339,7 @@ fd_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param) case PIPE_CAP_SIGNED_VERTEX_BUFFER_OFFSET: case PIPE_CAP_FENCE_SIGNAL: case PIPE_CAP_CONSTBUF0_FLAGS: + case PIPE_CAP_PACKED_UNIFORMS: return 0; case PIPE_CAP_CONTEXT_PRIORITY_MASK: diff --git a/src/gallium/drivers/i915/i915_screen.c b/src/gallium/drivers/i915/i915_screen.c index 345e82b573..59d2ec6628 100644 --- a/src/gallium/drivers/i915/i915_screen.c +++ b/src/gallium/drivers/i915/i915_screen.c @@ -326,6 +326,7 @@ i915_get_param(struct pipe_screen *screen, enum pipe_cap cap) case PIPE_CAP_CONTEXT_PRIORITY_MASK: case PIPE_CAP_FENCE_SIGNAL: case PIPE_CAP_CONSTBUF0_FLAGS: + case PIPE_CAP_PACKED_UNIFORMS: return 0; case PIPE_CAP_MAX_VIEWPORTS: diff --git a/src/gallium/drivers/llvmpipe/lp_screen.c b/src/gallium/drivers/llvmpipe/lp_screen.c index 01ef348e3b..3f5d0327bf 100644 --- a/src/gallium/drivers/llvmpipe/lp_screen.c +++ b/src/gallium/drivers/llvmpipe/lp_screen.c @@ -361,6 +361,7 @@ llvmpipe_get_param(struct pipe_screen *screen, enum pipe_cap param) case PIPE_CAP_CONTEXT_PRIORITY_MASK: case PIPE_CAP_FENCE_SIGNAL: case PIPE_CAP_CONSTBUF0_FLAGS: + case PIPE_CAP_PACKED_UNIFORMS: return 0; } /* should only get here on unhandled cases */ diff --git a/src/gallium/drivers/nouveau/nv30/nv30_screen.c b/src/gallium/drivers/nouveau/nv30/nv30_screen.c index d7fcff16fb..1d1fbaad60 100644 --- a/src/gallium/drivers/nouveau/nv30/nv30_screen.c +++ b/src/gallium/drivers/nouveau/nv30/nv30_screen.c @@ -228,6 +228,7 @@ nv30_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param) case PIPE_CAP_CONTEXT_PRIORITY_MASK: case PIPE_CAP_FENCE_SIGNAL: case PIPE_CAP_CONSTBUF0_FLAGS: + case PIPE_CAP_PACKED_UNIFORMS: return 0; case PIPE_CAP_VENDOR_ID: diff --git a/src/gallium/drivers/nouveau/nv50/nv50_screen.c b/src/gallium/drivers/nouveau/nv50/nv50_screen.c index a9a4dde508..6fd2982e3c 100644 --- a/src/gallium/drivers/nouveau/nv50/nv50_screen.c +++ b/src/gallium/drivers/nouveau/nv50/nv50_screen
Mesa (master): gallium: silence __builtin_frame_address nonzero argument is unsafe warning
Module: Mesa Branch: master Commit: 370e356ebab4885fc19b2b1d1de2816b6cd4dfc8 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=370e356ebab4885fc19b2b1d1de2816b6cd4dfc8 Author: Timothy Arceri <tarc...@itsqueeze.com> Date: Fri Mar 9 11:00:55 2018 +1100 gallium: silence __builtin_frame_address nonzero argument is unsafe warning Calling __builtin_frame_address with a nonzero argument is unsafe but is sometimes done for debugging purposes. Since this code is part of some debug util code I'm assuming that is the case here and using GCC pragma to silence the warning. Reviewed-by: Jose Fonseca <jfons...@vmware.com> --- src/gallium/auxiliary/util/u_debug_stack.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/gallium/auxiliary/util/u_debug_stack.c b/src/gallium/auxiliary/util/u_debug_stack.c index 6ddacdb362..974e639e89 100644 --- a/src/gallium/auxiliary/util/u_debug_stack.c +++ b/src/gallium/auxiliary/util/u_debug_stack.c @@ -265,7 +265,10 @@ debug_backtrace_capture(struct debug_stack_frame *backtrace, #endif #if defined(PIPE_CC_GCC) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wframe-address" frame_pointer = ((const void **)__builtin_frame_address(1)); +#pragma GCC diagnostic pop #elif defined(PIPE_CC_MSVC) && defined(PIPE_ARCH_X86) __asm { mov frame_pointer, ebp ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): radeonsi: add si_llvm_emit_kill() helper
Module: Mesa Branch: master Commit: 50cc97d98a5365b65988b2e6a827d744404f93ab URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=50cc97d98a5365b65988b2e6a827d744404f93ab Author: Timothy Arceri <tarc...@itsqueeze.com> Date: Thu Mar 8 09:37:10 2018 +1100 radeonsi: add si_llvm_emit_kill() helper Reviewed-by: Marek Olšák <marek.ol...@amd.com> --- src/gallium/drivers/radeonsi/si_shader_internal.h | 2 ++ src/gallium/drivers/radeonsi/si_shader_tgsi_alu.c | 31 ++- 2 files changed, 21 insertions(+), 12 deletions(-) diff --git a/src/gallium/drivers/radeonsi/si_shader_internal.h b/src/gallium/drivers/radeonsi/si_shader_internal.h index 8decd062c3..1730a1fef1 100644 --- a/src/gallium/drivers/radeonsi/si_shader_internal.h +++ b/src/gallium/drivers/radeonsi/si_shader_internal.h @@ -258,6 +258,8 @@ LLVMValueRef si_llvm_emit_fetch(struct lp_build_tgsi_context *bld_base, enum tgsi_opcode_type type, unsigned swizzle); +void si_llvm_emit_kill(struct ac_shader_abi *abi, LLVMValueRef visible); + LLVMValueRef si_nir_load_input_tes(struct ac_shader_abi *abi, LLVMTypeRef type, LLVMValueRef vertex_index, diff --git a/src/gallium/drivers/radeonsi/si_shader_tgsi_alu.c b/src/gallium/drivers/radeonsi/si_shader_tgsi_alu.c index 201e4988fa..854f7ec8a6 100644 --- a/src/gallium/drivers/radeonsi/si_shader_tgsi_alu.c +++ b/src/gallium/drivers/radeonsi/si_shader_tgsi_alu.c @@ -53,20 +53,10 @@ static void kill_if_fetch_args(struct lp_build_tgsi_context *bld_base, emit_data->args[0] = conds[0]; } -static void kil_emit(const struct lp_build_tgsi_action *action, -struct lp_build_tgsi_context *bld_base, -struct lp_build_emit_data *emit_data) +void si_llvm_emit_kill(struct ac_shader_abi *abi, LLVMValueRef visible) { - struct si_shader_context *ctx = si_shader_context(bld_base); + struct si_shader_context *ctx = si_shader_context_from_abi(abi); LLVMBuilderRef builder = ctx->ac.builder; - LLVMValueRef visible; - - if (emit_data->inst->Instruction.Opcode == TGSI_OPCODE_KILL_IF) { - visible = emit_data->args[0]; - } else { - assert(emit_data->inst->Instruction.Opcode == TGSI_OPCODE_KILL); - visible = LLVMConstInt(ctx->i1, false, 0); - } if (ctx->shader->selector->force_correct_derivs_after_kill) { /* LLVM 6.0 can kill immediately while maintaining WQM. */ @@ -84,6 +74,23 @@ static void kil_emit(const struct lp_build_tgsi_action *action, ac_build_kill_if_false(>ac, visible); } +static void kil_emit(const struct lp_build_tgsi_action *action, +struct lp_build_tgsi_context *bld_base, +struct lp_build_emit_data *emit_data) +{ + struct si_shader_context *ctx = si_shader_context(bld_base); + LLVMValueRef visible; + + if (emit_data->inst->Instruction.Opcode == TGSI_OPCODE_KILL_IF) { + visible = emit_data->args[0]; + } else { + assert(emit_data->inst->Instruction.Opcode == TGSI_OPCODE_KILL); + visible = LLVMConstInt(ctx->i1, false, 0); + } + + si_llvm_emit_kill(>abi, visible); +} + static void emit_icmp(const struct lp_build_tgsi_action *action, struct lp_build_tgsi_context *bld_base, struct lp_build_emit_data *emit_data) ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): ac/radeonsi: add emit_kill to the abi
Module: Mesa Branch: master Commit: 0c90264da4139805d34f530485a678c53809932e URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=0c90264da4139805d34f530485a678c53809932e Author: Timothy Arceri <tarc...@itsqueeze.com> Date: Thu Mar 8 09:46:42 2018 +1100 ac/radeonsi: add emit_kill to the abi This should fix a regression with Rocket League grass rendering on the NIR backend. Reviewed-by: Marek Olšák <marek.ol...@amd.com> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=104717 --- src/amd/common/ac_nir_to_llvm.c | 9 - src/amd/common/ac_shader_abi.h | 2 ++ src/gallium/drivers/radeonsi/si_shader.c | 1 + 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/amd/common/ac_nir_to_llvm.c b/src/amd/common/ac_nir_to_llvm.c index 29bffefd79..c785244dcc 100644 --- a/src/amd/common/ac_nir_to_llvm.c +++ b/src/amd/common/ac_nir_to_llvm.c @@ -3872,6 +3872,12 @@ static void emit_barrier(struct ac_llvm_context *ac, gl_shader_stage stage) ac->voidt, NULL, 0, AC_FUNC_ATTR_CONVERGENT); } +static void radv_emit_kill(struct ac_shader_abi *abi, LLVMValueRef visible) +{ + struct radv_shader_context *ctx = radv_shader_context_from_abi(abi); + ac_build_kill_if_false(>ac, visible); +} + static void emit_discard(struct ac_nir_context *ctx, const nir_intrinsic_instr *instr) { @@ -3886,7 +3892,7 @@ static void emit_discard(struct ac_nir_context *ctx, cond = LLVMConstInt(ctx->ac.i1, false, 0); } - ac_build_kill_if_false(>ac, cond); + ctx->abi->emit_kill(ctx->abi, cond); } static LLVMValueRef @@ -6955,6 +6961,7 @@ LLVMModuleRef ac_translate_nir_to_llvm(LLVMTargetMachineRef tm, ctx.abi.lookup_interp_param = lookup_interp_param; ctx.abi.load_sample_position = load_sample_position; ctx.abi.load_sample_mask_in = load_sample_mask_in; + ctx.abi.emit_kill = radv_emit_kill; } if (i) diff --git a/src/amd/common/ac_shader_abi.h b/src/amd/common/ac_shader_abi.h index 09fe32c136..901e49b1f9 100644 --- a/src/amd/common/ac_shader_abi.h +++ b/src/amd/common/ac_shader_abi.h @@ -86,6 +86,8 @@ struct ac_shader_abi { void (*emit_primitive)(struct ac_shader_abi *abi, unsigned stream); + void (*emit_kill)(struct ac_shader_abi *abi, LLVMValueRef visible); + LLVMValueRef (*load_inputs)(struct ac_shader_abi *abi, unsigned location, unsigned driver_location, diff --git a/src/gallium/drivers/radeonsi/si_shader.c b/src/gallium/drivers/radeonsi/si_shader.c index 343a5d57bf..fa7a19cb3a 100644 --- a/src/gallium/drivers/radeonsi/si_shader.c +++ b/src/gallium/drivers/radeonsi/si_shader.c @@ -6062,6 +6062,7 @@ static bool si_compile_tgsi_main(struct si_shader_context *ctx, ctx->abi.lookup_interp_param = si_nir_lookup_interp_param; ctx->abi.load_sample_position = load_sample_position; ctx->abi.load_sample_mask_in = load_sample_mask_in; + ctx->abi.emit_kill = si_llvm_emit_kill; break; case PIPE_SHADER_COMPUTE: ctx->abi.load_local_group_size = get_block_size; ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): spirv: fix autotools builds
Module: Mesa Branch: master Commit: f4b877631ec292ea18217706ab69ab0a2315e454 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=f4b877631ec292ea18217706ab69ab0a2315e454 Author: Timothy Arceri <tarc...@itsqueeze.com> Date: Thu Mar 8 10:37:52 2018 +1100 spirv: fix autotools builds Fixes: 68a6a3b51acc "spirv: handle AMD_gcn_shader extended instructions" Reviewed-by: Bas Nieuwenhuizen <b...@basnieuwenhuizen.nl> --- src/compiler/Makefile.sources | 1 + 1 file changed, 1 insertion(+) diff --git a/src/compiler/Makefile.sources b/src/compiler/Makefile.sources index 841bc8fec9..37340ba809 100644 --- a/src/compiler/Makefile.sources +++ b/src/compiler/Makefile.sources @@ -301,6 +301,7 @@ SPIRV_FILES = \ spirv/spirv_info.h \ spirv/spirv_to_nir.c \ spirv/vtn_alu.c \ + spirv/vtn_amd.c \ spirv/vtn_cfg.c \ spirv/vtn_glsl450.c \ spirv/vtn_private.h \ ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): ac: add if/loop build helpers
Module: Mesa Branch: master Commit: 42627dabb4db3011825a022325be7ae9b51103d6 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=42627dabb4db3011825a022325be7ae9b51103d6 Author: Timothy Arceri <tarc...@itsqueeze.com> Date: Wed Mar 7 10:53:34 2018 +1100 ac: add if/loop build helpers These have been ported over from radeonsi. Reviewed-by: Marek Olšák <marek.ol...@amd.com> --- src/amd/common/ac_llvm_build.c | 189 src/amd/common/ac_llvm_build.h | 20 + src/amd/common/ac_nir_to_llvm.c | 2 + 3 files changed, 211 insertions(+) diff --git a/src/amd/common/ac_llvm_build.c b/src/amd/common/ac_llvm_build.c index da2213d40b..9851cafb7f 100644 --- a/src/amd/common/ac_llvm_build.c +++ b/src/amd/common/ac_llvm_build.c @@ -41,6 +41,16 @@ #include "shader_enums.h" +#define AC_LLVM_INITIAL_CF_DEPTH 4 + +/* Data for if/else/endif and bgnloop/endloop control flow structures. + */ +struct ac_llvm_flow { + /* Loop exit or next part of if/else/endif. */ + LLVMBasicBlockRef next_block; + LLVMBasicBlockRef loop_entry_block; +}; + /* Initialize module-independent parts of the context. * * The caller is responsible for initializing ctx::module and ctx::builder. @@ -105,6 +115,14 @@ ac_llvm_context_init(struct ac_llvm_context *ctx, LLVMContextRef context, ctx->empty_md = LLVMMDNodeInContext(ctx->context, NULL, 0); } +void +ac_llvm_context_dispose(struct ac_llvm_context *ctx) +{ + free(ctx->flow); + ctx->flow = NULL; + ctx->flow_depth_max = 0; +} + int ac_get_llvm_num_components(LLVMValueRef value) { @@ -2146,3 +2164,174 @@ LLVMTypeRef ac_array_in_const32_addr_space(LLVMTypeRef elem_type) return LLVMPointerType(LLVMArrayType(elem_type, 0), AC_CONST_32BIT_ADDR_SPACE); } + +static struct ac_llvm_flow * +get_current_flow(struct ac_llvm_context *ctx) +{ + if (ctx->flow_depth > 0) + return >flow[ctx->flow_depth - 1]; + return NULL; +} + +static struct ac_llvm_flow * +get_innermost_loop(struct ac_llvm_context *ctx) +{ + for (unsigned i = ctx->flow_depth; i > 0; --i) { + if (ctx->flow[i - 1].loop_entry_block) + return >flow[i - 1]; + } + return NULL; +} + +static struct ac_llvm_flow * +push_flow(struct ac_llvm_context *ctx) +{ + struct ac_llvm_flow *flow; + + if (ctx->flow_depth >= ctx->flow_depth_max) { + unsigned new_max = MAX2(ctx->flow_depth << 1, + AC_LLVM_INITIAL_CF_DEPTH); + + ctx->flow = realloc(ctx->flow, new_max * sizeof(*ctx->flow)); + ctx->flow_depth_max = new_max; + } + + flow = >flow[ctx->flow_depth]; + ctx->flow_depth++; + + flow->next_block = NULL; + flow->loop_entry_block = NULL; + return flow; +} + +static void set_basicblock_name(LLVMBasicBlockRef bb, const char *base, + int label_id) +{ + char buf[32]; + snprintf(buf, sizeof(buf), "%s%d", base, label_id); + LLVMSetValueName(LLVMBasicBlockAsValue(bb), buf); +} + +/* Append a basic block at the level of the parent flow. + */ +static LLVMBasicBlockRef append_basic_block(struct ac_llvm_context *ctx, + const char *name) +{ + assert(ctx->flow_depth >= 1); + + if (ctx->flow_depth >= 2) { + struct ac_llvm_flow *flow = >flow[ctx->flow_depth - 2]; + + return LLVMInsertBasicBlockInContext(ctx->context, +flow->next_block, name); + } + + LLVMValueRef main_fn = + LLVMGetBasicBlockParent(LLVMGetInsertBlock(ctx->builder)); + return LLVMAppendBasicBlockInContext(ctx->context, main_fn, name); +} + +/* Emit a branch to the given default target for the current block if + * applicable -- that is, if the current block does not already contain a + * branch from a break or continue. + */ +static void emit_default_branch(LLVMBuilderRef builder, + LLVMBasicBlockRef target) +{ + if (!LLVMGetBasicBlockTerminator(LLVMGetInsertBlock(builder))) +LLVMBuildBr(builder, target); +} + +void ac_build_bgnloop(struct ac_llvm_context *ctx, int label_id) +{ + struct ac_llvm_flow *flow = push_flow(ctx); + flow->loop_entry_block = append_basic_block(ctx, "LOOP"); + flow->next_block = append_basic_block(ctx, "ENDLOOP"); + set_basicblock_name(flow->loop_entry_block, "loop", label_id); + LLVMBuildBr(ctx->builder, flow->loop_entry_block); + LLVMPositionBuilderAtEnd(ctx->builder, flow->loop_entry_block); +} + +void ac_build_break(struct ac_llvm_context *
Mesa (master): ac: make use of if/loop build helpers
Module: Mesa Branch: master Commit: 99cdc019bf6fe11c135b7544ef6daf4ac964fa24 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=99cdc019bf6fe11c135b7544ef6daf4ac964fa24 Author: Timothy Arceri <tarc...@itsqueeze.com> Date: Wed Mar 7 11:10:54 2018 +1100 ac: make use of if/loop build helpers These helpers insert the basic block in the same order as they appear in NIR making it easier to follow LLVM IR dumps. The helpers also insert more useful labels onto the blocks. TGSI use the line number of the corresponding opcode in the TGSI dump as the label id, here we use the corresponding block index from NIR. Reviewed-by: Marek Olšák <marek.ol...@amd.com> --- src/amd/common/ac_nir_to_llvm.c | 60 + 1 file changed, 18 insertions(+), 42 deletions(-) diff --git a/src/amd/common/ac_nir_to_llvm.c b/src/amd/common/ac_nir_to_llvm.c index 9a3ce94af7..29bffefd79 100644 --- a/src/amd/common/ac_nir_to_llvm.c +++ b/src/amd/common/ac_nir_to_llvm.c @@ -5300,17 +5300,15 @@ static void visit_ssa_undef(struct ac_nir_context *ctx, _mesa_hash_table_insert(ctx->defs, >def, undef); } -static void visit_jump(struct ac_nir_context *ctx, +static void visit_jump(struct ac_llvm_context *ctx, const nir_jump_instr *instr) { switch (instr->type) { case nir_jump_break: - LLVMBuildBr(ctx->ac.builder, ctx->break_block); - LLVMClearInsertionPosition(ctx->ac.builder); + ac_build_break(ctx); break; case nir_jump_continue: - LLVMBuildBr(ctx->ac.builder, ctx->continue_block); - LLVMClearInsertionPosition(ctx->ac.builder); + ac_build_continue(ctx); break; default: fprintf(stderr, "Unknown NIR jump instr: "); @@ -5348,7 +5346,7 @@ static void visit_block(struct ac_nir_context *ctx, nir_block *block) visit_ssa_undef(ctx, nir_instr_as_ssa_undef(instr)); break; case nir_instr_type_jump: - visit_jump(ctx, nir_instr_as_jump(instr)); + visit_jump(>ac, nir_instr_as_jump(instr)); break; default: fprintf(stderr, "Unknown NIR instr type: "); @@ -5365,56 +5363,34 @@ static void visit_if(struct ac_nir_context *ctx, nir_if *if_stmt) { LLVMValueRef value = get_src(ctx, if_stmt->condition); - LLVMValueRef fn = LLVMGetBasicBlockParent(LLVMGetInsertBlock(ctx->ac.builder)); - LLVMBasicBlockRef merge_block = - LLVMAppendBasicBlockInContext(ctx->ac.context, fn, ""); - LLVMBasicBlockRef if_block = - LLVMAppendBasicBlockInContext(ctx->ac.context, fn, ""); - LLVMBasicBlockRef else_block = merge_block; - if (!exec_list_is_empty(_stmt->else_list)) - else_block = LLVMAppendBasicBlockInContext( - ctx->ac.context, fn, ""); - - LLVMValueRef cond = LLVMBuildICmp(ctx->ac.builder, LLVMIntNE, value, - ctx->ac.i32_0, ""); - LLVMBuildCondBr(ctx->ac.builder, cond, if_block, else_block); - - LLVMPositionBuilderAtEnd(ctx->ac.builder, if_block); + nir_block *then_block = + (nir_block *) exec_list_get_head(_stmt->then_list); + + ac_build_uif(>ac, value, then_block->index); + visit_cf_list(ctx, _stmt->then_list); - if (LLVMGetInsertBlock(ctx->ac.builder)) - LLVMBuildBr(ctx->ac.builder, merge_block); if (!exec_list_is_empty(_stmt->else_list)) { - LLVMPositionBuilderAtEnd(ctx->ac.builder, else_block); + nir_block *else_block = + (nir_block *) exec_list_get_head(_stmt->else_list); + + ac_build_else(>ac, else_block->index); visit_cf_list(ctx, _stmt->else_list); - if (LLVMGetInsertBlock(ctx->ac.builder)) - LLVMBuildBr(ctx->ac.builder, merge_block); } - LLVMPositionBuilderAtEnd(ctx->ac.builder, merge_block); + ac_build_endif(>ac, then_block->index); } static void visit_loop(struct ac_nir_context *ctx, nir_loop *loop) { - LLVMValueRef fn = LLVMGetBasicBlockParent(LLVMGetInsertBlock(ctx->ac.builder)); - LLVMBasicBlockRef continue_parent = ctx->continue_block; - LLVMBasicBlockRef break_parent = ctx->break_block; + nir_block *first_loop_block = + (nir_block *) exec_list_get_head(>body); - ctx->continue_block = - LLVMAppendBasicBlockInContext(ctx->ac.context, fn, ""); - ctx->break_block = - LLVMAppendBasicBlockInContext(ctx->ac.context, fn, &q
Mesa (master): Revert "nir: bump loop unroll limit to 96."
Module: Mesa Branch: master Commit: 1fdb21541e78abeb28ba8dcbc747f5d9f199921b URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=1fdb21541e78abeb28ba8dcbc747f5d9f199921b Author: Timothy Arceri <tarc...@itsqueeze.com> Date: Tue Mar 6 14:48:07 2018 +1100 Revert "nir: bump loop unroll limit to 96." This reverts commit 2d36efdb7f18f061c519dbb93f6058bf161aad33. This raised limit turns out to harmful for more complex shaders, it causes excessive spilling in some Bioshock Infinite shaders. The fps for the ssao demo on radv remains unchanged when reverting this. Reviewed-by: Dave Airlie <airl...@redhat.com> Reviewed-by: Samuel Pitoiset <samuel.pitoi...@gmail.com> --- src/compiler/nir/nir_opt_loop_unroll.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/compiler/nir/nir_opt_loop_unroll.c b/src/compiler/nir/nir_opt_loop_unroll.c index dae5bfc902..79d04f978b 100644 --- a/src/compiler/nir/nir_opt_loop_unroll.c +++ b/src/compiler/nir/nir_opt_loop_unroll.c @@ -33,10 +33,8 @@ * to give about the same results. Around 5 instructions per node. But some * loops that would unroll with GLSL IR fail to unroll if we set this to 25 so * we set it to 26. - * This was bumped to 96 because it unrolled more loops with a positive - * effect (vulkan ssao demo). */ -#define LOOP_UNROLL_LIMIT 96 +#define LOOP_UNROLL_LIMIT 26 /* Prepare this loop for unrolling by first converting to lcssa and then * converting the phis from the loops first block and the block that follows ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): radeonsi/nir: fix handling of doubles for gs inputs
Module: Mesa Branch: master Commit: 71b3d681d88435b7397ad3fe896eb1fe7621b86a URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=71b3d681d88435b7397ad3fe896eb1fe7621b86a Author: Timothy Arceri <tarc...@itsqueeze.com> Date: Thu Mar 1 15:21:52 2018 +1100 radeonsi/nir: fix handling of doubles for gs inputs Fixes piglit test: tests/spec/arb_gpu_shader_fp64/execution/explicit-location-gs-fs-vs.shader_test Reviewed-by: Dave Airlie <airl...@redhat.com> --- src/gallium/drivers/radeonsi/si_shader.c | 8 ++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/gallium/drivers/radeonsi/si_shader.c b/src/gallium/drivers/radeonsi/si_shader.c index f3a37d71a0..2ae2544e3f 100644 --- a/src/gallium/drivers/radeonsi/si_shader.c +++ b/src/gallium/drivers/radeonsi/si_shader.c @@ -1693,10 +1693,14 @@ static LLVMValueRef si_nir_load_input_gs(struct ac_shader_abi *abi, { struct si_shader_context *ctx = si_shader_context_from_abi(abi); - LLVMValueRef value[8]; + LLVMValueRef value[4]; for (unsigned i = component; i < num_components + component; i++) { + unsigned offset = i; + if (llvm_type_is_64bit(ctx, type)) + offset *= 2; + value[i] = si_llvm_load_input_gs(>abi, driver_location / 4, -vertex_index, type, i); +vertex_index, type, offset); } return ac_build_varying_gather_values(>ac, value, num_components, component); ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): ac: pass the unmodified number of components to load gs inputs
Module: Mesa Branch: master Commit: 20bd0f6a2bd631aec06d5bdbcf72fa562ec8a9a2 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=20bd0f6a2bd631aec06d5bdbcf72fa562ec8a9a2 Author: Timothy Arceri <tarc...@itsqueeze.com> Date: Thu Mar 1 15:37:25 2018 +1100 ac: pass the unmodified number of components to load gs inputs Currently both users of this would overflow an array when the input was a dual slot double as they expected the number of components to be a max of 4. Since we pass the type we can just let the functions handle doubles in a way they choose. Reviewed-by: Dave Airlie <airl...@redhat.com> --- src/amd/common/ac_nir_to_llvm.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/amd/common/ac_nir_to_llvm.c b/src/amd/common/ac_nir_to_llvm.c index d2df2837c8..1fe09de484 100644 --- a/src/amd/common/ac_nir_to_llvm.c +++ b/src/amd/common/ac_nir_to_llvm.c @@ -3136,8 +3136,8 @@ static LLVMValueRef visit_load_var(struct ac_nir_context *ctx, return ctx->abi->load_inputs(ctx->abi, instr->variables[0]->var->data.location, instr->variables[0]->var->data.driver_location, - instr->variables[0]->var->data.location_frac, ve, -vertex_index, const_index, type); + instr->variables[0]->var->data.location_frac, +instr->num_components, vertex_index, const_index, type); } for (unsigned chan = comp; chan < ve + comp; chan++) { ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): radeonsi: move si_nir_load_input_gs() to si_shader.c
Module: Mesa Branch: master Commit: 2a68c6c6c8785e3f844791475df8423a6968ddfd URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=2a68c6c6c8785e3f844791475df8423a6968ddfd Author: Timothy Arceri <tarc...@itsqueeze.com> Date: Thu Mar 1 15:17:34 2018 +1100 radeonsi: move si_nir_load_input_gs() to si_shader.c All the tess shader and tgsi equivalents are here and it allows use to use llvm_type_is_64bit() in the following patch without exposing it externally. Reviewed-by: Dave Airlie <airl...@redhat.com> --- src/gallium/drivers/radeonsi/si_shader.c | 20 src/gallium/drivers/radeonsi/si_shader_internal.h | 9 - src/gallium/drivers/radeonsi/si_shader_nir.c | 20 3 files changed, 20 insertions(+), 29 deletions(-) diff --git a/src/gallium/drivers/radeonsi/si_shader.c b/src/gallium/drivers/radeonsi/si_shader.c index 2a50b266f6..f3a37d71a0 100644 --- a/src/gallium/drivers/radeonsi/si_shader.c +++ b/src/gallium/drivers/radeonsi/si_shader.c @@ -1682,6 +1682,26 @@ LLVMValueRef si_llvm_load_input_gs(struct ac_shader_abi *abi, return LLVMBuildBitCast(ctx->ac.builder, value, type, ""); } +static LLVMValueRef si_nir_load_input_gs(struct ac_shader_abi *abi, +unsigned location, +unsigned driver_location, +unsigned component, +unsigned num_components, +unsigned vertex_index, +unsigned const_index, +LLVMTypeRef type) +{ + struct si_shader_context *ctx = si_shader_context_from_abi(abi); + + LLVMValueRef value[8]; + for (unsigned i = component; i < num_components + component; i++) { + value[i] = si_llvm_load_input_gs(>abi, driver_location / 4, +vertex_index, type, i); + } + + return ac_build_varying_gather_values(>ac, value, num_components, component); +} + static LLVMValueRef fetch_input_gs( struct lp_build_tgsi_context *bld_base, const struct tgsi_full_src_register *reg, diff --git a/src/gallium/drivers/radeonsi/si_shader_internal.h b/src/gallium/drivers/radeonsi/si_shader_internal.h index dbe4f2e969..dc73517018 100644 --- a/src/gallium/drivers/radeonsi/si_shader_internal.h +++ b/src/gallium/drivers/radeonsi/si_shader_internal.h @@ -337,13 +337,4 @@ void si_llvm_load_input_fs( bool si_nir_build_llvm(struct si_shader_context *ctx, struct nir_shader *nir); -LLVMValueRef si_nir_load_input_gs(struct ac_shader_abi *abi, - unsigned location, - unsigned driver_location, - unsigned component, - unsigned num_components, - unsigned vertex_index, - unsigned const_index, - LLVMTypeRef type); - #endif diff --git a/src/gallium/drivers/radeonsi/si_shader_nir.c b/src/gallium/drivers/radeonsi/si_shader_nir.c index 05e00d016e..54ab0afca6 100644 --- a/src/gallium/drivers/radeonsi/si_shader_nir.c +++ b/src/gallium/drivers/radeonsi/si_shader_nir.c @@ -731,26 +731,6 @@ static void declare_nir_input_fs(struct si_shader_context *ctx, si_llvm_load_input_fs(ctx, input_index, out); } -LLVMValueRef si_nir_load_input_gs(struct ac_shader_abi *abi, - unsigned location, - unsigned driver_location, - unsigned component, - unsigned num_components, - unsigned vertex_index, - unsigned const_index, - LLVMTypeRef type) -{ - struct si_shader_context *ctx = si_shader_context_from_abi(abi); - - LLVMValueRef value[8]; - for (unsigned i = component; i < num_components + component; i++) { - value[i] = si_llvm_load_input_gs(>abi, driver_location / 4, -vertex_index, type, i); - } - - return ac_build_varying_gather_values(>ac, value, num_components, component); -} - LLVMValueRef si_nir_lookup_interp_param(struct ac_shader_abi *abi, enum glsl_interp_mode interp, unsigned location) ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): ac/radv: move lower_indirect_derefs() to ac_nir_to_llvm.c
Module: Mesa Branch: master Commit: 0f2c7341e8fc0ea5bb219a24a7120bd4c79bd3d6 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=0f2c7341e8fc0ea5bb219a24a7120bd4c79bd3d6 Author: Timothy Arceri <tarc...@itsqueeze.com> Date: Mon Mar 5 11:13:11 2018 +1100 ac/radv: move lower_indirect_derefs() to ac_nir_to_llvm.c Until llvm handles indirects better we will need to use these workarounds in the radeonsi backend also. Reviewed-by: Bas Nieuwenhuizen <b...@basnieuwenhuizen.nl> --- src/amd/common/ac_nir_to_llvm.c | 37 + src/amd/common/ac_nir_to_llvm.h | 2 ++ src/amd/vulkan/radv_pipeline.c | 8 src/amd/vulkan/radv_shader.c| 41 + src/amd/vulkan/radv_shader.h| 4 5 files changed, 44 insertions(+), 48 deletions(-) diff --git a/src/amd/common/ac_nir_to_llvm.c b/src/amd/common/ac_nir_to_llvm.c index 0ffcd75c3a..40ddf28974 100644 --- a/src/amd/common/ac_nir_to_llvm.c +++ b/src/amd/common/ac_nir_to_llvm.c @@ -7312,3 +7312,40 @@ void ac_create_gs_copy_shader(LLVMTargetMachineRef tm, MESA_SHADER_VERTEX, dump_shader, options->supports_spill); } + +void +ac_lower_indirect_derefs(struct nir_shader *nir, enum chip_class chip_class) +{ + /* While it would be nice not to have this flag, we are constrained +* by the reality that LLVM 5.0 doesn't have working VGPR indexing +* on GFX9. +*/ + bool llvm_has_working_vgpr_indexing = chip_class <= VI; + + /* TODO: Indirect indexing of GS inputs is unimplemented. +* +* TCS and TES load inputs directly from LDS or offchip memory, so +* indirect indexing is trivial. +*/ + nir_variable_mode indirect_mask = 0; + if (nir->info.stage == MESA_SHADER_GEOMETRY || + (nir->info.stage != MESA_SHADER_TESS_CTRL && +nir->info.stage != MESA_SHADER_TESS_EVAL && +!llvm_has_working_vgpr_indexing)) { + indirect_mask |= nir_var_shader_in; + } + if (!llvm_has_working_vgpr_indexing && + nir->info.stage != MESA_SHADER_TESS_CTRL) + indirect_mask |= nir_var_shader_out; + + /* TODO: We shouldn't need to do this, however LLVM isn't currently +* smart enough to handle indirects without causing excess spilling +* causing the gpu to hang. +* +* See the following thread for more details of the problem: +* https://lists.freedesktop.org/archives/mesa-dev/2017-July/162106.html +*/ + indirect_mask |= nir_var_local; + + nir_lower_indirect_derefs(nir, indirect_mask); +} diff --git a/src/amd/common/ac_nir_to_llvm.h b/src/amd/common/ac_nir_to_llvm.h index 766acec6ed..eea393a9c2 100644 --- a/src/amd/common/ac_nir_to_llvm.h +++ b/src/amd/common/ac_nir_to_llvm.h @@ -229,6 +229,8 @@ void ac_create_gs_copy_shader(LLVMTargetMachineRef tm, const struct ac_nir_compiler_options *options, bool dump_shader); +void ac_lower_indirect_derefs(struct nir_shader *nir, enum chip_class); + void ac_nir_translate(struct ac_llvm_context *ac, struct ac_shader_abi *abi, struct nir_shader *nir); diff --git a/src/amd/vulkan/radv_pipeline.c b/src/amd/vulkan/radv_pipeline.c index 6ad0b486f1..f8f09a7e16 100644 --- a/src/amd/vulkan/radv_pipeline.c +++ b/src/amd/vulkan/radv_pipeline.c @@ -1527,14 +1527,14 @@ radv_link_shaders(struct radv_pipeline *pipeline, nir_shader **shaders) if (progress) { if (nir_lower_global_vars_to_local(ordered_shaders[i])) { - radv_lower_indirect_derefs(ordered_shaders[i], - pipeline->device->physical_device); + ac_lower_indirect_derefs(ordered_shaders[i], + pipeline->device->physical_device->rad_info.chip_class); } radv_optimize_nir(ordered_shaders[i]); if (nir_lower_global_vars_to_local(ordered_shaders[i - 1])) { - radv_lower_indirect_derefs(ordered_shaders[i - 1], - pipeline->device->physical_device); + ac_lower_indirect_derefs(ordered_shaders[i - 1], + pipeline->device->physical_device->rad_info.chip_class); } radv_optimize_nir(ordered_shaders[i - 1]); } diff --git a/src/amd/vulkan/radv_shader.c b/src/amd/vulkan/radv_shader.c index 171802eede..e1de01f551 100644 --- a/src/amd/vulkan/radv_shader.c +++ b/src/amd/vulkan/radv_
Mesa (master): radeonsi: add chip class to compiler_ctx_state
Module: Mesa Branch: master Commit: 561503e3bd9fb800765b694092fecb97de92e192 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=561503e3bd9fb800765b694092fecb97de92e192 Author: Timothy Arceri <tarc...@itsqueeze.com> Date: Mon Mar 5 12:04:47 2018 +1100 radeonsi: add chip class to compiler_ctx_state This will be used in the following patch. Reviewed-by: Bas Nieuwenhuizen <b...@basnieuwenhuizen.nl> --- src/gallium/drivers/radeonsi/si_compute.c | 1 + src/gallium/drivers/radeonsi/si_shader.h| 2 ++ src/gallium/drivers/radeonsi/si_state_shaders.c | 1 + 3 files changed, 4 insertions(+) diff --git a/src/gallium/drivers/radeonsi/si_compute.c b/src/gallium/drivers/radeonsi/si_compute.c index 41927988cf..e9b6127115 100644 --- a/src/gallium/drivers/radeonsi/si_compute.c +++ b/src/gallium/drivers/radeonsi/si_compute.c @@ -186,6 +186,7 @@ static void *si_create_compute_state( program->ir.nir = (struct nir_shader *) cso->prog; } + program->compiler_ctx_state.chip_class = sctx->b.chip_class; program->compiler_ctx_state.debug = sctx->debug; program->compiler_ctx_state.is_debug_context = sctx->is_debug; p_atomic_inc(>num_shaders_created); diff --git a/src/gallium/drivers/radeonsi/si_shader.h b/src/gallium/drivers/radeonsi/si_shader.h index f58978989d..28f6e6bc4e 100644 --- a/src/gallium/drivers/radeonsi/si_shader.h +++ b/src/gallium/drivers/radeonsi/si_shader.h @@ -307,6 +307,8 @@ struct si_shader; /* State of the context creating the shader object. */ struct si_compiler_ctx_state { + enum chip_class chip_class; + /* Should only be used by si_init_shader_selector_async and * si_build_shader_variant if thread_index == -1 (non-threaded). */ LLVMTargetMachineReftm; diff --git a/src/gallium/drivers/radeonsi/si_state_shaders.c b/src/gallium/drivers/radeonsi/si_state_shaders.c index b28352951a..98a3dfe242 100644 --- a/src/gallium/drivers/radeonsi/si_state_shaders.c +++ b/src/gallium/drivers/radeonsi/si_state_shaders.c @@ -3121,6 +3121,7 @@ bool si_update_shaders(struct si_context *sctx) old_ps ? old_ps->key.part.ps.epilog.spi_shader_col_format : 0; int r; + compiler_state.chip_class = sctx->b.chip_class; compiler_state.tm = sctx->tm; compiler_state.debug = sctx->debug; compiler_state.is_debug_context = sctx->is_debug; ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): radeonsi/nir: call ac_lower_indirect_derefs()
Module: Mesa Branch: master Commit: 70190a656766019107d82aa5404ffa1cad9fb6e4 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=70190a656766019107d82aa5404ffa1cad9fb6e4 Author: Timothy Arceri <tarc...@itsqueeze.com> Date: Mon Mar 5 12:06:01 2018 +1100 radeonsi/nir: call ac_lower_indirect_derefs() Fixes piglit tests: tests/spec/glsl-1.50/execution/variable-indexing/gs-input-array-vec3-index-rd.shader_test tests/spec/glsl-1.50/execution/geometry/max-input-components.shader_test Reviewed-by: Bas Nieuwenhuizen <b...@basnieuwenhuizen.nl> --- src/gallium/drivers/radeonsi/si_compute.c | 2 +- src/gallium/drivers/radeonsi/si_shader.h| 2 +- src/gallium/drivers/radeonsi/si_shader_nir.c| 4 +++- src/gallium/drivers/radeonsi/si_state_shaders.c | 2 +- 4 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/gallium/drivers/radeonsi/si_compute.c b/src/gallium/drivers/radeonsi/si_compute.c index e9b6127115..d135a09add 100644 --- a/src/gallium/drivers/radeonsi/si_compute.c +++ b/src/gallium/drivers/radeonsi/si_compute.c @@ -107,7 +107,7 @@ static void si_create_compute_state_async(void *job, int thread_index) sel.nir = program->ir.nir; si_nir_scan_shader(sel.nir, ); - si_lower_nir(); + si_lower_nir(, program->compiler_ctx_state.chip_class); } diff --git a/src/gallium/drivers/radeonsi/si_shader.h b/src/gallium/drivers/radeonsi/si_shader.h index 28f6e6bc4e..23f9d20e19 100644 --- a/src/gallium/drivers/radeonsi/si_shader.h +++ b/src/gallium/drivers/radeonsi/si_shader.h @@ -674,7 +674,7 @@ void si_nir_scan_shader(const struct nir_shader *nir, void si_nir_scan_tess_ctrl(const struct nir_shader *nir, const struct tgsi_shader_info *info, struct tgsi_tessctrl_info *out); -void si_lower_nir(struct si_shader_selector *sel); +void si_lower_nir(struct si_shader_selector *sel, enum chip_class chip_class); /* Inline helpers. */ diff --git a/src/gallium/drivers/radeonsi/si_shader_nir.c b/src/gallium/drivers/radeonsi/si_shader_nir.c index 147bd9511d..05e00d016e 100644 --- a/src/gallium/drivers/radeonsi/si_shader_nir.c +++ b/src/gallium/drivers/radeonsi/si_shader_nir.c @@ -623,7 +623,7 @@ void si_nir_scan_shader(const struct nir_shader *nir, * selector is created. */ void -si_lower_nir(struct si_shader_selector* sel) +si_lower_nir(struct si_shader_selector* sel, enum chip_class chip_class) { /* Adjust the driver location of inputs and outputs. The state tracker * interprets them as slots, while the ac/nir backend interprets them @@ -673,6 +673,8 @@ si_lower_nir(struct si_shader_selector* sel) }; NIR_PASS_V(sel->nir, nir_lower_subgroups, _options); + ac_lower_indirect_derefs(sel->nir, chip_class); + bool progress; do { progress = false; diff --git a/src/gallium/drivers/radeonsi/si_state_shaders.c b/src/gallium/drivers/radeonsi/si_state_shaders.c index 98a3dfe242..2893135242 100644 --- a/src/gallium/drivers/radeonsi/si_state_shaders.c +++ b/src/gallium/drivers/radeonsi/si_state_shaders.c @@ -1999,7 +1999,7 @@ static void *si_create_shader_selector(struct pipe_context *ctx, si_nir_scan_shader(sel->nir, >info); si_nir_scan_tess_ctrl(sel->nir, >info, >tcs_info); - si_lower_nir(sel); + si_lower_nir(sel, sctx->b.chip_class); } sel->type = sel->info.processor; ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): ac: fix nir_intrinsic_shared_atomic_comp_swap handling
Module: Mesa Branch: master Commit: f5305c1b44a81d8e022997e0f2f5bd7556be7dea URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=f5305c1b44a81d8e022997e0f2f5bd7556be7dea Author: Timothy Arceri <tarc...@itsqueeze.com> Date: Thu Mar 1 20:17:38 2018 +1100 ac: fix nir_intrinsic_shared_atomic_comp_swap handling Following on from 49879f377870 this makes sure we use the correct src index. Fixes cts test: KHR-GL46.compute_shader.atomic-case3 Reviewed-by: Dave Airlie <airl...@redhat.com> --- src/amd/common/ac_nir_to_llvm.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/amd/common/ac_nir_to_llvm.c b/src/amd/common/ac_nir_to_llvm.c index afe17a8f11..0ffcd75c3a 100644 --- a/src/amd/common/ac_nir_to_llvm.c +++ b/src/amd/common/ac_nir_to_llvm.c @@ -3998,7 +3998,7 @@ static LLVMValueRef visit_var_atomic(struct ac_nir_context *ctx, if (instr->intrinsic == nir_intrinsic_var_atomic_comp_swap || instr->intrinsic == nir_intrinsic_shared_atomic_comp_swap) { - LLVMValueRef src1 = get_src(ctx, instr->src[1]); + LLVMValueRef src1 = get_src(ctx, instr->src[src_idx + 1]); result = LLVMBuildAtomicCmpXchg(ctx->ac.builder, ptr, src, src1, LLVMAtomicOrderingSequentiallyConsistent, ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): st/glsl_to_nir: simplify st_nir_assign_var_locations() and fix for fs outputs
Module: Mesa Branch: master Commit: 13cdf4e5906f2ac7ec39d0b06abc6b5671c0693d URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=13cdf4e5906f2ac7ec39d0b06abc6b5671c0693d Author: Timothy Arceri <tarc...@itsqueeze.com> Date: Thu Mar 1 13:39:20 2018 +1100 st/glsl_to_nir: simplify st_nir_assign_var_locations() and fix for fs outputs We only need to check for previously processed location on user defined varyings as they are the only ones that support component packing. Therefore a single instance of processed_locs can be shared by regular varyings and patches. For simplicity we make processed_locs an array in order to handle dual source bleanding. Fixes the follow piglit test on radeonsi: tests/spec/arb_enhanced_layouts/execution/component-layout/fs-output.shader_test Reviewed-by: Dave Airlie <airl...@redhat.com> --- src/mesa/state_tracker/st_glsl_to_nir.cpp | 30 +- 1 file changed, 13 insertions(+), 17 deletions(-) diff --git a/src/mesa/state_tracker/st_glsl_to_nir.cpp b/src/mesa/state_tracker/st_glsl_to_nir.cpp index 765c827d93..0bd9c4e4e3 100644 --- a/src/mesa/state_tracker/st_glsl_to_nir.cpp +++ b/src/mesa/state_tracker/st_glsl_to_nir.cpp @@ -127,8 +127,10 @@ st_nir_assign_var_locations(struct exec_list *var_list, unsigned *size, { unsigned location = 0; unsigned assigned_locations[VARYING_SLOT_TESS_MAX]; - uint64_t processed_locs = 0; - uint32_t processed_patch_locs = 0; + uint64_t processed_locs[2] = {0}; + + const int base = stage == MESA_SHADER_FRAGMENT ? + (int) FRAG_RESULT_DATA0 : (int) VARYING_SLOT_VAR0; nir_foreach_variable(var, var_list) { @@ -138,28 +140,22 @@ st_nir_assign_var_locations(struct exec_list *var_list, unsigned *size, type = glsl_get_array_element(type); } + /* Builtins don't allow component packing so we only need to worry about + * user defined varyings sharing the same location. + */ bool processed = false; - if (var->data.patch && - var->data.location != VARYING_SLOT_TESS_LEVEL_INNER && - var->data.location != VARYING_SLOT_TESS_LEVEL_OUTER && - var->data.location != VARYING_SLOT_BOUNDING_BOX0 && - var->data.location != VARYING_SLOT_BOUNDING_BOX1) { - unsigned patch_loc = var->data.location - VARYING_SLOT_PATCH0; - if (processed_patch_locs & (1 << patch_loc)) + if (var->data.location >= base) { + unsigned glsl_location = var->data.location - base; + if (processed_locs[var->data.index] & ((uint64_t)1 << glsl_location)) processed = true; - - processed_patch_locs |= (1 << patch_loc); - } else { - if (processed_locs & ((uint64_t)1 << var->data.location)) -processed = true; - - processed_locs |= ((uint64_t)1 << var->data.location); + else +processed_locs[var->data.index] |= ((uint64_t)1 << glsl_location); } /* Because component packing allows varyings to share the same location * we may have already have processed this location. */ - if (processed && var->data.location >= VARYING_SLOT_VAR0) { + if (processed) { var->data.driver_location = assigned_locations[var->data.location]; *size += type_size(type); continue; ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): gallium: remove llvm from ir struct
Module: Mesa Branch: master Commit: 7e46214f871983dc64730f2f9c5029ee6109c3b4 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=7e46214f871983dc64730f2f9c5029ee6109c3b4 Author: Timothy Arceri <tarc...@itsqueeze.com> Date: Fri Feb 2 08:50:09 2018 +1100 gallium: remove llvm from ir struct This was added in 425dc4c4b366 but never used. Also since 100796c15c3a native has superseded llvm. Acked-by: Dave Airlie <airl...@redhat.com> --- src/gallium/include/pipe/p_state.h | 1 - 1 file changed, 1 deletion(-) diff --git a/src/gallium/include/pipe/p_state.h b/src/gallium/include/pipe/p_state.h index 2b56d60b5e..640e6ed26d 100644 --- a/src/gallium/include/pipe/p_state.h +++ b/src/gallium/include/pipe/p_state.h @@ -267,7 +267,6 @@ struct pipe_shader_state /* TODO move tokens into union. */ const struct tgsi_token *tokens; union { - void *llvm; void *native; void *nir; } ir; ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): radeonsi: set some context vars for nir path
Module: Mesa Branch: master Commit: f383fec903220ecd18cb0d237b7d9a4de2ae8f2a URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=f383fec903220ecd18cb0d237b7d9a4de2ae8f2a Author: Timothy Arceri <tarc...@itsqueeze.com> Date: Tue Feb 13 13:06:51 2018 +1100 radeonsi: set some context vars for nir path Reviewed-by: Marek Olšák <marek.ol...@amd.com> --- src/gallium/drivers/radeonsi/si_shader_tgsi_setup.c | 16 ++-- 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/gallium/drivers/radeonsi/si_shader_tgsi_setup.c b/src/gallium/drivers/radeonsi/si_shader_tgsi_setup.c index 8707be504e..4a027d8659 100644 --- a/src/gallium/drivers/radeonsi/si_shader_tgsi_setup.c +++ b/src/gallium/drivers/radeonsi/si_shader_tgsi_setup.c @@ -1253,7 +1253,16 @@ void si_llvm_context_set_tgsi(struct si_shader_context *ctx, ctx->temps = NULL; ctx->temps_count = 0; - if (!info || !tokens) + if (!info) + return; + + ctx->num_const_buffers = util_last_bit(info->const_buffers_declared); + ctx->num_shader_buffers = util_last_bit(info->shader_buffers_declared); + + ctx->num_samplers = util_last_bit(info->samplers_declared); + ctx->num_images = util_last_bit(info->images_declared); + + if (!tokens) return; if (info->array_max[TGSI_FILE_TEMPORARY] > 0) { @@ -1281,11 +1290,6 @@ void si_llvm_context_set_tgsi(struct si_shader_context *ctx, ctx->bld_base.emit_fetch_funcs[TGSI_FILE_TEMPORARY] = si_llvm_emit_fetch; ctx->bld_base.emit_fetch_funcs[TGSI_FILE_OUTPUT] = si_llvm_emit_fetch; ctx->bld_base.emit_fetch_funcs[TGSI_FILE_SYSTEM_VALUE] = fetch_system_value; - - ctx->num_const_buffers = util_last_bit(info->const_buffers_declared); - ctx->num_shader_buffers = util_last_bit(info->shader_buffers_declared); - ctx->num_samplers = util_last_bit(info->samplers_declared); - ctx->num_images = util_last_bit(info->images_declared); } void si_llvm_create_func(struct si_shader_context *ctx, ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): nir: fix interger divide by zero crash during constant folding
Module: Mesa Branch: master Commit: 0c1f37cc2d8555223ade73b244a3ee374be8d9cd URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=0c1f37cc2d8555223ade73b244a3ee374be8d9cd Author: Timothy Arceri <tarc...@itsqueeze.com> Date: Wed Feb 28 14:33:55 2018 +1100 nir: fix interger divide by zero crash during constant folding From the GLSL 4.60 spec Section 5.9 (Expressions): "Dividing by zero does not cause an exception but does result in an unspecified value." Fixes: 89285e4d47a6 "nir: add new constant folding infrastructure" Reviewed-by: Jason Ekstrand <ja...@jlekstrand.net> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=105271 --- src/compiler/nir/nir_opcodes.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/compiler/nir/nir_opcodes.py b/src/compiler/nir/nir_opcodes.py index 278562b2bd..97da4db28f 100644 --- a/src/compiler/nir/nir_opcodes.py +++ b/src/compiler/nir/nir_opcodes.py @@ -404,8 +404,8 @@ binop("umul_high", tuint32, commutative, "(uint32_t)(((uint64_t) src0 * (uint64_t) src1) >> 32)") binop("fdiv", tfloat, "", "src0 / src1") -binop("idiv", tint, "", "src0 / src1") -binop("udiv", tuint, "", "src0 / src1") +binop("idiv", tint, "", "src1 == 0 ? 0 : (src0 / src1)") +binop("udiv", tuint, "", "src1 == 0 ? 0 : (src0 / src1)") # returns a boolean representing the carry resulting from the addition of # the two unsigned arguments. ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): ac: fix f2b and i2b for doubles
Module: Mesa Branch: master Commit: 3a0b4187ddeadc1fbeb0774540caa36a3a68974a URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=3a0b4187ddeadc1fbeb0774540caa36a3a68974a Author: Timothy Arceri <tarc...@itsqueeze.com> Date: Mon Feb 26 16:12:41 2018 +1100 ac: fix f2b and i2b for doubles Without this llvm was asserting in debug builds. V2: use LLVMConstNull() Reviewed-by: Samuel Pitoiset <samuel.pitoi...@gmail.com> --- src/amd/common/ac_nir_to_llvm.c | 6 -- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/amd/common/ac_nir_to_llvm.c b/src/amd/common/ac_nir_to_llvm.c index 3f0bfedfa7..96bbecd110 100644 --- a/src/amd/common/ac_nir_to_llvm.c +++ b/src/amd/common/ac_nir_to_llvm.c @@ -1437,8 +1437,9 @@ static LLVMValueRef emit_f2b(struct ac_llvm_context *ctx, LLVMValueRef src0) { src0 = ac_to_float(ctx, src0); + LLVMValueRef zero = LLVMConstNull(LLVMTypeOf(src0)); return LLVMBuildSExt(ctx->builder, -LLVMBuildFCmp(ctx->builder, LLVMRealUNE, src0, ctx->f32_0, ""), +LLVMBuildFCmp(ctx->builder, LLVMRealUNE, src0, zero, ""), ctx->i32, ""); } @@ -1457,8 +1458,9 @@ static LLVMValueRef emit_b2i(struct ac_llvm_context *ctx, static LLVMValueRef emit_i2b(struct ac_llvm_context *ctx, LLVMValueRef src0) { + LLVMValueRef zero = LLVMConstNull(LLVMTypeOf(src0)); return LLVMBuildSExt(ctx->builder, -LLVMBuildICmp(ctx->builder, LLVMIntNE, src0, ctx->i32_0, ""), +LLVMBuildICmp(ctx->builder, LLVMIntNE, src0, zero, ""), ctx->i32, ""); } ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): nir: add lower_ldexp to nir compiler options
Module: Mesa Branch: master Commit: a050ea60eef9c457a3d5185aa551631df0c35bec URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=a050ea60eef9c457a3d5185aa551631df0c35bec Author: Timothy Arceri <tarc...@itsqueeze.com> Date: Tue Feb 27 19:19:21 2018 +1100 nir: add lower_ldexp to nir compiler options Reviewed-by: Marek Olšák <marek.ol...@amd.com> --- src/broadcom/compiler/nir_to_vir.c | 1 + src/compiler/nir/nir.h | 2 ++ src/compiler/nir/nir_opt_algebraic.py | 4 ++-- src/gallium/drivers/freedreno/ir3/ir3_nir.c | 1 + src/gallium/drivers/vc4/vc4_program.c | 1 + src/intel/compiler/brw_compiler.c | 1 + 6 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/broadcom/compiler/nir_to_vir.c b/src/broadcom/compiler/nir_to_vir.c index 6bb2774143..595689d244 100644 --- a/src/broadcom/compiler/nir_to_vir.c +++ b/src/broadcom/compiler/nir_to_vir.c @@ -1893,6 +1893,7 @@ const nir_shader_compiler_options v3d_nir_options = { .lower_fpow = true, .lower_fsat = true, .lower_fsqrt = true, +.lower_ldexp = true, .native_integers = true, }; diff --git a/src/compiler/nir/nir.h b/src/compiler/nir/nir.h index 2acd9511f5..c676331000 100644 --- a/src/compiler/nir/nir.h +++ b/src/compiler/nir/nir.h @@ -1859,6 +1859,8 @@ typedef struct nir_shader_compiler_options { /** lowers ffract to fsub+ffloor: */ bool lower_ffract; + bool lower_ldexp; + bool lower_pack_half_2x16; bool lower_pack_unorm_2x16; bool lower_pack_snorm_2x16; diff --git a/src/compiler/nir/nir_opt_algebraic.py b/src/compiler/nir/nir_opt_algebraic.py index d40d59b5cd..296f067138 100644 --- a/src/compiler/nir/nir_opt_algebraic.py +++ b/src/compiler/nir/nir_opt_algebraic.py @@ -560,8 +560,8 @@ def ldexp(f, exp, bits): return ('fmul', ('fmul', f, pow2_1), pow2_2) optimizations += [ - (('ldexp@32', 'x', 'exp'), ldexp('x', 'exp', 32)), - (('ldexp@64', 'x', 'exp'), ldexp('x', 'exp', 64)), + (('ldexp@32', 'x', 'exp'), ldexp('x', 'exp', 32), 'options->lower_ldexp'), + (('ldexp@64', 'x', 'exp'), ldexp('x', 'exp', 64), 'options->lower_ldexp'), ] # Unreal Engine 4 demo applications open-codes bitfieldReverse() diff --git a/src/gallium/drivers/freedreno/ir3/ir3_nir.c b/src/gallium/drivers/freedreno/ir3/ir3_nir.c index 6edb0e4574..0b637bb99b 100644 --- a/src/gallium/drivers/freedreno/ir3/ir3_nir.c +++ b/src/gallium/drivers/freedreno/ir3/ir3_nir.c @@ -44,6 +44,7 @@ static const nir_shader_compiler_options options = { .lower_fmod32 = true, .lower_fmod64 = true, .lower_fdiv = true, + .lower_ldexp = true, .fuse_ffma = true, .native_integers = true, .vertex_id_zero_based = true, diff --git a/src/gallium/drivers/vc4/vc4_program.c b/src/gallium/drivers/vc4/vc4_program.c index 706982c4a1..be80a851d2 100644 --- a/src/gallium/drivers/vc4/vc4_program.c +++ b/src/gallium/drivers/vc4/vc4_program.c @@ -2188,6 +2188,7 @@ static const nir_shader_compiler_options nir_options = { .lower_fpow = true, .lower_fsat = true, .lower_fsqrt = true, +.lower_ldexp = true, .lower_negate = true, .native_integers = true, .max_unroll_iterations = 32, diff --git a/src/intel/compiler/brw_compiler.c b/src/intel/compiler/brw_compiler.c index e515559acb..bb9df5e701 100644 --- a/src/intel/compiler/brw_compiler.c +++ b/src/intel/compiler/brw_compiler.c @@ -41,6 +41,7 @@ .lower_usub_borrow = true, \ .lower_fdiv = true,\ .lower_flrp64 = true, \ + .lower_ldexp = true, \ .native_integers = true, \ .use_interpolated_input_intrinsics = true, \ .vertex_id_zero_based = true ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): ac/radeonsi: add load_base_vertex() to the abi
Module: Mesa Branch: master Commit: 8de6f7970702ec69143c4e256bbeab64fe7d79c0 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=8de6f7970702ec69143c4e256bbeab64fe7d79c0 Author: Timothy Arceri <tarc...@itsqueeze.com> Date: Mon Feb 26 22:11:53 2018 +1100 ac/radeonsi: add load_base_vertex() to the abi Fixes the following piglit tests: ./bin/arb_shader_draw_parameters-basevertex basevertex -auto -fbo ./bin/arb_shader_draw_parameters-basevertex basevertex-baseinstance -auto -fbo Reviewed-by: Samuel Pitoiset <samuel.pitoi...@gmail.com> Reviewed-by: Marek Olšák <marek.ol...@amd.com> --- src/amd/common/ac_nir_to_llvm.c | 8 +++- src/amd/common/ac_shader_abi.h | 2 ++ src/gallium/drivers/radeonsi/si_shader.c | 1 + 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/amd/common/ac_nir_to_llvm.c b/src/amd/common/ac_nir_to_llvm.c index 253c440a32..fabecb1786 100644 --- a/src/amd/common/ac_nir_to_llvm.c +++ b/src/amd/common/ac_nir_to_llvm.c @@ -4389,7 +4389,7 @@ static void visit_intrinsic(struct ac_nir_context *ctx, break; } case nir_intrinsic_load_base_vertex: { - result = ctx->abi->base_vertex; + result = ctx->abi->load_base_vertex(ctx->abi); break; } case nir_intrinsic_load_local_group_size: @@ -4634,6 +4634,11 @@ static void visit_intrinsic(struct ac_nir_context *ctx, } } +static LLVMValueRef radv_load_base_vertex(struct ac_shader_abi *abi) +{ + return abi->base_vertex; +} + static LLVMValueRef radv_load_ssbo(struct ac_shader_abi *abi, LLVMValueRef buffer_ptr, bool write) { @@ -6908,6 +6913,7 @@ LLVMModuleRef ac_translate_nir_to_llvm(LLVMTargetMachineRef tm, ctx.gs_max_out_vertices = shaders[i]->info.gs.vertices_out; ctx.abi.load_inputs = load_gs_input; ctx.abi.emit_primitive = visit_end_primitive; + ctx.abi.load_base_vertex = radv_load_base_vertex; } else if (shaders[i]->info.stage == MESA_SHADER_TESS_CTRL) { ctx.tcs_outputs_read = shaders[i]->info.outputs_read; ctx.tcs_patch_outputs_read = shaders[i]->info.patch_outputs_read; diff --git a/src/amd/common/ac_shader_abi.h b/src/amd/common/ac_shader_abi.h index 10d41ef997..09fe32c136 100644 --- a/src/amd/common/ac_shader_abi.h +++ b/src/amd/common/ac_shader_abi.h @@ -182,6 +182,8 @@ struct ac_shader_abi { LLVMValueRef (*load_sample_mask_in)(struct ac_shader_abi *abi); + LLVMValueRef (*load_base_vertex)(struct ac_shader_abi *abi); + /* Whether to clamp the shadow reference value to [0,1]on VI. Radeonsi currently * uses it due to promoting D16 to D32, but radv needs it off. */ bool clamp_shadow_reference; diff --git a/src/gallium/drivers/radeonsi/si_shader.c b/src/gallium/drivers/radeonsi/si_shader.c index aa9b50a7a2..2a50b266f6 100644 --- a/src/gallium/drivers/radeonsi/si_shader.c +++ b/src/gallium/drivers/radeonsi/si_shader.c @@ -6021,6 +6021,7 @@ static bool si_compile_tgsi_main(struct si_shader_context *ctx, else ctx->abi.emit_outputs = si_llvm_emit_vs_epilogue; bld_base->emit_epilogue = si_tgsi_emit_epilogue; + ctx->abi.load_base_vertex = get_base_vertex; break; case PIPE_SHADER_TESS_CTRL: bld_base->emit_fetch_funcs[TGSI_FILE_INPUT] = fetch_input_tcs; ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-commit
Mesa (master): radeonsi: create get_base_vertex() helper
Module: Mesa Branch: master Commit: 7f914734146a3008dc0e5b185f7ccab44a803bc9 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=7f914734146a3008dc0e5b185f7ccab44a803bc9 Author: Timothy Arceri <tarc...@itsqueeze.com> Date: Mon Feb 26 21:59:43 2018 +1100 radeonsi: create get_base_vertex() helper Reviewed-by: Samuel Pitoiset <samuel.pitoi...@gmail.com> Reviewed-by: Marek Olšák <marek.ol...@amd.com> --- src/gallium/drivers/radeonsi/si_shader.c | 34 +++- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/src/gallium/drivers/radeonsi/si_shader.c b/src/gallium/drivers/radeonsi/si_shader.c index b69c1bbb24..aa9b50a7a2 100644 --- a/src/gallium/drivers/radeonsi/si_shader.c +++ b/src/gallium/drivers/radeonsi/si_shader.c @@ -1908,6 +1908,25 @@ static LLVMValueRef get_sample_id(struct si_shader_context *ctx) return unpack_param(ctx, SI_PARAM_ANCILLARY, 8, 4); } +static LLVMValueRef get_base_vertex(struct ac_shader_abi *abi) +{ + struct si_shader_context *ctx = si_shader_context_from_abi(abi); + + /* For non-indexed draws, the base vertex set by the driver +* (for direct draws) or the CP (for indirect draws) is the +* first vertex ID, but GLSL expects 0 to be returned. +*/ + LLVMValueRef vs_state = LLVMGetParam(ctx->main_fn, +ctx->param_vs_state_bits); + LLVMValueRef indexed; + + indexed = LLVMBuildLShr(ctx->ac.builder, vs_state, ctx->i32_1, ""); + indexed = LLVMBuildTrunc(ctx->ac.builder, indexed, ctx->i1, ""); + + return LLVMBuildSelect(ctx->ac.builder, indexed, ctx->abi.base_vertex, + ctx->i32_0, ""); +} + static LLVMValueRef get_block_size(struct ac_shader_abi *abi) { struct si_shader_context *ctx = si_shader_context_from_abi(abi); @@ -2068,21 +2087,8 @@ void si_load_system_value(struct si_shader_context *ctx, break; case TGSI_SEMANTIC_BASEVERTEX: - { - /* For non-indexed draws, the base vertex set by the driver -* (for direct draws) or the CP (for indirect draws) is the -* first vertex ID, but GLSL expects 0 to be returned. -*/ - LLVMValueRef vs_state = LLVMGetParam(ctx->main_fn, ctx->param_vs_state_bits); - LLVMValueRef indexed; - - indexed = LLVMBuildLShr(ctx->ac.builder, vs_state, ctx->i32_1, ""); - indexed = LLVMBuildTrunc(ctx->ac.builder, indexed, ctx->i1, ""); - - value = LLVMBuildSelect(ctx->ac.builder, indexed, - ctx->abi.base_vertex, ctx->i32_0, ""); + value = get_base_vertex(>abi); break; - } case TGSI_SEMANTIC_BASEINSTANCE: value = ctx->abi.start_instance; ___ mesa-commit mailing list mesa-commit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-commit