summaryrefslogtreecommitdiffstats
path: root/src/gallium/drivers
diff options
context:
space:
mode:
authorNanley Chery <[email protected]>2019-10-25 15:38:18 -0700
committerSagar Ghuge <[email protected]>2019-10-29 14:46:15 -0700
commitf0ed86c6c621e227ecd7e680deac2e04cb9be9a0 (patch)
tree4027eb2d3b83992c99379fdb7e91db398570a6d2 /src/gallium/drivers
parent8b62e3d9788ad72cb74263126d5119db8b379463 (diff)
iris: Bail resource creation upon aux creation error
The functions used during aux buffer configuration and creation only return false for exceptional errors. Don't proceed with surface creation in those cases. Reviewed-by: Jordan Justen <[email protected]>
Diffstat (limited to 'src/gallium/drivers')
-rw-r--r--src/gallium/drivers/iris/iris_resource.c33
1 files changed, 17 insertions, 16 deletions
diff --git a/src/gallium/drivers/iris/iris_resource.c b/src/gallium/drivers/iris/iris_resource.c
index b598e5c69fa..294044f82f1 100644
--- a/src/gallium/drivers/iris/iris_resource.c
+++ b/src/gallium/drivers/iris/iris_resource.c
@@ -428,6 +428,9 @@ want_ccs_e_for_format(const struct gen_device_info *devinfo,
* Configure aux for the resource, but don't allocate it. For images which
* might be shared with modifiers, we must allocate the image and aux data in
* a single bo.
+ *
+ * Returns false on unexpected error (e.g. allocation failed, or invalid
+ * configuration result).
*/
static bool
iris_resource_configure_aux(struct iris_screen *screen,
@@ -594,6 +597,8 @@ iris_resource_configure_aux(struct iris_screen *screen,
/**
* Initialize the aux buffer contents.
+ *
+ * Returns false on unexpected error (e.g. mapping a BO failed).
*/
static bool
iris_resource_init_aux_buf(struct iris_resource *res, uint32_t alloc_flags,
@@ -602,10 +607,8 @@ iris_resource_init_aux_buf(struct iris_resource *res, uint32_t alloc_flags,
if (!(alloc_flags & BO_ALLOC_ZEROED)) {
void *map = iris_bo_map(NULL, res->aux.bo, MAP_WRITE | MAP_RAW);
- if (!map) {
- iris_resource_disable_aux(res);
+ if (!map)
return false;
- }
if (iris_resource_get_aux_state(res, 0, 0) != ISL_AUX_STATE_AUX_INVALID) {
uint8_t memset_value = isl_aux_usage_has_mcs(res->aux.usage) ? 0xFF : 0;
@@ -645,6 +648,9 @@ iris_resource_init_aux_buf(struct iris_resource *res, uint32_t alloc_flags,
/**
* Allocate the initial aux surface for a resource based on aux.usage
+ *
+ * Returns false on unexpected error (e.g. allocation failed, or invalid
+ * configuration result).
*/
static bool
iris_resource_alloc_separate_aux(struct iris_screen *screen,
@@ -845,10 +851,12 @@ iris_resource_create_with_modifiers(struct pipe_screen *pscreen,
uint32_t aux_preferred_alloc_flags;
uint64_t aux_size = 0;
- bool aux_enabled =
- iris_resource_configure_aux(screen, res, false, &aux_size,
- &aux_preferred_alloc_flags);
- aux_enabled = aux_enabled && res->aux.surf.size_B > 0;
+ if (!iris_resource_configure_aux(screen, res, false, &aux_size,
+ &aux_preferred_alloc_flags)) {
+ goto fail;
+ }
+
+ const bool aux_enabled = res->aux.surf.size_B > 0;
const bool separate_aux = aux_enabled && !res->mod_info;
uint64_t aux_offset;
uint64_t bo_size;
@@ -876,7 +884,7 @@ iris_resource_create_with_modifiers(struct pipe_screen *pscreen,
if (aux_enabled) {
if (separate_aux) {
if (!iris_resource_alloc_separate_aux(screen, res))
- aux_enabled = false;
+ goto fail;
} else {
res->aux.bo = res->bo;
iris_bo_reference(res->aux.bo);
@@ -886,18 +894,11 @@ iris_resource_create_with_modifiers(struct pipe_screen *pscreen,
if (clear_color_state_size > 0)
res->aux.clear_color_offset += aux_offset;
if (!iris_resource_init_aux_buf(res, flags, clear_color_state_size))
- aux_enabled = false;
+ goto fail;
map_aux_addresses(screen, res);
}
}
- if (!aux_enabled) {
- if (res->mod_info && res->mod_info->aux_usage != ISL_AUX_USAGE_NONE)
- goto fail;
- else
- iris_resource_disable_aux(res);
- }
-
return &res->base;
fail: