зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1243907 - Don't query _BITS enums on Core profiles. - r=jrmuizel
This commit is contained in:
Родитель
79f040d43b
Коммит
f534188807
|
@ -827,7 +827,8 @@ protected:
|
|||
public:
|
||||
void Disable(GLenum cap);
|
||||
void Enable(GLenum cap);
|
||||
bool GetStencilBits(GLint* out_stencilBits);
|
||||
bool GetStencilBits(GLint* const out_stencilBits);
|
||||
bool GetChannelBits(const char* funcName, GLenum pname, GLint* const out_val);
|
||||
virtual JS::Value GetParameter(JSContext* cx, GLenum pname, ErrorResult& rv);
|
||||
|
||||
void GetParameter(JSContext* cx, GLenum pname,
|
||||
|
|
|
@ -994,6 +994,10 @@ WebGLContext::Hint(GLenum target, GLenum mode)
|
|||
|
||||
switch (target) {
|
||||
case LOCAL_GL_GENERATE_MIPMAP_HINT:
|
||||
// Deprecated and removed in desktop GL Core profiles.
|
||||
if (gl->IsCoreProfile())
|
||||
return;
|
||||
|
||||
isValid = true;
|
||||
break;
|
||||
|
||||
|
|
|
@ -73,7 +73,7 @@ StringValue(JSContext* cx, const nsAString& str, ErrorResult& rv)
|
|||
}
|
||||
|
||||
bool
|
||||
WebGLContext::GetStencilBits(GLint* out_stencilBits)
|
||||
WebGLContext::GetStencilBits(GLint* const out_stencilBits)
|
||||
{
|
||||
*out_stencilBits = 0;
|
||||
if (mBoundDrawFramebuffer) {
|
||||
|
@ -97,9 +97,107 @@ WebGLContext::GetStencilBits(GLint* out_stencilBits)
|
|||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
WebGLContext::GetChannelBits(const char* funcName, GLenum pname, GLint* const out_val)
|
||||
{
|
||||
if (mBoundDrawFramebuffer) {
|
||||
if (!mBoundDrawFramebuffer->ValidateAndInitAttachments(funcName))
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!mBoundDrawFramebuffer) {
|
||||
switch (pname) {
|
||||
case LOCAL_GL_RED_BITS:
|
||||
case LOCAL_GL_GREEN_BITS:
|
||||
case LOCAL_GL_BLUE_BITS:
|
||||
*out_val = 8;
|
||||
break;
|
||||
|
||||
case LOCAL_GL_ALPHA_BITS:
|
||||
*out_val = (mOptions.alpha ? 8 : 0);
|
||||
break;
|
||||
|
||||
case LOCAL_GL_DEPTH_BITS:
|
||||
if (mOptions.depth) {
|
||||
const auto& glFormats = gl->GetGLFormats();
|
||||
|
||||
GLenum depthFormat = glFormats.depth;
|
||||
if (mOptions.stencil && glFormats.depthStencil) {
|
||||
depthFormat = glFormats.depthStencil;
|
||||
}
|
||||
|
||||
if (depthFormat == LOCAL_GL_DEPTH_COMPONENT16) {
|
||||
*out_val = 16;
|
||||
} else {
|
||||
*out_val = 24;
|
||||
}
|
||||
} else {
|
||||
*out_val = 0;
|
||||
}
|
||||
break;
|
||||
|
||||
case LOCAL_GL_STENCIL_BITS:
|
||||
*out_val = (mOptions.stencil ? 8 : 0);
|
||||
break;
|
||||
|
||||
default:
|
||||
MOZ_CRASH("bad pname");
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
if (!gl->IsCoreProfile()) {
|
||||
gl->fGetIntegerv(pname, out_val);
|
||||
return true;
|
||||
}
|
||||
|
||||
GLenum fbAttachment = 0;
|
||||
GLenum fbPName = 0;
|
||||
switch (pname) {
|
||||
case LOCAL_GL_RED_BITS:
|
||||
fbAttachment = LOCAL_GL_COLOR_ATTACHMENT0;
|
||||
fbPName = LOCAL_GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE;
|
||||
break;
|
||||
|
||||
case LOCAL_GL_GREEN_BITS:
|
||||
fbAttachment = LOCAL_GL_COLOR_ATTACHMENT0;
|
||||
fbPName = LOCAL_GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE;
|
||||
break;
|
||||
|
||||
case LOCAL_GL_BLUE_BITS:
|
||||
fbAttachment = LOCAL_GL_COLOR_ATTACHMENT0;
|
||||
fbPName = LOCAL_GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE;
|
||||
break;
|
||||
|
||||
case LOCAL_GL_ALPHA_BITS:
|
||||
fbAttachment = LOCAL_GL_COLOR_ATTACHMENT0;
|
||||
fbPName = LOCAL_GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE;
|
||||
break;
|
||||
|
||||
case LOCAL_GL_DEPTH_BITS:
|
||||
fbAttachment = LOCAL_GL_DEPTH_ATTACHMENT;
|
||||
fbPName = LOCAL_GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE;
|
||||
break;
|
||||
|
||||
case LOCAL_GL_STENCIL_BITS:
|
||||
fbAttachment = LOCAL_GL_STENCIL_ATTACHMENT;
|
||||
fbPName = LOCAL_GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE;
|
||||
break;
|
||||
|
||||
default:
|
||||
MOZ_CRASH("bad pname");
|
||||
}
|
||||
|
||||
gl->fGetFramebufferAttachmentParameteriv(LOCAL_GL_DRAW_FRAMEBUFFER, fbAttachment,
|
||||
fbPName, out_val);
|
||||
return true;
|
||||
}
|
||||
|
||||
JS::Value
|
||||
WebGLContext::GetParameter(JSContext* cx, GLenum pname, ErrorResult& rv)
|
||||
{
|
||||
const char funcName[] = "getParameter";
|
||||
|
||||
if (IsContextLost())
|
||||
return JS::NullValue();
|
||||
|
||||
|
@ -356,11 +454,7 @@ WebGLContext::GetParameter(JSContext* cx, GLenum pname, ErrorResult& rv)
|
|||
|
||||
return JS::Int32Value(refValue & stencilMask);
|
||||
}
|
||||
case LOCAL_GL_STENCIL_BITS: {
|
||||
GLint stencilBits = 0;
|
||||
GetStencilBits(&stencilBits);
|
||||
return JS::Int32Value(stencilBits);
|
||||
}
|
||||
|
||||
case LOCAL_GL_STENCIL_CLEAR_VALUE:
|
||||
case LOCAL_GL_UNPACK_ALIGNMENT:
|
||||
case LOCAL_GL_PACK_ALIGNMENT:
|
||||
|
@ -370,28 +464,26 @@ WebGLContext::GetParameter(JSContext* cx, GLenum pname, ErrorResult& rv)
|
|||
case LOCAL_GL_MAX_VERTEX_ATTRIBS:
|
||||
case LOCAL_GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:
|
||||
case LOCAL_GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:
|
||||
case LOCAL_GL_MAX_TEXTURE_IMAGE_UNITS:
|
||||
case LOCAL_GL_RED_BITS:
|
||||
case LOCAL_GL_GREEN_BITS:
|
||||
case LOCAL_GL_BLUE_BITS: {
|
||||
case LOCAL_GL_MAX_TEXTURE_IMAGE_UNITS: {
|
||||
GLint i = 0;
|
||||
gl->fGetIntegerv(pname, &i);
|
||||
return JS::Int32Value(i);
|
||||
}
|
||||
case LOCAL_GL_DEPTH_BITS: {
|
||||
GLint i = 0;
|
||||
if (!mNeedsFakeNoDepth) {
|
||||
gl->fGetIntegerv(pname, &i);
|
||||
}
|
||||
return JS::Int32Value(i);
|
||||
}
|
||||
case LOCAL_GL_ALPHA_BITS: {
|
||||
GLint i = 0;
|
||||
if (!mNeedsFakeNoAlpha) {
|
||||
gl->fGetIntegerv(pname, &i);
|
||||
}
|
||||
return JS::Int32Value(i);
|
||||
|
||||
case LOCAL_GL_RED_BITS:
|
||||
case LOCAL_GL_GREEN_BITS:
|
||||
case LOCAL_GL_BLUE_BITS:
|
||||
case LOCAL_GL_ALPHA_BITS:
|
||||
case LOCAL_GL_DEPTH_BITS:
|
||||
case LOCAL_GL_STENCIL_BITS: {
|
||||
// Deprecated and removed in GL Core profiles, so special handling required.
|
||||
GLint val;
|
||||
if (!GetChannelBits(funcName, pname, &val))
|
||||
return JS::NullValue();
|
||||
|
||||
return JS::Int32Value(val);
|
||||
}
|
||||
|
||||
case LOCAL_GL_MAX_TEXTURE_SIZE:
|
||||
return JS::Int32Value(mImplMaxTextureSize);
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче