Browse Source

dxgsg9: Implement ability to get screenshot from multisample backbuffer

Fixes #1225
rdb 4 years ago
parent
commit
ecc6fb6b0c
1 changed files with 29 additions and 0 deletions
  1. 29 0
      panda/src/dxgsg9/dxGraphicsStateGuardian9.cxx

+ 29 - 0
panda/src/dxgsg9/dxGraphicsStateGuardian9.cxx

@@ -2070,6 +2070,35 @@ do_framebuffer_copy_to_ram(Texture *tex, int view, int z,
 
     backbuffer -> GetDesc (&surface_description);
 
+    // We can't directly call GetRenderTargetData on a multisampled buffer.
+    // Instead, blit it into a temporary target.
+    if (surface_description.MultiSampleType != D3DMULTISAMPLE_NONE) {
+      IDirect3DSurface9 *resolved;
+      hr = _d3d_device->CreateRenderTarget(surface_description.Width,
+                                           surface_description.Height,
+                                           surface_description.Format,
+                                           D3DMULTISAMPLE_NONE, 0, FALSE,
+                                           &resolved, nullptr);
+      if (FAILED(hr)) {
+        dxgsg9_cat.error()
+          << "CreateRenderTarget failed" << D3DERRORSTRING(hr) << "\n";
+        backbuffer->Release();
+        return false;
+      }
+
+      _d3d_device->StretchRect(backbuffer, nullptr, resolved, nullptr, D3DTEXF_NONE);
+      if (FAILED(hr)) {
+        dxgsg9_cat.error()
+          << "StretchRect failed" << D3DERRORSTRING(hr) << "\n";
+        backbuffer->Release();
+        resolved->Release();
+        return false;
+      }
+
+      backbuffer->Release();
+      backbuffer = resolved;
+    }
+
     pool = D3DPOOL_SYSTEMMEM;
     hr = _d3d_device->CreateOffscreenPlainSurface(
                                                   surface_description.Width,