Bug 816181 - Split out WebGLShader into separate files - r=bjacob

This commit is contained in:
Saurabh Anand 2012-12-03 18:40:23 +05:30
parent 1f8c9e91e5
commit 56368912e3
3 changed files with 175 additions and 145 deletions

View File

@ -8,6 +8,7 @@
#include "WebGLElementArrayCache.h"
#include "WebGLObjectModel.h"
#include "WebGLShader.h"
#include "WebGLBuffer.h"
#include "WebGLRenderbuffer.h"
#include "WebGLVertexAttribData.h"
@ -41,8 +42,6 @@
#include "ForceDiscreteGPUHelperCGL.h"
#endif
#include "angle/ShaderLang.h"
#include "mozilla/dom/TypedArray.h"
#include "mozilla/dom/Nullable.h"
#include "mozilla/ErrorResult.h"
@ -72,7 +71,6 @@ namespace mozilla {
class WebGLTexture;
class WebGLProgram;
class WebGLShader;
class WebGLFramebuffer;
class WebGLUniformLocation;
class WebGLMemoryPressureObserver;
@ -1640,148 +1638,6 @@ public:
}
};
struct WebGLMappedIdentifier {
nsCString original, mapped; // ASCII strings
WebGLMappedIdentifier(const nsACString& o, const nsACString& m) : original(o), mapped(m) {}
};
struct WebGLUniformInfo {
uint32_t arraySize;
bool isArray;
ShDataType type;
WebGLUniformInfo(uint32_t s = 0, bool a = false, ShDataType t = SH_NONE)
: arraySize(s), isArray(a), type(t) {}
int ElementSize() const {
switch (type) {
case SH_INT:
case SH_FLOAT:
case SH_BOOL:
case SH_SAMPLER_2D:
case SH_SAMPLER_CUBE:
return 1;
case SH_INT_VEC2:
case SH_FLOAT_VEC2:
case SH_BOOL_VEC2:
return 2;
case SH_INT_VEC3:
case SH_FLOAT_VEC3:
case SH_BOOL_VEC3:
return 3;
case SH_INT_VEC4:
case SH_FLOAT_VEC4:
case SH_BOOL_VEC4:
case SH_FLOAT_MAT2:
return 4;
case SH_FLOAT_MAT3:
return 9;
case SH_FLOAT_MAT4:
return 16;
default:
NS_ABORT(); // should never get here
return 0;
}
}
};
class WebGLShader MOZ_FINAL
: public nsISupports
, public WebGLRefCountedObject<WebGLShader>
, public LinkedListElement<WebGLShader>
, public WebGLContextBoundObject
, public nsWrapperCache
{
friend class WebGLContext;
friend class WebGLProgram;
public:
WebGLShader(WebGLContext *context, WebGLenum stype)
: WebGLContextBoundObject(context)
, mType(stype)
, mNeedsTranslation(true)
, mAttribMaxNameLength(0)
, mCompileStatus(false)
{
SetIsDOMBinding();
mContext->MakeContextCurrent();
mGLName = mContext->gl->fCreateShader(mType);
mContext->mShaders.insertBack(this);
}
~WebGLShader() {
DeleteOnce();
}
size_t SizeOfIncludingThis(nsMallocSizeOfFun aMallocSizeOf) const {
return aMallocSizeOf(this) +
mSource.SizeOfExcludingThisIfUnshared(aMallocSizeOf) +
mTranslationLog.SizeOfExcludingThisIfUnshared(aMallocSizeOf);
}
void Delete() {
mSource.Truncate();
mTranslationLog.Truncate();
mContext->MakeContextCurrent();
mContext->gl->fDeleteShader(mGLName);
LinkedListElement<WebGLShader>::removeFrom(mContext->mShaders);
}
WebGLuint GLName() { return mGLName; }
WebGLenum ShaderType() { return mType; }
void SetSource(const nsAString& src) {
// XXX do some quick gzip here maybe -- getting this will be very rare
mSource.Assign(src);
}
const nsString& Source() const { return mSource; }
void SetNeedsTranslation() { mNeedsTranslation = true; }
bool NeedsTranslation() const { return mNeedsTranslation; }
void SetCompileStatus (bool status) {
mCompileStatus = status;
}
bool CompileStatus() const {
return mCompileStatus;
}
void SetTranslationSuccess() {
mTranslationLog.SetIsVoid(true);
mNeedsTranslation = false;
}
void SetTranslationFailure(const nsCString& msg) {
mTranslationLog.Assign(msg);
}
const nsCString& TranslationLog() const { return mTranslationLog; }
WebGLContext *GetParentObject() const {
return Context();
}
virtual JSObject* WrapObject(JSContext *cx, JSObject *scope, bool *triedToWrap);
NS_DECL_CYCLE_COLLECTING_ISUPPORTS
NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(WebGLShader)
protected:
WebGLuint mGLName;
WebGLenum mType;
nsString mSource;
nsCString mTranslationLog; // The translation log should contain only ASCII characters
bool mNeedsTranslation;
nsTArray<WebGLMappedIdentifier> mAttributes;
nsTArray<WebGLMappedIdentifier> mUniforms;
nsTArray<WebGLUniformInfo> mUniformInfos;
int mAttribMaxNameLength;
bool mCompileStatus;
};
/** Takes an ASCII string like "foo[i]", turns it into "foo" and returns "[i]" in bracketPart
*
* \param string input/output: the string to split, becomes the string without the bracket part

View File

@ -3,6 +3,7 @@
* 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 "WebGLShader.h"
#include "WebGLContext.h"
#include "mozilla/dom/WebGLRenderingContextBinding.h"
@ -13,6 +14,41 @@ WebGLShader::WrapObject(JSContext *cx, JSObject *scope, bool *triedToWrap) {
return dom::WebGLShaderBinding::Wrap(cx, scope, this, triedToWrap);
}
WebGLShader::WebGLShader(WebGLContext *context, WebGLenum stype)
: WebGLContextBoundObject(context)
, mType(stype)
, mNeedsTranslation(true)
, mAttribMaxNameLength(0)
, mCompileStatus(false)
{
SetIsDOMBinding();
mContext->MakeContextCurrent();
mGLName = mContext->gl->fCreateShader(mType);
mContext->mShaders.insertBack(this);
}
void
WebGLShader::Delete() {
mSource.Truncate();
mTranslationLog.Truncate();
mContext->MakeContextCurrent();
mContext->gl->fDeleteShader(mGLName);
LinkedListElement<WebGLShader>::removeFrom(mContext->mShaders);
}
size_t
WebGLShader::SizeOfIncludingThis(nsMallocSizeOfFun aMallocSizeOf) const {
return aMallocSizeOf(this) +
mSource.SizeOfExcludingThisIfUnshared(aMallocSizeOf) +
mTranslationLog.SizeOfExcludingThisIfUnshared(aMallocSizeOf);
}
void
WebGLShader::SetTranslationSuccess() {
mTranslationLog.SetIsVoid(true);
mNeedsTranslation = false;
}
NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE_0(WebGLShader)
NS_IMPL_CYCLE_COLLECTING_ADDREF(WebGLShader)

View File

@ -0,0 +1,138 @@
/* -*- 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/. */
#ifndef WEBGLSHADER_H_
#define WEBGLSHADER_H_
#include "WebGLObjectModel.h"
#include "nsWrapperCache.h"
#include "angle/ShaderLang.h"
#include "mozilla/LinkedList.h"
namespace mozilla {
struct WebGLMappedIdentifier {
nsCString original, mapped; // ASCII strings
WebGLMappedIdentifier(const nsACString& o, const nsACString& m) : original(o), mapped(m) {}
};
struct WebGLUniformInfo {
uint32_t arraySize;
bool isArray;
ShDataType type;
WebGLUniformInfo(uint32_t s = 0, bool a = false, ShDataType t = SH_NONE)
: arraySize(s), isArray(a), type(t) {}
int ElementSize() const {
switch (type) {
case SH_INT:
case SH_FLOAT:
case SH_BOOL:
case SH_SAMPLER_2D:
case SH_SAMPLER_CUBE:
return 1;
case SH_INT_VEC2:
case SH_FLOAT_VEC2:
case SH_BOOL_VEC2:
return 2;
case SH_INT_VEC3:
case SH_FLOAT_VEC3:
case SH_BOOL_VEC3:
return 3;
case SH_INT_VEC4:
case SH_FLOAT_VEC4:
case SH_BOOL_VEC4:
case SH_FLOAT_MAT2:
return 4;
case SH_FLOAT_MAT3:
return 9;
case SH_FLOAT_MAT4:
return 16;
default:
NS_ABORT(); // should never get here
return 0;
}
}
};
class WebGLShader MOZ_FINAL
: public nsISupports
, public WebGLRefCountedObject<WebGLShader>
, public LinkedListElement<WebGLShader>
, public WebGLContextBoundObject
, public nsWrapperCache
{
friend class WebGLContext;
friend class WebGLProgram;
public:
WebGLShader(WebGLContext *context, WebGLenum stype);
~WebGLShader() {
DeleteOnce();
}
size_t SizeOfIncludingThis(nsMallocSizeOfFun aMallocSizeOf) const;
WebGLuint GLName() { return mGLName; }
WebGLenum ShaderType() { return mType; }
void SetSource(const nsAString& src) {
// XXX do some quick gzip here maybe -- getting this will be very rare
mSource.Assign(src);
}
const nsString& Source() const { return mSource; }
void SetNeedsTranslation() { mNeedsTranslation = true; }
bool NeedsTranslation() const { return mNeedsTranslation; }
void SetCompileStatus (bool status) {
mCompileStatus = status;
}
void Delete();
bool CompileStatus() const {
return mCompileStatus;
}
void SetTranslationSuccess();
void SetTranslationFailure(const nsCString& msg) {
mTranslationLog.Assign(msg);
}
const nsCString& TranslationLog() const { return mTranslationLog; }
WebGLContext *GetParentObject() const {
return Context();
}
virtual JSObject* WrapObject(JSContext *cx, JSObject *scope, bool *triedToWrap);
NS_DECL_CYCLE_COLLECTING_ISUPPORTS
NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(WebGLShader)
protected:
WebGLuint mGLName;
WebGLenum mType;
nsString mSource;
nsCString mTranslationLog; // The translation log should contain only ASCII characters
bool mNeedsTranslation;
nsTArray<WebGLMappedIdentifier> mAttributes;
nsTArray<WebGLMappedIdentifier> mUniforms;
nsTArray<WebGLUniformInfo> mUniformInfos;
int mAttribMaxNameLength;
bool mCompileStatus;
};
} // namespace mozilla
#endif