Bug 766345 - Part 1 - Implement DEAA Antialiasing for transformed layers (v5 Patch). r=vladimir, r=djg
This commit is contained in:
@@ -40,7 +40,8 @@ enum ShaderFeatures {
|
||||
ENABLE_COLOR_MATRIX=0x200,
|
||||
ENABLE_MASK_2D=0x400,
|
||||
ENABLE_MASK_3D=0x800,
|
||||
ENABLE_PREMULTIPLY=0x1000
|
||||
ENABLE_PREMULTIPLY=0x1000,
|
||||
ENABLE_DEAA=0x2000
|
||||
};
|
||||
|
||||
class KnownUniform {
|
||||
@@ -50,6 +51,7 @@ public:
|
||||
NotAKnownUniform = -1,
|
||||
|
||||
LayerTransform = 0,
|
||||
LayerTransformInverse,
|
||||
MaskTransform,
|
||||
LayerRects,
|
||||
MatrixProj,
|
||||
@@ -73,6 +75,9 @@ public:
|
||||
BlurOffset,
|
||||
BlurAlpha,
|
||||
BlurGaussianKernel,
|
||||
SSEdges,
|
||||
ViewportSize,
|
||||
VisibleCenter,
|
||||
|
||||
KnownUniformCount
|
||||
};
|
||||
@@ -163,6 +168,30 @@ public:
|
||||
return false;
|
||||
}
|
||||
|
||||
bool UpdateArrayUniform(int cnt, const gfx::Point3D* points) {
|
||||
if (mLocation == -1) return false;
|
||||
if (cnt > 4) {
|
||||
return false;
|
||||
}
|
||||
|
||||
float fp[12];
|
||||
float *d = fp;
|
||||
for(int i=0; i < cnt; i++) {
|
||||
// Note: Do not want to make assumptions about .x, .y, .z member packing.
|
||||
// If gfx::Point3D is updated to make this guarantee, SIMD optimizations
|
||||
// may be possible
|
||||
*d++ = points[i].x;
|
||||
*d++ = points[i].y;
|
||||
*d++ = points[i].z;
|
||||
}
|
||||
|
||||
if (memcmp(mValue.f16v, fp, sizeof(float) * cnt * 3) != 0) {
|
||||
memcpy(mValue.f16v, fp, sizeof(float) * cnt * 3);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
KnownUniformName mName;
|
||||
const char *mNameString;
|
||||
int32_t mLocation;
|
||||
@@ -192,6 +221,7 @@ public:
|
||||
void SetMask2D(bool aEnabled);
|
||||
void SetMask3D(bool aEnabled);
|
||||
void SetPremultiply(bool aEnabled);
|
||||
void SetDEAA(bool aEnabled);
|
||||
|
||||
bool operator< (const ShaderConfigOGL& other) const {
|
||||
return mFeatures < other.mFeatures;
|
||||
@@ -303,10 +333,28 @@ public:
|
||||
SetMatrixUniform(KnownUniform::LayerTransform, aMatrix);
|
||||
}
|
||||
|
||||
void SetLayerTransformInverse(const gfx::Matrix4x4& aMatrix) {
|
||||
SetMatrixUniform(KnownUniform::LayerTransformInverse, aMatrix);
|
||||
}
|
||||
|
||||
void SetMaskLayerTransform(const gfx::Matrix4x4& aMatrix) {
|
||||
SetMatrixUniform(KnownUniform::MaskTransform, aMatrix);
|
||||
}
|
||||
|
||||
void SetDEAAEdges(const gfx::Point3D* aEdges) {
|
||||
SetArrayUniform(KnownUniform::SSEdges, 4, aEdges);
|
||||
}
|
||||
|
||||
void SetViewportSize(const gfx::IntSize& aSize) {
|
||||
float vals[2] = { (float)aSize.width, (float)aSize.height };
|
||||
SetUniform(KnownUniform::ViewportSize, 2, vals);
|
||||
}
|
||||
|
||||
void SetVisibleCenter(const gfx::Point& aVisibleCenter) {
|
||||
float vals[2] = { aVisibleCenter.x, aVisibleCenter.y };
|
||||
SetUniform(KnownUniform::VisibleCenter, 2, vals);
|
||||
}
|
||||
|
||||
void SetLayerRects(const gfx::Rect* aRects) {
|
||||
float vals[16] = { aRects[0].x, aRects[0].y, aRects[0].width, aRects[0].height,
|
||||
aRects[1].x, aRects[1].y, aRects[1].width, aRects[1].height,
|
||||
@@ -333,13 +381,13 @@ public:
|
||||
}
|
||||
|
||||
void SetRenderOffset(const nsIntPoint& aOffset) {
|
||||
float vals[4] = { float(aOffset.x), float(aOffset.y), 0.0f, 0.0f };
|
||||
SetUniform(KnownUniform::RenderTargetOffset, 4, vals);
|
||||
float vals[4] = { float(aOffset.x), float(aOffset.y) };
|
||||
SetUniform(KnownUniform::RenderTargetOffset, 2, vals);
|
||||
}
|
||||
|
||||
void SetRenderOffset(float aX, float aY) {
|
||||
float vals[4] = { aX, aY, 0.0f, 0.0f };
|
||||
SetUniform(KnownUniform::RenderTargetOffset, 4, vals);
|
||||
float vals[2] = { aX, aY };
|
||||
SetUniform(KnownUniform::RenderTargetOffset, 2, vals);
|
||||
}
|
||||
|
||||
void SetLayerOpacity(float aOpacity) {
|
||||
@@ -497,6 +545,17 @@ protected:
|
||||
}
|
||||
}
|
||||
|
||||
void SetArrayUniform(KnownUniform::KnownUniformName aKnownUniform, int aLength, const gfx::Point3D *aPointValues)
|
||||
{
|
||||
ASSERT_THIS_PROGRAM;
|
||||
NS_ASSERTION(aKnownUniform >= 0 && aKnownUniform < KnownUniform::KnownUniformCount, "Invalid known uniform");
|
||||
|
||||
KnownUniform& ku(mProfile.mUniforms[aKnownUniform]);
|
||||
if (ku.UpdateArrayUniform(aLength, aPointValues)) {
|
||||
mGL->fUniform3fv(ku.mLocation, aLength, ku.mValue.f16v);
|
||||
}
|
||||
}
|
||||
|
||||
void SetUniform(KnownUniform::KnownUniformName aKnownUniform, GLint aIntValue) {
|
||||
ASSERT_THIS_PROGRAM;
|
||||
NS_ASSERTION(aKnownUniform >= 0 && aKnownUniform < KnownUniform::KnownUniformCount, "Invalid known uniform");
|
||||
|
||||
Reference in New Issue
Block a user