Commit 48cdc2e8 by Luc Ferron Committed by Commit Bot

Vulkan: Implement setUniform for matrices correctly

This fixes all these tests: dEQP-GLES2.functional.shaders.functions.datatypes.float_mat* dEQP-GLES2.functional.shaders.functions.datatypes.mat* dEQP-GLES2.functional.shaders.linkage.varying_type_mat* dEQP-GLES2.functional.shaders.matrix.* dEQP-GLES2.functional.uniform_api.value.assigned.by_pointer.render.basic.mat2_* dEQP-GLES2.functional.uniform_api.value.assigned.by_pointer.render.basic.mat3_* dEQP-GLES2.functional.shaders.conversions.matrix_to_matrix.* dEQP-GLES2.functional.shaders.conversions.matrix_combine.* dEQP-GLES2.functional.shaders.random.scalar_conversion* Bug:angleproject:2581 Bug:angleproject:2583 Bug:angleproject:2584 Bug:angleproject:2588 Change-Id: Ib8c03397f0229432292c51f4a6332f954fc8fa12 Reviewed-on: https://chromium-review.googlesource.com/1080392 Commit-Queue: Luc Ferron <lucferron@chromium.org> Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org>
parent 79216620
...@@ -159,26 +159,6 @@ bool FindFlatInterpolationVarying(const gl::Context *context, ...@@ -159,26 +159,6 @@ bool FindFlatInterpolationVarying(const gl::Context *context,
return false; return false;
} }
// Helper method to de-tranpose a matrix uniform for an API query.
void GetMatrixUniform(GLint columns, GLint rows, GLfloat *dataOut, const GLfloat *source)
{
for (GLint col = 0; col < columns; ++col)
{
for (GLint row = 0; row < rows; ++row)
{
GLfloat *outptr = dataOut + ((col * rows) + row);
const GLfloat *inptr = source + ((row * 4) + col);
*outptr = *inptr;
}
}
}
template <typename NonFloatT>
void GetMatrixUniform(GLint columns, GLint rows, NonFloatT *dataOut, const NonFloatT *source)
{
UNREACHABLE();
}
class UniformBlockInfo final : angle::NonCopyable class UniformBlockInfo final : angle::NonCopyable
{ {
public: public:
...@@ -2722,8 +2702,7 @@ void ProgramD3D::getUniformInternal(GLint location, DestT *dataOut) const ...@@ -2722,8 +2702,7 @@ void ProgramD3D::getUniformInternal(GLint location, DestT *dataOut) const
if (gl::IsMatrixType(uniform.type)) if (gl::IsMatrixType(uniform.type))
{ {
GetMatrixUniform(gl::VariableColumnCount(uniform.type), gl::VariableRowCount(uniform.type), GetMatrixUniform(uniform.type, dataOut, reinterpret_cast<const DestT *>(srcPointer), true);
dataOut, reinterpret_cast<const DestT *>(srcPointer));
} }
else else
{ {
......
...@@ -19,6 +19,7 @@ ...@@ -19,6 +19,7 @@
#include "libANGLE/renderer/Format.h" #include "libANGLE/renderer/Format.h"
#include <string.h> #include <string.h>
#include "common/utilities.h"
namespace rx namespace rx
{ {
...@@ -656,4 +657,29 @@ bool SetFloatUniformMatrix(unsigned int arrayElementOffset, ...@@ -656,4 +657,29 @@ bool SetFloatUniformMatrix(unsigned int arrayElementOffset,
return dirty; return dirty;
} }
template void GetMatrixUniform<GLint>(GLenum, GLint *, const GLint *, bool);
template void GetMatrixUniform<GLuint>(GLenum, GLuint *, const GLuint *, bool);
void GetMatrixUniform(GLenum type, GLfloat *dataOut, const GLfloat *source, bool transpose)
{
int columns = gl::VariableColumnCount(type);
int rows = gl::VariableRowCount(type);
for (GLint col = 0; col < columns; ++col)
{
for (GLint row = 0; row < rows; ++row)
{
GLfloat *outptr = dataOut + ((col * rows) + row);
const GLfloat *inptr =
transpose ? source + ((row * 4) + col) : source + ((col * 4) + row);
*outptr = *inptr;
}
}
}
template <typename NonFloatT>
void GetMatrixUniform(GLenum type, NonFloatT *dataOut, const NonFloatT *source, bool transpose)
{
UNREACHABLE();
}
} // namespace rx } // namespace rx
...@@ -267,6 +267,12 @@ bool SetFloatUniformMatrix(unsigned int arrayElementOffset, ...@@ -267,6 +267,12 @@ bool SetFloatUniformMatrix(unsigned int arrayElementOffset,
const GLfloat *value, const GLfloat *value,
uint8_t *targetData); uint8_t *targetData);
// Helper method to de-tranpose a matrix uniform for an API query.
void GetMatrixUniform(GLenum type, GLfloat *dataOut, const GLfloat *source, bool transpose);
template <typename NonFloatT>
void GetMatrixUniform(GLenum type, NonFloatT *dataOut, const NonFloatT *source, bool transpose);
} // namespace rx } // namespace rx
#endif // LIBANGLE_RENDERER_RENDERER_UTILS_H_ #endif // LIBANGLE_RENDERER_RENDERER_UTILS_H_
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
#include "common/debug.h" #include "common/debug.h"
#include "common/utilities.h" #include "common/utilities.h"
#include "libANGLE/Context.h" #include "libANGLE/Context.h"
#include "libANGLE/renderer/renderer_utils.h"
#include "libANGLE/renderer/vulkan/ContextVk.h" #include "libANGLE/renderer/vulkan/ContextVk.h"
#include "libANGLE/renderer/vulkan/GlslangWrapper.h" #include "libANGLE/renderer/vulkan/GlslangWrapper.h"
#include "libANGLE/renderer/vulkan/RendererVk.h" #include "libANGLE/renderer/vulkan/RendererVk.h"
...@@ -487,8 +488,18 @@ void ProgramVk::getUniformImpl(GLint location, T *v, GLenum entryPointType) cons ...@@ -487,8 +488,18 @@ void ProgramVk::getUniformImpl(GLint location, T *v, GLenum entryPointType) cons
ASSERT(linkedUniform.typeInfo->componentType == entryPointType || ASSERT(linkedUniform.typeInfo->componentType == entryPointType ||
linkedUniform.typeInfo->componentType == gl::VariableBoolVectorType(entryPointType)); linkedUniform.typeInfo->componentType == gl::VariableBoolVectorType(entryPointType));
ReadFromDefaultUniformBlock(linkedUniform.typeInfo->componentCount, locationInfo.arrayIndex, v,
layoutInfo, &uniformBlock.uniformData); if (gl::IsMatrixType(linkedUniform.type))
{
const uint8_t *ptrToElement = uniformBlock.uniformData.data() + layoutInfo.offset +
(locationInfo.arrayIndex * linkedUniform.getElementSize());
GetMatrixUniform(linkedUniform.type, v, reinterpret_cast<const T *>(ptrToElement), false);
}
else
{
ReadFromDefaultUniformBlock(linkedUniform.typeInfo->componentCount, locationInfo.arrayIndex,
v, layoutInfo, &uniformBlock.uniformData);
}
} }
void ProgramVk::setUniform1fv(GLint location, GLsizei count, const GLfloat *v) void ProgramVk::setUniform1fv(GLint location, GLsizei count, const GLfloat *v)
...@@ -551,18 +562,37 @@ void ProgramVk::setUniform4uiv(GLint location, GLsizei count, const GLuint *v) ...@@ -551,18 +562,37 @@ void ProgramVk::setUniform4uiv(GLint location, GLsizei count, const GLuint *v)
UNIMPLEMENTED(); UNIMPLEMENTED();
} }
template <int cols, int rows>
void ProgramVk::setUniformMatrixfv(GLint location,
GLsizei count,
GLboolean transpose,
const GLfloat *value)
{
const gl::VariableLocation &locationInfo = mState.getUniformLocations()[location];
const gl::LinkedUniform &linkedUniform = mState.getUniforms()[locationInfo.index];
for (auto &uniformBlock : mDefaultUniformBlocks)
{
const sh::BlockMemberInfo &layoutInfo = uniformBlock.uniformLayout[location];
// Assume an offset of -1 means the block is unused.
if (layoutInfo.offset == -1)
{
continue;
}
uniformBlock.uniformsDirty = SetFloatUniformMatrix<cols, rows>(
locationInfo.arrayIndex, linkedUniform.getArraySizeProduct(), count, transpose, value,
uniformBlock.uniformData.data() + layoutInfo.offset);
}
}
void ProgramVk::setUniformMatrix2fv(GLint location, void ProgramVk::setUniformMatrix2fv(GLint location,
GLsizei count, GLsizei count,
GLboolean transpose, GLboolean transpose,
const GLfloat *value) const GLfloat *value)
{ {
if (transpose == GL_TRUE) setUniformMatrixfv<2, 2>(location, count, transpose, value);
{
UNIMPLEMENTED();
return;
}
setUniformImpl(location, count, value, GL_FLOAT_MAT2);
} }
void ProgramVk::setUniformMatrix3fv(GLint location, void ProgramVk::setUniformMatrix3fv(GLint location,
...@@ -570,12 +600,7 @@ void ProgramVk::setUniformMatrix3fv(GLint location, ...@@ -570,12 +600,7 @@ void ProgramVk::setUniformMatrix3fv(GLint location,
GLboolean transpose, GLboolean transpose,
const GLfloat *value) const GLfloat *value)
{ {
if (transpose == GL_TRUE) setUniformMatrixfv<3, 3>(location, count, transpose, value);
{
UNIMPLEMENTED();
return;
}
setUniformImpl(location, count, value, GL_FLOAT_MAT3);
} }
void ProgramVk::setUniformMatrix4fv(GLint location, void ProgramVk::setUniformMatrix4fv(GLint location,
...@@ -583,13 +608,7 @@ void ProgramVk::setUniformMatrix4fv(GLint location, ...@@ -583,13 +608,7 @@ void ProgramVk::setUniformMatrix4fv(GLint location,
GLboolean transpose, GLboolean transpose,
const GLfloat *value) const GLfloat *value)
{ {
if (transpose == GL_TRUE) setUniformMatrixfv<4, 4>(location, count, transpose, value);
{
UNIMPLEMENTED();
return;
}
setUniformImpl(location, count, value, GL_FLOAT_MAT4);
} }
void ProgramVk::setUniformMatrix2x3fv(GLint location, void ProgramVk::setUniformMatrix2x3fv(GLint location,
...@@ -597,7 +616,7 @@ void ProgramVk::setUniformMatrix2x3fv(GLint location, ...@@ -597,7 +616,7 @@ void ProgramVk::setUniformMatrix2x3fv(GLint location,
GLboolean transpose, GLboolean transpose,
const GLfloat *value) const GLfloat *value)
{ {
UNIMPLEMENTED(); setUniformMatrixfv<2, 3>(location, count, transpose, value);
} }
void ProgramVk::setUniformMatrix3x2fv(GLint location, void ProgramVk::setUniformMatrix3x2fv(GLint location,
...@@ -605,7 +624,7 @@ void ProgramVk::setUniformMatrix3x2fv(GLint location, ...@@ -605,7 +624,7 @@ void ProgramVk::setUniformMatrix3x2fv(GLint location,
GLboolean transpose, GLboolean transpose,
const GLfloat *value) const GLfloat *value)
{ {
UNIMPLEMENTED(); setUniformMatrixfv<3, 2>(location, count, transpose, value);
} }
void ProgramVk::setUniformMatrix2x4fv(GLint location, void ProgramVk::setUniformMatrix2x4fv(GLint location,
...@@ -613,7 +632,7 @@ void ProgramVk::setUniformMatrix2x4fv(GLint location, ...@@ -613,7 +632,7 @@ void ProgramVk::setUniformMatrix2x4fv(GLint location,
GLboolean transpose, GLboolean transpose,
const GLfloat *value) const GLfloat *value)
{ {
UNIMPLEMENTED(); setUniformMatrixfv<2, 4>(location, count, transpose, value);
} }
void ProgramVk::setUniformMatrix4x2fv(GLint location, void ProgramVk::setUniformMatrix4x2fv(GLint location,
...@@ -621,7 +640,7 @@ void ProgramVk::setUniformMatrix4x2fv(GLint location, ...@@ -621,7 +640,7 @@ void ProgramVk::setUniformMatrix4x2fv(GLint location,
GLboolean transpose, GLboolean transpose,
const GLfloat *value) const GLfloat *value)
{ {
UNIMPLEMENTED(); setUniformMatrixfv<4, 2>(location, count, transpose, value);
} }
void ProgramVk::setUniformMatrix3x4fv(GLint location, void ProgramVk::setUniformMatrix3x4fv(GLint location,
...@@ -629,7 +648,7 @@ void ProgramVk::setUniformMatrix3x4fv(GLint location, ...@@ -629,7 +648,7 @@ void ProgramVk::setUniformMatrix3x4fv(GLint location,
GLboolean transpose, GLboolean transpose,
const GLfloat *value) const GLfloat *value)
{ {
UNIMPLEMENTED(); setUniformMatrixfv<3, 4>(location, count, transpose, value);
} }
void ProgramVk::setUniformMatrix4x3fv(GLint location, void ProgramVk::setUniformMatrix4x3fv(GLint location,
...@@ -637,7 +656,7 @@ void ProgramVk::setUniformMatrix4x3fv(GLint location, ...@@ -637,7 +656,7 @@ void ProgramVk::setUniformMatrix4x3fv(GLint location,
GLboolean transpose, GLboolean transpose,
const GLfloat *value) const GLfloat *value)
{ {
UNIMPLEMENTED(); setUniformMatrixfv<4, 3>(location, count, transpose, value);
} }
void ProgramVk::setUniformBlockBinding(GLuint uniformBlockIndex, GLuint uniformBlockBinding) void ProgramVk::setUniformBlockBinding(GLuint uniformBlockIndex, GLuint uniformBlockBinding)
......
...@@ -125,6 +125,12 @@ class ProgramVk : public ProgramImpl ...@@ -125,6 +125,12 @@ class ProgramVk : public ProgramImpl
void setDefaultUniformBlocksMinSizeForTesting(size_t minSize); void setDefaultUniformBlocksMinSizeForTesting(size_t minSize);
private: private:
template <int cols, int rows>
void setUniformMatrixfv(GLint location,
GLsizei count,
GLboolean transpose,
const GLfloat *value);
vk::Error reset(ContextVk *contextVk); vk::Error reset(ContextVk *contextVk);
vk::Error allocateDescriptorSet(ContextVk *contextVk, uint32_t descriptorSetIndex); vk::Error allocateDescriptorSet(ContextVk *contextVk, uint32_t descriptorSetIndex);
gl::Error initDefaultUniformBlocks(const gl::Context *glContext); gl::Error initDefaultUniformBlocks(const gl::Context *glContext);
......
...@@ -212,19 +212,12 @@ ...@@ -212,19 +212,12 @@
2580 VULKAN : dEQP-GLES2.functional.buffer.write.recreate_store.different_size = SKIP 2580 VULKAN : dEQP-GLES2.functional.buffer.write.recreate_store.different_size = SKIP
2580 VULKAN : dEQP-GLES2.functional.buffer.write.recreate_store.random_* = SKIP 2580 VULKAN : dEQP-GLES2.functional.buffer.write.recreate_store.random_* = SKIP
2580 VULKAN : dEQP-GLES2.functional.buffer.write.random.* = SKIP 2580 VULKAN : dEQP-GLES2.functional.buffer.write.random.* = SKIP
2581 VULKAN : dEQP-GLES2.functional.shaders.linkage.varying_type_mat* = SKIP
2582 VULKAN : dEQP-GLES2.functional.shaders.linkage.uniform_struct_fragment* = SKIP 2582 VULKAN : dEQP-GLES2.functional.shaders.linkage.uniform_struct_fragment* = SKIP
2583 VULKAN : dEQP-GLES2.functional.shaders.conversions.scalar_to_matrix.* = SKIP 2583 VULKAN : dEQP-GLES2.functional.shaders.conversions.scalar_to_matrix.* = SKIP
2583 VULKAN : dEQP-GLES2.functional.shaders.conversions.matrix_to_matrix.* = SKIP
2583 VULKAN : dEQP-GLES2.functional.shaders.conversions.matrix_combine.* = SKIP
2583 VULKAN : dEQP-GLES2.functional.shaders.random.scalar_conversion* = SKIP
2584 VULKAN : dEQP-GLES2.functional.shaders.functions.datatypes.float_mat* = SKIP
2584 VULKAN : dEQP-GLES2.functional.shaders.functions.datatypes.mat* = SKIP
2585 VULKAN : dEQP-GLES2.functional.shaders.qualification_order.variables.valid.* = SKIP 2585 VULKAN : dEQP-GLES2.functional.shaders.qualification_order.variables.valid.* = SKIP
2586 VULKAN : dEQP-GLES2.functional.shaders.indexing.uniform_array.vec2_* = SKIP 2586 VULKAN : dEQP-GLES2.functional.shaders.indexing.uniform_array.vec2_* = SKIP
2586 VULKAN : dEQP-GLES2.functional.shaders.indexing.uniform_array.vec3_* = SKIP 2586 VULKAN : dEQP-GLES2.functional.shaders.indexing.uniform_array.vec3_* = SKIP
2587 VULKAN : dEQP-GLES2.functional.shaders.loops.* = SKIP 2587 VULKAN : dEQP-GLES2.functional.shaders.loops.* = SKIP
2588 VULKAN : dEQP-GLES2.functional.shaders.matrix.* = SKIP
2589 VULKAN : dEQP-GLES2.functional.shaders.return.output_write* = SKIP 2589 VULKAN : dEQP-GLES2.functional.shaders.return.output_write* = SKIP
2589 VULKAN : dEQP-GLES2.functional.shaders.return.return_in_static_loop* = SKIP 2589 VULKAN : dEQP-GLES2.functional.shaders.return.return_in_static_loop* = SKIP
2590 VULKAN : dEQP-GLES2.functional.shaders.discard.* = SKIP 2590 VULKAN : dEQP-GLES2.functional.shaders.discard.* = SKIP
...@@ -310,8 +303,6 @@ ...@@ -310,8 +303,6 @@
2161 VULKAN : dEQP-GLES2.functional.uniform_api.value.assigned.by_pointer.get_uniform.multiple_basic.both = SKIP 2161 VULKAN : dEQP-GLES2.functional.uniform_api.value.assigned.by_pointer.get_uniform.multiple_basic.both = SKIP
2161 VULKAN : dEQP-GLES2.functional.uniform_api.value.assigned.by_pointer.get_uniform.multiple_basic_array.* = SKIP 2161 VULKAN : dEQP-GLES2.functional.uniform_api.value.assigned.by_pointer.get_uniform.multiple_basic_array.* = SKIP
2161 VULKAN : dEQP-GLES2.functional.uniform_api.value.assigned.by_pointer.get_uniform.multiple_nested_structs_arrays.* = SKIP 2161 VULKAN : dEQP-GLES2.functional.uniform_api.value.assigned.by_pointer.get_uniform.multiple_nested_structs_arrays.* = SKIP
2161 VULKAN : dEQP-GLES2.functional.uniform_api.value.assigned.by_pointer.render.basic.mat2_* = SKIP
2161 VULKAN : dEQP-GLES2.functional.uniform_api.value.assigned.by_pointer.render.basic.mat3_* = SKIP
2161 VULKAN : dEQP-GLES2.functional.uniform_api.value.assigned.by_pointer.render.basic.samplerCube* = SKIP 2161 VULKAN : dEQP-GLES2.functional.uniform_api.value.assigned.by_pointer.render.basic.samplerCube* = SKIP
2161 VULKAN : dEQP-GLES2.functional.uniform_api.value.assigned.by_pointer.render.basic_array.sampler2D_* = SKIP 2161 VULKAN : dEQP-GLES2.functional.uniform_api.value.assigned.by_pointer.render.basic_array.sampler2D_* = SKIP
2161 VULKAN : dEQP-GLES2.functional.uniform_api.value.assigned.by_pointer.render.basic_struct.sampler2D_* = SKIP 2161 VULKAN : dEQP-GLES2.functional.uniform_api.value.assigned.by_pointer.render.basic_struct.sampler2D_* = SKIP
......
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