iris: Avoid croaking when trying to create FBO surfaces with bad formats
authorKenneth Graunke <kenneth@whitecape.org>
Thu, 26 Jul 2018 08:06:27 +0000 (01:06 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Thu, 21 Feb 2019 18:26:08 +0000 (10:26 -0800)
create_surface happens before st_validate_attachment, which actually
does the "hey, this is a render target now, is that OK?" check

Fixes asserts in ./bin/arb_texture_view-rendering-formats, allowing the
rest of the tests to run.

src/gallium/drivers/iris/iris_state.c

index a74c80f2bd7dce0ef15e2efa2c9fc92a0ddd1266..d5669d0f6e52b38f014a252eb4d5a52e9185c530 100644 (file)
@@ -1091,6 +1091,7 @@ iris_create_surface(struct pipe_context *ctx,
 {
    struct iris_context *ice = (struct iris_context *) ctx;
    struct iris_screen *screen = (struct iris_screen *)ctx->screen;
+   const struct gen_device_info *devinfo = &screen->devinfo;
    struct iris_surface *surf = calloc(1, sizeof(struct iris_surface));
    struct pipe_surface *psurf = &surf->pipe;
    struct iris_resource *res = (struct iris_resource *) tex;
@@ -1109,16 +1110,28 @@ iris_create_surface(struct pipe_context *ctx,
    psurf->u.tex.last_layer = tmpl->u.tex.last_layer;
    psurf->u.tex.level = tmpl->u.tex.level;
 
+   enum isl_format isl_format = iris_isl_format_for_pipe_format(psurf->format);
+
    unsigned usage = 0;
    if (tmpl->writable)
       usage = ISL_SURF_USAGE_STORAGE_BIT;
    else if (util_format_is_depth_or_stencil(tmpl->format))
       usage = ISL_SURF_USAGE_DEPTH_BIT;
-   else
+   else {
       usage = ISL_SURF_USAGE_RENDER_TARGET_BIT;
 
+      if (!isl_format_supports_rendering(devinfo, isl_format)) {
+         /* Framebuffer validation will reject this invalid case, but it
+          * hasn't had the opportunity yet.  In the meantime, we need to
+          * avoid hitting ISL asserts about unsupported formats below.
+          */
+         free(surf);
+         return NULL;
+      }
+   }
+
    surf->view = (struct isl_view) {
-      .format = iris_isl_format_for_pipe_format(tmpl->format),
+      .format = isl_format,
       .base_level = tmpl->u.tex.level,
       .levels = 1,
       .base_array_layer = tmpl->u.tex.first_layer,