From 0dd9d6cbb9dfa8cc7a464997388b54691a1cf1a1 Mon Sep 17 00:00:00 2001 From: Danylo Piliaiev Date: Thu, 14 Mar 2019 15:35:21 -0700 Subject: [PATCH 1/2] glsl: Cross validate variable's invariance by explicit invariance only 'invariant' qualifier is propagated on variables which are used to calculate other invariant variables, however when we are matching variable's declarations we should take into account only explicitly declared invariance because invariance propagation is an implementation specific detail. Thus new flag is added to ir_variable_data which indicates 'invariant' qualifier being explicitly set in the shader. Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=100316 Signed-off-by: Danylo Piliaiev Signed-off-by: Dongwon Kim --- src/compiler/glsl/ast_to_hir.cpp | 8 ++++++-- src/compiler/glsl/ir.cpp | 1 + src/compiler/glsl/ir.h | 13 +++++++++++++ src/compiler/glsl/ir_reader.cpp | 3 ++- src/compiler/glsl/link_varyings.cpp | 6 +++--- src/compiler/glsl/linker.cpp | 2 +- 6 files changed, 26 insertions(+), 7 deletions(-) diff --git a/src/compiler/glsl/ast_to_hir.cpp b/src/compiler/glsl/ast_to_hir.cpp index dd60a2a87fd..859801de5b0 100644 --- a/src/compiler/glsl/ast_to_hir.cpp +++ b/src/compiler/glsl/ast_to_hir.cpp @@ -3925,7 +3925,8 @@ apply_type_qualifier_to_variable(const struct ast_type_qualifier *qual, "`invariant' after being used", var->name); } else { - var->data.invariant = 1; + var->data.explicit_invariant = true; + var->data.invariant = true; } } @@ -4133,8 +4134,10 @@ apply_type_qualifier_to_variable(const struct ast_type_qualifier *qual, } } - if (state->all_invariant && var->data.mode == ir_var_shader_out) + if (state->all_invariant && var->data.mode == ir_var_shader_out) { + var->data.explicit_invariant = true; var->data.invariant = true; + } var->data.interpolation = interpret_interpolation_qualifier(qual, var->type, @@ -4845,6 +4848,7 @@ ast_declarator_list::hir(exec_list *instructions, "`invariant' after being used", earlier->name); } else { + earlier->data.explicit_invariant = true; earlier->data.invariant = true; } } diff --git a/src/compiler/glsl/ir.cpp b/src/compiler/glsl/ir.cpp index e3134eaa1c8..00e8ec72b11 100644 --- a/src/compiler/glsl/ir.cpp +++ b/src/compiler/glsl/ir.cpp @@ -1706,6 +1706,7 @@ ir_variable::ir_variable(const struct glsl_type *type, const char *name, this->data.centroid = false; this->data.sample = false; this->data.patch = false; + this->data.explicit_invariant = false; this->data.invariant = false; this->data.how_declared = ir_var_declared_normally; this->data.mode = mode; diff --git a/src/compiler/glsl/ir.h b/src/compiler/glsl/ir.h index 67b38f48eff..3a0ce72480f 100644 --- a/src/compiler/glsl/ir.h +++ b/src/compiler/glsl/ir.h @@ -657,6 +657,19 @@ class ir_variable : public ir_instruction { unsigned centroid:1; unsigned sample:1; unsigned patch:1; + /** + * Was an 'invariant' qualifier explicitly set in the shader? + * + * This is used to cross validate qualifiers. + */ + unsigned explicit_invariant:1; + /** + * Is the variable invariant? + * + * It can happen either by having the 'invariant' qualifier + * explicitly set in the shader or by being used in calculations + * of other invariant variables. + */ unsigned invariant:1; unsigned precise:1; diff --git a/src/compiler/glsl/ir_reader.cpp b/src/compiler/glsl/ir_reader.cpp index b87933ba511..b3397a4e4cf 100644 --- a/src/compiler/glsl/ir_reader.cpp +++ b/src/compiler/glsl/ir_reader.cpp @@ -420,7 +420,8 @@ ir_reader::read_declaration(s_expression *expr) } else if (strcmp(qualifier->value(), "patch") == 0) { var->data.patch = 1; } else if (strcmp(qualifier->value(), "invariant") == 0) { - var->data.invariant = 1; + var->data.explicit_invariant = true; + var->data.invariant = true; } else if (strcmp(qualifier->value(), "uniform") == 0) { var->data.mode = ir_var_uniform; } else if (strcmp(qualifier->value(), "shader_storage") == 0) { diff --git a/src/compiler/glsl/link_varyings.cpp b/src/compiler/glsl/link_varyings.cpp index 211633d9ee3..28bb2ca0e33 100644 --- a/src/compiler/glsl/link_varyings.cpp +++ b/src/compiler/glsl/link_varyings.cpp @@ -308,16 +308,16 @@ cross_validate_types_and_qualifiers(struct gl_context *ctx, * "The invariance of varyings that are declared in both the vertex * and fragment shaders must match." */ - if (input->data.invariant != output->data.invariant && + if (input->data.explicit_invariant != output->data.explicit_invariant && prog->data->Version < (prog->IsES ? 300 : 430)) { linker_error(prog, "%s shader output `%s' %s invariant qualifier, " "but %s shader input %s invariant qualifier\n", _mesa_shader_stage_to_string(producer_stage), output->name, - (output->data.invariant) ? "has" : "lacks", + (output->data.explicit_invariant) ? "has" : "lacks", _mesa_shader_stage_to_string(consumer_stage), - (input->data.invariant) ? "has" : "lacks"); + (input->data.explicit_invariant) ? "has" : "lacks"); return; } diff --git a/src/compiler/glsl/linker.cpp b/src/compiler/glsl/linker.cpp index 95e7c3c5e99..941659c3717 100644 --- a/src/compiler/glsl/linker.cpp +++ b/src/compiler/glsl/linker.cpp @@ -1087,7 +1087,7 @@ cross_validate_globals(struct gl_context *ctx, struct gl_shader_program *prog, } } - if (existing->data.invariant != var->data.invariant) { + if (existing->data.explicit_invariant != var->data.explicit_invariant) { linker_error(prog, "declarations for %s `%s' have " "mismatching invariant qualifiers\n", mode_string(var), var->name); From 2a9a699a301defa542e03f202937a7590c0749c5 Mon Sep 17 00:00:00 2001 From: "Xiong, James" Date: Fri, 17 May 2019 11:20:05 -0700 Subject: [PATCH 2/2] i965: handle batch or state mapping failures in submit_batch validate the addresses after mapping batch and state buffers, and fail the submission if any of mapping failed. Signed-off-by: Xiong, James --- src/mesa/drivers/dri/i965/intel_batchbuffer.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/mesa/drivers/dri/i965/intel_batchbuffer.c b/src/mesa/drivers/dri/i965/intel_batchbuffer.c index df999ffeb1d..e7370f004f8 100644 --- a/src/mesa/drivers/dri/i965/intel_batchbuffer.c +++ b/src/mesa/drivers/dri/i965/intel_batchbuffer.c @@ -742,11 +742,18 @@ submit_batch(struct brw_context *brw, int in_fence_fd, int *out_fence_fd) int ret = 0; if (batch->use_shadow_copy) { - void *bo_map = brw_bo_map(brw, batch->batch.bo, MAP_WRITE); - memcpy(bo_map, batch->batch.map, 4 * USED_BATCH(*batch)); + void *state_map, *batch_map = brw_bo_map(brw, batch->batch.bo, MAP_WRITE); + if(batch_map == NULL) + return -1; + + state_map = brw_bo_map(brw, batch->state.bo, MAP_WRITE); + if (state_map == NULL) { + brw_bo_unmap(batch->batch.bo); + return -1; + } - bo_map = brw_bo_map(brw, batch->state.bo, MAP_WRITE); - memcpy(bo_map, batch->state.map, batch->state_used); + memcpy(batch_map, batch->batch.map, 4 * USED_BATCH(*batch)); + memcpy(state_map, batch->state.map, batch->state_used); } brw_bo_unmap(batch->batch.bo);