+/* Helper function that conditionally creates a single-sample resolve resource
+ * and attaches it to main multisample resource. */
+static bool
+swr_create_resolve_resource(struct pipe_screen *_screen,
+ struct swr_resource *msaa_res)
+{
+ struct swr_screen *screen = swr_screen(_screen);
+
+ /* If resource is multisample, create a single-sample resolve resource */
+ if (msaa_res->base.nr_samples > 1 || (screen->msaa_force_enable &&
+ !(msaa_res->base.flags & SWR_RESOURCE_FLAG_ALT_SURFACE))) {
+
+ /* Create a single-sample copy of the resource. Copy the original
+ * resource parameters and set flag to prevent recursion when re-calling
+ * resource_create */
+ struct pipe_resource alt_template = msaa_res->base;
+ alt_template.nr_samples = 0;
+ alt_template.flags |= SWR_RESOURCE_FLAG_ALT_SURFACE;
+
+ /* Note: Display_target is a special single-sample resource, only the
+ * display_target has been created already. */
+ if (msaa_res->base.bind & (PIPE_BIND_DISPLAY_TARGET | PIPE_BIND_SCANOUT
+ | PIPE_BIND_SHARED)) {
+ /* Allocate the multisample buffers. */
+ if (!swr_texture_layout(screen, msaa_res, true))
+ return false;
+
+ /* Alt resource will only be bound as PIPE_BIND_RENDER_TARGET
+ * remove the DISPLAY_TARGET, SCANOUT, and SHARED bindings */
+ alt_template.bind = PIPE_BIND_RENDER_TARGET;
+ }
+
+ /* Allocate single-sample resolve surface */
+ struct pipe_resource *alt;
+ alt = _screen->resource_create(_screen, &alt_template);
+ if (!alt)
+ return false;
+
+ /* Attach it to the multisample resource */
+ msaa_res->resolve_target = alt;
+
+ /* Hang resolve surface state off the multisample surface state to so
+ * StoreTiles knows where to resolve the surface. */
+ msaa_res->swr.xpAuxBaseAddress = (gfxptr_t)&swr_resource(alt)->swr;
+ }
+
+ return true; /* success */
+}
+