Commit 2cd00090 by Alexis Hétu

Revert "Fixed sampler allocation"

This reverts commit a141a075. Reason for revert: We need a different solution to fix this issue which doesn't require having a different sampler index and register index. Change-Id: If08a0fc4713e2bd8277630ca760bb8686a2effd2 Reviewed-on: https://swiftshader-review.googlesource.com/15649Reviewed-by: 's avatarAlexis Hétu <sugoi@google.com> Tested-by: 's avatarAlexis Hétu <sugoi@google.com>
parent 2693e753
......@@ -3074,16 +3074,15 @@ void Context::applyTextures(sw::SamplerType samplerType)
{
Program *programObject = getCurrentProgram();
const std::map<int, es2::Program::Sampler> &samplerMap = programObject->getSamplerMap(samplerType);
int samplerCount = (samplerType == sw::SAMPLER_PIXEL) ? MAX_TEXTURE_IMAGE_UNITS : MAX_VERTEX_TEXTURE_IMAGE_UNITS; // Range of samplers of given sampler type
int samplerIndex = 0;
for(auto sampler : samplerMap)
for(int samplerIndex = 0; samplerIndex < samplerCount; samplerIndex++)
{
int textureUnit = sampler.second.logicalTextureUnit;
int textureUnit = programObject->getSamplerMapping(samplerType, samplerIndex); // OpenGL texture image unit index
if(textureUnit != -1)
{
TextureType textureType = programObject->getSamplerTextureType(samplerType, sampler.first);
TextureType textureType = programObject->getSamplerTextureType(samplerType, samplerIndex);
Texture *texture = getSamplerTexture(textureUnit, textureType);
......@@ -3154,13 +3153,6 @@ void Context::applyTextures(sw::SamplerType samplerType)
{
applyTexture(samplerType, samplerIndex, nullptr);
}
++samplerIndex;
}
int samplerCount = (samplerType == sw::SAMPLER_PIXEL) ? MAX_TEXTURE_IMAGE_UNITS : MAX_VERTEX_TEXTURE_IMAGE_UNITS;
for(; samplerIndex < samplerCount; ++samplerIndex)
{
applyTexture(samplerType, samplerIndex, nullptr);
}
}
......
......@@ -304,9 +304,38 @@ namespace es2
return attributeStream[attributeIndex];
}
const std::map<int, es2::Program::Sampler>& Program::getSamplerMap(sw::SamplerType type) const
// Returns the index of the texture image unit (0-19) corresponding to a sampler index (0-15 for the pixel shader and 0-3 for the vertex shader)
GLint Program::getSamplerMapping(sw::SamplerType type, unsigned int samplerIndex)
{
return (type == sw::SAMPLER_PIXEL) ? samplersPS : samplersVS;
GLint logicalTextureUnit = -1;
switch(type)
{
case sw::SAMPLER_PIXEL:
ASSERT(samplerIndex < sizeof(samplersPS) / sizeof(samplersPS[0]));
if(samplersPS[samplerIndex].active)
{
logicalTextureUnit = samplersPS[samplerIndex].logicalTextureUnit;
}
break;
case sw::SAMPLER_VERTEX:
ASSERT(samplerIndex < sizeof(samplersVS) / sizeof(samplersVS[0]));
if(samplersVS[samplerIndex].active)
{
logicalTextureUnit = samplersVS[samplerIndex].logicalTextureUnit;
}
break;
default: UNREACHABLE(type);
}
if(logicalTextureUnit < MAX_COMBINED_TEXTURE_IMAGE_UNITS)
{
return logicalTextureUnit;
}
return -1;
}
// Returns the texture type for a given sampler type and index (0-15 for the pixel shader and 0-3 for the vertex shader)
......@@ -315,8 +344,12 @@ namespace es2
switch(type)
{
case sw::SAMPLER_PIXEL:
ASSERT(samplerIndex < sizeof(samplersPS)/sizeof(samplersPS[0]));
ASSERT(samplersPS[samplerIndex].active);
return samplersPS[samplerIndex].textureType;
case sw::SAMPLER_VERTEX:
ASSERT(samplerIndex < sizeof(samplersVS)/sizeof(samplersVS[0]));
ASSERT(samplersVS[samplerIndex].active);
return samplersVS[samplerIndex].textureType;
default: UNREACHABLE(type);
}
......@@ -1676,8 +1709,10 @@ namespace es2
{
if(shader == GL_VERTEX_SHADER)
{
if(samplersVS.size() < MAX_VERTEX_TEXTURE_IMAGE_UNITS)
if(index < MAX_VERTEX_TEXTURE_IMAGE_UNITS)
{
samplersVS[index].active = true;
switch(type)
{
default: UNREACHABLE(type);
......@@ -1709,8 +1744,10 @@ namespace es2
}
else if(shader == GL_FRAGMENT_SHADER)
{
if(samplersPS.size() < MAX_TEXTURE_IMAGE_UNITS)
if(index < MAX_TEXTURE_IMAGE_UNITS)
{
samplersPS[index].active = true;
switch(type)
{
default: UNREACHABLE(type);
......@@ -2230,8 +2267,9 @@ namespace es2
{
unsigned int samplerIndex = targetUniform->psRegisterIndex + i;
if(samplersPS.find(samplerIndex) != samplersPS.end())
if(samplerIndex < MAX_TEXTURE_IMAGE_UNITS)
{
ASSERT(samplersPS[samplerIndex].active);
samplersPS[samplerIndex].logicalTextureUnit = v[i];
}
}
......@@ -2243,8 +2281,9 @@ namespace es2
{
unsigned int samplerIndex = targetUniform->vsRegisterIndex + i;
if(samplersVS.find(samplerIndex) != samplersVS.end())
if(samplerIndex < MAX_VERTEX_TEXTURE_IMAGE_UNITS)
{
ASSERT(samplersVS[samplerIndex].active);
samplersVS[samplerIndex].logicalTextureUnit = v[i];
}
}
......@@ -2330,8 +2369,9 @@ namespace es2
{
unsigned int samplerIndex = targetUniform->psRegisterIndex + i;
if(samplersPS.find(samplerIndex) != samplersPS.end())
if(samplerIndex < MAX_TEXTURE_IMAGE_UNITS)
{
ASSERT(samplersPS[samplerIndex].active);
samplersPS[samplerIndex].logicalTextureUnit = v[i];
}
}
......@@ -2343,8 +2383,9 @@ namespace es2
{
unsigned int samplerIndex = targetUniform->vsRegisterIndex + i;
if(samplersVS.find(samplerIndex) != samplersVS.end())
if(samplerIndex < MAX_VERTEX_TEXTURE_IMAGE_UNITS)
{
ASSERT(samplersVS[samplerIndex].active);
samplersVS[samplerIndex].logicalTextureUnit = v[i];
}
}
......@@ -2469,8 +2510,15 @@ namespace es2
attributeStream[index] = -1;
}
samplersPS.clear();
samplersVS.clear();
for(int index = 0; index < MAX_TEXTURE_IMAGE_UNITS; index++)
{
samplersPS[index].active = false;
}
for(int index = 0; index < MAX_VERTEX_TEXTURE_IMAGE_UNITS; index++)
{
samplersVS[index].active = false;
}
while(!uniforms.empty())
{
......@@ -2886,67 +2934,73 @@ namespace es2
textureUnitType[i] = TEXTURE_UNKNOWN;
}
for(auto sampler : samplersPS)
for(unsigned int i = 0; i < MAX_TEXTURE_IMAGE_UNITS; i++)
{
unsigned int unit = sampler.second.logicalTextureUnit;
if(unit >= MAX_COMBINED_TEXTURE_IMAGE_UNITS)
if(samplersPS[i].active)
{
if(logErrors)
{
appendToInfoLog("Sampler uniform (%d) exceeds MAX_COMBINED_TEXTURE_IMAGE_UNITS (%d)", unit, MAX_COMBINED_TEXTURE_IMAGE_UNITS);
}
return false;
}
unsigned int unit = samplersPS[i].logicalTextureUnit;
if(textureUnitType[unit] != TEXTURE_UNKNOWN)
{
if(sampler.second.textureType != textureUnitType[unit])
if(unit >= MAX_COMBINED_TEXTURE_IMAGE_UNITS)
{
if(logErrors)
{
appendToInfoLog("Samplers of conflicting types refer to the same texture image unit (%d).", unit);
appendToInfoLog("Sampler uniform (%d) exceeds MAX_COMBINED_TEXTURE_IMAGE_UNITS (%d)", unit, MAX_COMBINED_TEXTURE_IMAGE_UNITS);
}
return false;
}
}
else
{
textureUnitType[unit] = sampler.second.textureType;
}
}
for(auto sampler : samplersVS)
{
unsigned int unit = sampler.second.logicalTextureUnit;
if(textureUnitType[unit] != TEXTURE_UNKNOWN)
{
if(samplersPS[i].textureType != textureUnitType[unit])
{
if(logErrors)
{
appendToInfoLog("Samplers of conflicting types refer to the same texture image unit (%d).", unit);
}
if(unit >= MAX_COMBINED_TEXTURE_IMAGE_UNITS)
{
if(logErrors)
return false;
}
}
else
{
appendToInfoLog("Sampler uniform (%d) exceeds MAX_COMBINED_TEXTURE_IMAGE_UNITS (%d)", unit, MAX_COMBINED_TEXTURE_IMAGE_UNITS);
textureUnitType[unit] = samplersPS[i].textureType;
}
return false;
}
}
if(textureUnitType[unit] != TEXTURE_UNKNOWN)
for(unsigned int i = 0; i < MAX_VERTEX_TEXTURE_IMAGE_UNITS; i++)
{
if(samplersVS[i].active)
{
if(sampler.second.textureType != textureUnitType[unit])
unsigned int unit = samplersVS[i].logicalTextureUnit;
if(unit >= MAX_COMBINED_TEXTURE_IMAGE_UNITS)
{
if(logErrors)
{
appendToInfoLog("Samplers of conflicting types refer to the same texture image unit (%d).", unit);
appendToInfoLog("Sampler uniform (%d) exceeds MAX_COMBINED_TEXTURE_IMAGE_UNITS (%d)", unit, MAX_COMBINED_TEXTURE_IMAGE_UNITS);
}
return false;
}
}
else
{
textureUnitType[unit] = sampler.second.textureType;
if(textureUnitType[unit] != TEXTURE_UNKNOWN)
{
if(samplersVS[i].textureType != textureUnitType[unit])
{
if(logErrors)
{
appendToInfoLog("Samplers of conflicting types refer to the same texture image unit (%d).", unit);
}
return false;
}
}
else
{
textureUnitType[unit] = samplersVS[i].textureType;
}
}
}
......
......@@ -121,12 +121,6 @@ namespace es2
class Program
{
public:
struct Sampler
{
GLint logicalTextureUnit;
TextureType textureType;
};
Program(ResourceManager *manager, GLuint handle);
~Program();
......@@ -142,7 +136,7 @@ namespace es2
GLint getAttributeLocation(const char *name);
int getAttributeStream(int attributeIndex);
const std::map<int, es2::Program::Sampler>& getSamplerMap(sw::SamplerType type) const;
GLint getSamplerMapping(sw::SamplerType type, unsigned int samplerIndex);
TextureType getSamplerTextureType(sw::SamplerType type, unsigned int samplerIndex);
GLuint getUniformIndex(const std::string &name) const;
......@@ -297,8 +291,15 @@ namespace es2
GLenum transformFeedbackBufferMode;
size_t totalLinkedVaryingsComponents;
std::map<int, Sampler> samplersPS;
std::map<int, Sampler> samplersVS;
struct Sampler
{
bool active;
GLint logicalTextureUnit;
TextureType textureType;
};
Sampler samplersPS[MAX_TEXTURE_IMAGE_UNITS];
Sampler samplersVS[MAX_VERTEX_TEXTURE_IMAGE_UNITS];
typedef std::vector<Uniform*> UniformArray;
UniformArray uniforms;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment