diff --git a/renderdoc/driver/gl/gl_common.cpp b/renderdoc/driver/gl/gl_common.cpp index 6c93520d9..1642fd76f 100644 --- a/renderdoc/driver/gl/gl_common.cpp +++ b/renderdoc/driver/gl/gl_common.cpp @@ -794,7 +794,10 @@ bool GLInitParams::IsSupportedVersion(uint64_t ver) if(ver == CurrentVersion) return true; - // we can check other older versions we support here. + // 0x1A -> 0x1B - supported MSAA and Multiview framebuffer attachments, which added + // number of samples, number of views, and base view index to the serialized data + if(ver == 0x1A) + return true; return false; } diff --git a/renderdoc/driver/gl/gl_common.h b/renderdoc/driver/gl/gl_common.h index 8045ece0e..eaaf7f032 100644 --- a/renderdoc/driver/gl/gl_common.h +++ b/renderdoc/driver/gl/gl_common.h @@ -457,7 +457,9 @@ extern bool IsGLES; EXT_TO_CHECK(99, 99, NV_read_depth) \ EXT_TO_CHECK(99, 99, NV_read_stencil) \ EXT_TO_CHECK(99, 99, NV_read_depth_stencil) \ - EXT_TO_CHECK(99, 99, EXT_disjoint_timer_query) + EXT_TO_CHECK(99, 99, EXT_disjoint_timer_query) \ + EXT_TO_CHECK(99, 99, EXT_multisampled_render_to_texture) \ + EXT_TO_CHECK(99, 99, OVR_multiview) // GL extensions equivalents // Either promoted extensions from EXT to ARB, or diff --git a/renderdoc/driver/gl/gl_driver.h b/renderdoc/driver/gl/gl_driver.h index 5da2aee30..b0daaa1f5 100644 --- a/renderdoc/driver/gl/gl_driver.h +++ b/renderdoc/driver/gl/gl_driver.h @@ -53,7 +53,7 @@ struct GLInitParams uint32_t height; // check if a frame capture section version is supported - static const uint64_t CurrentVersion = 0x1A; + static const uint64_t CurrentVersion = 0x1B; static bool IsSupportedVersion(uint64_t ver); }; diff --git a/renderdoc/driver/gl/gl_initstate.cpp b/renderdoc/driver/gl/gl_initstate.cpp index 7d1e2d9e3..27d204814 100644 --- a/renderdoc/driver/gl/gl_initstate.cpp +++ b/renderdoc/driver/gl/gl_initstate.cpp @@ -77,6 +77,18 @@ void DoSerialise(SerialiserType &ser, FramebufferAttachmentData &el) SERIALISE_MEMBER(layered); SERIALISE_MEMBER(layer); SERIALISE_MEMBER(level); + if(ser.VersionAtLeast(0x1B)) + { + SERIALISE_MEMBER(numVirtualSamples); + SERIALISE_MEMBER(numViews); + SERIALISE_MEMBER(startView); + } + else if(ser.IsReading()) + { + el.numVirtualSamples = 1; + el.numViews = 1; + el.startView = 0; + } SERIALISE_MEMBER(obj); } @@ -200,6 +212,20 @@ void GLResourceManager::ContextPrepare_InitialState(GLResource res) if(layered == 0) gl.glGetNamedFramebufferAttachmentParameterivEXT( res.name, attachment, eGL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER, &a.layer); + + if(HasExt[EXT_multisampled_render_to_texture]) + gl.glGetNamedFramebufferAttachmentParameterivEXT( + res.name, attachment, eGL_FRAMEBUFFER_ATTACHMENT_TEXTURE_SAMPLES_EXT, + &a.numVirtualSamples); + + if(HasExt[OVR_multiview]) + { + gl.glGetNamedFramebufferAttachmentParameterivEXT( + res.name, attachment, eGL_FRAMEBUFFER_ATTACHMENT_TEXTURE_NUM_VIEWS_OVR, &a.numViews); + gl.glGetNamedFramebufferAttachmentParameterivEXT( + res.name, attachment, eGL_FRAMEBUFFER_ATTACHMENT_TEXTURE_BASE_VIEW_INDEX_OVR, + &a.startView); + } } a.layered = (layered != 0); @@ -1999,7 +2025,30 @@ void GLResourceManager::Apply_InitialState(GLResource live, GLInitialContents in details.curType == eGL_TEXTURE_1D_ARRAY || details.curType == eGL_TEXTURE_2D_ARRAY) { - gl.glFramebufferTextureLayer(eGL_DRAW_FRAMEBUFFER, attachment, obj, a.level, a.layer); + if(a.numViews > 1) + { + if(a.numVirtualSamples > 1) + { + gl.glFramebufferTextureMultisampleMultiviewOVR(eGL_DRAW_FRAMEBUFFER, attachment, + obj, a.level, a.numVirtualSamples, + a.startView, a.numViews); + } + else + { + gl.glFramebufferTextureMultiviewOVR(eGL_DRAW_FRAMEBUFFER, attachment, obj, + a.level, a.startView, a.numViews); + } + } + else + { + gl.glFramebufferTextureLayer(eGL_DRAW_FRAMEBUFFER, attachment, obj, a.level, a.layer); + } + } + else if(a.numVirtualSamples > 1) + { + gl.glFramebufferTexture2DMultisampleEXT(eGL_DRAW_FRAMEBUFFER, attachment, + details.curType, obj, a.level, + a.numVirtualSamples); } else { diff --git a/renderdoc/driver/gl/gl_initstate.h b/renderdoc/driver/gl/gl_initstate.h index f6377d131..83f56807d 100644 --- a/renderdoc/driver/gl/gl_initstate.h +++ b/renderdoc/driver/gl/gl_initstate.h @@ -78,6 +78,10 @@ struct FramebufferAttachmentData bool layered; int32_t layer; int32_t level; + int32_t numVirtualSamples; // number of samples for mobile MSAA framebuffers, where the tiler + // resolves into non-msaa textures + int32_t numViews; // number of views for multiview framebuffers + int32_t startView; // index of the first view for multiview framebuffers GLResource obj; };