freedreno/a6xx: fix hang with large render target
[mesa.git] / src / gallium / drivers / svga / svga_resource.c
index 6a297a2ae024b529ccce861129beb5e754eca7e8..320d42dd535c5a9d8a05047198b89f50b669d6ee 100644 (file)
 #include "svga_format.h"
 
 
+/**
+ * This is the primary driver entrypoint for allocating graphics memory
+ * (vertex/index/constant buffers, textures, etc)
+ */
 static struct pipe_resource *
 svga_resource_create(struct pipe_screen *screen,
                      const struct pipe_resource *template)
 {
+   struct pipe_resource *r;
+
    if (template->target == PIPE_BUFFER)
-      return svga_buffer_create(screen, template);
+      r = svga_buffer_create(screen, template);
    else
-      return svga_texture_create(screen, template);
+      r = svga_texture_create(screen, template);
+
+   if (!r) {
+      struct svga_screen *svgascreen = svga_screen(screen);
+      svgascreen->hud.num_failed_allocations++;
+   }
+
+   return r;
 }
 
 
@@ -62,7 +75,7 @@ svga_resource_from_handle(struct pipe_screen * screen,
  * and format can be created.
  * \Return TRUE if OK, FALSE if too large.
  */
-static boolean
+static bool
 svga_can_create_resource(struct pipe_screen *screen,
                          const struct pipe_resource *res)
 {
@@ -72,6 +85,7 @@ svga_can_create_resource(struct pipe_screen *screen,
    SVGA3dSize base_level_size;
    uint32 numMipLevels;
    uint32 arraySize;
+   uint32 numSamples;
 
    if (res->target == PIPE_BUFFER) {
       format = SVGA3D_BUFFER;
@@ -80,6 +94,7 @@ svga_can_create_resource(struct pipe_screen *screen,
       base_level_size.depth = 1;
       numMipLevels = 1;
       arraySize = 1;
+      numSamples = 0;
 
    } else {
       if (res->target == PIPE_TEXTURE_CUBE)
@@ -87,17 +102,18 @@ svga_can_create_resource(struct pipe_screen *screen,
 
       format = svga_translate_format(svgascreen, res->format, res->bind);
       if (format == SVGA3D_FORMAT_INVALID)
-         return FALSE;
+         return false;
 
       base_level_size.width = res->width0;
       base_level_size.height = res->height0;
       base_level_size.depth = res->depth0;
       numMipLevels = res->last_level + 1;
       arraySize = res->array_size;
+      numSamples = res->nr_samples;
    }
 
    return sws->surface_can_create(sws, format, base_level_size, 
-                                  arraySize, numMipLevels);
+                                  arraySize, numMipLevels, numSamples);
 }