Commit 568fc39b by Lingfeng Yang Committed by Commit Bot

GLES1: glMultMatrix(f|x)

BUG=angleproject:2306 Change-Id: I178b051c23da51d8eaf24c2a0df97f01ae5f3aaa Reviewed-on: https://chromium-review.googlesource.com/1002914 Commit-Queue: Lingfeng Yang <lfy@google.com> Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org>
parent 3a41af64
...@@ -11,6 +11,24 @@ ...@@ -11,6 +11,24 @@
#include "common/mathutil.h" #include "common/mathutil.h"
#include "common/utilities.h" #include "common/utilities.h"
namespace
{
angle::Mat4 FixedMatrixToMat4(const GLfixed *m)
{
angle::Mat4 matrixAsFloat;
GLfloat *floatData = matrixAsFloat.data();
for (int i = 0; i < 16; i++)
{
floatData[i] = gl::FixedToFloat(m[i]);
}
return matrixAsFloat;
}
} // namespace
namespace gl namespace gl
{ {
...@@ -234,15 +252,7 @@ void Context::loadMatrixf(const GLfloat *m) ...@@ -234,15 +252,7 @@ void Context::loadMatrixf(const GLfloat *m)
void Context::loadMatrixx(const GLfixed *m) void Context::loadMatrixx(const GLfixed *m)
{ {
angle::Mat4 matrixAsFloat; mGLState.gles1().loadMatrix(FixedMatrixToMat4(m));
GLfloat *floatData = matrixAsFloat.data();
for (int i = 0; i < 16; i++)
{
floatData[i] = FixedToFloat(m[i]);
}
mGLState.gles1().loadMatrix(matrixAsFloat);
} }
void Context::logicOp(GLenum opcode) void Context::logicOp(GLenum opcode)
...@@ -277,12 +287,12 @@ void Context::matrixMode(MatrixType mode) ...@@ -277,12 +287,12 @@ void Context::matrixMode(MatrixType mode)
void Context::multMatrixf(const GLfloat *m) void Context::multMatrixf(const GLfloat *m)
{ {
UNIMPLEMENTED(); mGLState.gles1().multMatrix(angle::Mat4(m));
} }
void Context::multMatrixx(const GLfixed *m) void Context::multMatrixx(const GLfixed *m)
{ {
UNIMPLEMENTED(); mGLState.gles1().multMatrix(FixedMatrixToMat4(m));
} }
void Context::multiTexCoord4f(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q) void Context::multiTexCoord4f(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q)
......
...@@ -262,4 +262,10 @@ void GLES1State::loadMatrix(const angle::Mat4 &m) ...@@ -262,4 +262,10 @@ void GLES1State::loadMatrix(const angle::Mat4 &m)
currentMatrixStack().back() = m; currentMatrixStack().back() = m;
} }
void GLES1State::multMatrix(const angle::Mat4 &m)
{
angle::Mat4 currentMatrix = currentMatrixStack().back();
currentMatrixStack().back() = currentMatrix.product(m);
}
} // namespace gl } // namespace gl
...@@ -148,6 +148,7 @@ class GLES1State final : angle::NonCopyable ...@@ -148,6 +148,7 @@ class GLES1State final : angle::NonCopyable
const MatrixStack &currentMatrixStack() const; const MatrixStack &currentMatrixStack() const;
void loadMatrix(const angle::Mat4 &m); void loadMatrix(const angle::Mat4 &m);
void multMatrix(const angle::Mat4 &m);
private: private:
friend class State; friend class State;
......
...@@ -386,13 +386,13 @@ bool ValidateMatrixMode(Context *context, MatrixType mode) ...@@ -386,13 +386,13 @@ bool ValidateMatrixMode(Context *context, MatrixType mode)
bool ValidateMultMatrixf(Context *context, const GLfloat *m) bool ValidateMultMatrixf(Context *context, const GLfloat *m)
{ {
UNIMPLEMENTED(); ANGLE_VALIDATE_IS_GLES1(context);
return true; return true;
} }
bool ValidateMultMatrixx(Context *context, const GLfixed *m) bool ValidateMultMatrixx(Context *context, const GLfixed *m)
{ {
UNIMPLEMENTED(); ANGLE_VALIDATE_IS_GLES1(context);
return true; return true;
} }
......
...@@ -54,6 +54,7 @@ ...@@ -54,6 +54,7 @@
'<(angle_path)/src/tests/gl_tests/gles1/CurrentTextureCoordsTest.cpp', '<(angle_path)/src/tests/gl_tests/gles1/CurrentTextureCoordsTest.cpp',
'<(angle_path)/src/tests/gl_tests/gles1/MatrixLoadTest.cpp', '<(angle_path)/src/tests/gl_tests/gles1/MatrixLoadTest.cpp',
'<(angle_path)/src/tests/gl_tests/gles1/MatrixModeTest.cpp', '<(angle_path)/src/tests/gl_tests/gles1/MatrixModeTest.cpp',
'<(angle_path)/src/tests/gl_tests/gles1/MatrixMultTest.cpp',
'<(angle_path)/src/tests/gl_tests/gles1/MatrixStackTest.cpp', '<(angle_path)/src/tests/gl_tests/gles1/MatrixStackTest.cpp',
'<(angle_path)/src/tests/gl_tests/GLSLTest.cpp', '<(angle_path)/src/tests/gl_tests/GLSLTest.cpp',
'<(angle_path)/src/tests/gl_tests/ImageTest.cpp', '<(angle_path)/src/tests/gl_tests/ImageTest.cpp',
......
//
// Copyright 2018 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// MatrixMultTest.cpp: Tests basic usage of glMultMatrix(f|x).
#include "test_utils/ANGLETest.h"
#include "test_utils/gl_raii.h"
#include "common/matrix_utils.h"
#include "random_utils.h"
#include <stdint.h>
using namespace angle;
class MatrixMultTest : public ANGLETest
{
protected:
MatrixMultTest()
{
setWindowWidth(32);
setWindowHeight(32);
setConfigRedBits(8);
setConfigGreenBits(8);
setConfigBlueBits(8);
setConfigAlphaBits(8);
setConfigDepthBits(24);
}
};
// Multiplies identity matrix with itself.
TEST_P(MatrixMultTest, Identity)
{
angle::Mat4 testMatrix;
angle::Mat4 outputMatrix;
glMultMatrixf(testMatrix.data());
EXPECT_GL_NO_ERROR();
glGetFloatv(GL_MODELVIEW_MATRIX, outputMatrix.data());
EXPECT_GL_NO_ERROR();
EXPECT_EQ(angle::Mat4(), outputMatrix);
}
// Multiplies translation matrix and checks matrix underneath in stack is not affected.
TEST_P(MatrixMultTest, Translation)
{
glPushMatrix();
angle::Mat4 testMatrix = angle::Mat4::Translate(angle::Vector3(1.0f, 0.0f, 0.0f));
angle::Mat4 outputMatrix;
glMultMatrixf(testMatrix.data());
EXPECT_GL_NO_ERROR();
glMultMatrixf(testMatrix.data());
EXPECT_GL_NO_ERROR();
glGetFloatv(GL_MODELVIEW_MATRIX, outputMatrix.data());
EXPECT_GL_NO_ERROR();
EXPECT_EQ(angle::Mat4::Translate(angle::Vector3(2.0f, 0.0f, 0.0f)), outputMatrix);
glPopMatrix();
glGetFloatv(GL_MODELVIEW_MATRIX, outputMatrix.data());
EXPECT_GL_NO_ERROR();
EXPECT_EQ(angle::Mat4(), outputMatrix);
}
ANGLE_INSTANTIATE_TEST(MatrixMultTest, ES1_D3D11(), ES1_OPENGL(), ES1_OPENGLES());
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment