diff --git a/docs/features.txt b/docs/features.txt
index 289477e0321..c0140aca3f8 100644
--- a/docs/features.txt
+++ b/docs/features.txt
@@ -353,6 +353,7 @@ Khronos, ARB, and OES extensions that are not part of any OpenGL or OpenGL ES ve
GL_OES_viewport_array DONE (freedreno/a6xx, nvc0, r600, radeonsi, softpipe, zink, iris, crocus/gen7.5+, asahi)
GL_OVR_multiview DONE (zink)
GL_OVR_multiview2 DONE (zink)
+ GL_OVR_multiview_multisampled_render_to_texture DONE (zink)
GLX_ARB_context_flush_control DONE (all drivers)
GLX_ARB_robustness_application_isolation not started
GLX_ARB_robustness_share_group_isolation not started
diff --git a/src/gallium/drivers/zink/ci/zink-lvp-validation-settings.txt b/src/gallium/drivers/zink/ci/zink-lvp-validation-settings.txt
index e3e3c5546df..41229bb16e8 100644
--- a/src/gallium/drivers/zink/ci/zink-lvp-validation-settings.txt
+++ b/src/gallium/drivers/zink/ci/zink-lvp-validation-settings.txt
@@ -1,6 +1,6 @@
# Please include a comment with the log message and a testcase triggering each
# VUID at the bottom of the file.
-khronos_validation.message_id_filter = VUID-VkPhysicalDeviceProperties2-pNext-pNext,VUID-VkDeviceCreateInfo-pNext-pNext,VUID-RuntimeSpirv-Location-06272,VUID-vkCmdDrawMultiEXT-None-02699,VUID-RuntimeSpirv-OpEntryPoint-08743,VUID-vkCmdPipelineBarrier2-shaderTileImageColorReadAccess-08718,VUID-VkGraphicsPipelineCreateInfo-flags-06482,VUID-vkCmdPipelineBarrier2-None-08719
+khronos_validation.message_id_filter = VUID-VkPhysicalDeviceProperties2-pNext-pNext,VUID-VkDeviceCreateInfo-pNext-pNext,VUID-RuntimeSpirv-Location-06272,VUID-vkCmdDrawMultiEXT-None-02699,VUID-RuntimeSpirv-OpEntryPoint-08743,VUID-vkCmdPipelineBarrier2-shaderTileImageColorReadAccess-08718,VUID-VkGraphicsPipelineCreateInfo-flags-06482,VUID-vkCmdPipelineBarrier2-None-08719,VUID-vkCmdDrawMultiEXT-rasterizationSamples-07474
khronos_validation.report_flags = error
khronos_validation.debug_action = VK_DBG_LAYER_ACTION_LOG_MSG,VK_DBG_LAYER_ACTION_BREAK
VK_LAYER_ENABLES=VK_VALIDATION_FEATURE_ENABLE_DEBUG_PRINTF_EXT
@@ -60,3 +60,6 @@ khronos_validation.log_filename = stdout
# VUID-vkCmdPipelineBarrier2-shaderTileImageColorReadAccess-08718
# VUID-VkGraphicsPipelineCreateInfo-flags-06482
# VUID-vkCmdPipelineBarrier2-None-08719
+
+# spec broken
+# VUID-vkCmdDrawMultiEXT-rasterizationSamples-07474
diff --git a/src/gallium/targets/osmesa/osmesa-symbols.txt b/src/gallium/targets/osmesa/osmesa-symbols.txt
index daf58d227b1..23fd1fa2547 100644
--- a/src/gallium/targets/osmesa/osmesa-symbols.txt
+++ b/src/gallium/targets/osmesa/osmesa-symbols.txt
@@ -333,6 +333,7 @@ glFramebufferTexture3DEXT
glFramebufferTextureLayer
glFramebufferTextureLayerEXT
glFramebufferTextureMultiviewOVR
+glFramebufferTextureMultisampleMultiviewOVR
glFrontFace
glFrustum
glFrustumf
diff --git a/src/mapi/glapi/gen/OVR_multiview_multisampled_render_to_texture.xml b/src/mapi/glapi/gen/OVR_multiview_multisampled_render_to_texture.xml
new file mode 100755
index 00000000000..4dc0d253ca5
--- /dev/null
+++ b/src/mapi/glapi/gen/OVR_multiview_multisampled_render_to_texture.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/mapi/glapi/gen/gl_API.xml b/src/mapi/glapi/gen/gl_API.xml
index 305c1fa558d..e356035dd9d 100644
--- a/src/mapi/glapi/gen/gl_API.xml
+++ b/src/mapi/glapi/gen/gl_API.xml
@@ -8064,6 +8064,8 @@
+
+
diff --git a/src/mapi/glapi/gen/static_data.py b/src/mapi/glapi/gen/static_data.py
index 97b64d9157d..6bebde08698 100644
--- a/src/mapi/glapi/gen/static_data.py
+++ b/src/mapi/glapi/gen/static_data.py
@@ -1710,6 +1710,7 @@ offsets = {
"TexStorageAttribs3DEXT": 1674,
"FramebufferTextureMultiviewOVR": 1675,
"NamedFramebufferTextureMultiviewOVR": 1676,
+ "FramebufferTextureMultisampleMultiviewOVR": 1677,
}
functions = [
@@ -2037,6 +2038,7 @@ functions = [
"FramebufferTextureLayer",
"FramebufferTextureLayerARB",
"FramebufferTextureLayerEXT",
+ "FramebufferTextureMultisampleMultiviewOVR",
"FramebufferTextureMultiviewOVR",
"FrontFace",
"Frustum",
diff --git a/src/mesa/main/consts_exts.h b/src/mesa/main/consts_exts.h
index f7c7c04be62..e0a5ed0c930 100644
--- a/src/mesa/main/consts_exts.h
+++ b/src/mesa/main/consts_exts.h
@@ -225,6 +225,7 @@ struct gl_extensions
GLboolean OES_viewport_array;
GLboolean OVR_multiview;
GLboolean OVR_multiview2;
+ GLboolean OVR_multiview_multisampled_render_to_texture;
/* vendor extensions */
GLboolean AMD_compressed_ATC_texture;
GLboolean AMD_framebuffer_multisample_advanced;
diff --git a/src/mesa/main/extensions_table.h b/src/mesa/main/extensions_table.h
index d38ef4a15ec..8c9117d60dd 100644
--- a/src/mesa/main/extensions_table.h
+++ b/src/mesa/main/extensions_table.h
@@ -507,6 +507,7 @@ EXT(OES_vertex_half_float , ARB_half_float_vertex
EXT(OES_viewport_array , OES_viewport_array , x , x , x , 31, 2010)
EXT(OVR_multiview , OVR_multiview , GLL, GLC, x , 30, 2018)
EXT(OVR_multiview2 , OVR_multiview2 , GLL, GLC, x , 30, 2018)
+EXT(OVR_multiview_multisampled_render_to_texture, OVR_multiview_multisampled_render_to_texture, GLL, GLC, x , 30, 2018)
EXT(S3_s3tc , ANGLE_texture_compression_dxt , GLL, GLC, x , x , 1999)
EXT(SGIS_generate_mipmap , dummy_true , GLL, x , x , x , 1997)
diff --git a/src/mesa/main/fbobject.c b/src/mesa/main/fbobject.c
index 2d242135a42..b2d6ec618ff 100644
--- a/src/mesa/main/fbobject.c
+++ b/src/mesa/main/fbobject.c
@@ -4217,7 +4217,7 @@ _mesa_FramebufferTexture3D(GLenum target, GLenum attachment,
static ALWAYS_INLINE void
frame_buffer_texture(GLuint framebuffer, GLenum target,
GLenum attachment, GLuint texture,
- GLint level, GLint layer, const char *func,
+ GLint level, GLsizei samples, GLint layer, const char *func,
bool dsa, bool no_error, bool check_layered, GLsizei numviews)
{
GET_CURRENT_CONTEXT(ctx);
@@ -4329,7 +4329,7 @@ frame_buffer_texture(GLuint framebuffer, GLenum target,
}
_mesa_framebuffer_texture(ctx, fb, attachment, att, texObj, textarget,
- level, 0, layer, layered, numviews);
+ level, samples, layer, layered, numviews);
}
@@ -4338,7 +4338,7 @@ _mesa_FramebufferTextureLayer_no_error(GLenum target, GLenum attachment,
GLuint texture, GLint level,
GLint layer)
{
- frame_buffer_texture(0, target, attachment, texture, level, layer,
+ frame_buffer_texture(0, target, attachment, texture, level, 0, layer,
"glFramebufferTextureLayer", false, true, false, 0);
}
@@ -4347,7 +4347,7 @@ void GLAPIENTRY
_mesa_FramebufferTextureLayer(GLenum target, GLenum attachment,
GLuint texture, GLint level, GLint layer)
{
- frame_buffer_texture(0, target, attachment, texture, level, layer,
+ frame_buffer_texture(0, target, attachment, texture, level, 0, layer,
"glFramebufferTextureLayer", false, false, false, 0);
}
@@ -4358,7 +4358,7 @@ _mesa_NamedFramebufferTextureLayer_no_error(GLuint framebuffer,
GLuint texture, GLint level,
GLint layer)
{
- frame_buffer_texture(framebuffer, 0, attachment, texture, level, layer,
+ frame_buffer_texture(framebuffer, 0, attachment, texture, level, 0, layer,
"glNamedFramebufferTextureLayer", true, true, false, 0);
}
@@ -4367,7 +4367,7 @@ void GLAPIENTRY
_mesa_NamedFramebufferTextureLayer(GLuint framebuffer, GLenum attachment,
GLuint texture, GLint level, GLint layer)
{
- frame_buffer_texture(framebuffer, 0, attachment, texture, level, layer,
+ frame_buffer_texture(framebuffer, 0, attachment, texture, level, 0, layer,
"glNamedFramebufferTextureLayer", true, false, false, 0);
}
@@ -4377,7 +4377,7 @@ _mesa_FramebufferTextureMultiviewOVR_no_error(GLenum target, GLenum attachment,
GLuint texture, GLint level,
GLint baseViewIndex, GLsizei numViews)
{
- frame_buffer_texture(0, target, attachment, texture, level, baseViewIndex,
+ frame_buffer_texture(0, target, attachment, texture, level, 0, baseViewIndex,
"glFramebufferTexture", false, true, false, numViews);
}
@@ -4387,17 +4387,37 @@ _mesa_FramebufferTextureMultiviewOVR(GLenum target, GLenum attachment,
GLuint texture, GLint level,
GLint baseViewIndex, GLsizei numViews)
{
- frame_buffer_texture(0, target, attachment, texture, level, baseViewIndex,
+ frame_buffer_texture(0, target, attachment, texture, level, 0, baseViewIndex,
"glFramebufferTexture", false, false, false, numViews);
}
+void GLAPIENTRY
+_mesa_FramebufferTextureMultisampleMultiviewOVR_no_error(GLenum target, GLenum attachment,
+ GLuint texture, GLint level, GLsizei samples,
+ GLint baseViewIndex, GLsizei numViews)
+{
+ frame_buffer_texture(0, target, attachment, texture, level, samples, baseViewIndex,
+ "FramebufferTextureMultisampleMultiviewOVR", false, true, false, numViews);
+}
+
+
+void GLAPIENTRY
+_mesa_FramebufferTextureMultisampleMultiviewOVR(GLenum target, GLenum attachment,
+ GLuint texture, GLint level, GLsizei samples,
+ GLint baseViewIndex, GLsizei numViews)
+{
+ frame_buffer_texture(0, target, attachment, texture, level, samples, baseViewIndex,
+ "FramebufferTextureMultisampleMultiviewOVR", false, false, false, numViews);
+}
+
+
void GLAPIENTRY
_mesa_NamedFramebufferTextureMultiviewOVR_no_error(GLuint framebuffer, GLenum attachment,
GLuint texture, GLint level,
GLint baseViewIndex, GLsizei numViews)
{
- frame_buffer_texture(framebuffer, 0, attachment, texture, level, baseViewIndex,
+ frame_buffer_texture(framebuffer, 0, attachment, texture, level, 0, baseViewIndex,
"glFramebufferTexture", true, true, false, numViews);
}
@@ -4407,7 +4427,7 @@ _mesa_NamedFramebufferTextureMultiviewOVR(GLuint framebuffer, GLenum attachment,
GLuint texture, GLint level,
GLint baseViewIndex, GLsizei numViews)
{
- frame_buffer_texture(framebuffer, 0, attachment, texture, level, baseViewIndex,
+ frame_buffer_texture(framebuffer, 0, attachment, texture, level, 0, baseViewIndex,
"glFramebufferTexture", true, false, false, numViews);
}
@@ -4416,7 +4436,7 @@ void GLAPIENTRY
_mesa_FramebufferTexture_no_error(GLenum target, GLenum attachment,
GLuint texture, GLint level)
{
- frame_buffer_texture(0, target, attachment, texture, level, 0,
+ frame_buffer_texture(0, target, attachment, texture, level, 0, 0,
"glFramebufferTexture", false, true, true, 0);
}
@@ -4425,7 +4445,7 @@ void GLAPIENTRY
_mesa_FramebufferTexture(GLenum target, GLenum attachment,
GLuint texture, GLint level)
{
- frame_buffer_texture(0, target, attachment, texture, level, 0,
+ frame_buffer_texture(0, target, attachment, texture, level, 0, 0,
"glFramebufferTexture", false, false, true, 0);
}
@@ -4433,7 +4453,7 @@ void GLAPIENTRY
_mesa_NamedFramebufferTexture_no_error(GLuint framebuffer, GLenum attachment,
GLuint texture, GLint level)
{
- frame_buffer_texture(framebuffer, 0, attachment, texture, level, 0,
+ frame_buffer_texture(framebuffer, 0, attachment, texture, level, 0, 0,
"glNamedFramebufferTexture", true, true, true, 0);
}
@@ -4442,7 +4462,7 @@ void GLAPIENTRY
_mesa_NamedFramebufferTexture(GLuint framebuffer, GLenum attachment,
GLuint texture, GLint level)
{
- frame_buffer_texture(framebuffer, 0, attachment, texture, level, 0,
+ frame_buffer_texture(framebuffer, 0, attachment, texture, level, 0, 0,
"glNamedFramebufferTexture", true, false, true, 0);
}
diff --git a/src/mesa/state_tracker/st_extensions.c b/src/mesa/state_tracker/st_extensions.c
index 907023b8f1f..650c831f992 100644
--- a/src/mesa/state_tracker/st_extensions.c
+++ b/src/mesa/state_tracker/st_extensions.c
@@ -1297,6 +1297,9 @@ void st_init_extensions(struct pipe_screen *screen,
break;
}
+ extensions->OVR_multiview_multisampled_render_to_texture = extensions->EXT_multisampled_render_to_texture &&
+ extensions->OVR_multiview;
+
if (screen->get_param(screen, PIPE_CAP_OPENCL_INTEGER_FUNCTIONS) &&
screen->get_param(screen, PIPE_CAP_INTEGER_MULTIPLY_32X16)) {
extensions->INTEL_shader_integer_functions2 = GL_TRUE;