mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
Bug 1083936 - WebGL2: Add texImage3D - r=jgilbert,smaug
This commit is contained in:
parent
e76a67393f
commit
012dfb0c0a
@ -66,7 +66,11 @@ public:
|
||||
void TexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
|
||||
void TexStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height,
|
||||
GLsizei depth);
|
||||
|
||||
void TexImage3D(GLenum target, GLint level, GLenum internalformat,
|
||||
GLsizei width, GLsizei height, GLsizei depth,
|
||||
GLint border, GLenum format, GLenum type,
|
||||
const Nullable<dom::ArrayBufferView> &pixels,
|
||||
ErrorResult& rv);
|
||||
void TexSubImage3D(GLenum target, GLint level,
|
||||
GLint xoffset, GLint yoffset, GLint zoffset,
|
||||
GLsizei width, GLsizei height, GLsizei depth,
|
||||
|
@ -204,6 +204,119 @@ WebGL2Context::TexStorage3D(GLenum target, GLsizei levels, GLenum internalformat
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
WebGL2Context::TexImage3D(GLenum target, GLint level, GLenum internalformat,
|
||||
GLsizei width, GLsizei height, GLsizei depth,
|
||||
GLint border, GLenum format, GLenum type,
|
||||
const Nullable<dom::ArrayBufferView> &pixels,
|
||||
ErrorResult& rv)
|
||||
{
|
||||
if (IsContextLost())
|
||||
return;
|
||||
|
||||
void* data;
|
||||
size_t dataLength;
|
||||
js::Scalar::Type jsArrayType;
|
||||
if (pixels.IsNull()) {
|
||||
data = nullptr;
|
||||
dataLength = 0;
|
||||
jsArrayType = js::Scalar::TypeMax;
|
||||
} else {
|
||||
const ArrayBufferView& view = pixels.Value();
|
||||
view.ComputeLengthAndData();
|
||||
|
||||
data = view.Data();
|
||||
dataLength = view.Length();
|
||||
jsArrayType = JS_GetArrayBufferViewType(view.Obj());
|
||||
}
|
||||
|
||||
const WebGLTexImageFunc func = WebGLTexImageFunc::TexImage;
|
||||
const WebGLTexDimensions dims = WebGLTexDimensions::Tex3D;
|
||||
|
||||
if (!ValidateTexImageTarget(target, func, dims))
|
||||
return;
|
||||
|
||||
TexImageTarget texImageTarget = target;
|
||||
|
||||
if (!ValidateTexImage(texImageTarget, level, internalformat,
|
||||
0, 0, 0,
|
||||
width, height, depth,
|
||||
border, format, type, func, dims))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (!ValidateTexInputData(type, jsArrayType, func, dims))
|
||||
return;
|
||||
|
||||
TexInternalFormat effectiveInternalFormat =
|
||||
EffectiveInternalFormatFromInternalFormatAndType(internalformat, type);
|
||||
|
||||
if (effectiveInternalFormat == LOCAL_GL_NONE) {
|
||||
return ErrorInvalidOperation("texImage3D: bad combination of internalformat and type");
|
||||
}
|
||||
|
||||
// we need to find the exact sized format of the source data. Slightly abusing
|
||||
// EffectiveInternalFormatFromInternalFormatAndType for that purpose. Really, an unsized source format
|
||||
// is the same thing as an unsized internalformat.
|
||||
TexInternalFormat effectiveSourceFormat =
|
||||
EffectiveInternalFormatFromInternalFormatAndType(format, type);
|
||||
MOZ_ASSERT(effectiveSourceFormat != LOCAL_GL_NONE); // should have validated format/type combo earlier
|
||||
const size_t srcbitsPerTexel = GetBitsPerTexel(effectiveSourceFormat);
|
||||
MOZ_ASSERT((srcbitsPerTexel % 8) == 0); // should not have compressed formats here.
|
||||
size_t srcTexelSize = srcbitsPerTexel / 8;
|
||||
|
||||
CheckedUint32 checked_neededByteLength =
|
||||
GetImageSize(height, width, depth, srcTexelSize, mPixelStoreUnpackAlignment);
|
||||
|
||||
if (!checked_neededByteLength.isValid())
|
||||
return ErrorInvalidOperation("texSubImage2D: integer overflow computing the needed buffer size");
|
||||
|
||||
uint32_t bytesNeeded = checked_neededByteLength.value();
|
||||
|
||||
if (dataLength && dataLength < bytesNeeded)
|
||||
return ErrorInvalidOperation("texImage3D: not enough data for operation (need %d, have %d)",
|
||||
bytesNeeded, dataLength);
|
||||
|
||||
WebGLTexture* tex = activeBoundTextureForTexImageTarget(texImageTarget);
|
||||
|
||||
if (!tex)
|
||||
return ErrorInvalidOperation("texImage3D: no texture is bound to this target");
|
||||
|
||||
if (tex->IsImmutable()) {
|
||||
return ErrorInvalidOperation(
|
||||
"texImage3D: disallowed because the texture "
|
||||
"bound to this target has already been made immutable by texStorage3D");
|
||||
}
|
||||
|
||||
GLenum driverType = LOCAL_GL_NONE;
|
||||
GLenum driverInternalFormat = LOCAL_GL_NONE;
|
||||
GLenum driverFormat = LOCAL_GL_NONE;
|
||||
DriverFormatsFromEffectiveInternalFormat(gl,
|
||||
effectiveInternalFormat,
|
||||
&driverInternalFormat,
|
||||
&driverFormat,
|
||||
&driverType);
|
||||
|
||||
MakeContextCurrent();
|
||||
GetAndFlushUnderlyingGLErrors();
|
||||
gl->fTexImage3D(texImageTarget.get(), level,
|
||||
driverInternalFormat,
|
||||
width, height, depth,
|
||||
0, driverFormat, driverType,
|
||||
data);
|
||||
GLenum error = GetAndFlushUnderlyingGLErrors();
|
||||
if (error) {
|
||||
return GenerateWarning("texImage3D generated error %s", ErrorName(error));
|
||||
}
|
||||
|
||||
tex->SetImageInfo(texImageTarget, level,
|
||||
width, height, depth,
|
||||
effectiveInternalFormat,
|
||||
data ? WebGLImageDataStatus::InitializedImageData
|
||||
: WebGLImageDataStatus::UninitializedImageData);
|
||||
}
|
||||
|
||||
void
|
||||
WebGL2Context::TexSubImage3D(GLenum rawTarget, GLint level,
|
||||
GLint xoffset, GLint yoffset, GLint zoffset,
|
||||
|
@ -867,6 +867,7 @@ InfoFrom(WebGLTexImageFunc func, WebGLTexDimensions dims)
|
||||
}
|
||||
case WebGLTexDimensions::Tex3D:
|
||||
switch (func) {
|
||||
case WebGLTexImageFunc::TexImage: return "texImage3D";
|
||||
case WebGLTexImageFunc::TexSubImage: return "texSubImage3D";
|
||||
case WebGLTexImageFunc::CopyTexSubImage: return "copyTexSubImage3D";
|
||||
case WebGLTexImageFunc::CompTexSubImage: return "compressedTexSubImage3D";
|
||||
|
@ -342,6 +342,11 @@ interface WebGL2RenderingContext : WebGLRenderingContext
|
||||
void texStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
|
||||
void texStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height,
|
||||
GLsizei depth);
|
||||
[Throws]
|
||||
void texImage3D(GLenum target, GLint level, GLenum internalformat,
|
||||
GLsizei width, GLsizei height, GLsizei depth,
|
||||
GLint border, GLenum format,
|
||||
GLenum type, ArrayBufferView? pixels);
|
||||
[Throws] void texSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset,
|
||||
GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type,
|
||||
ArrayBufferView? pixels);
|
||||
|
@ -1253,7 +1253,7 @@ GLContext::InitWithPrefix(const char *prefix, bool trygl)
|
||||
|
||||
if (IsSupported(GLFeature::texture_3D)) {
|
||||
SymLoadStruct coreSymbols[] = {
|
||||
// TexImage3D is not required for WebGL2 so not queried here.
|
||||
{ (PRFuncPtr*) &mSymbols.fTexImage3D, { "TexImage3D", nullptr } },
|
||||
{ (PRFuncPtr*) &mSymbols.fTexSubImage3D, { "TexSubImage3D", nullptr } },
|
||||
END_SYMBOLS
|
||||
};
|
||||
|
@ -3132,6 +3132,21 @@ public:
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// 3D Textures
|
||||
void fTexImage3D(GLenum target, GLint level,
|
||||
GLint internalFormat,
|
||||
GLsizei width, GLsizei height, GLsizei depth,
|
||||
GLint border, GLenum format, GLenum type,
|
||||
const GLvoid * data)
|
||||
{
|
||||
BEFORE_GL_CALL;
|
||||
ASSERT_SYMBOL_PRESENT(fTexImage3D);
|
||||
mSymbols.fTexImage3D(target, level, internalFormat,
|
||||
width, height, depth,
|
||||
border, format, type,
|
||||
data);
|
||||
AFTER_GL_CALL;
|
||||
}
|
||||
|
||||
void fTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset,
|
||||
GLint zoffset, GLsizei width, GLsizei height, GLsizei depth,
|
||||
GLenum format, GLenum type, const GLvoid* pixels)
|
||||
|
@ -642,6 +642,12 @@ struct GLContextSymbols
|
||||
PFNGLGETFRAGDATALOCATIONPROC fGetFragDataLocation;
|
||||
|
||||
// 3D Textures
|
||||
typedef void (GLAPIENTRY * PFNGLTEXIMAGE3DPROC) (GLenum target, GLint level,
|
||||
GLenum internalFormat,
|
||||
GLenum width, GLsizei height, GLsizei depth,
|
||||
GLint border, GLenum format, GLenum type,
|
||||
const GLvoid* pixels);
|
||||
PFNGLTEXIMAGE3DPROC fTexImage3D;
|
||||
typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset,
|
||||
GLint yoffset, GLint zoffset, GLsizei width,
|
||||
GLsizei height, GLsizei depth, GLenum format,
|
||||
|
Loading…
Reference in New Issue
Block a user