summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/mapi/glapi/gen/EXT_multisampled_render_to_texture.xml34
-rw-r--r--src/mapi/glapi/gen/Makefile.am1
-rw-r--r--src/mapi/glapi/gen/gl_API.xml2
-rw-r--r--src/mapi/glapi/gen/meson.build1
-rw-r--r--src/mesa/drivers/common/meta.c2
-rw-r--r--src/mesa/main/extensions_table.h2
-rw-r--r--src/mesa/main/fbobject.c57
-rw-r--r--src/mesa/main/fbobject.h8
-rw-r--r--src/mesa/main/glheader.h3
-rw-r--r--src/mesa/main/mtypes.h2
10 files changed, 96 insertions, 16 deletions
diff --git a/src/mapi/glapi/gen/EXT_multisampled_render_to_texture.xml b/src/mapi/glapi/gen/EXT_multisampled_render_to_texture.xml
new file mode 100644
index 00000000000..555b008bd33
--- /dev/null
+++ b/src/mapi/glapi/gen/EXT_multisampled_render_to_texture.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0"?>
+<!DOCTYPE OpenGLAPI SYSTEM "gl_API.dtd">
+
+<OpenGLAPI>
+
+<category name="GL_EXT_multisampled_render_to_texture" number="106">
+
+ <enum name="RENDERBUFFER_SAMPLES_EXT" value="0x8CAB"/>
+ <enum name="FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT" value="0x8D56"/>
+ <enum name="MAX_SAMPLES_EXT" value="0x8D57"/>
+ <enum name="FRAMEBUFFER_ATTACHMENT_TEXTURE_SAMPLES_EXT" value="0x8D6C"/>
+
+<!-- Already defined in EXT_framebuffer_object.xml
+ <function name="RenderbufferStorageMultisampleEXT" es2="2.0">
+ <param name="target" type="GLenum"/>
+ <param name="samples" type="GLsizei"/>
+ <param name="internalformat" type="GLenum"/>
+ <param name="width" type="GLsizei"/>
+ <param name="height" type="GLsizei"/>
+ </function>
+-->
+
+ <function name="FramebufferTexture2DMultisampleEXT" es2="2.0">
+ <param name="target" type="GLenum"/>
+ <param name="attachment" type="GLenum"/>
+ <param name="textarget" type="GLenum"/>
+ <param name="texture" type="GLuint"/>
+ <param name="level" type="GLint"/>
+ <param name="samples" type="GLsizei"/>
+ </function>
+
+</category>
+
+</OpenGLAPI>
diff --git a/src/mapi/glapi/gen/Makefile.am b/src/mapi/glapi/gen/Makefile.am
index 6e0ee1e1687..40538b0ff2e 100644
--- a/src/mapi/glapi/gen/Makefile.am
+++ b/src/mapi/glapi/gen/Makefile.am
@@ -200,6 +200,7 @@ API_XML = \
EXT_external_objects_fd.xml \
EXT_framebuffer_object.xml \
EXT_gpu_shader4.xml \
+ EXT_multisampled_render_to_texture.xml \
EXT_packed_depth_stencil.xml \
EXT_provoking_vertex.xml \
EXT_separate_shader_objects.xml \
diff --git a/src/mapi/glapi/gen/gl_API.xml b/src/mapi/glapi/gen/gl_API.xml
index f4d0808f13b..f1def8090de 100644
--- a/src/mapi/glapi/gen/gl_API.xml
+++ b/src/mapi/glapi/gen/gl_API.xml
@@ -8175,6 +8175,8 @@
<xi:include href="ARB_robustness.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>
+<xi:include href="EXT_multisampled_render_to_texture.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>
+
<xi:include href="ARB_base_instance.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>
<category name="GL_ARB_transform_feedback_instanced" number="109">
diff --git a/src/mapi/glapi/gen/meson.build b/src/mapi/glapi/gen/meson.build
index f494e9707b6..8cc163b2989 100644
--- a/src/mapi/glapi/gen/meson.build
+++ b/src/mapi/glapi/gen/meson.build
@@ -107,6 +107,7 @@ api_xml_files = files(
'EXT_external_objects_fd.xml',
'EXT_framebuffer_object.xml',
'EXT_gpu_shader4.xml',
+ 'EXT_multisampled_render_to_texture.xml',
'EXT_packed_depth_stencil.xml',
'EXT_provoking_vertex.xml',
'EXT_separate_shader_objects.xml',
diff --git a/src/mesa/drivers/common/meta.c b/src/mesa/drivers/common/meta.c
index 4392c4bbd88..3515e312023 100644
--- a/src/mesa/drivers/common/meta.c
+++ b/src/mesa/drivers/common/meta.c
@@ -127,7 +127,7 @@ _mesa_meta_framebuffer_texture_image(struct gl_context *ctx,
assert(att);
_mesa_framebuffer_texture(ctx, fb, attachment, att, texObj, texTarget,
- level, layer, false);
+ level, att->NumSamples, layer, false);
}
static struct gl_shader *
diff --git a/src/mesa/main/extensions_table.h b/src/mesa/main/extensions_table.h
index 7e45ffe4047..dad38124d57 100644
--- a/src/mesa/main/extensions_table.h
+++ b/src/mesa/main/extensions_table.h
@@ -242,6 +242,8 @@ EXT(EXT_map_buffer_range , ARB_map_buffer_range
EXT(EXT_memory_object , EXT_memory_object , GLL, GLC, x , ES2, 2017)
EXT(EXT_memory_object_fd , EXT_memory_object_fd , GLL, GLC, x , ES2, 2017)
EXT(EXT_multi_draw_arrays , dummy_true , GLL, x , ES1, ES2, 1999)
+EXT(EXT_multisampled_render_to_texture , EXT_multisampled_render_to_texture , x , x , x , ES2, 2016)
+EXT(EXT_multisampled_render_to_texture2 , EXT_multisampled_render_to_texture , x , x , x , ES2, 2016)
EXT(EXT_occlusion_query_boolean , ARB_occlusion_query2 , x , x , x , ES2, 2011)
EXT(EXT_packed_depth_stencil , dummy_true , GLL, GLC, x , x , 2005)
EXT(EXT_packed_float , EXT_packed_float , GLL, GLC, x , x , 2004)
diff --git a/src/mesa/main/fbobject.c b/src/mesa/main/fbobject.c
index 68e0daf3423..23e49396199 100644
--- a/src/mesa/main/fbobject.c
+++ b/src/mesa/main/fbobject.c
@@ -497,8 +497,8 @@ set_texture_attachment(struct gl_context *ctx,
struct gl_framebuffer *fb,
struct gl_renderbuffer_attachment *att,
struct gl_texture_object *texObj,
- GLenum texTarget, GLuint level, GLuint layer,
- GLboolean layered)
+ GLenum texTarget, GLuint level, GLsizei samples,
+ GLuint layer, GLboolean layered)
{
struct gl_renderbuffer *rb = att->Renderbuffer;
@@ -520,6 +520,7 @@ set_texture_attachment(struct gl_context *ctx,
/* always update these fields */
att->TextureLevel = level;
+ att->NumSamples = samples;
att->CubeMapFace = _mesa_tex_target_to_face(texTarget);
att->Zoffset = layer;
att->Layered = layered;
@@ -1085,8 +1086,11 @@ _mesa_test_framebuffer_completeness(struct gl_context *ctx,
return;
}
- attNumSamples = texImg->NumSamples;
- attNumStorageSamples = texImg->NumSamples;
+ if (att->NumSamples > 0)
+ attNumSamples = att->NumSamples;
+ else
+ attNumSamples = texImg->NumSamples;
+ attNumStorageSamples = attNumSamples;
}
else if (att->Type == GL_RENDERBUFFER_EXT) {
minWidth = MIN2(minWidth, att->Renderbuffer->Width);
@@ -3498,7 +3502,8 @@ _mesa_framebuffer_texture(struct gl_context *ctx, struct gl_framebuffer *fb,
GLenum attachment,
struct gl_renderbuffer_attachment *att,
struct gl_texture_object *texObj, GLenum textarget,
- GLint level, GLuint layer, GLboolean layered)
+ GLint level, GLsizei samples,
+ GLuint layer, GLboolean layered)
{
FLUSH_VERTICES(ctx, _NEW_BUFFERS);
@@ -3509,6 +3514,7 @@ _mesa_framebuffer_texture(struct gl_context *ctx, struct gl_framebuffer *fb,
level == fb->Attachment[BUFFER_STENCIL].TextureLevel &&
_mesa_tex_target_to_face(textarget) ==
fb->Attachment[BUFFER_STENCIL].CubeMapFace &&
+ samples == fb->Attachment[BUFFER_STENCIL].NumSamples &&
layer == fb->Attachment[BUFFER_STENCIL].Zoffset) {
/* The texture object is already attached to the stencil attachment
* point. Don't create a new renderbuffer; just reuse the stencil
@@ -3522,13 +3528,14 @@ _mesa_framebuffer_texture(struct gl_context *ctx, struct gl_framebuffer *fb,
level == fb->Attachment[BUFFER_DEPTH].TextureLevel &&
_mesa_tex_target_to_face(textarget) ==
fb->Attachment[BUFFER_DEPTH].CubeMapFace &&
+ samples == fb->Attachment[BUFFER_DEPTH].NumSamples &&
layer == fb->Attachment[BUFFER_DEPTH].Zoffset) {
/* As above, but with depth and stencil transposed. */
reuse_framebuffer_texture_attachment(fb, BUFFER_STENCIL,
BUFFER_DEPTH);
} else {
set_texture_attachment(ctx, fb, att, texObj, textarget,
- level, layer, layered);
+ level, samples, layer, layered);
if (attachment == GL_DEPTH_STENCIL_ATTACHMENT) {
/* Above we created a new renderbuffer and attached it to the
@@ -3583,15 +3590,15 @@ framebuffer_texture_with_dims_no_error(GLenum target, GLenum attachment,
get_attachment(ctx, fb, attachment, NULL);
_mesa_framebuffer_texture(ctx, fb, attachment, att, texObj, textarget,
- level, layer, GL_FALSE);
+ level, 0, layer, GL_FALSE);
}
static void
framebuffer_texture_with_dims(int dims, GLenum target,
GLenum attachment, GLenum textarget,
- GLuint texture, GLint level, GLint layer,
- const char *caller)
+ GLuint texture, GLint level, GLsizei samples,
+ GLint layer, const char *caller)
{
GET_CURRENT_CONTEXT(ctx);
struct gl_framebuffer *fb;
@@ -3626,7 +3633,7 @@ framebuffer_texture_with_dims(int dims, GLenum target,
return;
_mesa_framebuffer_texture(ctx, fb, attachment, att, texObj, textarget,
- level, layer, GL_FALSE);
+ level, samples, layer, GL_FALSE);
}
@@ -3645,7 +3652,7 @@ _mesa_FramebufferTexture1D(GLenum target, GLenum attachment,
GLenum textarget, GLuint texture, GLint level)
{
framebuffer_texture_with_dims(1, target, attachment, textarget, texture,
- level, 0, "glFramebufferTexture1D");
+ level, 0, 0, "glFramebufferTexture1D");
}
@@ -3664,7 +3671,17 @@ _mesa_FramebufferTexture2D(GLenum target, GLenum attachment,
GLenum textarget, GLuint texture, GLint level)
{
framebuffer_texture_with_dims(2, target, attachment, textarget, texture,
- level, 0, "glFramebufferTexture2D");
+ level, 0, 0, "glFramebufferTexture2D");
+}
+
+
+void GLAPIENTRY
+_mesa_FramebufferTexture2DMultisampleEXT(GLenum target, GLenum attachment,
+ GLenum textarget, GLuint texture,
+ GLint level, GLsizei samples)
+{
+ framebuffer_texture_with_dims(2, target, attachment, textarget, texture,
+ level, samples, 0, "glFramebufferTexture2DMultisampleEXT");
}
@@ -3684,7 +3701,7 @@ _mesa_FramebufferTexture3D(GLenum target, GLenum attachment,
GLint level, GLint layer)
{
framebuffer_texture_with_dims(3, target, attachment, textarget, texture,
- level, layer, "glFramebufferTexture3D");
+ level, 0, layer, "glFramebufferTexture3D");
}
@@ -3774,7 +3791,7 @@ frame_buffer_texture(GLuint framebuffer, GLenum target,
}
_mesa_framebuffer_texture(ctx, fb, attachment, att, texObj, textarget,
- level, layer, layered);
+ level, 0, layer, layered);
}
void GLAPIENTRY
@@ -4357,6 +4374,18 @@ get_framebuffer_attachment_parameter(struct gl_context *ctx,
goto invalid_pname_enum;
}
return;
+ case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_SAMPLES_EXT:
+ if (!ctx->Extensions.EXT_multisampled_render_to_texture) {
+ goto invalid_pname_enum;
+ } else if (att->Type == GL_TEXTURE) {
+ *params = att->NumSamples;
+ } else if (att->Type == GL_NONE) {
+ _mesa_error(ctx, err, "%s(invalid pname %s)", caller,
+ _mesa_enum_to_string(pname));
+ } else {
+ goto invalid_pname_enum;
+ }
+ return;
default:
goto invalid_pname_enum;
}
diff --git a/src/mesa/main/fbobject.h b/src/mesa/main/fbobject.h
index 5cd3c60297f..fcf9835dfa4 100644
--- a/src/mesa/main/fbobject.h
+++ b/src/mesa/main/fbobject.h
@@ -129,7 +129,8 @@ _mesa_framebuffer_texture(struct gl_context *ctx, struct gl_framebuffer *fb,
GLenum attachment,
struct gl_renderbuffer_attachment *att,
struct gl_texture_object *texObj, GLenum textarget,
- GLint level, GLuint layer, GLboolean layered);
+ GLint level, GLsizei samples,
+ GLuint layer, GLboolean layered);
extern GLenum
_mesa_check_framebuffer_status(struct gl_context *ctx,
@@ -250,6 +251,11 @@ extern void GLAPIENTRY
_mesa_FramebufferTexture2D(GLenum target, GLenum attachment,
GLenum textarget, GLuint texture, GLint level);
+void GLAPIENTRY
+_mesa_FramebufferTexture2DMultisampleEXT(GLenum target, GLenum attachment,
+ GLenum textarget, GLuint texture,
+ GLint level, GLsizei samples);
+
extern void GLAPIENTRY
_mesa_FramebufferTexture3D_no_error(GLenum target, GLenum attachment,
GLenum textarget, GLuint texture,
diff --git a/src/mesa/main/glheader.h b/src/mesa/main/glheader.h
index 4dd9a182be1..5764b83ffbb 100644
--- a/src/mesa/main/glheader.h
+++ b/src/mesa/main/glheader.h
@@ -151,6 +151,9 @@ typedef int GLclampx;
*/
#define GL_SHADER_PROGRAM_MESA 0x9999
+#ifndef GL_EXT_multisampled_render_to_texture
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_SAMPLES_EXT 0x8D6C
+#endif
#ifdef __cplusplus
}
diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
index 411d30602f2..3d4673aa7e8 100644
--- a/src/mesa/main/mtypes.h
+++ b/src/mesa/main/mtypes.h
@@ -3414,6 +3414,7 @@ struct gl_renderbuffer_attachment
*/
struct gl_texture_object *Texture;
GLuint TextureLevel; /**< Attached mipmap level. */
+ GLsizei NumSamples; /**< from FramebufferTexture2DMultisampleEXT */
GLuint CubeMapFace; /**< 0 .. 5, for cube map textures. */
GLuint Zoffset; /**< Slice for 3D textures, or layer for both 1D
* and 2D array textures */
@@ -4254,6 +4255,7 @@ struct gl_extensions
GLboolean EXT_gpu_shader4;
GLboolean EXT_memory_object;
GLboolean EXT_memory_object_fd;
+ GLboolean EXT_multisampled_render_to_texture;
GLboolean EXT_packed_float;
GLboolean EXT_pixel_buffer_object;
GLboolean EXT_point_parameters;