Bug 1012407 - Part 5: Allow passing a texture rectangle to BindAndDrawQuad (r=Bas)

This commit is contained in:
Andreas Gal 2014-05-22 12:29:54 +02:00
Родитель 69c73e6b6b
Коммит 859d692d6a
9 изменённых файлов: 53 добавлений и 62 удалений

Просмотреть файл

@ -37,25 +37,6 @@ RectTriangles::addRect(GLfloat x0, GLfloat y0, GLfloat x1, GLfloat y1,
AppendRectToCoordArray(mTexCoords, tx0, ty0, tx1, ty1);
}
bool
RectTriangles::isSimpleQuad(gfx3DMatrix& aOutTextureTransform) const
{
if (mVertexCoords.Length() == 6 &&
mVertexCoords[0].x == 0.0f &&
mVertexCoords[0].y == 0.0f &&
mVertexCoords[5].x == 1.0f &&
mVertexCoords[5].y == 1.0f)
{
GLfloat tx0 = mTexCoords[0].x;
GLfloat ty0 = mTexCoords[0].y;
GLfloat tx1 = mTexCoords[5].x;
GLfloat ty1 = mTexCoords[5].y;
aOutTextureTransform = gfx3DMatrix::From2D(gfxMatrix(tx1 - tx0, 0, 0, ty1 - ty0, tx0, ty0));
return true;
}
return false;
}
static GLfloat
WrapTexCoord(GLfloat v)
{

Просмотреть файл

@ -28,13 +28,6 @@ public:
GLfloat tx0, GLfloat ty0, GLfloat tx1, GLfloat ty1,
bool flip_y = false);
// Returns whether this object is made of only one rect that can be drawn
// with a pre-buffered unity quad which has 0,0,1,1 as both vertex
// positions and texture coordinates.
// aOutTextureTransform returns the transform that maps 0,0,1,1 texture
// coordinates to the correct ones.
bool isSimpleQuad(gfx3DMatrix& aOutTextureTransform) const;
/**
* these return a float pointer to the start of each array respectively.
* Use it for glVertexAttribPointer calls.

Просмотреть файл

@ -477,19 +477,12 @@ CompositorOGL::BindAndDrawQuadWithTextureRect(ShaderProgramOGL *aProg,
rects, flipped);
}
gfx3DMatrix textureTransform;
if (rects.isSimpleQuad(textureTransform)) {
Matrix4x4 transform;
ToMatrix4x4(aTextureTransform * textureTransform, transform);
aProg->SetTextureTransform(transform);
BindAndDrawQuad(aProg, aRect);
} else {
Matrix4x4 transform;
ToMatrix4x4(aTextureTransform, transform);
aProg->SetTextureTransform(transform);
aProg->SetLayerQuadRect(aRect);
DrawQuads(mGLContext, mVBOs, aProg, LOCAL_GL_TRIANGLES, rects);
}
Matrix4x4 transform;
aProg->SetLayerRect(aRect);
ToMatrix4x4(aTextureTransform, transform);
aProg->SetTextureTransform(transform);
aProg->SetTextureRect(Rect(0.0f, 0.0f, 1.0f, 1.0f));
DrawQuads(mGLContext, mVBOs, aProg, LOCAL_GL_TRIANGLES, rects);
}
void
@ -1466,11 +1459,13 @@ CompositorOGL::QuadVBOTexCoordsAttrib(GLuint aAttribIndex) {
}
void
CompositorOGL::BindAndDrawQuad(ShaderProgramOGL *aProg, const Rect& aRect)
CompositorOGL::BindAndDrawQuad(ShaderProgramOGL *aProg,
const Rect& aLayerRect,
const Rect& aTextureRect)
{
NS_ASSERTION(aProg->HasInitialized(), "Shader program not correctly initialized");
aProg->SetLayerQuadRect(aRect);
aProg->SetLayerRect(aLayerRect);
GLuint vertAttribIndex = aProg->AttribLocation(ShaderProgramOGL::VertexCoordAttrib);
GLuint texCoordAttribIndex = aProg->AttribLocation(ShaderProgramOGL::TexCoordAttrib);
@ -1481,6 +1476,8 @@ CompositorOGL::BindAndDrawQuad(ShaderProgramOGL *aProg, const Rect& aRect)
if (texCoordAttribIndex != GLuint(-1)) {
QuadVBOTexCoordsAttrib(texCoordAttribIndex);
mGLContext->fEnableVertexAttribArray(texCoordAttribIndex);
aProg->SetTextureRect(aTextureRect);
}
mGLContext->fEnableVertexAttribArray(vertAttribIndex);

Просмотреть файл

@ -369,7 +369,8 @@ private:
void QuadVBOVerticesAttrib(GLuint aAttribIndex);
void QuadVBOTexCoordsAttrib(GLuint aAttribIndex);
void BindAndDrawQuad(ShaderProgramOGL *aProg,
const gfx::Rect& aRect);
const gfx::Rect& aLayerRect,
const gfx::Rect& aTextureRect = gfx::Rect(0.0f, 0.0f, 1.0f, 1.0f));
void BindAndDrawQuadWithTextureRect(ShaderProgramOGL *aProg,
const gfx::Rect& aRect,
const gfx3DMatrix& aTextureTransform,

Просмотреть файл

@ -43,9 +43,11 @@ public:
return mImpl->GetProjMatrix();
}
virtual void BindAndDrawQuad(ShaderProgramOGL *aProg, const gfx::Rect& aRect) MOZ_OVERRIDE
virtual void BindAndDrawQuad(ShaderProgramOGL *aProg,
const gfx::Rect& aLayerRect,
const gfx::Rect& aTextureRect) MOZ_OVERRIDE
{
mImpl->BindAndDrawQuad(aProg, aRect);
mImpl->BindAndDrawQuad(aProg, aLayerRect, aTextureRect);
}
private:

Просмотреть файл

@ -33,7 +33,8 @@ public:
virtual gl::GLContext* gl() const = 0;
virtual ShaderProgramOGL* GetProgram(GLenum aTarget, gfx::SurfaceFormat aFormat) = 0;
virtual const gfx::Matrix4x4& GetProjMatrix() const = 0;
virtual void BindAndDrawQuad(ShaderProgramOGL *aProg, const gfx::Rect& aRect) = 0;
virtual void BindAndDrawQuad(ShaderProgramOGL *aProg, const gfx::Rect& aLayerRect,
const gfx::Rect& aTextureRect) = 0;
};
}

Просмотреть файл

@ -31,10 +31,11 @@ AddUniforms(ProgramProfileOGL& aProfile)
{
static const char *sKnownUniformNames[] = {
"uLayerTransform",
"uMaskQuadTransform",
"uLayerQuadRect",
"uMaskTransform",
"uLayerRect",
"uMatrixProj",
"uTextureTransform",
"uTextureRect",
"uRenderTargetOffset",
"uLayerOpacity",
"uTexture",
@ -145,7 +146,7 @@ ProgramProfileOGL::GetProfileFor(ShaderConfigOGL aConfig)
AddUniforms(result);
vs << "uniform mat4 uMatrixProj;" << endl;
vs << "uniform vec4 uLayerQuadRect;" << endl;
vs << "uniform vec4 uLayerRect;" << endl;
vs << "uniform mat4 uLayerTransform;" << endl;
vs << "uniform vec4 uRenderTargetOffset;" << endl;
@ -153,28 +154,29 @@ ProgramProfileOGL::GetProfileFor(ShaderConfigOGL aConfig)
if (!(aConfig.mFeatures & ENABLE_RENDER_COLOR)) {
vs << "uniform mat4 uTextureTransform;" << endl;
vs << "uniform vec4 uTextureRect;" << endl;
vs << "attribute vec2 aTexCoord;" << endl;
vs << "varying vec2 vTexCoord;" << endl;
}
if (aConfig.mFeatures & ENABLE_MASK_2D ||
aConfig.mFeatures & ENABLE_MASK_3D) {
vs << "uniform mat4 uMaskQuadTransform;" << endl;
vs << "uniform mat4 uMaskTransform;" << endl;
vs << "varying vec3 vMaskCoord;" << endl;
}
vs << "void main() {" << endl;
vs << " vec4 finalPosition = vec4(aVertexCoord.xy * uLayerQuadRect.zw + uLayerQuadRect.xy, 0.0, 1.0);" << endl;
vs << " vec4 finalPosition = vec4(aVertexCoord.xy * uLayerRect.zw + uLayerRect.xy, 0.0, 1.0);" << endl;
vs << " finalPosition = uLayerTransform * finalPosition;" << endl;
vs << " finalPosition.xyz /= finalPosition.w;" << endl;
if (aConfig.mFeatures & ENABLE_MASK_3D) {
vs << " vMaskCoord.xy = (uMaskQuadTransform * vec4(finalPosition.xyz, 1.0)).xy;" << endl;
vs << " vMaskCoord.xy = (uMaskTransform * vec4(finalPosition.xyz, 1.0)).xy;" << endl;
// correct for perspective correct interpolation, see comment in D3D10 shader
vs << " vMaskCoord.z = 1.0;" << endl;
vs << " vMaskCoord *= finalPosition.w;" << endl;
} else if (aConfig.mFeatures & ENABLE_MASK_2D) {
vs << " vMaskCoord.xy = (uMaskQuadTransform * finalPosition).xy;" << endl;
vs << " vMaskCoord.xy = (uMaskTransform * finalPosition).xy;" << endl;
}
vs << " finalPosition = finalPosition - uRenderTargetOffset;" << endl;
@ -182,7 +184,8 @@ ProgramProfileOGL::GetProfileFor(ShaderConfigOGL aConfig)
vs << " finalPosition = uMatrixProj * finalPosition;" << endl;
if (!(aConfig.mFeatures & ENABLE_RENDER_COLOR)) {
vs << " vTexCoord = (uTextureTransform * vec4(aTexCoord.x, aTexCoord.y, 0.0, 1.0)).xy;" << endl;
vs << " vec2 texCoord = aTexCoord * uTextureRect.zw + uTextureRect.xy;" << endl;
vs << " vTexCoord = (uTextureTransform * vec4(texCoord, 0.0, 1.0)).xy;" << endl;
}
vs << " gl_Position = finalPosition;" << endl;

Просмотреть файл

@ -51,10 +51,11 @@ public:
NotAKnownUniform = -1,
LayerTransform = 0,
MaskQuadTransform,
LayerQuadRect,
MaskTransform,
LayerRect,
MatrixProj,
TextureTransform,
TextureRect,
RenderTargetOffset,
LayerOpacity,
Texture,
@ -318,12 +319,12 @@ public:
}
void SetMaskLayerTransform(const gfx::Matrix4x4& aMatrix) {
SetMatrixUniform(KnownUniform::MaskQuadTransform, aMatrix);
SetMatrixUniform(KnownUniform::MaskTransform, aMatrix);
}
void SetLayerQuadRect(const gfx::Rect& aRect) {
void SetLayerRect(const gfx::Rect& aRect) {
float vals[4] = { float(aRect.x), float(aRect.y), float(aRect.width), float(aRect.height) };
SetUniform(KnownUniform::LayerQuadRect, 4, vals);
SetUniform(KnownUniform::LayerRect, 4, vals);
}
void SetProjectionMatrix(const gfx::Matrix4x4& aMatrix) {
@ -335,6 +336,11 @@ public:
SetMatrixUniform(KnownUniform::TextureTransform, aMatrix);
}
void SetTextureRect(const gfx::Rect& aRect) {
float vals[4] = { float(aRect.x), float(aRect.y), float(aRect.width), float(aRect.height) };
SetUniform(KnownUniform::TextureRect, 4, vals);
}
void SetRenderOffset(const nsIntPoint& aOffset) {
float vals[4] = { float(aOffset.x), float(aOffset.y), 0.0f, 0.0f };
SetUniform(KnownUniform::RenderTargetOffset, 4, vals);

Просмотреть файл

@ -345,7 +345,9 @@ public:
{
return mProjMatrix;
}
virtual void BindAndDrawQuad(ShaderProgramOGL *aProg, const gfx::Rect& aRect) MOZ_OVERRIDE;
virtual void BindAndDrawQuad(ShaderProgramOGL *aProg,
const gfx::Rect& aLayerRect,
const gfx::Rect& aTextureRect) MOZ_OVERRIDE;
void BeginFrame(nsIntSize aRenderSize);
void EndFrame();
@ -2760,7 +2762,9 @@ RectTextureImage::Draw(GLManager* aManager,
program->SetTexCoordMultiplier(mUsedSize.width, mUsedSize.height);
program->SetTextureUnit(0);
aManager->BindAndDrawQuad(program, gfx::Rect(0, 0, mUsedSize.width, mUsedSize.height));
aManager->BindAndDrawQuad(program,
gfx::Rect(0.0, 0.0, mUsedSize.width, mUsedSize.height),
gfx::Rect(0.0, 0.0, 1.0f, 1.0f));
aManager->gl()->fBindTexture(LOCAL_GL_TEXTURE_RECTANGLE_ARB, 0);
}
@ -2800,11 +2804,14 @@ GLPresenter::~GLPresenter()
}
void
GLPresenter::BindAndDrawQuad(ShaderProgramOGL *aProgram, const gfx::Rect& aRect)
GLPresenter::BindAndDrawQuad(ShaderProgramOGL *aProgram,
const gfx::Rect& aLayerRect,
const gfx::Rect& aTextureRect)
{
mGLContext->MakeCurrent();
aProgram->SetLayerQuadRect(aRect);
aProgram->SetLayerRect(aLayerRect);
aProgram->SetTextureRect(aTextureRect);
GLuint vertAttribIndex = aProgram->AttribLocation(ShaderProgramOGL::VertexCoordAttrib);
GLuint texCoordAttribIndex = aProgram->AttribLocation(ShaderProgramOGL::TexCoordAttrib);