mirror of
https://github.com/godotengine/godot-angle-static.git
synced 2026-01-06 02:09:55 +03:00
Bug: angleproject:8297 Change-Id: I5bab916f452439d92afa65b9172574000ee0b587 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4762838 Reviewed-by: Charlie Lao <cclao@google.com> Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: Yuxin Hu <yuxinhu@google.com>
151 lines
6.6 KiB
C++
151 lines
6.6 KiB
C++
//
|
|
// Copyright 2016 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.
|
|
//
|
|
// ProgramVk.h:
|
|
// Defines the class interface for ProgramVk, implementing ProgramImpl.
|
|
//
|
|
|
|
#ifndef LIBANGLE_RENDERER_VULKAN_PROGRAMVK_H_
|
|
#define LIBANGLE_RENDERER_VULKAN_PROGRAMVK_H_
|
|
|
|
#include <array>
|
|
|
|
#include "common/utilities.h"
|
|
#include "libANGLE/renderer/ProgramImpl.h"
|
|
#include "libANGLE/renderer/vulkan/ContextVk.h"
|
|
#include "libANGLE/renderer/vulkan/ProgramExecutableVk.h"
|
|
#include "libANGLE/renderer/vulkan/RendererVk.h"
|
|
#include "libANGLE/renderer/vulkan/TransformFeedbackVk.h"
|
|
#include "libANGLE/renderer/vulkan/vk_helpers.h"
|
|
|
|
namespace rx
|
|
{
|
|
class ProgramVk : public ProgramImpl
|
|
{
|
|
public:
|
|
ProgramVk(const gl::ProgramState &state);
|
|
~ProgramVk() override;
|
|
void destroy(const gl::Context *context) override;
|
|
|
|
std::unique_ptr<LinkEvent> load(const gl::Context *context,
|
|
gl::BinaryInputStream *stream,
|
|
gl::InfoLog &infoLog) override;
|
|
void save(const gl::Context *context, gl::BinaryOutputStream *stream) override;
|
|
void setBinaryRetrievableHint(bool retrievable) override;
|
|
void setSeparable(bool separable) override;
|
|
|
|
std::unique_ptr<LinkEvent> link(const gl::Context *context,
|
|
const gl::ProgramLinkedResources &resources,
|
|
gl::InfoLog &infoLog,
|
|
const gl::ProgramMergedVaryings &mergedVaryings,
|
|
gl::ScopedShaderLinkLocks *shaderLocks) override;
|
|
GLboolean validate(const gl::Caps &caps, gl::InfoLog *infoLog) override;
|
|
|
|
angle::Result syncState(const gl::Context *context,
|
|
const gl::Program::DirtyBits &dirtyBits) 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;
|
|
|
|
bool areShaderUniformsDirty(gl::ShaderType shaderType) const
|
|
{
|
|
return mExecutable.mDefaultUniformBlocksDirty[shaderType];
|
|
}
|
|
void setShaderUniformDirtyBit(gl::ShaderType shaderType)
|
|
{
|
|
if (!mExecutable.mDefaultUniformBlocks[shaderType]->uniformData.empty())
|
|
{
|
|
mExecutable.mDefaultUniformBlocksDirty.set(shaderType);
|
|
}
|
|
}
|
|
void clearShaderUniformDirtyBit(gl::ShaderType shaderType)
|
|
{
|
|
mExecutable.mDefaultUniformBlocksDirty.reset(shaderType);
|
|
}
|
|
|
|
const ProgramExecutableVk &getExecutable() const { return mExecutable; }
|
|
ProgramExecutableVk &getExecutable() { return mExecutable; }
|
|
|
|
const SpvProgramInterfaceInfo &getSpvProgramInterfaceInfo() { return mSpvProgramInterfaceInfo; }
|
|
|
|
private:
|
|
template <int cols, int rows>
|
|
void setUniformMatrixfv(GLint location,
|
|
GLsizei count,
|
|
GLboolean transpose,
|
|
const GLfloat *value);
|
|
|
|
void reset(ContextVk *contextVk);
|
|
|
|
template <class T>
|
|
void getUniformImpl(GLint location, T *v, GLenum entryPointType) const;
|
|
|
|
template <typename T>
|
|
void setUniformImpl(GLint location, GLsizei count, const T *v, GLenum entryPointType);
|
|
void linkResources(const gl::Context *context, const gl::ProgramLinkedResources &resources);
|
|
|
|
angle::Result createGraphicsPipelineWithDefaultState(const gl::Context *context,
|
|
vk::PipelineCacheAccess *pipelineCache);
|
|
|
|
// We keep the SPIR-V code to use for draw call pipeline creation.
|
|
SpvProgramInterfaceInfo mSpvProgramInterfaceInfo;
|
|
|
|
ProgramExecutableVk mExecutable;
|
|
};
|
|
|
|
} // namespace rx
|
|
|
|
#endif // LIBANGLE_RENDERER_VULKAN_PROGRAMVK_H_
|