Hash :
3b555e8d
Author :
Date :
2023-10-26T00:00:00
GL: Add emulateClipOrigin workaround Older Adreno drivers apply GL_CLIP_ORIGIN_EXT to the framebuffer instead of the clip space, thus causing various side-effects. Used a uniform to emulate the correct behavior. Drive-by: * Fixed a typo in ClipControlTest.OriginFrontFacing Fixed: angleproject:8392 Change-Id: I2f7145977ab0e11dc88e8dbfec2cd32c4c31f830 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4987326 Reviewed-by: Geoff Lang <geofflang@chromium.org> Commit-Queue: Alexey Knyazev <lexa.knyazev@gmail.com>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125
//
// Copyright 2023 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.
//
// ProgramExecutableGL.h: Implementation of ProgramExecutableImpl.
#ifndef LIBANGLE_RENDERER_GL_PROGRAMEXECUTABLEGL_H_
#define LIBANGLE_RENDERER_GL_PROGRAMEXECUTABLEGL_H_
#include "libANGLE/ProgramExecutable.h"
#include "libANGLE/renderer/ProgramExecutableImpl.h"
namespace angle
{
struct FeaturesGL;
} // namespace angle
namespace rx
{
class FunctionsGL;
class StateManagerGL;
class ProgramExecutableGL : public ProgramExecutableImpl
{
public:
ProgramExecutableGL(const gl::ProgramExecutable *executable);
~ProgramExecutableGL() override;
void destroy(const gl::Context *context) override;
void setUniform1fv(GLint location, GLsizei count, const GLfloat *v) override;
void setUniform2fv(GLint location, GLsizei count, const GLfloat *v) override;
void setUniform3fv(GLint location, GLsizei count, const GLfloat *v) override;
void setUniform4fv(GLint location, GLsizei count, const GLfloat *v) override;
void setUniform1iv(GLint location, GLsizei count, const GLint *v) override;
void setUniform2iv(GLint location, GLsizei count, const GLint *v) override;
void setUniform3iv(GLint location, GLsizei count, const GLint *v) override;
void setUniform4iv(GLint location, GLsizei count, const GLint *v) override;
void setUniform1uiv(GLint location, GLsizei count, const GLuint *v) override;
void setUniform2uiv(GLint location, GLsizei count, const GLuint *v) override;
void setUniform3uiv(GLint location, GLsizei count, const GLuint *v) override;
void setUniform4uiv(GLint location, GLsizei count, const GLuint *v) override;
void setUniformMatrix2fv(GLint location,
GLsizei count,
GLboolean transpose,
const GLfloat *value) override;
void setUniformMatrix3fv(GLint location,
GLsizei count,
GLboolean transpose,
const GLfloat *value) override;
void setUniformMatrix4fv(GLint location,
GLsizei count,
GLboolean transpose,
const GLfloat *value) override;
void setUniformMatrix2x3fv(GLint location,
GLsizei count,
GLboolean transpose,
const GLfloat *value) override;
void setUniformMatrix3x2fv(GLint location,
GLsizei count,
GLboolean transpose,
const GLfloat *value) override;
void setUniformMatrix2x4fv(GLint location,
GLsizei count,
GLboolean transpose,
const GLfloat *value) override;
void setUniformMatrix4x2fv(GLint location,
GLsizei count,
GLboolean transpose,
const GLfloat *value) override;
void setUniformMatrix3x4fv(GLint location,
GLsizei count,
GLboolean transpose,
const GLfloat *value) override;
void setUniformMatrix4x3fv(GLint location,
GLsizei count,
GLboolean transpose,
const GLfloat *value) override;
void getUniformfv(const gl::Context *context, GLint location, GLfloat *params) const override;
void getUniformiv(const gl::Context *context, GLint location, GLint *params) const override;
void getUniformuiv(const gl::Context *context, GLint location, GLuint *params) const override;
void updateEnabledClipDistances(uint8_t enabledClipDistancesPacked) const;
void updateEmulatedClipOrigin(gl::ClipOrigin origin) const;
void enableLayeredRenderingPath(int baseViewIndex) const;
GLuint getProgramID() const { return mProgramID; }
private:
friend class ProgramGL;
void reset();
void postLink(const FunctionsGL *functions,
StateManagerGL *stateManager,
const angle::FeaturesGL &features,
GLuint programID);
// Helper function, makes it simpler to type.
GLint uniLoc(GLint glLocation) const { return mUniformRealLocationMap[glLocation]; }
std::vector<GLint> mUniformRealLocationMap;
std::vector<GLuint> mUniformBlockRealLocationMap;
bool mHasAppliedTransformFeedbackVaryings;
GLint mClipDistanceEnabledUniformLocation;
GLint mClipOriginUniformLocation;
GLint mMultiviewBaseViewLayerIndexUniformLocation;
// The program for which the executable was built
GLuint mProgramID;
const FunctionsGL *mFunctions;
StateManagerGL *mStateManager;
};
} // namespace rx
#endif // LIBANGLE_RENDERER_GL_PROGRAMEXECUTABLEGL_H_