GLX bug fixes

This commit is contained in:
Jack Andersen 2018-10-11 10:47:37 -10:00
parent bba2486c15
commit f917d154b2
4 changed files with 29 additions and 20 deletions

View File

@ -720,7 +720,7 @@ class GLShaderStage : public GraphicsDataNode<IShaderStage>
friend class GLDataFactory; friend class GLDataFactory;
GLuint m_shad = 0; GLuint m_shad = 0;
std::vector<std::pair<std::string, int>> m_texNames; std::vector<std::pair<std::string, int>> m_texNames;
std::vector<std::string> m_blockNames; std::vector<std::pair<std::string, int>> m_blockNames;
static constexpr EShLanguage ShaderTypes[] = static constexpr EShLanguage ShaderTypes[] =
{ {
@ -750,6 +750,7 @@ class GLShaderStage : public GraphicsDataNode<IShaderStage>
prog.addShader(&shader); prog.addShader(&shader);
if (!prog.link(messages)) if (!prog.link(messages))
{ {
printf("%s\n", source);
Log.report(logvisor::Fatal, "unable to link shader program\n%s", prog.getInfoLog()); Log.report(logvisor::Fatal, "unable to link shader program\n%s", prog.getInfoLog());
} }
@ -769,7 +770,13 @@ class GLShaderStage : public GraphicsDataNode<IShaderStage>
count = prog.getNumLiveUniformBlocks(); count = prog.getNumLiveUniformBlocks();
m_blockNames.reserve(count); m_blockNames.reserve(count);
for (int i = 0; i < count; ++i) for (int i = 0; i < count; ++i)
m_blockNames.emplace_back(prog.getUniformBlockName(i)); {
const glslang::TType* tp = prog.getUniformBlockTType(i);
const auto& qual = tp->getQualifier();
if (!qual.hasBinding())
Log.report(logvisor::Fatal, "shader uniform %s does not have layout binding", prog.getUniformBlockName(i));
m_blockNames.emplace_back(std::make_pair(prog.getUniformBlockName(i), qual.layoutBinding));
}
} }
GLShaderStage(const ObjToken<BaseGraphicsData>& parent, const char* source, PipelineStage stage) GLShaderStage(const ObjToken<BaseGraphicsData>& parent, const char* source, PipelineStage stage)
@ -802,7 +809,7 @@ public:
~GLShaderStage() { if (m_shad) glDeleteShader(m_shad); } ~GLShaderStage() { if (m_shad) glDeleteShader(m_shad); }
GLuint getShader() const { return m_shad; } GLuint getShader() const { return m_shad; }
const std::vector<std::pair<std::string, int>>& getTexNames() const { return m_texNames; } const std::vector<std::pair<std::string, int>>& getTexNames() const { return m_texNames; }
const std::vector<std::string>& getBlockNames() const { return m_blockNames; } const std::vector<std::pair<std::string, int>>& getBlockNames() const { return m_blockNames; }
}; };
class GLShaderPipeline : public GraphicsDataNode<IShaderPipeline> class GLShaderPipeline : public GraphicsDataNode<IShaderPipeline>
@ -831,10 +838,12 @@ protected:
bool m_overwriteAlpha = false; bool m_overwriteAlpha = false;
CullMode m_culling; CullMode m_culling;
uint32_t m_patchSize = 0; uint32_t m_patchSize = 0;
mutable std::vector<GLint> m_uniLocs; mutable GLint m_uniLocs[BOO_GLSL_MAX_UNIFORM_COUNT];
GLShaderPipeline(const ObjToken<BaseGraphicsData>& parent, const AdditionalPipelineInfo& info) GLShaderPipeline(const ObjToken<BaseGraphicsData>& parent, const AdditionalPipelineInfo& info)
: GraphicsDataNode<IShaderPipeline>(parent) : GraphicsDataNode<IShaderPipeline>(parent)
{ {
std::fill(std::begin(m_uniLocs), std::end(m_uniLocs), -1);
if (info.srcFac == BlendFactor::Subtract || info.dstFac == BlendFactor::Subtract) if (info.srcFac == BlendFactor::Subtract || info.dstFac == BlendFactor::Subtract)
{ {
m_sfactor = GL_SRC_ALPHA; m_sfactor = GL_SRC_ALPHA;
@ -915,10 +924,10 @@ public:
{ {
for (const auto& name : stage->getBlockNames()) for (const auto& name : stage->getBlockNames())
{ {
GLint uniLoc = glGetUniformBlockIndex(m_prog, name.c_str()); GLint uniLoc = glGetUniformBlockIndex(m_prog, name.first.c_str());
//if (uniLoc < 0) //if (uniLoc < 0)
// Log.report(logvisor::Warning, "unable to find uniform block '%s'", uniformBlockNames[i]); // Log.report(logvisor::Warning, "unable to find uniform block '%s'", uniformBlockNames[i]);
m_uniLocs.push_back(uniLoc); m_uniLocs[name.second] = uniLoc;
} }
for (const auto& name : stage->getTexNames()) for (const auto& name : stage->getTexNames())
{ {
@ -1116,7 +1125,7 @@ struct GLShaderDataBinding : GraphicsDataNode<IShaderDataBinding>
glBindVertexArray(m_vao[b]); glBindVertexArray(m_vao[b]);
if (m_ubufOffs.size()) if (m_ubufOffs.size())
{ {
for (size_t i=0 ; i<m_ubufs.size() && i<pipeline.m_uniLocs.size() ; ++i) for (size_t i=0 ; i<m_ubufs.size() ; ++i)
{ {
GLint loc = pipeline.m_uniLocs[i]; GLint loc = pipeline.m_uniLocs[i];
if (loc < 0) if (loc < 0)
@ -1132,7 +1141,7 @@ struct GLShaderDataBinding : GraphicsDataNode<IShaderDataBinding>
} }
else else
{ {
for (size_t i=0 ; i<m_ubufs.size() && i<pipeline.m_uniLocs.size() ; ++i) for (size_t i=0 ; i<m_ubufs.size() ; ++i)
{ {
GLint loc = pipeline.m_uniLocs[i]; GLint loc = pipeline.m_uniLocs[i];
if (loc < 0) if (loc < 0)

View File

@ -151,7 +151,6 @@ public:
void setDisplayGamma(float gamma) void setDisplayGamma(float gamma)
{ {
m_gamma = gamma; m_gamma = gamma;
if (gamma != 1.f)
UpdateGammaLUT(m_gammaLUT.get(), gamma); UpdateGammaLUT(m_gammaLUT.get(), gamma);
} }
@ -414,7 +413,7 @@ bool VulkanContext::initVulkan(std::string_view appName, PFN_vkGetInstanceProcAd
#ifndef NDEBUG #ifndef NDEBUG
m_layerNames.push_back("VK_LAYER_LUNARG_standard_validation"); m_layerNames.push_back("VK_LAYER_LUNARG_standard_validation");
//m_layerNames.push_back("VK_LAYER_RENDERDOC_Capture"); m_layerNames.push_back("VK_LAYER_RENDERDOC_Capture");
//m_layerNames.push_back("VK_LAYER_LUNARG_api_dump"); //m_layerNames.push_back("VK_LAYER_LUNARG_api_dump");
//m_layerNames.push_back("VK_LAYER_LUNARG_core_validation"); //m_layerNames.push_back("VK_LAYER_LUNARG_core_validation");
//m_layerNames.push_back("VK_LAYER_LUNARG_object_tracker"); //m_layerNames.push_back("VK_LAYER_LUNARG_object_tracker");

View File

@ -1,8 +1,9 @@
option(ENABLE_NX "Build mesa for offline NX shader compilation and runtime" ON)
find_program(MESON_PROG meson) find_program(MESON_PROG meson)
find_program(NINJA_PROG ninja) find_program(NINJA_PROG ninja)
if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/mesa/meson.build AND if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/mesa/meson.build AND
EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/libdrm_nouveau/Makefile AND EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/libdrm_nouveau/Makefile AND
MESON_PROG AND NINJA_PROG) MESON_PROG AND NINJA_PROG AND ENABLE_NX)
message(STATUS "Enabling NX support") message(STATUS "Enabling NX support")
set(LIBDRM_DIR ${CMAKE_CURRENT_SOURCE_DIR}/libdrm_nouveau) set(LIBDRM_DIR ${CMAKE_CURRENT_SOURCE_DIR}/libdrm_nouveau)
@ -147,7 +148,7 @@ endif()
else() else()
if(NX) if(NX)
message(FATAL_ERROR "Unable to find meson or ninja or mesa submodules; this is required for NX.") message(FATAL_ERROR "Unable to find meson or ninja or mesa submodules; this is required for NX.")
else() elseif(ENABLE_NX)
message(STATUS "Unable to find meson or ninja or mesa submodules; skipping NX support.") message(STATUS "Unable to find meson or ninja or mesa submodules; skipping NX support.")
endif() endif()
endif() endif()

View File

@ -70,37 +70,37 @@ static const int ContextAttribList[7][7] =
{ {
{ GLX_CONTEXT_MAJOR_VERSION_ARB, 4, { GLX_CONTEXT_MAJOR_VERSION_ARB, 4,
GLX_CONTEXT_MINOR_VERSION_ARB, 5, GLX_CONTEXT_MINOR_VERSION_ARB, 5,
GLX_CONTEXT_FLAGS_ARB, GLX_CONTEXT_CORE_PROFILE_BIT_ARB, GLX_CONTEXT_PROFILE_MASK_ARB, GLX_CONTEXT_CORE_PROFILE_BIT_ARB,
0 0
}, },
{ GLX_CONTEXT_MAJOR_VERSION_ARB, 4, { GLX_CONTEXT_MAJOR_VERSION_ARB, 4,
GLX_CONTEXT_MINOR_VERSION_ARB, 4, GLX_CONTEXT_MINOR_VERSION_ARB, 4,
GLX_CONTEXT_FLAGS_ARB, GLX_CONTEXT_CORE_PROFILE_BIT_ARB, GLX_CONTEXT_PROFILE_MASK_ARB, GLX_CONTEXT_CORE_PROFILE_BIT_ARB,
0 0
}, },
{ GLX_CONTEXT_MAJOR_VERSION_ARB, 4, { GLX_CONTEXT_MAJOR_VERSION_ARB, 4,
GLX_CONTEXT_MINOR_VERSION_ARB, 3, GLX_CONTEXT_MINOR_VERSION_ARB, 3,
GLX_CONTEXT_FLAGS_ARB, GLX_CONTEXT_CORE_PROFILE_BIT_ARB, GLX_CONTEXT_PROFILE_MASK_ARB, GLX_CONTEXT_CORE_PROFILE_BIT_ARB,
0 0
}, },
{ GLX_CONTEXT_MAJOR_VERSION_ARB, 4, { GLX_CONTEXT_MAJOR_VERSION_ARB, 4,
GLX_CONTEXT_MINOR_VERSION_ARB, 2, GLX_CONTEXT_MINOR_VERSION_ARB, 2,
GLX_CONTEXT_FLAGS_ARB, GLX_CONTEXT_CORE_PROFILE_BIT_ARB, GLX_CONTEXT_PROFILE_MASK_ARB, GLX_CONTEXT_CORE_PROFILE_BIT_ARB,
0 0
}, },
{ GLX_CONTEXT_MAJOR_VERSION_ARB, 4, { GLX_CONTEXT_MAJOR_VERSION_ARB, 4,
GLX_CONTEXT_MINOR_VERSION_ARB, 1, GLX_CONTEXT_MINOR_VERSION_ARB, 1,
GLX_CONTEXT_FLAGS_ARB, GLX_CONTEXT_CORE_PROFILE_BIT_ARB, GLX_CONTEXT_PROFILE_MASK_ARB, GLX_CONTEXT_CORE_PROFILE_BIT_ARB,
0 0
}, },
{ GLX_CONTEXT_MAJOR_VERSION_ARB, 4, { GLX_CONTEXT_MAJOR_VERSION_ARB, 4,
GLX_CONTEXT_MINOR_VERSION_ARB, 0, GLX_CONTEXT_MINOR_VERSION_ARB, 0,
GLX_CONTEXT_FLAGS_ARB, GLX_CONTEXT_CORE_PROFILE_BIT_ARB, GLX_CONTEXT_PROFILE_MASK_ARB, GLX_CONTEXT_CORE_PROFILE_BIT_ARB,
0 0
}, },
{ GLX_CONTEXT_MAJOR_VERSION_ARB, 3, { GLX_CONTEXT_MAJOR_VERSION_ARB, 3,
GLX_CONTEXT_MINOR_VERSION_ARB, 3, GLX_CONTEXT_MINOR_VERSION_ARB, 3,
GLX_CONTEXT_FLAGS_ARB, GLX_CONTEXT_CORE_PROFILE_BIT_ARB, GLX_CONTEXT_PROFILE_MASK_ARB, GLX_CONTEXT_CORE_PROFILE_BIT_ARB,
0 0
}, },
}; };