Add the ability to auto discard unused texture layer based on the compiled shader
This commit is contained in:
parent
0aa61ec746
commit
0ed74ac3e9
@ -353,17 +353,6 @@ Material::Material(const XMLNode *node, bool deprecated)
|
||||
m_sampler_path[i] = "";
|
||||
}
|
||||
}
|
||||
|
||||
#ifndef SERVER_ONLY
|
||||
if (ProfileWorld::isNoGraphics() || !CVS->isDefferedEnabled())
|
||||
{
|
||||
for (int i = 2; i < 6; i++)
|
||||
{
|
||||
// When advanced pipeline is off only .spm uv textures are used
|
||||
m_sampler_path[i] = "";
|
||||
}
|
||||
}
|
||||
#endif
|
||||
loadContainerId();
|
||||
|
||||
core::stringc texfname(m_texname.c_str());
|
||||
|
@ -39,8 +39,9 @@ SPDynamicDrawCall::SPDynamicDrawCall(scene::E_PRIMITIVE_TYPE pt,
|
||||
m_textures.resize(m_stk_material.size());
|
||||
for (unsigned j = 0; j < 6; j++)
|
||||
{
|
||||
m_textures[0][j] = SPTextureManager::get()->getTexture
|
||||
(std::get<2>(m_stk_material[0])->getSamplerPath(j),
|
||||
m_textures[0][j] = SPTextureManager::get()->getTexture(
|
||||
m_shaders[0] && m_shaders[0]->hasTextureLayer(j) ?
|
||||
std::get<2>(m_stk_material[0])->getSamplerPath(j) : "",
|
||||
j == 0 ? std::get<2>(m_stk_material[0]) : NULL,
|
||||
m_shaders[0] && m_shaders[0]->isSrgbForTextureLayer(j),
|
||||
std::get<2>(m_stk_material[0])->getContainerId());
|
||||
|
@ -126,7 +126,8 @@ void SPMeshBuffer::uploadGLMesh()
|
||||
for (unsigned j = 0; j < 6; j++)
|
||||
{
|
||||
m_textures[i][j] = SPTextureManager::get()->getTexture
|
||||
(std::get<2>(m_stk_material[i])->getSamplerPath(j),
|
||||
(m_shaders[0]->hasTextureLayer(j) ?
|
||||
std::get<2>(m_stk_material[i])->getSamplerPath(j) : "",
|
||||
j == 0 ? std::get<2>(m_stk_material[i]) : NULL,
|
||||
m_shaders[0]->isSrgbForTextureLayer(j),
|
||||
std::get<2>(m_stk_material[i])->getContainerId());
|
||||
|
@ -127,7 +127,7 @@ void SPShader::addAllTextures(RenderPass rp)
|
||||
const unsigned idx =
|
||||
unsigned(m_prefilled_samplers[rp].size() + m_samplers[rp].size());
|
||||
glUniform1i(loc, idx);
|
||||
m_samplers[rp].emplace_back(i, idx);
|
||||
m_samplers[rp][i] = idx;
|
||||
}
|
||||
#endif
|
||||
} // addPrefilledTextures
|
||||
|
@ -27,6 +27,7 @@
|
||||
#include <cstring>
|
||||
#include <functional>
|
||||
#include <ostream>
|
||||
#include <map>
|
||||
#include <memory>
|
||||
#include <string>
|
||||
#include <unordered_map>
|
||||
@ -85,7 +86,7 @@ private:
|
||||
|
||||
GLuint m_program[RP_COUNT];
|
||||
|
||||
std::vector<std::pair<unsigned, unsigned> > m_samplers[RP_COUNT];
|
||||
std::map<unsigned, unsigned> m_samplers[RP_COUNT];
|
||||
|
||||
std::vector<std::tuple<unsigned, std::string, SamplerType,
|
||||
GLuint> >m_prefilled_samplers[RP_COUNT];
|
||||
@ -229,7 +230,18 @@ public:
|
||||
bool isSrgbForTextureLayer(unsigned layer) const;
|
||||
// ------------------------------------------------------------------------
|
||||
bool useTangents() const { return m_use_tangents; }
|
||||
|
||||
// ------------------------------------------------------------------------
|
||||
bool hasTextureLayer(unsigned layer)
|
||||
{
|
||||
for (unsigned rp = RP_1ST; rp < RP_COUNT; rp++)
|
||||
{
|
||||
if (m_samplers[rp].find(layer) != m_samplers[rp].end())
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user