Files
palemoon27/dom/canvas/WebGL2ContextTransformFeedback.cpp
T
roytam1 cbff465051 import changes from `dev' branch of rmottola/Arctic-Fox:
- Bug 1167420 - Handle fallible AppendElement call in netwerk/base/Dashboard.cpp. r=valentin (a485b8990)
- Bug 968520 - Add mozilla::fallible to FallibleTArray::AppendElement calls. r=froydnj (12a529a0e)
- Bug 1172584 - Avoid coping FallibleTArray in SendRequestRunnable constructor. r=dragana (c3a4a4253)
- Bug 948466: Rename gfxPangoFonts to gfxFontconfigFonts. r=nical (43eed1f5f)
- Bug 968520 - Add mozilla::fallible to more FallibleTArray calls. r=froydnj (339968a1d)
- Bug 1166544 - Assume successful InsertElementAt calls in DOMSVG*List::MaybeInsertNullInAnimValListAt. r=dholbert (cf687dad7)
- Bug 968520 - Add mozilla::fallible to FallibleTArray::InsertElementAt calls. r=froydnj (cc5c68ff2)
- Bug 968520 - Add mozilla::fallible to more FallibleTArray::InsertElementsAt calls. r=froydnj (66df1d034)
- Bug 1165735 - Make ThreadSharedFloatArrayBufferList::mContents infallible. r=roc (eda2839db)
- Bug 1166544 - Use ReplaceElementAt instead of Clear and InsertElementAt in SVGMotionSMILType::Add. r=dholbert (474887a8c)
- Bug 1167418 - Check AppendElement call in MediaQueryList. r=heycam (b6ed6d153)
- Bug 1167418 - Use nsTArray instead of FallibleTArray in MediaQueryList. r=heycam (c9e3816d0)
- Bug 1167418 - Follow-up: Fix bustage (5015e91ce)
- Bug 1174220 - Part 1: Remove capacity constructor of MediaLargeByteBuffer. r=jya (66819d3e4)
- Bug 1179282 - Use nsTArray::Assign instead of the assignment operator in dom/svg/. r=dholbert (cb3d43c19)
- Bug 968520 - Add nsTArray::Assign. r=froydnj (e5eccf354)
- Bug 1182277, don't leak when using nsAutoTArray inside nsTArray, r=nfroyd (bba32394c)
- Bug 1143575. Avoid including Android's GraphicBuffer.h from LayersTypes.h. r=nical (99e4e2816)
- Bug 1143575. Avoid use of COMPARE macro which can clash with Android headers. r=bent (99cfc74c4)
- Bug 1143575. Add RefBase #include to stagefright stubs. r=cpearce (f9e327600)
- Bug 1143575. test_HaveMetadataUnbufferedSeek should not wait for canplay since preload='metadata' elements may not fire canplay. r=cpearce (f1b0eee27)
- Bug 1143575. Make GL context current before cleaning up programs. r=nical (d7b05b2bd)
- partial Bug 1143575. Android's screenshotting code should invalidate the LayrManagerComposite to ensure composition will actually happen. r=nical (58fb296ab)
- Bug 1143575. Remove unused Image::IsSentToCompositor tracking. r=nical (808d0b3f0)
- Bug 1143575. Remove unused CompositionNotifySink. r=nical (98a332305)
- Bug 1143575. Remove unused VideoFrameContainer::Reset. r=nical (e292bc722)
- Bug 1143575. Rename mAsyncTransactionTrackeres to mAsyncTransactionTrackers. r=nical (df71ebf4f)
- Bug 1143575. Remove unused ImageContainer::ResetPaintCount. r=nical (a92c5bf6e)
- Bug 1143575. Remove unused VideoFrameContainer::ClearCurrentFrame aResetSize parameter. r=nical (5d3c9b83a)
- Bug 1143575. Remove unused ReturnReleaseFence. r=nical (9d6ea92b5)
- Bug 1143575. LayerManagerComposite can't get END_NO_COMPOSITE. r=mattwoodrow (0c5c364b5)
- Bug 1143575. Remove unused AttachAsyncCompositable overload. r=nical (5fd3d4f6d)
- Bug 1143575. Rename ImageBridgeChild's AutoRemoteTextures to AutoRemoveTexturesFromImageBridge to avoid clashes with later work. r=nical (34d67fcc0)
- Bug 1143575. Fix some code formatting. r=nical (1d7f30f60)
- Bug 1143575. Move mLayer from ImageClientBridge up into its superclass ImageClient. r=nical (40c902a36)
- Bug 1127336 - Label HW-decoded frames with correct origin. - r=vlad (fd1580bcd)
- Bug 1167504 - Part 1: Remove BindableName - Framebuffer. r=jgilbert (b3133eee6)
- Bug 1167504 - Part 2: Remove BindableName - Renderbuffer. r=jgilbert (155a7e796)
- Bug 1167504 - Part 3: Remove BindableName - Sampler. r=jgilbert (8c5c68960)
- Bug 1167504 - Part 4: Remove BindableName - Texture. r=jgilbert (28077db04)
- Bug 1167504 - Part 5: Remove BindableName - Transform Feedback. r=jgilbert (4fd839598)
- Bug 1170454: Fix up instance type for VAOs. r=smaug,r=jgilbert (cc62d993a)
- Bug 1167504 - Part 6: Remove BindableName - Vertex Array. r=jgilbert (1d54d5bc1)
- Bug 1048724 - Implement GetBufferSubData. r=jgilbert, r=smaug (06570aa84)
- Bug 1167504 - Part 7: Remove BindableName - Buffer. r=jgilbert (b2ddf3fc6)
2021-03-18 11:57:10 +08:00

254 lines
7.1 KiB
C++

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "WebGL2Context.h"
#include "WebGLActiveInfo.h"
#include "WebGLProgram.h"
#include "WebGLTransformFeedback.h"
#include "GLContext.h"
using namespace mozilla;
using namespace mozilla::dom;
// -------------------------------------------------------------------------
// Transform Feedback
already_AddRefed<WebGLTransformFeedback>
WebGL2Context::CreateTransformFeedback()
{
if (IsContextLost())
return nullptr;
GLuint tf = 0;
MakeContextCurrent();
gl->fGenTransformFeedbacks(1, &tf);
nsRefPtr<WebGLTransformFeedback> globj = new WebGLTransformFeedback(this, tf);
return globj.forget();
}
void
WebGL2Context::DeleteTransformFeedback(WebGLTransformFeedback* tf)
{
if (IsContextLost())
return;
if (!ValidateObjectAllowDeletedOrNull("deleteTransformFeedback", tf))
return;
if (!tf || tf->IsDeleted())
return;
if (mBoundTransformFeedback == tf)
BindTransformFeedback(LOCAL_GL_TRANSFORM_FEEDBACK, tf);
tf->RequestDelete();
}
bool
WebGL2Context::IsTransformFeedback(WebGLTransformFeedback* tf)
{
if (IsContextLost())
return false;
if (!ValidateObjectAllowDeleted("isTransformFeedback", tf))
return false;
if (tf->IsDeleted())
return false;
MakeContextCurrent();
return gl->fIsTransformFeedback(tf->mGLName);
}
void
WebGL2Context::BindTransformFeedback(GLenum target, WebGLTransformFeedback* tf)
{
if (IsContextLost())
return;
if (!ValidateObjectAllowDeletedOrNull("bindTransformFeedback", tf))
return;
if (target != LOCAL_GL_TRANSFORM_FEEDBACK)
return ErrorInvalidEnum("bindTransformFeedback: target must be TRANSFORM_FEEDBACK");
WebGLRefPtr<WebGLTransformFeedback> currentTF = mBoundTransformFeedback;
if (currentTF && currentTF->mIsActive && !currentTF->mIsPaused) {
return ErrorInvalidOperation("bindTransformFeedback: Currently bound transform "
"feedback is active and not paused");
}
if (tf && tf->IsDeleted())
return ErrorInvalidOperation("bindTransformFeedback: Attempt to bind deleted id");
MakeContextCurrent();
gl->fBindTransformFeedback(target, tf ? tf->mGLName : 0);
if (tf)
mBoundTransformFeedback = tf;
else
mBoundTransformFeedback = mDefaultTransformFeedback;
}
void
WebGL2Context::BeginTransformFeedback(GLenum primitiveMode)
{
if (IsContextLost())
return;
WebGLTransformFeedback* tf = mBoundTransformFeedback;
MOZ_ASSERT(tf);
if (!tf)
return;
if (tf->mIsActive)
return ErrorInvalidOperation("beginTransformFeedback: transform feedback is active");
const GLenum mode = tf->mMode;
if (mode != LOCAL_GL_POINTS && mode != LOCAL_GL_LINES && mode != LOCAL_GL_TRIANGLES)
return ErrorInvalidEnum("beginTransformFeedback: primitive must be one of POINTS, LINES, or TRIANGLES");
// TODO:
// GL_INVALID_OPERATION is generated by glBeginTransformFeedback
// if any binding point used in transform feedback mode does not
// have a buffer object bound. In interleaved mode, only the first
// buffer object binding point is ever written to.
// GL_INVALID_OPERATION is generated by glBeginTransformFeedback
// if no binding points would be used, either because no program
// object is active of because the active program object has
// specified no varying variables to record.
if (!mCurrentProgram)
return ErrorInvalidOperation("beginTransformFeedback: no program is active");
MakeContextCurrent();
gl->fBeginTransformFeedback(primitiveMode);
tf->mIsActive = true;
tf->mIsPaused = false;
}
void
WebGL2Context::EndTransformFeedback()
{
if (IsContextLost())
return;
WebGLTransformFeedback* tf = mBoundTransformFeedback;
MOZ_ASSERT(tf);
if (!tf)
return;
if (!tf->mIsActive)
return ErrorInvalidOperation("%s: transform feedback in not active",
"endTransformFeedback");
MakeContextCurrent();
gl->fEndTransformFeedback();
tf->mIsActive = false;
tf->mIsPaused = false;
}
void
WebGL2Context::PauseTransformFeedback()
{
if (IsContextLost())
return;
WebGLTransformFeedback* tf = mBoundTransformFeedback;
MOZ_ASSERT(tf);
if (!tf)
return;
if (!tf->mIsActive || tf->mIsPaused) {
return ErrorInvalidOperation("%s: transform feedback is not active or is paused",
"pauseTransformFeedback");
}
MakeContextCurrent();
gl->fPauseTransformFeedback();
tf->mIsPaused = true;
}
void
WebGL2Context::ResumeTransformFeedback()
{
if (IsContextLost())
return;
WebGLTransformFeedback* tf = mBoundTransformFeedback;
MOZ_ASSERT(tf);
if (!tf)
return;
if (!tf->mIsActive || !tf->mIsPaused)
return ErrorInvalidOperation("resumeTransformFeedback: transform feedback is not active or is not paused");
MakeContextCurrent();
gl->fResumeTransformFeedback();
tf->mIsPaused = false;
}
void
WebGL2Context::TransformFeedbackVaryings(WebGLProgram* program,
const dom::Sequence<nsString>& varyings,
GLenum bufferMode)
{
if (IsContextLost())
return;
if (!ValidateObject("transformFeedbackVaryings: program", program))
return;
GLsizei count = varyings.Length();
GLchar** tmpVaryings = (GLchar**) moz_xmalloc(count * sizeof(GLchar*));
for (GLsizei n = 0; n < count; n++) {
tmpVaryings[n] = (GLchar*) ToNewCString(varyings[n]);
}
GLuint progname = program->mGLName;
MakeContextCurrent();
gl->fTransformFeedbackVaryings(progname, count, tmpVaryings, bufferMode);
NS_FREE_XPCOM_ALLOCATED_POINTER_ARRAY(count, tmpVaryings);
}
already_AddRefed<WebGLActiveInfo>
WebGL2Context::GetTransformFeedbackVarying(WebGLProgram* program, GLuint index)
{
if (IsContextLost())
return nullptr;
if (!ValidateObject("getTransformFeedbackVarying: program", program))
return nullptr;
MakeContextCurrent();
GLint len = 0;
GLuint progname = program->mGLName;
gl->fGetProgramiv(progname, LOCAL_GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH, &len);
if (!len)
return nullptr;
UniquePtr<char[]> name(new char[len]);
GLint tfsize = 0;
GLuint tftype = 0;
gl->fGetTransformFeedbackVarying(progname, index, len, &len, &tfsize, &tftype, name.get());
if (len == 0 || tfsize == 0 || tftype == 0)
return nullptr;
MOZ_CRASH("todo");
/*
// Reverse lookup of name
nsCString reverseMappedName;
prog->ReverveMapIdentifier(nsDependentCString(name), &reverseMappedName);
nsRefPtr<WebGLActiveInfo> result = new WebGLActiveInfo(tfsize, tftype, nsDependentCString(name.get()));
return result.forget();
*/
}