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) ...@@ -3074,16 +3074,15 @@ void Context::applyTextures(sw::SamplerType samplerType)
{ {
Program *programObject = getCurrentProgram(); 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(int samplerIndex = 0; samplerIndex < samplerCount; samplerIndex++)
for(auto sampler : samplerMap)
{ {
int textureUnit = sampler.second.logicalTextureUnit; int textureUnit = programObject->getSamplerMapping(samplerType, samplerIndex); // OpenGL texture image unit index
if(textureUnit != -1) if(textureUnit != -1)
{ {
TextureType textureType = programObject->getSamplerTextureType(samplerType, sampler.first); TextureType textureType = programObject->getSamplerTextureType(samplerType, samplerIndex);
Texture *texture = getSamplerTexture(textureUnit, textureType); Texture *texture = getSamplerTexture(textureUnit, textureType);
...@@ -3154,13 +3153,6 @@ void Context::applyTextures(sw::SamplerType samplerType) ...@@ -3154,13 +3153,6 @@ void Context::applyTextures(sw::SamplerType samplerType)
{ {
applyTexture(samplerType, samplerIndex, nullptr); 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 ...@@ -304,9 +304,38 @@ namespace es2
return attributeStream[attributeIndex]; 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) // 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 ...@@ -315,8 +344,12 @@ namespace es2
switch(type) switch(type)
{ {
case sw::SAMPLER_PIXEL: case sw::SAMPLER_PIXEL:
ASSERT(samplerIndex < sizeof(samplersPS)/sizeof(samplersPS[0]));
ASSERT(samplersPS[samplerIndex].active);
return samplersPS[samplerIndex].textureType; return samplersPS[samplerIndex].textureType;
case sw::SAMPLER_VERTEX: case sw::SAMPLER_VERTEX:
ASSERT(samplerIndex < sizeof(samplersVS)/sizeof(samplersVS[0]));
ASSERT(samplersVS[samplerIndex].active);
return samplersVS[samplerIndex].textureType; return samplersVS[samplerIndex].textureType;
default: UNREACHABLE(type); default: UNREACHABLE(type);
} }
...@@ -1676,8 +1709,10 @@ namespace es2 ...@@ -1676,8 +1709,10 @@ namespace es2
{ {
if(shader == GL_VERTEX_SHADER) 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) switch(type)
{ {
default: UNREACHABLE(type); default: UNREACHABLE(type);
...@@ -1709,8 +1744,10 @@ namespace es2 ...@@ -1709,8 +1744,10 @@ namespace es2
} }
else if(shader == GL_FRAGMENT_SHADER) 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) switch(type)
{ {
default: UNREACHABLE(type); default: UNREACHABLE(type);
...@@ -2230,8 +2267,9 @@ namespace es2 ...@@ -2230,8 +2267,9 @@ namespace es2
{ {
unsigned int samplerIndex = targetUniform->psRegisterIndex + i; 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]; samplersPS[samplerIndex].logicalTextureUnit = v[i];
} }
} }
...@@ -2243,8 +2281,9 @@ namespace es2 ...@@ -2243,8 +2281,9 @@ namespace es2
{ {
unsigned int samplerIndex = targetUniform->vsRegisterIndex + i; 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]; samplersVS[samplerIndex].logicalTextureUnit = v[i];
} }
} }
...@@ -2330,8 +2369,9 @@ namespace es2 ...@@ -2330,8 +2369,9 @@ namespace es2
{ {
unsigned int samplerIndex = targetUniform->psRegisterIndex + i; 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]; samplersPS[samplerIndex].logicalTextureUnit = v[i];
} }
} }
...@@ -2343,8 +2383,9 @@ namespace es2 ...@@ -2343,8 +2383,9 @@ namespace es2
{ {
unsigned int samplerIndex = targetUniform->vsRegisterIndex + i; 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]; samplersVS[samplerIndex].logicalTextureUnit = v[i];
} }
} }
...@@ -2469,8 +2510,15 @@ namespace es2 ...@@ -2469,8 +2510,15 @@ namespace es2
attributeStream[index] = -1; attributeStream[index] = -1;
} }
samplersPS.clear(); for(int index = 0; index < MAX_TEXTURE_IMAGE_UNITS; index++)
samplersVS.clear(); {
samplersPS[index].active = false;
}
for(int index = 0; index < MAX_VERTEX_TEXTURE_IMAGE_UNITS; index++)
{
samplersVS[index].active = false;
}
while(!uniforms.empty()) while(!uniforms.empty())
{ {
...@@ -2886,9 +2934,11 @@ namespace es2 ...@@ -2886,9 +2934,11 @@ namespace es2
textureUnitType[i] = TEXTURE_UNKNOWN; textureUnitType[i] = TEXTURE_UNKNOWN;
} }
for(auto sampler : samplersPS) for(unsigned int i = 0; i < MAX_TEXTURE_IMAGE_UNITS; i++)
{
if(samplersPS[i].active)
{ {
unsigned int unit = sampler.second.logicalTextureUnit; unsigned int unit = samplersPS[i].logicalTextureUnit;
if(unit >= MAX_COMBINED_TEXTURE_IMAGE_UNITS) if(unit >= MAX_COMBINED_TEXTURE_IMAGE_UNITS)
{ {
...@@ -2902,7 +2952,7 @@ namespace es2 ...@@ -2902,7 +2952,7 @@ namespace es2
if(textureUnitType[unit] != TEXTURE_UNKNOWN) if(textureUnitType[unit] != TEXTURE_UNKNOWN)
{ {
if(sampler.second.textureType != textureUnitType[unit]) if(samplersPS[i].textureType != textureUnitType[unit])
{ {
if(logErrors) if(logErrors)
{ {
...@@ -2914,13 +2964,16 @@ namespace es2 ...@@ -2914,13 +2964,16 @@ namespace es2
} }
else else
{ {
textureUnitType[unit] = sampler.second.textureType; textureUnitType[unit] = samplersPS[i].textureType;
}
} }
} }
for(auto sampler : samplersVS) for(unsigned int i = 0; i < MAX_VERTEX_TEXTURE_IMAGE_UNITS; i++)
{
if(samplersVS[i].active)
{ {
unsigned int unit = sampler.second.logicalTextureUnit; unsigned int unit = samplersVS[i].logicalTextureUnit;
if(unit >= MAX_COMBINED_TEXTURE_IMAGE_UNITS) if(unit >= MAX_COMBINED_TEXTURE_IMAGE_UNITS)
{ {
...@@ -2934,7 +2987,7 @@ namespace es2 ...@@ -2934,7 +2987,7 @@ namespace es2
if(textureUnitType[unit] != TEXTURE_UNKNOWN) if(textureUnitType[unit] != TEXTURE_UNKNOWN)
{ {
if(sampler.second.textureType != textureUnitType[unit]) if(samplersVS[i].textureType != textureUnitType[unit])
{ {
if(logErrors) if(logErrors)
{ {
...@@ -2946,7 +2999,8 @@ namespace es2 ...@@ -2946,7 +2999,8 @@ namespace es2
} }
else else
{ {
textureUnitType[unit] = sampler.second.textureType; textureUnitType[unit] = samplersVS[i].textureType;
}
} }
} }
......
...@@ -121,12 +121,6 @@ namespace es2 ...@@ -121,12 +121,6 @@ namespace es2
class Program class Program
{ {
public: public:
struct Sampler
{
GLint logicalTextureUnit;
TextureType textureType;
};
Program(ResourceManager *manager, GLuint handle); Program(ResourceManager *manager, GLuint handle);
~Program(); ~Program();
...@@ -142,7 +136,7 @@ namespace es2 ...@@ -142,7 +136,7 @@ namespace es2
GLint getAttributeLocation(const char *name); GLint getAttributeLocation(const char *name);
int getAttributeStream(int attributeIndex); 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); TextureType getSamplerTextureType(sw::SamplerType type, unsigned int samplerIndex);
GLuint getUniformIndex(const std::string &name) const; GLuint getUniformIndex(const std::string &name) const;
...@@ -297,8 +291,15 @@ namespace es2 ...@@ -297,8 +291,15 @@ namespace es2
GLenum transformFeedbackBufferMode; GLenum transformFeedbackBufferMode;
size_t totalLinkedVaryingsComponents; size_t totalLinkedVaryingsComponents;
std::map<int, Sampler> samplersPS; struct Sampler
std::map<int, Sampler> samplersVS; {
bool active;
GLint logicalTextureUnit;
TextureType textureType;
};
Sampler samplersPS[MAX_TEXTURE_IMAGE_UNITS];
Sampler samplersVS[MAX_VERTEX_TEXTURE_IMAGE_UNITS];
typedef std::vector<Uniform*> UniformArray; typedef std::vector<Uniform*> UniformArray;
UniformArray uniforms; 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