mesa: support multisample textures in framebuffer completeness check
- sample count must be the same on all attachments
- fixedsamplepositions must be the same on all attachments
(renderbuffers have fixedsamplepositions=true implicitly; only
multisample textures can choose to have it false)
V2: - fix wrapping to 80 columns, debug message, fix for state moving
from texobj to image.
- stencil texturing tweaks tidied up and folded in here.
V3: - Removed silly stencil hacks entirely; the extension doesn't
actually make stencil-only textures legal at all.
- Moved sample count / fixed sample locations checks into
existing attachment-type-specific blocks, as suggested by Eric
V4: - Removed stencil hacks which were missed in V3 (thanks Eric)
- Don't move the declaration of texImg; only required pre-V3.
Signed-off-by: Chris Forbes <chrisf@ijw.co.nz>
[V2] Reviewed-by: Paul Berry <stereotype441@gmail.com>
Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
This commit is contained in:
+37
-14
@@ -745,6 +745,7 @@ _mesa_test_framebuffer_completeness(struct gl_context *ctx,
|
||||
GLenum intFormat = GL_NONE; /* color buffers' internal format */
|
||||
GLuint minWidth = ~0, minHeight = ~0, maxWidth = 0, maxHeight = 0;
|
||||
GLint numSamples = -1;
|
||||
GLint fixedSampleLocations = -1;
|
||||
GLint i;
|
||||
GLuint j;
|
||||
|
||||
@@ -814,12 +815,29 @@ _mesa_test_framebuffer_completeness(struct gl_context *ctx,
|
||||
f = texImg->_BaseFormat;
|
||||
attFormat = texImg->TexFormat;
|
||||
numImages++;
|
||||
|
||||
if (!is_format_color_renderable(ctx, attFormat, texImg->InternalFormat) &&
|
||||
!is_legal_depth_format(ctx, f)) {
|
||||
fb->_Status = GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT;
|
||||
fbo_incomplete("texture attachment incomplete", -1);
|
||||
return;
|
||||
}
|
||||
|
||||
if (numSamples < 0)
|
||||
numSamples = texImg->NumSamples;
|
||||
else if (numSamples != texImg->NumSamples) {
|
||||
fb->_Status = GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE;
|
||||
fbo_incomplete("inconsistent sample count", -1);
|
||||
return;
|
||||
}
|
||||
|
||||
if (fixedSampleLocations < 0)
|
||||
fixedSampleLocations = texImg->FixedSampleLocations;
|
||||
else if (fixedSampleLocations != texImg->FixedSampleLocations) {
|
||||
fb->_Status = GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE;
|
||||
fbo_incomplete("inconsistent fixed sample locations", -1);
|
||||
return;
|
||||
}
|
||||
}
|
||||
else if (att->Type == GL_RENDERBUFFER_EXT) {
|
||||
minWidth = MIN2(minWidth, att->Renderbuffer->Width);
|
||||
@@ -829,24 +847,35 @@ _mesa_test_framebuffer_completeness(struct gl_context *ctx,
|
||||
f = att->Renderbuffer->InternalFormat;
|
||||
attFormat = att->Renderbuffer->Format;
|
||||
numImages++;
|
||||
|
||||
if (numSamples < 0)
|
||||
numSamples = att->Renderbuffer->NumSamples;
|
||||
else if (numSamples != att->Renderbuffer->NumSamples) {
|
||||
fb->_Status = GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE;
|
||||
fbo_incomplete("inconsistent sample count", -1);
|
||||
return;
|
||||
}
|
||||
|
||||
/* RENDERBUFFER has fixedSampleLocations implicitly true */
|
||||
if (fixedSampleLocations < 0)
|
||||
fixedSampleLocations = GL_TRUE;
|
||||
else if (fixedSampleLocations != GL_TRUE) {
|
||||
fb->_Status = GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE;
|
||||
fbo_incomplete("inconsistent fixed sample locations", -1);
|
||||
return;
|
||||
}
|
||||
}
|
||||
else {
|
||||
assert(att->Type == GL_NONE);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (att->Renderbuffer && numSamples < 0) {
|
||||
/* first buffer */
|
||||
numSamples = att->Renderbuffer->NumSamples;
|
||||
}
|
||||
|
||||
/* check if integer color */
|
||||
fb->_IntegerColor = _mesa_is_format_integer_color(attFormat);
|
||||
|
||||
/* Error-check width, height, format, samples
|
||||
*/
|
||||
/* Error-check width, height, format */
|
||||
if (numImages == 1) {
|
||||
/* save format, num samples */
|
||||
/* save format */
|
||||
if (i >= 0) {
|
||||
intFormat = f;
|
||||
}
|
||||
@@ -866,12 +895,6 @@ _mesa_test_framebuffer_completeness(struct gl_context *ctx,
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (att->Renderbuffer &&
|
||||
att->Renderbuffer->NumSamples != numSamples) {
|
||||
fb->_Status = GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE;
|
||||
fbo_incomplete("inconsistant number of samples", i);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
/* Check that the format is valid. (MESA_FORMAT_NONE means unsupported)
|
||||
|
||||
Reference in New Issue
Block a user