mirror of
https://github.com/MobileGL-Dev/MobileGL
synced 2026-09-11 21:58:31 +09:00
[Fix] (MG_Impl): create sampler objects at Gen; guard combined-format CopyTexImage
glGenSamplers creates the sampler objects themselves (unlike texture and buffer names), so glIsSampler must answer GL_TRUE before any bind - the names now get their state vectors at Gen time (KHR-GL33.api.coverage). glCopyTexImage2D with a combined DEPTH_STENCIL internalformat now requires both halves in the read framebuffer and reports GL_INVALID_OPERATION when only the depth or only the stencil attachment point is populated (packed_depth_stencil.validate_errors.*).
This commit is contained in:
@@ -185,6 +185,11 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
static thread_local Vector<GLuint> names;
|
static thread_local Vector<GLuint> names;
|
||||||
MG_State::pGLContext->GenSamplerNames(count, names);
|
MG_State::pGLContext->GenSamplerNames(count, names);
|
||||||
Memcpy(samplers, names.data(), count * sizeof(GLuint));
|
Memcpy(samplers, names.data(), count * sizeof(GLuint));
|
||||||
|
// Unlike textures/buffers, glGenSamplers CREATES the sampler objects: each name
|
||||||
|
// is immediately a sampler (glIsSampler == GL_TRUE before any bind).
|
||||||
|
for (GLsizei i = 0; i < count; ++i) {
|
||||||
|
MG_State::pGLContext->CreateSamplerObject(names[i]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void DeleteSamplers_State(GLsizei count, const GLuint* samplers) {
|
void DeleteSamplers_State(GLsizei count, const GLuint* samplers) {
|
||||||
|
|||||||
@@ -2820,7 +2820,22 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
"The attachment specified by the read buffer is incomplete.")); \
|
"The attachment specified by the read buffer is incomplete.")); \
|
||||||
return false; \
|
return false; \
|
||||||
}
|
}
|
||||||
if (isDepth) {
|
if (isDepth && isStencil) {
|
||||||
|
// A combined internalformat copies both halves, so the read framebuffer
|
||||||
|
// must populate both attachment points.
|
||||||
|
const auto& stencilAttachment = currentReadFBO->GetAttachment(FramebufferAttachmentType::Stencil);
|
||||||
|
const auto& depthAttachment = currentReadFBO->GetAttachment(FramebufferAttachmentType::Depth);
|
||||||
|
if (!depthAttachment.IsValid() || depthAttachment.IsEmpty() || !stencilAttachment.IsValid() ||
|
||||||
|
stencilAttachment.IsEmpty()) {
|
||||||
|
MG_State::pGLContext->RecordError(
|
||||||
|
ErrorCode::InvalidOperation,
|
||||||
|
MakeUnique<GenericErrorInfo>(
|
||||||
|
"MG_Impl/GLImpl", "CopyTexImage2D_State",
|
||||||
|
"DEPTH_STENCIL copy requires both depth and stencil attachments in the read framebuffer."));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
GET_SRC_INTERNAL_FORMAT(FramebufferAttachmentType::Depth);
|
||||||
|
} else if (isDepth) {
|
||||||
GET_SRC_INTERNAL_FORMAT(FramebufferAttachmentType::Depth);
|
GET_SRC_INTERNAL_FORMAT(FramebufferAttachmentType::Depth);
|
||||||
} else if (isStencil) {
|
} else if (isStencil) {
|
||||||
GET_SRC_INTERNAL_FORMAT(FramebufferAttachmentType::Stencil);
|
GET_SRC_INTERNAL_FORMAT(FramebufferAttachmentType::Stencil);
|
||||||
|
|||||||
Reference in New Issue
Block a user