mirror of
https://github.com/blawar/GLideN64.git
synced 2024-07-04 10:03:36 +00:00
Fixed problem with combiners shaders generation:
Parts of shaders code created on start. Some parts depend on config options. When config changed with GUI shaders updated but code parts not updated. Thus new shaders do not correspond to current state of config.
This commit is contained in:
parent
7d1d3da114
commit
365838eddc
|
@ -92,6 +92,7 @@ CombinerInfo & CombinerInfo::get()
|
|||
|
||||
void CombinerInfo::init()
|
||||
{
|
||||
gfxContext.resetCombinerProgramBuilder();
|
||||
m_pCurrent = nullptr;
|
||||
|
||||
m_shadersLoaded = 0;
|
||||
|
|
|
@ -1,19 +1,25 @@
|
|||
#include <vector>
|
||||
#include "CombinerProgram.h"
|
||||
#include <Config.h>
|
||||
|
||||
namespace graphics {
|
||||
|
||||
void CombinerProgram::getShaderCombinerOptionsSet(std::vector<u32> & _vecOptions)
|
||||
u32 CombinerProgram::getShaderCombinerOptionsBits()
|
||||
{
|
||||
// WARNING: Shader Storage format version must be increased after any change in this function.
|
||||
_vecOptions.push_back(config.video.multisampling > 0 ? 1 : 0);
|
||||
_vecOptions.push_back(config.texture.bilinearMode);
|
||||
_vecOptions.push_back(config.generalEmulation.enableHWLighting);
|
||||
_vecOptions.push_back(config.generalEmulation.enableNoise);
|
||||
_vecOptions.push_back(config.generalEmulation.enableLOD);
|
||||
_vecOptions.push_back(config.frameBufferEmulation.N64DepthCompare);
|
||||
_vecOptions.push_back(config.generalEmulation.enableLegacyBlending);
|
||||
_vecOptions.push_back(config.generalEmulation.enableFragmentDepthWrite);
|
||||
std::vector<u32> vecOptions;
|
||||
vecOptions.push_back(config.video.multisampling > 0 ? 1 : 0);
|
||||
vecOptions.push_back(config.texture.bilinearMode);
|
||||
vecOptions.push_back(config.generalEmulation.enableHWLighting);
|
||||
vecOptions.push_back(config.generalEmulation.enableNoise);
|
||||
vecOptions.push_back(config.generalEmulation.enableLOD);
|
||||
vecOptions.push_back(config.frameBufferEmulation.N64DepthCompare);
|
||||
vecOptions.push_back(config.generalEmulation.enableLegacyBlending);
|
||||
vecOptions.push_back(config.generalEmulation.enableFragmentDepthWrite);
|
||||
u32 optionsSet = 0;
|
||||
for (u32 i = 0; i < vecOptions.size(); ++i)
|
||||
optionsSet |= vecOptions[i] << i;
|
||||
return optionsSet;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -22,7 +22,7 @@ namespace graphics {
|
|||
|
||||
virtual bool getBinaryForm(std::vector<char> & _buffer) = 0;
|
||||
|
||||
static void getShaderCombinerOptionsSet(std::vector<u32> & _vecOptions);
|
||||
static u32 getShaderCombinerOptionsBits();
|
||||
};
|
||||
|
||||
typedef std::map<CombinerKey, graphics::CombinerProgram *> Combiners;
|
||||
|
|
|
@ -199,6 +199,17 @@ ColorBufferReader * Context::createColorBufferReader(CachedTexture * _pTexture)
|
|||
|
||||
/*---------------Shaders-------------*/
|
||||
|
||||
bool Context::isCombinerProgramBuilderObsolete()
|
||||
{
|
||||
return m_impl->isCombinerProgramBuilderObsolete();
|
||||
|
||||
}
|
||||
|
||||
void Context::resetCombinerProgramBuilder()
|
||||
{
|
||||
m_impl->resetCombinerProgramBuilder();
|
||||
}
|
||||
|
||||
CombinerProgram * Context::createCombinerProgram(Combiner & _color, Combiner & _alpha, const CombinerKey & _key)
|
||||
{
|
||||
return m_impl->createCombinerProgram(_color, _alpha, _key);
|
||||
|
|
|
@ -200,6 +200,10 @@ namespace graphics {
|
|||
|
||||
/*---------------Shaders-------------*/
|
||||
|
||||
bool isCombinerProgramBuilderObsolete();
|
||||
|
||||
void resetCombinerProgramBuilder();
|
||||
|
||||
CombinerProgram * createCombinerProgram(Combiner & _color, Combiner & _alpha, const CombinerKey & _key);
|
||||
|
||||
bool saveShadersStorage(const Combiners & _combiners);
|
||||
|
|
|
@ -45,6 +45,8 @@ namespace graphics {
|
|||
virtual PixelWriteBuffer * createPixelWriteBuffer(size_t _sizeInBytes) = 0;
|
||||
virtual PixelReadBuffer * createPixelReadBuffer(size_t _sizeInBytes) = 0;
|
||||
virtual ColorBufferReader * createColorBufferReader(CachedTexture * _pTexture) = 0;
|
||||
virtual bool isCombinerProgramBuilderObsolete() = 0;
|
||||
virtual void resetCombinerProgramBuilder() = 0;
|
||||
virtual CombinerProgram * createCombinerProgram(Combiner & _color, Combiner & _alpha, const CombinerKey & _key) = 0;
|
||||
virtual bool saveShadersStorage(const Combiners & _combiners) = 0;
|
||||
virtual bool loadShadersStorage(Combiners & _combiners) = 0;
|
||||
|
|
|
@ -1990,6 +1990,7 @@ CombinerProgramBuilder::CombinerProgramBuilder(const opengl::GLInfo & _glinfo, o
|
|||
, m_shaderN64DepthCompare(new ShaderN64DepthCompare(_glinfo))
|
||||
, m_shaderN64DepthRender(new ShaderN64DepthRender(_glinfo))
|
||||
, m_useProgram(_useProgram)
|
||||
, m_combinerOptionsBits(graphics::CombinerProgram::getShaderCombinerOptionsBits())
|
||||
{
|
||||
m_vertexShaderRect = _createVertexShader(m_vertexHeader.get(), m_vertexRect.get());
|
||||
m_vertexShaderTriangle = _createVertexShader(m_vertexHeader.get(), m_vertexTriangle.get());
|
||||
|
@ -2005,3 +2006,8 @@ CombinerProgramBuilder::~CombinerProgramBuilder()
|
|||
glDeleteShader(m_vertexShaderTexturedRect);
|
||||
glDeleteShader(m_vertexShaderTexturedTriangle);
|
||||
}
|
||||
|
||||
bool CombinerProgramBuilder::isObsolete() const
|
||||
{
|
||||
return m_combinerOptionsBits != graphics::CombinerProgram::getShaderCombinerOptionsBits();
|
||||
}
|
||||
|
|
|
@ -31,6 +31,8 @@ namespace glsl {
|
|||
|
||||
const ShaderPart * getFragmentShaderEnd() const;
|
||||
|
||||
bool isObsolete() const;
|
||||
|
||||
private:
|
||||
CombinerInputs compileCombiner(const CombinerKey & _key, Combiner & _color, Combiner & _alpha, std::string & _strShader);
|
||||
|
||||
|
@ -89,6 +91,7 @@ namespace glsl {
|
|||
GLuint m_vertexShaderTexturedRect;
|
||||
GLuint m_vertexShaderTexturedTriangle;
|
||||
opengl::CachedUseProgram * m_useProgram;
|
||||
u32 m_combinerOptionsBits;
|
||||
};
|
||||
|
||||
}
|
||||
|
|
|
@ -47,17 +47,6 @@ void getStorageFileName(const opengl::GLInfo & _glinfo, wchar_t * _shadersFileNa
|
|||
swprintf(_shadersFileName, PLUGIN_PATH_SIZE, L"%ls/GLideN64.%08lx.%ls.%ls", pPath, std::hash<std::string>()(RSP.romname), strOpenGLType.c_str(), _fileExtension);
|
||||
}
|
||||
|
||||
static
|
||||
u32 _getConfigOptionsBitSet()
|
||||
{
|
||||
std::vector<u32> vecOptions;
|
||||
graphics::CombinerProgram::getShaderCombinerOptionsSet(vecOptions);
|
||||
u32 optionsSet = 0;
|
||||
for (u32 i = 0; i < vecOptions.size(); ++i)
|
||||
optionsSet |= vecOptions[i] << i;
|
||||
return optionsSet;
|
||||
}
|
||||
|
||||
/*
|
||||
Storage has text format:
|
||||
line_1 Version in hex form
|
||||
|
@ -114,6 +103,10 @@ bool ShaderStorage::saveShadersStorage(const graphics::Combiners & _combiners) c
|
|||
if (!_saveCombinerKeys(_combiners))
|
||||
return false;
|
||||
|
||||
if (gfxContext.isCombinerProgramBuilderObsolete())
|
||||
// Created shaders are obsolete due to changes in config, but we saved combiners keys.
|
||||
return true;
|
||||
|
||||
if (!gfxContext.isSupported(graphics::SpecialFeatures::ShaderProgramBinary))
|
||||
// Shaders storage is not supported, but we saved combiners keys.
|
||||
return true;
|
||||
|
@ -135,7 +128,7 @@ bool ShaderStorage::saveShadersStorage(const graphics::Combiners & _combiners) c
|
|||
|
||||
shadersOut.write((char*)&m_formatVersion, sizeof(m_formatVersion));
|
||||
|
||||
const u32 configOptionsBitSet = _getConfigOptionsBitSet();
|
||||
const u32 configOptionsBitSet = graphics::CombinerProgram::getShaderCombinerOptionsBits();
|
||||
shadersOut.write((char*)&configOptionsBitSet, sizeof(configOptionsBitSet));
|
||||
|
||||
const char * strRenderer = reinterpret_cast<const char *>(glGetString(GL_RENDERER));
|
||||
|
@ -279,7 +272,7 @@ bool ShaderStorage::loadShadersStorage(graphics::Combiners & _combiners)
|
|||
|
||||
wchar_t shadersFileName[PLUGIN_PATH_SIZE];
|
||||
getStorageFileName(m_glinfo, shadersFileName, L"shaders");
|
||||
const u32 configOptionsBitSet = _getConfigOptionsBitSet();
|
||||
const u32 configOptionsBitSet = graphics::CombinerProgram::getShaderCombinerOptionsBits();
|
||||
|
||||
#if defined(OS_WINDOWS) && !defined(MINGW)
|
||||
std::ifstream fin(shadersFileName, std::ofstream::binary);
|
||||
|
|
|
@ -66,12 +66,7 @@ void ContextImpl::init()
|
|||
m_graphicsDrawer.reset(new UnbufferedDrawer(m_glInfo, m_cachedFunctions->getCachedVertexAttribArray()));
|
||||
}
|
||||
|
||||
m_combinerProgramBuilder.reset(new glsl::CombinerProgramBuilder(m_glInfo, m_cachedFunctions->getCachedUseProgram()));
|
||||
m_specialShadersFactory.reset(new glsl::SpecialShadersFactory(m_glInfo,
|
||||
m_cachedFunctions->getCachedUseProgram(),
|
||||
m_combinerProgramBuilder->getVertexShaderHeader(),
|
||||
m_combinerProgramBuilder->getFragmentShaderHeader(),
|
||||
m_combinerProgramBuilder->getFragmentShaderEnd()));
|
||||
resetCombinerProgramBuilder();
|
||||
}
|
||||
|
||||
void ContextImpl::destroy()
|
||||
|
@ -319,6 +314,25 @@ graphics::ColorBufferReader * ContextImpl::createColorBufferReader(CachedTexture
|
|||
|
||||
/*---------------Shaders-------------*/
|
||||
|
||||
bool ContextImpl::isCombinerProgramBuilderObsolete()
|
||||
{
|
||||
if (!m_combinerProgramBuilder)
|
||||
return true;
|
||||
return m_combinerProgramBuilder->isObsolete();
|
||||
}
|
||||
|
||||
void ContextImpl::resetCombinerProgramBuilder()
|
||||
{
|
||||
if (!isCombinerProgramBuilderObsolete())
|
||||
return;
|
||||
m_combinerProgramBuilder.reset(new glsl::CombinerProgramBuilder(m_glInfo, m_cachedFunctions->getCachedUseProgram()));
|
||||
m_specialShadersFactory.reset(new glsl::SpecialShadersFactory(m_glInfo,
|
||||
m_cachedFunctions->getCachedUseProgram(),
|
||||
m_combinerProgramBuilder->getVertexShaderHeader(),
|
||||
m_combinerProgramBuilder->getFragmentShaderHeader(),
|
||||
m_combinerProgramBuilder->getFragmentShaderEnd()));
|
||||
}
|
||||
|
||||
graphics::CombinerProgram * ContextImpl::createCombinerProgram(Combiner & _color, Combiner & _alpha, const CombinerKey & _key)
|
||||
{
|
||||
return m_combinerProgramBuilder->buildCombinerProgram(_color, _alpha, _key);
|
||||
|
|
|
@ -98,6 +98,10 @@ namespace opengl {
|
|||
|
||||
/*---------------Shaders-------------*/
|
||||
|
||||
bool isCombinerProgramBuilderObsolete() override;
|
||||
|
||||
void resetCombinerProgramBuilder() override;
|
||||
|
||||
graphics::CombinerProgram * createCombinerProgram(Combiner & _color, Combiner & _alpha, const CombinerKey & _key) override;
|
||||
|
||||
bool saveShadersStorage(const graphics::Combiners & _combiners) override;
|
||||
|
|
Loading…
Reference in New Issue
Block a user