Implement support all sampler object associated GLES 3 API entry points.

TRAC #23454

Signed-off-by: Nicolas Capens
Signed-off-by: Shannon Woods
Authored-by: Jamie Madill
diff --git a/src/libGLESv2/libGLESv2.cpp b/src/libGLESv2/libGLESv2.cpp
index 0b0f832..b08ce3a 100644
--- a/src/libGLESv2/libGLESv2.cpp
+++ b/src/libGLESv2/libGLESv2.cpp
@@ -2107,6 +2107,26 @@
     }
 }
 
+bool validateSamplerObjectParameter(GLenum pname)
+{
+    switch (pname)
+    {
+      case GL_TEXTURE_MIN_FILTER:
+      case GL_TEXTURE_MAG_FILTER:
+      case GL_TEXTURE_WRAP_S:
+      case GL_TEXTURE_WRAP_T:
+      case GL_TEXTURE_WRAP_R:
+      case GL_TEXTURE_MIN_LOD:
+      case GL_TEXTURE_MAX_LOD:
+      case GL_TEXTURE_COMPARE_MODE:
+      case GL_TEXTURE_COMPARE_FUNC:
+        return true;
+
+      default:
+        return gl::error(GL_INVALID_ENUM, false);
+    }
+}
+
 extern "C"
 {
 
@@ -11135,8 +11155,15 @@
                 return gl::error(GL_INVALID_OPERATION);
             }
 
-            // glGenSamplers
-            UNIMPLEMENTED();
+            if (count < 0)
+            {
+                return gl::error(GL_INVALID_VALUE);
+            }
+
+            for (int i = 0; i < count; i++)
+            {
+                samplers[i] = context->createSampler();
+            }
         }
     }
     catch(std::bad_alloc&)
@@ -11160,8 +11187,15 @@
                 return gl::error(GL_INVALID_OPERATION);
             }
 
-            // glDeleteSamplers
-            UNIMPLEMENTED();
+            if (count < 0)
+            {
+                return gl::error(GL_INVALID_VALUE);
+            }
+
+            for (int i = 0; i < count; i++)
+            {
+                context->deleteSampler(samplers[i]);
+            }
         }
     }
     catch(std::bad_alloc&)
@@ -11185,8 +11219,7 @@
                 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
             }
 
-            // glIsSampler
-            UNIMPLEMENTED();
+            return context->isSampler(sampler);
         }
     }
     catch(std::bad_alloc&)
@@ -11212,8 +11245,17 @@
                 return gl::error(GL_INVALID_OPERATION);
             }
 
-            // glBindSampler
-            UNIMPLEMENTED();
+            if (sampler != 0 && !context->isSampler(sampler))
+            {
+                return gl::error(GL_INVALID_OPERATION);
+            }
+
+            if (unit >= context->getMaximumCombinedTextureImageUnits())
+            {
+                return gl::error(GL_INVALID_VALUE);
+            }
+
+            context->bindSampler(unit, sampler);
         }
     }
     catch(std::bad_alloc&)
@@ -11237,8 +11279,22 @@
                 return gl::error(GL_INVALID_OPERATION);
             }
 
-            // glSamplerParameteri
-            UNIMPLEMENTED();
+            if (!validateSamplerObjectParameter(pname))
+            {
+                return;
+            }
+
+            if (!validateTexParamParameters(context, pname, param))
+            {
+                return;
+            }
+
+            if (!context->isSampler(sampler))
+            {
+                return gl::error(GL_INVALID_OPERATION);
+            }
+
+            context->samplerParameteri(sampler, pname, param);
         }
     }
     catch(std::bad_alloc&)
@@ -11249,28 +11305,7 @@
 
 void __stdcall glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint* param)
 {
-    EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, const GLint* param = 0x%0.8p)",
-          sampler, pname, param);
-
-    try
-    {
-        gl::Context *context = gl::getNonLostContext();
-
-        if (context)
-        {
-            if (context->getClientVersion() < 3)
-            {
-                return gl::error(GL_INVALID_OPERATION);
-            }
-
-            // glSamplerParameteriv
-            UNIMPLEMENTED();
-        }
-    }
-    catch(std::bad_alloc&)
-    {
-        return gl::error(GL_OUT_OF_MEMORY);
-    }
+    glSamplerParameteri(sampler, pname, *param);
 }
 
 void __stdcall glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
@@ -11288,8 +11323,22 @@
                 return gl::error(GL_INVALID_OPERATION);
             }
 
-            // glSamplerParameterf
-            UNIMPLEMENTED();
+            if (!validateSamplerObjectParameter(pname))
+            {
+                return;
+            }
+
+            if (!validateTexParamParameters(context, pname, static_cast<GLint>(param)))
+            {
+                return;
+            }
+
+            if (!context->isSampler(sampler))
+            {
+                return gl::error(GL_INVALID_OPERATION);
+            }
+
+            context->samplerParameterf(sampler, pname, param);
         }
     }
     catch(std::bad_alloc&)
@@ -11300,27 +11349,7 @@
 
 void __stdcall glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat* param)
 {
-    EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, const GLfloat* param = 0x%0.8p)", sampler, pname, param);
-
-    try
-    {
-        gl::Context *context = gl::getNonLostContext();
-
-        if (context)
-        {
-            if (context->getClientVersion() < 3)
-            {
-                return gl::error(GL_INVALID_OPERATION);
-            }
-
-            // glSamplerParameterfv
-            UNIMPLEMENTED();
-        }
-    }
-    catch(std::bad_alloc&)
-    {
-        return gl::error(GL_OUT_OF_MEMORY);
-    }
+    glSamplerParameterf(sampler, pname, *param);
 }
 
 void __stdcall glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint* params)
@@ -11338,8 +11367,17 @@
                 return gl::error(GL_INVALID_OPERATION);
             }
 
-            // glGetSamplerParameteriv
-            UNIMPLEMENTED();
+            if (!validateSamplerObjectParameter(pname))
+            {
+                return;
+            }
+
+            if (!context->isSampler(sampler))
+            {
+                return gl::error(GL_INVALID_OPERATION);
+            }
+
+            *params = context->getSamplerParameteri(sampler, pname);
         }
     }
     catch(std::bad_alloc&)
@@ -11363,8 +11401,17 @@
                 return gl::error(GL_INVALID_OPERATION);
             }
 
-            // glGetSamplerParameterfv
-            UNIMPLEMENTED();
+            if (!validateSamplerObjectParameter(pname))
+            {
+                return;
+            }
+
+            if (!context->isSampler(sampler))
+            {
+                return gl::error(GL_INVALID_OPERATION);
+            }
+
+            *params = context->getSamplerParameterf(sampler, pname);
         }
     }
     catch(std::bad_alloc&)