/*-------------------------------------------------------------------------
 * OpenGL Conformance Test Suite
 * -----------------------------
 *
 * Copyright (c) 2014-2016 The Khronos Group Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 */ /*!
 * \file
 * \brief
 */ /*-------------------------------------------------------------------*/

#include "gl4cShaderImageLoadStoreTests.hpp"
#include "gluContextInfo.hpp"
#include "glwEnums.hpp"
#include "tcuMatrix.hpp"
#include "tcuPlatform.hpp"
#include "tcuRenderTarget.hpp"
#include "tcuVectorUtil.hpp"
#include <assert.h>
#include <climits>
#include <cmath>
#include <cstdarg>
#include <deque>
#include <iomanip>
#include <map>
#include <sstream>
#include <tcuFloat.hpp>

namespace gl4cts
{
using namespace glw;

namespace
{
typedef tcu::Vec2  vec2;
typedef tcu::Vec4  vec4;
typedef tcu::IVec4 ivec4;
typedef tcu::UVec4 uvec4;
typedef tcu::Mat4  mat4;

class ShaderImageLoadStoreBase : public deqp::SubcaseBase
{
	virtual std::string Title()
	{
		return "";
	}

	virtual std::string Purpose()
	{
		return "";
	}

	virtual std::string Method()
	{
		return "";
	}

	virtual std::string PassCriteria()
	{
		return "";
	}

public:
	bool SupportedInVS(int requiredVS)
	{
		GLint imagesVS;
		glGetIntegerv(GL_MAX_VERTEX_IMAGE_UNIFORMS, &imagesVS);
		if (imagesVS >= requiredVS)
			return true;
		else
		{
			std::ostringstream reason;
			reason << "Required " << requiredVS << " VS image uniforms but only " << imagesVS << " available."
				   << std::endl;
			OutputNotSupported(reason.str());
			return false;
		}
	}

	bool SupportedInTCS(int requiredTCS)
	{
		GLint imagesTCS;
		glGetIntegerv(GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS, &imagesTCS);
		if (imagesTCS >= requiredTCS)
			return true;
		else
		{
			std::ostringstream reason;
			reason << "Required " << requiredTCS << " TCS image uniforms but only " << imagesTCS << " available."
				   << std::endl;
			OutputNotSupported(reason.str());
			return false;
		}
	}

	bool SupportedInTES(int requiredTES)
	{
		GLint imagesTES;
		glGetIntegerv(GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS, &imagesTES);
		if (imagesTES >= requiredTES)
			return true;
		else
		{
			std::ostringstream reason;
			reason << "Required " << requiredTES << " TES image uniforms but only " << imagesTES << " available."
				   << std::endl;
			OutputNotSupported(reason.str());
			return false;
		}
	}

	bool SupportedInGS(int requiredGS)
	{
		GLint imagesGS;
		glGetIntegerv(GL_MAX_GEOMETRY_IMAGE_UNIFORMS, &imagesGS);
		if (imagesGS >= requiredGS)
			return true;
		else
		{
			std::ostringstream reason;
			reason << "Required " << requiredGS << " GS image uniforms but only " << imagesGS << " available."
				   << std::endl;
			OutputNotSupported(reason.str());
			return false;
		}
	}

	bool SupportedInGeomStages(int required)
	{
		return SupportedInVS(required) && SupportedInTCS(required) && SupportedInTES(required) &&
			   SupportedInGS(required);
	}

	bool SupportedInStage(int stage, int required)
	{
		switch (stage)
		{
		case 0:
			return SupportedInVS(required);
		case 1:
			return SupportedInTCS(required);
		case 2:
			return SupportedInTES(required);
		case 3:
			return SupportedInGS(required);
		default:
			return true;
		}
	}

	bool SupportedSamples(int required)
	{
		int i;
		glGetIntegerv(GL_MAX_IMAGE_SAMPLES, &i);
		if (i >= required)
			return true;
		else
		{
			std::ostringstream reason;
			reason << "Required " << required << " image samples but only " << i << " available." << std::endl;
			OutputNotSupported(reason.str());
			return false;
		}
	}

	int getWindowWidth()
	{
		const tcu::RenderTarget& renderTarget = m_context.getRenderContext().getRenderTarget();
		return renderTarget.getWidth();
	}

	int getWindowHeight()
	{
		const tcu::RenderTarget& renderTarget = m_context.getRenderContext().getRenderTarget();
		return renderTarget.getHeight();
	}

	void scaleDimensionsToMemory(int& width, int& height, int devLayers, int sysLayers, int devBPP, int sysBPP)
	{
		tcu::PlatformMemoryLimits memoryLimits;
		m_context.getTestContext().getPlatform().getMemoryLimits(memoryLimits);
		GLsizeiptr sysSpace		  = memoryLimits.totalSystemMemory;
		GLsizeiptr devSpace		  = memoryLimits.totalDeviceLocalMemory;
		int		   devInSysLayers = 0;

		if (devSpace == 0)
		{
			devInSysLayers = devLayers;
			devLayers	  = 0;
		}

		// Check if available memory is enough
		GLsizeiptr pixelsPerLayer = width * height;
		GLsizeiptr sysRequired	= pixelsPerLayer * ((sysBPP * sysLayers) + (devBPP * devInSysLayers));
		GLsizeiptr devRequired	= pixelsPerLayer * devBPP * devLayers;
		if ((sysRequired <= sysSpace) && (devRequired <= devSpace))
		{
			return;
		}

		// Scales the width and height such that the overall texture fits into
		// the available space for both system and device.
		GLdouble scale = sqrt(sysSpace / GLdouble(sysRequired));
		if (devSpace != 0)
		{
			GLdouble devScale = sqrt(devSpace / GLdouble(devRequired));
			scale			  = de::min(devScale, scale);
		}
		int newWidth  = int(width * scale);
		int newHeight = int(height * scale);

		m_context.getTestContext().getLog()
			<< tcu::TestLog::Message << "Reducing surface dimensions to fit in memory, from " << width << "x" << height
			<< " to " << newWidth << "x" << newHeight << "." << tcu::TestLog::EndMessage;

		width  = newWidth;
		height = newHeight;
	}

	inline bool ColorEqual(const vec4& c0, const vec4& c1, const vec4& epsilon)
	{
		if (fabs(c0[0] - c1[0]) > epsilon[0])
			return false;
		if (fabs(c0[1] - c1[1]) > epsilon[1])
			return false;
		if (fabs(c0[2] - c1[2]) > epsilon[2])
			return false;
		if (fabs(c0[3] - c1[3]) > epsilon[3])
			return false;
		return true;
	}

	bool IsEqual(vec4 a, vec4 b)
	{
		return (a[0] == b[0]) && (a[1] == b[1]) && (a[2] == b[2]) && (a[3] == b[3]);
	}

	bool Equal(const vec4& v0, const vec4& v1, GLenum internalformat)
	{
		if (internalformat == GL_RGBA16_SNORM || internalformat == GL_RG16_SNORM || internalformat == GL_R16_SNORM)
		{
			return ColorEqual(v0, v1, vec4(0.0001f));
		}
		else if (internalformat == GL_RGBA8_SNORM || internalformat == GL_RG8_SNORM || internalformat == GL_R8_SNORM)
		{
			return ColorEqual(v0, v1, vec4(0.01f));
		}
		return (v0[0] == v1[0]) && (v0[1] == v1[1]) && (v0[2] == v1[2]) && (v0[3] == v1[3]);
	}

	bool Equal(const ivec4& a, const ivec4& b, GLenum)
	{
		return (a[0] == b[0]) && (a[1] == b[1]) && (a[2] == b[2]) && (a[3] == b[3]);
	}

	bool Equal(const uvec4& a, const uvec4& b, GLenum)
	{
		return (a[0] == b[0]) && (a[1] == b[1]) && (a[2] == b[2]) && (a[3] == b[3]);
	}

	template <class T>
	std::string ToString(T v)
	{
		std::ostringstream s;
		s << "[";
		for (int i = 0; i < 4; ++i)
			s << v[i] << (i == 3 ? "" : ",");
		s << "]";
		return s.str();
	}

	bool ValidateReadBuffer(int x, int y, int w, int h, const vec4& expected)
	{
		bool					 status		  = true;
		const tcu::RenderTarget& renderTarget = m_context.getRenderContext().getRenderTarget();
		const tcu::PixelFormat&  pixelFormat  = renderTarget.getPixelFormat();
		vec4					 g_color_eps  = vec4(
			1.f / static_cast<float>(1 << pixelFormat.redBits), 1.f / static_cast<float>(1 << pixelFormat.greenBits),
			1.f / static_cast<float>(1 << pixelFormat.blueBits), 1.f / static_cast<float>(1 << pixelFormat.alphaBits));

		std::vector<vec4> fb(w * h);
		glReadPixels(x, y, w, h, GL_RGBA, GL_FLOAT, &fb[0]);

		for (int yy = 0; yy < h; ++yy)
		{
			for (int xx = 0; xx < w; ++xx)
			{
				const int idx = yy * w + xx;
				if (!ColorEqual(fb[idx], expected, g_color_eps))
				{
					m_context.getTestContext().getLog()
						<< tcu::TestLog::Message << "First bad color: " << ToString(fb[idx])
						<< tcu::TestLog::EndMessage;
					status = false;
					return status;
				}
			}
		}
		return status;
	}

	bool CompileShader(GLuint shader)
	{
		glCompileShader(shader);

		GLint status;
		glGetShaderiv(shader, GL_COMPILE_STATUS, &status);
		if (status == GL_FALSE)
		{
			GLsizei length;
			GLchar  log[1024];
			glGetShaderInfoLog(shader, sizeof(log), &length, log);
			if (length > 1)
			{
				m_context.getTestContext().getLog() << tcu::TestLog::Message << "Shader Info Log:\n"
													<< log << tcu::TestLog::EndMessage;
			}
			return false;
		}
		return true;
	}

	bool LinkProgram(GLuint program)
	{
		glLinkProgram(program);

		GLint status;
		glGetProgramiv(program, GL_LINK_STATUS, &status);
		if (status == GL_FALSE)
		{
			GLsizei length;
			GLchar  log[1024];
			glGetProgramInfoLog(program, sizeof(log), &length, log);
			if (length > 1)
			{
				m_context.getTestContext().getLog() << tcu::TestLog::Message << "Program Info Log:\n"
													<< log << tcu::TestLog::EndMessage;
			}
			return false;
		}
		return true;
	}

	GLuint BuildProgram(const char* src_vs, const char* src_tcs, const char* src_tes, const char* src_gs,
						const char* src_fs, bool* result = NULL)
	{
		const GLuint p = glCreateProgram();

		if (src_vs)
		{
			GLuint sh = glCreateShader(GL_VERTEX_SHADER);
			glAttachShader(p, sh);
			glDeleteShader(sh);
			glShaderSource(sh, 1, &src_vs, NULL);
			if (!CompileShader(sh))
			{
				m_context.getTestContext().getLog() << tcu::TestLog::Message << src_vs << tcu::TestLog::EndMessage;
				if (result)
					*result = false;
				return p;
			}
		}
		if (src_tcs)
		{
			GLuint sh = glCreateShader(GL_TESS_CONTROL_SHADER);
			glAttachShader(p, sh);
			glDeleteShader(sh);
			glShaderSource(sh, 1, &src_tcs, NULL);
			if (!CompileShader(sh))
			{
				m_context.getTestContext().getLog() << tcu::TestLog::Message << src_tcs << tcu::TestLog::EndMessage;
				if (result)
					*result = false;
				return p;
			}
		}
		if (src_tes)
		{
			GLuint sh = glCreateShader(GL_TESS_EVALUATION_SHADER);
			glAttachShader(p, sh);
			glDeleteShader(sh);
			glShaderSource(sh, 1, &src_tes, NULL);
			if (!CompileShader(sh))
			{
				m_context.getTestContext().getLog() << tcu::TestLog::Message << src_tes << tcu::TestLog::EndMessage;
				if (result)
					*result = false;
				return p;
			}
		}
		if (src_gs)
		{
			GLuint sh = glCreateShader(GL_GEOMETRY_SHADER);
			glAttachShader(p, sh);
			glDeleteShader(sh);
			glShaderSource(sh, 1, &src_gs, NULL);
			if (!CompileShader(sh))
			{
				m_context.getTestContext().getLog() << tcu::TestLog::Message << src_gs << tcu::TestLog::EndMessage;
				if (result)
					*result = false;
				return p;
			}
		}
		if (src_fs)
		{
			GLuint sh = glCreateShader(GL_FRAGMENT_SHADER);
			glAttachShader(p, sh);
			glDeleteShader(sh);
			glShaderSource(sh, 1, &src_fs, NULL);
			if (!CompileShader(sh))
			{
				m_context.getTestContext().getLog() << tcu::TestLog::Message << src_fs << tcu::TestLog::EndMessage;
				if (result)
					*result = false;
				return p;
			}
		}
		if (!LinkProgram(p))
		{
			if (src_vs)
				m_context.getTestContext().getLog() << tcu::TestLog::Message << src_vs << tcu::TestLog::EndMessage;
			if (src_tcs)
				m_context.getTestContext().getLog() << tcu::TestLog::Message << src_tcs << tcu::TestLog::EndMessage;
			if (src_tes)
				m_context.getTestContext().getLog() << tcu::TestLog::Message << src_tes << tcu::TestLog::EndMessage;
			if (src_gs)
				m_context.getTestContext().getLog() << tcu::TestLog::Message << src_gs << tcu::TestLog::EndMessage;
			if (src_fs)
				m_context.getTestContext().getLog() << tcu::TestLog::Message << src_fs << tcu::TestLog::EndMessage;
			if (result)
				*result = false;
			return p;
		}

		return p;
	}

	GLuint BuildShaderProgram(GLenum type, const char* src)
	{
		const GLuint p = glCreateShaderProgramv(type, 1, &src);

		GLint status;
		glGetProgramiv(p, GL_LINK_STATUS, &status);
		if (status == GL_FALSE)
		{
			GLchar log[1024];
			glGetProgramInfoLog(p, sizeof(log), NULL, log);
			m_context.getTestContext().getLog() << tcu::TestLog::Message << "Program Info Log:\n"
												<< log << "\n"
												<< src << tcu::TestLog::EndMessage;
		}

		return p;
	}

	void CreateFullViewportQuad(GLuint* vao, GLuint* vbo, GLuint* ebo)
	{
		assert(vao && vbo);

		// interleaved data (vertex, color0 (green), color1 (blue), color2 (red))
		const float v[] = {
			-1.0f, -1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f,  1.0f, 0.0f, 0.0f, 1.0f, -1.0f, 0.0f, 1.0f,
			0.0f,  0.0f,  0.0f, 1.0f, 1.0f, 0.0f, 0.0f, -1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f,  0.0f, 1.0f,
			1.0f,  0.0f,  0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f,  0.0f, 0.0f, 1.0f, 1.0f, 0.0f,  0.0f,
		};
		glGenBuffers(1, vbo);
		glBindBuffer(GL_ARRAY_BUFFER, *vbo);
		glBufferData(GL_ARRAY_BUFFER, sizeof(v), v, GL_STATIC_DRAW);
		glBindBuffer(GL_ARRAY_BUFFER, 0);

		if (ebo)
		{
			std::vector<GLushort> index_data(4);
			for (int i = 0; i < 4; ++i)
			{
				index_data[i] = static_cast<GLushort>(i);
			}
			glGenBuffers(1, ebo);
			glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, *ebo);
			glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLushort) * 4, &index_data[0], GL_STATIC_DRAW);
			glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
		}

		glGenVertexArrays(1, vao);
		glBindVertexArray(*vao);
		glBindBuffer(GL_ARRAY_BUFFER, *vbo);
		glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(float) * 11, 0);
		glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 11, reinterpret_cast<void*>(sizeof(float) * 2));
		glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 11, reinterpret_cast<void*>(sizeof(float) * 5));
		glVertexAttribPointer(3, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 11, reinterpret_cast<void*>(sizeof(float) * 8));
		glBindBuffer(GL_ARRAY_BUFFER, 0);
		glEnableVertexAttribArray(0);
		glEnableVertexAttribArray(1);
		glEnableVertexAttribArray(2);
		glEnableVertexAttribArray(3);
		if (ebo)
		{
			glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, *ebo);
		}
		glBindVertexArray(0);
	}

	std::string FormatEnumToString(GLenum e)
	{
		switch (e)
		{
		case GL_RGBA32F:
			return "rgba32f";
		case GL_RGBA16F:
			return "rgba16f";
		case GL_RG32F:
			return "rg32f";
		case GL_RG16F:
			return "rg16f";
		case GL_R11F_G11F_B10F:
			return "r11f_g11f_b10f";
		case GL_R32F:
			return "r32f";
		case GL_R16F:
			return "r16f";

		case GL_RGBA32UI:
			return "rgba32ui";
		case GL_RGBA16UI:
			return "rgba16ui";
		case GL_RGB10_A2UI:
			return "rgb10_a2ui";
		case GL_RGBA8UI:
			return "rgba8ui";
		case GL_RG32UI:
			return "rg32ui";
		case GL_RG16UI:
			return "rg16ui";
		case GL_RG8UI:
			return "rg8ui";
		case GL_R32UI:
			return "r32ui";
		case GL_R16UI:
			return "r16ui";
		case GL_R8UI:
			return "r8ui";

		case GL_RGBA32I:
			return "rgba32i";
		case GL_RGBA16I:
			return "rgba16i";
		case GL_RGBA8I:
			return "rgba8i";
		case GL_RG32I:
			return "rg32i";
		case GL_RG16I:
			return "rg16i";
		case GL_RG8I:
			return "rg8i";
		case GL_R32I:
			return "r32i";
		case GL_R16I:
			return "r16i";
		case GL_R8I:
			return "r8i";

		case GL_RGBA16:
			return "rgba16";
		case GL_RGB10_A2:
			return "rgb10_a2";
		case GL_RGBA8:
			return "rgba8";
		case GL_RG16:
			return "rg16";
		case GL_RG8:
			return "rg8";
		case GL_R16:
			return "r16";
		case GL_R8:
			return "r8";

		case GL_RGBA16_SNORM:
			return "rgba16_snorm";
		case GL_RGBA8_SNORM:
			return "rgba8_snorm";
		case GL_RG16_SNORM:
			return "rg16_snorm";
		case GL_RG8_SNORM:
			return "rg8_snorm";
		case GL_R16_SNORM:
			return "r16_snorm";
		case GL_R8_SNORM:
			return "r8_snorm";
		}

		assert(0);
		return "";
	}

	const char* StageName(int stage)
	{
		switch (stage)
		{
		case 0:
			return "Vertex Shader";
		case 1:
			return "Tessellation Control Shader";
		case 2:
			return "Tessellation Evaluation Shader";
		case 3:
			return "Geometry Shader";
		case 4:
			return "Compute Shader";
		}
		assert(0);
		return NULL;
	}

	template <typename T>
	GLenum Format();

	template <typename T>
	GLenum Type();

	template <typename T>
	std::string TypePrefix();

	template <typename T>
	GLenum ImageType(GLenum target);

	void ClearBuffer(GLenum buffer, GLint drawbuffer, const vec4& color)
	{
		glClearBufferfv(buffer, drawbuffer, &color[0]);
	}

	void ClearBuffer(GLenum buffer, GLint drawbuffer, const ivec4& color)
	{
		glClearBufferiv(buffer, drawbuffer, &color[0]);
	}

	void ClearBuffer(GLenum buffer, GLint drawbuffer, const uvec4& color)
	{
		glClearBufferuiv(buffer, drawbuffer, &color[0]);
	}

	bool CheckUniform(GLuint program, const std::string& name, const std::map<std::string, GLuint>& name_index_map,
					  GLint size, GLenum type)
	{
		std::map<std::string, GLuint>::const_iterator iter = name_index_map.find(name);
		assert(iter != name_index_map.end());

		GLchar  name_gl[32];
		GLsizei length_gl;
		GLint   size_gl;
		GLenum  type_gl;

		glGetActiveUniform(program, iter->second, sizeof(name_gl), &length_gl, &size_gl, &type_gl, name_gl);

		if (std::string(name_gl) != name)
		{
			m_context.getTestContext().getLog() << tcu::TestLog::Message << "Uniform name is " << name_gl
												<< " should be " << name << tcu::TestLog::EndMessage;
			return false;
		}
		if (length_gl != static_cast<GLsizei>(name.length()))
		{
			m_context.getTestContext().getLog()
				<< tcu::TestLog::Message << "Uniform length is " << length_gl << " should be " << name << "(" << name_gl
				<< ")" << tcu::TestLog::EndMessage;
			return false;
		}
		if (size_gl != size)
		{
			m_context.getTestContext().getLog()
				<< tcu::TestLog::Message << "Uniform size is " << size_gl << " should be " << size << "(" << name_gl
				<< ")" << tcu::TestLog::EndMessage;
			return false;
		}
		if (type_gl != type)
		{
			m_context.getTestContext().getLog()
				<< tcu::TestLog::Message << "Uniform type is " << type_gl << " should be " << type << "(" << name_gl
				<< ")" << tcu::TestLog::EndMessage;
			return false;
		}

		return true;
	}

	bool CheckMax(GLenum pname, GLint min_value)
	{
		GLboolean b;
		GLint	 i;
		GLfloat   f;
		GLdouble  d;
		GLint64   i64;

		glGetIntegerv(pname, &i);
		if (i < min_value)
			return false;

		glGetBooleanv(pname, &b);
		if (b != (i ? GL_TRUE : GL_FALSE))
			return false;

		glGetFloatv(pname, &f);
		if (static_cast<GLint>(f) < min_value)
			return false;

		glGetDoublev(pname, &d);
		if (static_cast<GLint>(d) < min_value)
			return false;

		glGetInteger64v(pname, &i64);
		if (static_cast<GLint>(i64) < min_value)
			return false;

		return true;
	}

	bool CheckBinding(GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access,
					  GLenum format)
	{
		GLint	 i;
		GLboolean b;

		glGetIntegeri_v(GL_IMAGE_BINDING_NAME, unit, &i);
		if (static_cast<GLuint>(i) != texture)
		{
			m_context.getTestContext().getLog() << tcu::TestLog::Message << "GL_IMAGE_BINDING_NAME is " << i
												<< " should be " << texture << tcu::TestLog::EndMessage;
			return false;
		}
		glGetBooleani_v(GL_IMAGE_BINDING_NAME, unit, &b);
		if (b != (i ? GL_TRUE : GL_FALSE))
		{
			m_context.getTestContext().getLog()
				<< tcu::TestLog::Message << "GL_IMAGE_BINDING_NAME (as boolean) is " << b << " should be "
				<< (i ? GL_TRUE : GL_FALSE) << tcu::TestLog::EndMessage;
			return false;
		}

		glGetIntegeri_v(GL_IMAGE_BINDING_LEVEL, unit, &i);
		if (i != level)
		{
			m_context.getTestContext().getLog() << tcu::TestLog::Message << "GL_IMAGE_BINDING_LEVEL is " << i
												<< " should be " << level << tcu::TestLog::EndMessage;
			return false;
		}
		glGetBooleani_v(GL_IMAGE_BINDING_LEVEL, unit, &b);
		if (b != (i ? GL_TRUE : GL_FALSE))
		{
			m_context.getTestContext().getLog()
				<< tcu::TestLog::Message << "GL_IMAGE_BINDING_LEVEL (as boolean) is " << b << " should be "
				<< (i ? GL_TRUE : GL_FALSE) << tcu::TestLog::EndMessage;
			return false;
		}

		glGetIntegeri_v(GL_IMAGE_BINDING_LAYERED, unit, &i);
		if (i != layered)
		{
			m_context.getTestContext().getLog() << tcu::TestLog::Message << "GL_IMAGE_BINDING_LAYERED is " << i
												<< " should be " << layered << tcu::TestLog::EndMessage;
			return false;
		}
		glGetBooleani_v(GL_IMAGE_BINDING_LAYERED, unit, &b);
		if (b != (i ? GL_TRUE : GL_FALSE))
		{
			m_context.getTestContext().getLog()
				<< tcu::TestLog::Message << "GL_IMAGE_BINDING_LAYERED (as boolean) is " << b << " should be "
				<< (i ? GL_TRUE : GL_FALSE) << tcu::TestLog::EndMessage;
			return false;
		}

		glGetIntegeri_v(GL_IMAGE_BINDING_LAYER, unit, &i);
		if (i != layer)
		{
			m_context.getTestContext().getLog() << tcu::TestLog::Message << "GL_IMAGE_BINDING_LAYER is " << i
												<< " should be " << layer << tcu::TestLog::EndMessage;
			return false;
		}
		glGetBooleani_v(GL_IMAGE_BINDING_LAYER, unit, &b);
		if (b != (i ? GL_TRUE : GL_FALSE))
		{
			m_context.getTestContext().getLog()
				<< tcu::TestLog::Message << "GL_IMAGE_BINDING_LAYER (as boolean) is " << b << " should be "
				<< (i ? GL_TRUE : GL_FALSE) << tcu::TestLog::EndMessage;
			return false;
		}

		glGetIntegeri_v(GL_IMAGE_BINDING_ACCESS, unit, &i);
		if (static_cast<GLenum>(i) != access)
		{
			m_context.getTestContext().getLog() << tcu::TestLog::Message << "GL_IMAGE_BINDING_ACCESS is " << i
												<< " should be " << access << tcu::TestLog::EndMessage;
			return false;
		}
		glGetBooleani_v(GL_IMAGE_BINDING_ACCESS, unit, &b);
		if (b != (i ? GL_TRUE : GL_FALSE))
		{
			m_context.getTestContext().getLog()
				<< tcu::TestLog::Message << "GL_IMAGE_BINDING_ACCESS (as boolean) is " << b << " should be "
				<< (i ? GL_TRUE : GL_FALSE) << tcu::TestLog::EndMessage;
			return false;
		}

		glGetIntegeri_v(GL_IMAGE_BINDING_FORMAT, unit, &i);
		if (static_cast<GLenum>(i) != format)
		{
			m_context.getTestContext().getLog() << tcu::TestLog::Message << "GL_IMAGE_BINDING_FORMAT is " << i
												<< " should be " << format << tcu::TestLog::EndMessage;
			return false;
		}
		glGetBooleani_v(GL_IMAGE_BINDING_FORMAT, unit, &b);
		if (b != (i ? GL_TRUE : GL_FALSE))
		{
			m_context.getTestContext().getLog()
				<< tcu::TestLog::Message << "GL_IMAGE_BINDING_FORMAT (as boolean) is " << b << " should be "
				<< (i ? GL_TRUE : GL_FALSE) << tcu::TestLog::EndMessage;
			return false;
		}

		return true;
	}
	const char* EnumToString(GLenum e)
	{
		switch (e)
		{
		case GL_TEXTURE_1D:
			return "GL_TEXTURE_1D";
		case GL_TEXTURE_2D:
			return "GL_TEXTURE_2D";
		case GL_TEXTURE_3D:
			return "GL_TEXTURE_3D";
		case GL_TEXTURE_RECTANGLE:
			return "GL_TEXTURE_RECTANGLE";
		case GL_TEXTURE_CUBE_MAP:
			return "GL_TEXTURE_CUBE_MAP";
		case GL_TEXTURE_1D_ARRAY:
			return "GL_TEXTURE_1D_ARRAY";
		case GL_TEXTURE_2D_ARRAY:
			return "GL_TEXTURE_2D_ARRAY";
		case GL_TEXTURE_CUBE_MAP_ARRAY:
			return "GL_TEXTURE_CUBE_MAP_ARRAY";

		default:
			assert(0);
			break;
		}
		return NULL;
	}
};

template <>
GLenum ShaderImageLoadStoreBase::Format<vec4>()
{
	return GL_RGBA;
}

template <>
GLenum ShaderImageLoadStoreBase::Format<ivec4>()
{
	return GL_RGBA_INTEGER;
}

template <>
GLenum ShaderImageLoadStoreBase::Format<uvec4>()
{
	return GL_RGBA_INTEGER;
}

template <>
GLenum ShaderImageLoadStoreBase::Format<GLint>()
{
	return GL_RED_INTEGER;
}

template <>
GLenum ShaderImageLoadStoreBase::Format<GLuint>()
{
	return GL_RED_INTEGER;
}

template <>
GLenum ShaderImageLoadStoreBase::Type<vec4>()
{
	return GL_FLOAT;
}

template <>
GLenum ShaderImageLoadStoreBase::Type<ivec4>()
{
	return GL_INT;
}

template <>
GLenum ShaderImageLoadStoreBase::Type<uvec4>()
{
	return GL_UNSIGNED_INT;
}

template <>
GLenum ShaderImageLoadStoreBase::Type<GLint>()
{
	return GL_INT;
}

template <>
GLenum ShaderImageLoadStoreBase::Type<GLuint>()
{
	return GL_UNSIGNED_INT;
}

template <>
std::string ShaderImageLoadStoreBase::TypePrefix<vec4>()
{
	return "";
}

template <>
std::string ShaderImageLoadStoreBase::TypePrefix<ivec4>()
{
	return "i";
}

template <>
std::string ShaderImageLoadStoreBase::TypePrefix<uvec4>()
{
	return "u";
}

template <>
std::string ShaderImageLoadStoreBase::TypePrefix<GLint>()
{
	return "i";
}

template <>
std::string ShaderImageLoadStoreBase::TypePrefix<GLuint>()
{
	return "u";
}

template <>
GLenum ShaderImageLoadStoreBase::ImageType<vec4>(GLenum target)
{
	switch (target)
	{
	case GL_TEXTURE_1D:
		return GL_IMAGE_1D;
	case GL_TEXTURE_2D:
		return GL_IMAGE_2D;
	case GL_TEXTURE_3D:
		return GL_IMAGE_3D;
	case GL_TEXTURE_RECTANGLE:
		return GL_IMAGE_2D_RECT;
	case GL_TEXTURE_CUBE_MAP:
		return GL_IMAGE_CUBE;
	case GL_TEXTURE_BUFFER:
		return GL_IMAGE_BUFFER;
	case GL_TEXTURE_1D_ARRAY:
		return GL_IMAGE_1D_ARRAY;
	case GL_TEXTURE_2D_ARRAY:
		return GL_IMAGE_2D_ARRAY;
	case GL_TEXTURE_CUBE_MAP_ARRAY:
		return GL_IMAGE_CUBE_MAP_ARRAY;
	case GL_TEXTURE_2D_MULTISAMPLE:
		return GL_IMAGE_2D_MULTISAMPLE;
	case GL_TEXTURE_2D_MULTISAMPLE_ARRAY:
		return GL_IMAGE_2D_MULTISAMPLE_ARRAY;
	}
	assert(0);
	return 0;
}

template <>
GLenum ShaderImageLoadStoreBase::ImageType<ivec4>(GLenum target)
{
	switch (target)
	{
	case GL_TEXTURE_1D:
		return GL_INT_IMAGE_1D;
	case GL_TEXTURE_2D:
		return GL_INT_IMAGE_2D;
	case GL_TEXTURE_3D:
		return GL_INT_IMAGE_3D;
	case GL_TEXTURE_RECTANGLE:
		return GL_INT_IMAGE_2D_RECT;
	case GL_TEXTURE_CUBE_MAP:
		return GL_INT_IMAGE_CUBE;
	case GL_TEXTURE_BUFFER:
		return GL_INT_IMAGE_BUFFER;
	case GL_TEXTURE_1D_ARRAY:
		return GL_INT_IMAGE_1D_ARRAY;
	case GL_TEXTURE_2D_ARRAY:
		return GL_INT_IMAGE_2D_ARRAY;
	case GL_TEXTURE_CUBE_MAP_ARRAY:
		return GL_INT_IMAGE_CUBE_MAP_ARRAY;
	case GL_TEXTURE_2D_MULTISAMPLE:
		return GL_INT_IMAGE_2D_MULTISAMPLE;
	case GL_TEXTURE_2D_MULTISAMPLE_ARRAY:
		return GL_INT_IMAGE_2D_MULTISAMPLE_ARRAY;
	}
	assert(0);
	return 0;
}

template <>
GLenum ShaderImageLoadStoreBase::ImageType<uvec4>(GLenum target)
{
	switch (target)
	{
	case GL_TEXTURE_1D:
		return GL_UNSIGNED_INT_IMAGE_1D;
	case GL_TEXTURE_2D:
		return GL_UNSIGNED_INT_IMAGE_2D;
	case GL_TEXTURE_3D:
		return GL_UNSIGNED_INT_IMAGE_3D;
	case GL_TEXTURE_RECTANGLE:
		return GL_UNSIGNED_INT_IMAGE_2D_RECT;
	case GL_TEXTURE_CUBE_MAP:
		return GL_UNSIGNED_INT_IMAGE_CUBE;
	case GL_TEXTURE_BUFFER:
		return GL_UNSIGNED_INT_IMAGE_BUFFER;
	case GL_TEXTURE_1D_ARRAY:
		return GL_UNSIGNED_INT_IMAGE_1D_ARRAY;
	case GL_TEXTURE_2D_ARRAY:
		return GL_UNSIGNED_INT_IMAGE_2D_ARRAY;
	case GL_TEXTURE_CUBE_MAP_ARRAY:
		return GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY;
	case GL_TEXTURE_2D_MULTISAMPLE:
		return GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE;
	case GL_TEXTURE_2D_MULTISAMPLE_ARRAY:
		return GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY;
	}
	assert(0);
	return 0;
}

//-----------------------------------------------------------------------------
// 1.1.1 BasicAPIGet
//-----------------------------------------------------------------------------
class BasicAPIGet : public ShaderImageLoadStoreBase
{
	virtual long Run()
	{
		if (!CheckMax(GL_MAX_IMAGE_UNITS, 8))
		{
			m_context.getTestContext().getLog()
				<< tcu::TestLog::Message << "GL_MAX_IMAGE_UNITS value is invalid." << tcu::TestLog::EndMessage;
			return ERROR;
		}
		if (!CheckMax(GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES, 8))
		{
			m_context.getTestContext().getLog()
				<< tcu::TestLog::Message << "GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES value is invalid."
				<< tcu::TestLog::EndMessage;
			return ERROR;
		}
		if (!CheckMax(GL_MAX_IMAGE_SAMPLES, 0))
		{
			m_context.getTestContext().getLog()
				<< tcu::TestLog::Message << "GL_MAX_IMAGE_SAMPLES value is invalid." << tcu::TestLog::EndMessage;
			return ERROR;
		}
		if (!CheckMax(GL_MAX_VERTEX_IMAGE_UNIFORMS, 0))
		{
			m_context.getTestContext().getLog()
				<< tcu::TestLog::Message << "GL_MAX_VERTEX_IMAGE_UNIFORMS value is invalid."
				<< tcu::TestLog::EndMessage;
			return ERROR;
		}
		if (!CheckMax(GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS, 0))
		{
			m_context.getTestContext().getLog()
				<< tcu::TestLog::Message << "GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS value is invalid."
				<< tcu::TestLog::EndMessage;
			return ERROR;
		}
		if (!CheckMax(GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS, 0))
		{
			m_context.getTestContext().getLog()
				<< tcu::TestLog::Message << "GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS value is invalid."
				<< tcu::TestLog::EndMessage;
			return ERROR;
		}
		if (!CheckMax(GL_MAX_GEOMETRY_IMAGE_UNIFORMS, 0))
		{
			m_context.getTestContext().getLog()
				<< tcu::TestLog::Message << "GL_MAX_GEOMETRY_IMAGE_UNIFORMS value is invalid."
				<< tcu::TestLog::EndMessage;
			return ERROR;
		}
		if (!CheckMax(GL_MAX_FRAGMENT_IMAGE_UNIFORMS, 8))
		{
			m_context.getTestContext().getLog()
				<< tcu::TestLog::Message << "GL_MAX_FRAGMENT_IMAGE_UNIFORMS value is invalid."
				<< tcu::TestLog::EndMessage;
			return ERROR;
		}
		if (!CheckMax(GL_MAX_COMBINED_IMAGE_UNIFORMS, 8))
		{
			m_context.getTestContext().getLog()
				<< tcu::TestLog::Message << "GL_MAX_COMBINED_IMAGE_UNIFORMS value is invalid."
				<< tcu::TestLog::EndMessage;
			return ERROR;
		}
		return NO_ERROR;
	}
};
//-----------------------------------------------------------------------------
// 1.1.2 BasicAPIBind
//-----------------------------------------------------------------------------
class BasicAPIBind : public ShaderImageLoadStoreBase
{
	GLuint m_texture;

	virtual long Setup()
	{
		m_texture = 0;
		return NO_ERROR;
	}

	virtual long Run()
	{
		for (GLuint index = 0; index < 8; ++index)
		{
			if (!CheckBinding(index, 0, 0, GL_FALSE, 0, GL_READ_ONLY, GL_R8))
			{
				m_context.getTestContext().getLog() << tcu::TestLog::Message << "Binding point " << index
													<< " has invalid default state." << tcu::TestLog::EndMessage;
				return ERROR;
			}
		}

		glGenTextures(1, &m_texture);
		glBindTexture(GL_TEXTURE_2D_ARRAY, m_texture);
		glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_R32F, 16, 16, 4, 0, GL_RED, GL_FLOAT, NULL);
		glTexImage3D(GL_TEXTURE_2D_ARRAY, 1, GL_R32F, 8, 8, 4, 0, GL_RED, GL_FLOAT, NULL);
		glTexImage3D(GL_TEXTURE_2D_ARRAY, 2, GL_R32F, 4, 4, 4, 0, GL_RED, GL_FLOAT, NULL);
		glTexImage3D(GL_TEXTURE_2D_ARRAY, 3, GL_R32F, 2, 2, 4, 0, GL_RED, GL_FLOAT, NULL);
		glTexImage3D(GL_TEXTURE_2D_ARRAY, 4, GL_R32F, 1, 1, 4, 0, GL_RED, GL_FLOAT, NULL);
		glBindTexture(GL_TEXTURE_2D_ARRAY, 0);

		glBindImageTexture(0, m_texture, 0, GL_FALSE, 0, GL_READ_WRITE, GL_R32F);
		if (!CheckBinding(0, m_texture, 0, GL_FALSE, 0, GL_READ_WRITE, GL_R32F))
			return ERROR;

		glBindImageTexture(1, m_texture, 1, GL_TRUE, 1, GL_WRITE_ONLY, GL_RGBA8);
		if (!CheckBinding(1, m_texture, 1, GL_TRUE, 1, GL_WRITE_ONLY, GL_RGBA8))
			return ERROR;

		glBindImageTexture(4, m_texture, 3, GL_FALSE, 2, GL_READ_ONLY, GL_RG16);
		if (!CheckBinding(4, m_texture, 3, GL_FALSE, 2, GL_READ_ONLY, GL_RG16))
			return ERROR;

		glBindImageTexture(7, m_texture, 4, GL_FALSE, 3, GL_READ_ONLY, GL_R32I);
		if (!CheckBinding(7, m_texture, 4, GL_FALSE, 3, GL_READ_ONLY, GL_R32I))
			return ERROR;

		glDeleteTextures(1, &m_texture);
		m_texture = 0;

		for (GLuint index = 0; index < 8; ++index)
		{
			GLint name;
			glGetIntegeri_v(GL_IMAGE_BINDING_NAME, index, &name);
			if (name != 0)
			{
				m_context.getTestContext().getLog()
					<< tcu::TestLog::Message << "Binding point " << index
					<< " should be set to 0 after texture deletion." << tcu::TestLog::EndMessage;
				return ERROR;
			}
		}

		return NO_ERROR;
	}

	virtual long Cleanup()
	{
		glDeleteTextures(1, &m_texture);
		return NO_ERROR;
	}
};
//-----------------------------------------------------------------------------
// 1.1.3 BasicAPIBarrier
//-----------------------------------------------------------------------------
class BasicAPIBarrier : public ShaderImageLoadStoreBase
{
	virtual long Run()
	{
		glMemoryBarrier(GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT);
		glMemoryBarrier(GL_ELEMENT_ARRAY_BARRIER_BIT);
		glMemoryBarrier(GL_UNIFORM_BARRIER_BIT);
		glMemoryBarrier(GL_TEXTURE_FETCH_BARRIER_BIT);
		glMemoryBarrier(GL_SHADER_IMAGE_ACCESS_BARRIER_BIT);
		glMemoryBarrier(GL_COMMAND_BARRIER_BIT);
		glMemoryBarrier(GL_PIXEL_BUFFER_BARRIER_BIT);
		glMemoryBarrier(GL_TEXTURE_UPDATE_BARRIER_BIT);
		glMemoryBarrier(GL_BUFFER_UPDATE_BARRIER_BIT);
		glMemoryBarrier(GL_FRAMEBUFFER_BARRIER_BIT);
		glMemoryBarrier(GL_TRANSFORM_FEEDBACK_BARRIER_BIT);
		glMemoryBarrier(GL_ATOMIC_COUNTER_BARRIER_BIT);

		glMemoryBarrier(GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT | GL_ELEMENT_ARRAY_BARRIER_BIT | GL_UNIFORM_BARRIER_BIT |
						GL_TEXTURE_FETCH_BARRIER_BIT | GL_SHADER_IMAGE_ACCESS_BARRIER_BIT | GL_COMMAND_BARRIER_BIT |
						GL_PIXEL_BUFFER_BARRIER_BIT | GL_TEXTURE_UPDATE_BARRIER_BIT | GL_BUFFER_UPDATE_BARRIER_BIT |
						GL_FRAMEBUFFER_BARRIER_BIT | GL_TRANSFORM_FEEDBACK_BARRIER_BIT | GL_ATOMIC_COUNTER_BARRIER_BIT);

		glMemoryBarrier(GL_ALL_BARRIER_BITS);

		return NO_ERROR;
	}
};
//-----------------------------------------------------------------------------
// 1.1.4 BasicAPITexParam
//-----------------------------------------------------------------------------
class BasicAPITexParam : public ShaderImageLoadStoreBase
{
	GLuint m_texture;

	virtual long Setup()
	{
		m_texture = 0;
		return NO_ERROR;
	}

	virtual long Run()
	{
		glGenTextures(1, &m_texture);
		glBindTexture(GL_TEXTURE_2D, m_texture);
		glTexImage2D(GL_TEXTURE_2D, 0, GL_RG32F, 16, 16, 0, GL_RED, GL_FLOAT, NULL);

		GLint   i;
		GLfloat f;
		GLuint  ui;

		glGetTexParameteriv(GL_TEXTURE_2D, GL_IMAGE_FORMAT_COMPATIBILITY_TYPE, &i);
		if (i != GL_IMAGE_FORMAT_COMPATIBILITY_BY_SIZE)
		{
			m_context.getTestContext().getLog()
				<< tcu::TestLog::Message << "GL_IMAGE_FORMAT_COMPATIBILITY_TYPE should equal to "
				<< "GL_IMAGE_FORMAT_COMPATIBILITY_BY_SIZE for textures allocated by the GL."
				<< tcu::TestLog::EndMessage;
			return ERROR;
		}
		glGetTexParameterfv(GL_TEXTURE_2D, GL_IMAGE_FORMAT_COMPATIBILITY_TYPE, &f);
		if (static_cast<GLenum>(f) != GL_IMAGE_FORMAT_COMPATIBILITY_BY_SIZE)
		{
			m_context.getTestContext().getLog()
				<< tcu::TestLog::Message << "GL_IMAGE_FORMAT_COMPATIBILITY_TYPE should equal to "
				<< "GL_IMAGE_FORMAT_COMPATIBILITY_BY_SIZE for textures allocated by the GL."
				<< tcu::TestLog::EndMessage;
			return ERROR;
		}
		glGetTexParameterIiv(GL_TEXTURE_2D, GL_IMAGE_FORMAT_COMPATIBILITY_TYPE, &i);
		if (i != GL_IMAGE_FORMAT_COMPATIBILITY_BY_SIZE)
		{
			m_context.getTestContext().getLog()
				<< tcu::TestLog::Message << "GL_IMAGE_FORMAT_COMPATIBILITY_TYPE should equal to "
				<< "GL_IMAGE_FORMAT_COMPATIBILITY_BY_SIZE for textures allocated by the GL."
				<< tcu::TestLog::EndMessage;
			return ERROR;
		}
		glGetTexParameterIuiv(GL_TEXTURE_2D, GL_IMAGE_FORMAT_COMPATIBILITY_TYPE, &ui);
		if (ui != GL_IMAGE_FORMAT_COMPATIBILITY_BY_SIZE)
		{
			m_context.getTestContext().getLog()
				<< tcu::TestLog::Message << "GL_IMAGE_FORMAT_COMPATIBILITY_TYPE should equal to "
				<< "GL_IMAGE_FORMAT_COMPATIBILITY_BY_SIZE for textures allocated by the GL."
				<< tcu::TestLog::EndMessage;
			return ERROR;
		}

		return NO_ERROR;
	}

	virtual long Cleanup()
	{
		glDeleteTextures(1, &m_texture);
		return NO_ERROR;
	}
};
//-----------------------------------------------------------------------------
// 1.2.1 BasicAllFormatsStore
//-----------------------------------------------------------------------------
class BasicAllFormatsStore : public ShaderImageLoadStoreBase
{
	GLuint m_vao;
	GLuint m_vbo;

	virtual long Setup()
	{
		m_vao = 0;
		m_vbo = 0;
		return NO_ERROR;
	}

	virtual long Run()
	{
		CreateFullViewportQuad(&m_vao, &m_vbo, NULL);

		if (!Write(GL_RGBA32F, vec4(1.0f, 2.0f, 3.0f, 4.0f), vec4(1.0f, 2.0f, 3.0f, 4.0f)))
			return ERROR;
		if (!Write(GL_RG32F, vec4(1.0f, 2.0f, 3.0f, 4.0f), vec4(1.0f, 2.0f, 0.0f, 1.0f)))
			return ERROR;
		if (!Write(GL_R32F, vec4(1.0f, 2.0f, 3.0f, 4.0f), vec4(1.0f, 0.0f, 0.0f, 1.0f)))
			return ERROR;

		if (!Write(GL_RGBA16F, vec4(1.0f, 2.0f, 3.0f, 4.0f), vec4(1.0f, 2.0f, 3.0f, 4.0f)))
			return ERROR;
		if (!Write(GL_RG16F, vec4(1.0f, 2.0f, 3.0f, 4.0f), vec4(1.0f, 2.0f, 0.0f, 1.0f)))
			return ERROR;
		if (!Write(GL_R16F, vec4(1.0f, 2.0f, 3.0f, 4.0f), vec4(1.0f, 0.0f, 0.0f, 1.0f)))
			return ERROR;

		if (!Write(GL_RGBA32I, ivec4(1, -2, 3, -4), ivec4(1, -2, 3, -4)))
			return ERROR;
		if (!Write(GL_RG32I, ivec4(1, -2, 3, -4), ivec4(1, -2, 0, 1)))
			return ERROR;
		if (!Write(GL_R32I, ivec4(1, -2, 3, -4), ivec4(1, 0, 0, 1)))
			return ERROR;

		if (!Write(GL_R11F_G11F_B10F, vec4(1.0f, 2.0f, 3.0f, 4.0f), vec4(1.0f, 2.0f, 3.0f, 1.0f)))
			return ERROR;

		if (!Write(GL_RGBA16I, ivec4(1, -2, 3, -4), ivec4(1, -2, 3, -4)))
			return ERROR;
		if (!Write(GL_RG16I, ivec4(1, -2, 3, -4), ivec4(1, -2, 0, 1)))
			return ERROR;
		if (!Write(GL_R16I, ivec4(1, -2, 3, -4), ivec4(1, 0, 0, 1)))
			return ERROR;

		if (!Write(GL_RGBA8I, ivec4(1, -2, 3, -4), ivec4(1, -2, 3, -4)))
			return ERROR;
		if (!Write(GL_RG8I, ivec4(1, -2, 3, -4), ivec4(1, -2, 0, 1)))
			return ERROR;
		if (!Write(GL_R8I, ivec4(1, -2, 3, -4), ivec4(1, 0, 0, 1)))
			return ERROR;

		if (!Write(GL_RGBA32UI, uvec4(0, 1, 2, 3), uvec4(0, 1, 2, 3)))
			return ERROR;
		if (!Write(GL_RGB10_A2UI, uvec4(0, 1, 2, 3), uvec4(0, 1, 2, 3)))
			return ERROR;
		if (!Write(GL_RG32UI, uvec4(0, 1, 2, 3), uvec4(0, 1, 0, 1)))
			return ERROR;
		if (!Write(GL_R32UI, uvec4(7, 2, 3, 4), uvec4(7, 0, 0, 1)))
			return ERROR;

		if (!Write(GL_RGBA16UI, uvec4(0, 1, 2, 3), uvec4(0, 1, 2, 3)))
			return ERROR;
		if (!Write(GL_RG16UI, uvec4(0, 1, 2, 3), uvec4(0, 1, 0, 1)))
			return ERROR;
		if (!Write(GL_R16UI, uvec4(7, 2, 3, 4), uvec4(7, 0, 0, 1)))
			return ERROR;

		if (!Write(GL_RGBA8UI, uvec4(0, 1, 2, 3), uvec4(0, 1, 2, 3)))
			return ERROR;
		if (!Write(GL_RG8UI, uvec4(0, 1, 2, 3), uvec4(0, 1, 0, 1)))
			return ERROR;
		if (!Write(GL_R8UI, uvec4(7, 2, 3, 4), uvec4(7, 0, 0, 1)))
			return ERROR;

		if (!Write(GL_RGBA16, vec4(1.0f), vec4(1.0f)))
			return ERROR;
		if (!Write(GL_RGB10_A2, vec4(1.0f), vec4(1.0f)))
			return ERROR;
		if (!Write(GL_RG16, vec4(1.0f), vec4(1.0f, 1.0f, 0.0f, 1.0f)))
			return ERROR;
		if (!Write(GL_R16, vec4(1.0f), vec4(1.0f, 0.0f, 0.0f, 1.0f)))
			return ERROR;

		if (!Write(GL_RGBA8, vec4(1.0f), vec4(1.0f)))
			return ERROR;
		if (!Write(GL_RG8, vec4(1.0f), vec4(1.0f, 1.0f, 0.0f, 1.0f)))
			return ERROR;
		if (!Write(GL_R8, vec4(1.0f), vec4(1.0f, 0.0f, 0.0f, 1.0f)))
			return ERROR;

		if (!Write(GL_RGBA16_SNORM, vec4(1.0f, -1.0f, 1.0f, -1.0f), vec4(1.0f, -1.0f, 1.0f, -1.0f)))
			return ERROR;
		if (!Write(GL_RG16_SNORM, vec4(-1.0f), vec4(-1.0f, -1.0f, 0.0f, 1.0f)))
			return ERROR;
		if (!Write(GL_R16_SNORM, vec4(-1.0f, 1.0f, -1.0f, 1.0f), vec4(-1.0f, 0.0f, 0.0f, 1.0f)))
			return ERROR;

		if (!Write(GL_RGBA8_SNORM, vec4(1.0f, -1.0f, 1.0f, -1.0f), vec4(1.0f, -1.0f, 1.0f, -1.0f)))
			return ERROR;
		if (!Write(GL_RG8_SNORM, vec4(-1.0f), vec4(-1.0f, -1.0f, 0.0f, 1.0f)))
			return ERROR;
		if (!Write(GL_R8_SNORM, vec4(-1.0f, 1.0f, -1.0f, 1.0f), vec4(-1.0f, 0.0f, 0.0f, 1.0f)))
			return ERROR;

		return NO_ERROR;
	}

	template <typename T>
	bool Write(GLenum internalformat, const T& write_value, const T& expected_value)
	{
		const char* src_vs = "#version 420 core" NL "layout(location = 0) in vec4 i_position;" NL "void main() {" NL
							 "  gl_Position = i_position;" NL "}";
		const GLuint   program = BuildProgram(src_vs, NULL, NULL, NULL, GenFS(internalformat, write_value).c_str());
		const int	  kSize   = 16;
		std::vector<T> data(kSize * kSize);
		GLuint		   texture;
		glGenTextures(1, &texture);

		for (GLuint unit = 0; unit < 8; ++unit)
		{
			glBindTexture(GL_TEXTURE_2D, texture);
			glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
			glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
			glTexImage2D(GL_TEXTURE_2D, 0, internalformat, kSize, kSize, 0, Format<T>(), Type<T>(), &data[0]);
			glBindTexture(GL_TEXTURE_2D, 0);

			glViewport(0, 0, kSize, kSize);
			glUseProgram(program);
			glBindImageTexture(unit, texture, 0, GL_FALSE, 0, GL_WRITE_ONLY, internalformat);
			glBindVertexArray(m_vao);
			glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

			glBindTexture(GL_TEXTURE_2D, texture);
			glMemoryBarrier(GL_TEXTURE_UPDATE_BARRIER_BIT);
			glGetTexImage(GL_TEXTURE_2D, 0, Format<T>(), Type<T>(), &data[0]);

			for (int i = 0; i < kSize * kSize; ++i)
			{
				if (!Equal(data[i], expected_value, internalformat))
				{
					glDeleteTextures(1, &texture);
					glUseProgram(0);
					glDeleteProgram(program);
					m_context.getTestContext().getLog() << tcu::TestLog::Message << "Value is: " << ToString(data[i])
														<< ". Value should be: " << ToString(expected_value)
														<< ". Format is: " << FormatEnumToString(internalformat)
														<< ". Unit is: " << unit << tcu::TestLog::EndMessage;
					return false;
				}
			}

			if (unit < 7)
			{
				glUniform1i(glGetUniformLocation(program, "g_image"), static_cast<GLint>(unit + 1));
			}
		}

		glDeleteTextures(1, &texture);
		glUseProgram(0);
		glDeleteProgram(program);

		return true;
	}

	virtual long Cleanup()
	{
		glViewport(0, 0, getWindowWidth(), getWindowHeight());
		glDeleteVertexArrays(1, &m_vao);
		glDeleteBuffers(1, &m_vbo);
		return NO_ERROR;
	}

	template <typename T>
	std::string GenFS(GLenum internalformat, const T& value)
	{
		std::ostringstream os;
		os << "#version 420 core" NL "layout(" << FormatEnumToString(internalformat) << ") writeonly uniform "
		   << TypePrefix<T>() << "image2D g_image;" NL "void main() {" NL "  ivec2 coord = ivec2(gl_FragCoord.xy);" NL
								 "  imageStore(g_image, coord, "
		   << TypePrefix<T>() << "vec4" << value << ");" NL "  discard;" NL "}";
		return os.str();
	}
};
//-----------------------------------------------------------------------------
// 1.2.2 BasicAllFormatsLoad
//-----------------------------------------------------------------------------
class BasicAllFormatsLoad : public ShaderImageLoadStoreBase
{
	GLuint m_vao;
	GLuint m_vbo;

	virtual long Setup()
	{
		m_vao = 0;
		m_vbo = 0;
		return NO_ERROR;
	}

	virtual long Run()
	{
		CreateFullViewportQuad(&m_vao, &m_vbo, NULL);

		if (!Read(GL_RGBA32F, vec4(1.0f, 2.0f, 3.0f, 4.0f), vec4(1.0f, 2.0f, 3.0f, 4.0f)))
			return ERROR;
		if (!Read(GL_RG32F, vec4(1.0f, 2.0f, 3.0f, 4.0f), vec4(1.0f, 2.0f, 0.0f, 1.0f)))
			return ERROR;
		if (!Read(GL_R32F, vec4(1.0f, 2.0f, 3.0f, 4.0f), vec4(1.0f, 0.0f, 0.0f, 1.0f)))
			return ERROR;

		if (!Read(GL_RGBA16F, vec4(1.0f, 2.0f, 3.0f, 4.0f), vec4(1.0f, 2.0f, 3.0f, 4.0f)))
			return ERROR;
		if (!Read(GL_RG16F, vec4(1.0f, 2.0f, 3.0f, 4.0f), vec4(1.0f, 2.0f, 0.0f, 1.0f)))
			return ERROR;
		if (!Read(GL_R16F, vec4(1.0f, 2.0f, 3.0f, 4.0f), vec4(1.0f, 0.0f, 0.0f, 1.0f)))
			return ERROR;

		if (!Read(GL_RGBA32I, ivec4(1, -2, 3, -4), ivec4(1, -2, 3, -4)))
			return ERROR;
		if (!Read(GL_RG32I, ivec4(1, -2, 3, -4), ivec4(1, -2, 0, 1)))
			return ERROR;
		if (!Read(GL_R32I, ivec4(1, -2, 3, -4), ivec4(1, 0, 0, 1)))
			return ERROR;

		if (!Read(GL_R11F_G11F_B10F, vec4(1.0f, 2.0f, 3.0f, 4.0f), vec4(1.0f, 2.0f, 3.0f, 1.0f)))
			return ERROR;

		if (!Read(GL_RGBA16I, ivec4(1, -2, 3, -4), ivec4(1, -2, 3, -4)))
			return ERROR;
		if (!Read(GL_RG16I, ivec4(1, -2, 3, -4), ivec4(1, -2, 0, 1)))
			return ERROR;
		if (!Read(GL_R16I, ivec4(1, -2, 3, -4), ivec4(1, 0, 0, 1)))
			return ERROR;

		if (!Read(GL_RGBA8I, ivec4(1, -2, 3, -4), ivec4(1, -2, 3, -4)))
			return ERROR;
		if (!Read(GL_RG8I, ivec4(1, -2, 3, -4), ivec4(1, -2, 0, 1)))
			return ERROR;
		if (!Read(GL_R8I, ivec4(1, -2, 3, -4), ivec4(1, 0, 0, 1)))
			return ERROR;

		if (!Read(GL_RGBA32UI, uvec4(0, 1, 2, 3), uvec4(0, 1, 2, 3)))
			return ERROR;
		if (!Read(GL_RGB10_A2UI, uvec4(0, 1, 2, 3), uvec4(0, 1, 2, 3)))
			return ERROR;
		if (!Read(GL_RG32UI, uvec4(0, 1, 2, 3), uvec4(0, 1, 0, 1)))
			return ERROR;
		if (!Read(GL_R32UI, uvec4(7, 2, 3, 4), uvec4(7, 0, 0, 1)))
			return ERROR;

		if (!Read(GL_RGBA16UI, uvec4(0, 1, 2, 3), uvec4(0, 1, 2, 3)))
			return ERROR;
		if (!Read(GL_RG16UI, uvec4(0, 1, 2, 3), uvec4(0, 1, 0, 1)))
			return ERROR;
		if (!Read(GL_R16UI, uvec4(7, 2, 3, 4), uvec4(7, 0, 0, 1)))
			return ERROR;

		if (!Read(GL_RGBA8UI, uvec4(0, 1, 2, 3), uvec4(0, 1, 2, 3)))
			return ERROR;
		if (!Read(GL_RG8UI, uvec4(0, 1, 2, 3), uvec4(0, 1, 0, 1)))
			return ERROR;
		if (!Read(GL_R8UI, uvec4(7, 2, 3, 4), uvec4(7, 0, 0, 1)))
			return ERROR;

		if (!Read(GL_RGBA16, vec4(1.0f), vec4(1.0f)))
			return ERROR;
		if (!Read(GL_RGB10_A2, vec4(1.0f), vec4(1.0f)))
			return ERROR;
		if (!Read(GL_RG16, vec4(1.0f), vec4(1.0f, 1.0f, 0.0f, 1.0f)))
			return ERROR;
		if (!Read(GL_R16, vec4(1.0f), vec4(1.0f, 0.0f, 0.0f, 1.0f)))
			return ERROR;

		if (!Read(GL_RGBA8, vec4(1.0f), vec4(1.0f)))
			return ERROR;
		if (!Read(GL_RG8, vec4(1.0f), vec4(1.0f, 1.0f, 0.0f, 1.0f)))
			return ERROR;
		if (!Read(GL_R8, vec4(1.0f), vec4(1.0f, 0.0f, 0.0f, 1.0f)))
			return ERROR;

		if (!Read(GL_RGBA16_SNORM, vec4(1.0f, -1.0f, 1.0f, -1.0f), vec4(1.0f, -1.0f, 1.0f, -1.0f)))
			return ERROR;
		if (!Read(GL_RG16_SNORM, vec4(-1.0f), vec4(-1.0f, -1.0f, 0.0f, 1.0f)))
			return ERROR;
		if (!Read(GL_R16_SNORM, vec4(-1.0f, 1.0f, -1.0f, 1.0f), vec4(-1.0f, 0.0f, 0.0f, 1.0f)))
			return ERROR;

		if (!Read(GL_RGBA8_SNORM, vec4(1.0f, -1.0f, 1.0f, -1.0f), vec4(1.0f, -1.0f, 1.0f, -1.0f)))
			return ERROR;
		if (!Read(GL_RG8_SNORM, vec4(-1.0f), vec4(-1.0f, -1.0f, 0.0f, 1.0f)))
			return ERROR;
		if (!Read(GL_R8_SNORM, vec4(-1.0f, 1.0f, -1.0f, 1.0f), vec4(-1.0f, 0.0f, 0.0f, 1.0f)))
			return ERROR;

		return NO_ERROR;
	}

	template <typename T>
	bool Read(GLenum internalformat, const T& value, const T& expected_value)
	{
		const char* src_vs = "#version 420 core" NL "layout(location = 0) in vec4 i_position;" NL "void main() {" NL
							 "  gl_Position = i_position;" NL "}";
		const GLuint   program = BuildProgram(src_vs, NULL, NULL, NULL, GenFS(internalformat, expected_value).c_str());
		const int	  kSize   = 16;
		std::vector<T> data(kSize * kSize, value);
		GLuint		   texture;
		glGenTextures(1, &texture);

		for (GLuint unit = 0; unit < 8; ++unit)
		{
			glBindTexture(GL_TEXTURE_2D, texture);
			glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
			glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
			glTexImage2D(GL_TEXTURE_2D, 0, internalformat, kSize, kSize, 0, Format<T>(), Type<T>(), &data[0]);
			glBindTexture(GL_TEXTURE_2D, 0);

			glViewport(0, 0, kSize, kSize);
			glClear(GL_COLOR_BUFFER_BIT);
			glUseProgram(program);
			glBindImageTexture(unit, texture, 0, GL_FALSE, 0, GL_READ_ONLY, internalformat);
			glBindVertexArray(m_vao);
			glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

			if (!ValidateReadBuffer(0, 0, kSize, kSize, vec4(0, 1, 0, 1)))
			{
				glDeleteTextures(1, &texture);
				glUseProgram(0);
				glDeleteProgram(program);
				m_context.getTestContext().getLog()
					<< tcu::TestLog::Message << "Bad load value. Format is: " << FormatEnumToString(internalformat)
					<< ". Unit is: " << unit << tcu::TestLog::EndMessage;
				return false;
			}

			if (unit < 7)
			{
				glUniform1i(glGetUniformLocation(program, "g_image"), static_cast<GLint>(unit + 1));
			}
		}

		glDeleteTextures(1, &texture);
		glUseProgram(0);
		glDeleteProgram(program);

		return true;
	}

	virtual long Cleanup()
	{
		glViewport(0, 0, getWindowWidth(), getWindowHeight());
		glDeleteVertexArrays(1, &m_vao);
		glDeleteBuffers(1, &m_vbo);
		return NO_ERROR;
	}

	template <typename T>
	std::string GenFS(GLenum internalformat, const T& expected_value)
	{
		std::ostringstream os;
		os << "#version 420 core" NL "layout(location = 0) out vec4 o_color;" NL "layout("
		   << FormatEnumToString(internalformat) << ") readonly uniform " << TypePrefix<T>()
		   << "image2D g_image;" NL "void main() {" NL "  ivec2 coord = ivec2(gl_FragCoord.xy);" NL "  "
		   << TypePrefix<T>() << "vec4 v = imageLoad(g_image, coord);" NL "  if (v != " << TypePrefix<T>() << "vec4"
		   << expected_value
		   << ") o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL "  else o_color = vec4(0.0, 1.0, 0.0, 1.0);" NL "}";
		return os.str();
	}
};
//-----------------------------------------------------------------------------
// 1.2.3 BasicAllFormatsStoreGeometryStages
//-----------------------------------------------------------------------------
class BasicAllFormatsStoreGeometryStages : public ShaderImageLoadStoreBase
{
	GLuint m_vao;

	virtual long Setup()
	{
		glGenVertexArrays(1, &m_vao);
		return NO_ERROR;
	}

	virtual long Run()
	{
		if (!SupportedInGeomStages(1))
			return NOT_SUPPORTED;
		glEnable(GL_RASTERIZER_DISCARD);

		if (!Write(GL_RGBA32F, vec4(1.0f, 2.0f, 3.0f, 4.0f), vec4(1.0f, 2.0f, 3.0f, 4.0f)))
			return ERROR;
		if (!Write(GL_RG32F, vec4(1.0f, 2.0f, 3.0f, 4.0f), vec4(1.0f, 2.0f, 0.0f, 1.0f)))
			return ERROR;
		if (!Write(GL_R32F, vec4(1.0f, 2.0f, 3.0f, 4.0f), vec4(1.0f, 0.0f, 0.0f, 1.0f)))
			return ERROR;

		if (!Write(GL_RGBA16F, vec4(1.0f, 2.0f, 3.0f, 4.0f), vec4(1.0f, 2.0f, 3.0f, 4.0f)))
			return ERROR;
		if (!Write(GL_RG16F, vec4(1.0f, 2.0f, 3.0f, 4.0f), vec4(1.0f, 2.0f, 0.0f, 1.0f)))
			return ERROR;
		if (!Write(GL_R16F, vec4(1.0f, 2.0f, 3.0f, 4.0f), vec4(1.0f, 0.0f, 0.0f, 1.0f)))
			return ERROR;

		if (!Write(GL_RGBA32I, ivec4(1, -2, 3, -4), ivec4(1, -2, 3, -4)))
			return ERROR;
		if (!Write(GL_RG32I, ivec4(1, -2, 3, -4), ivec4(1, -2, 0, 1)))
			return ERROR;
		if (!Write(GL_R32I, ivec4(1, -2, 3, -4), ivec4(1, 0, 0, 1)))
			return ERROR;

		if (!Write(GL_R11F_G11F_B10F, vec4(1.0f, 2.0f, 3.0f, 4.0f), vec4(1.0f, 2.0f, 3.0f, 1.0f)))
			return ERROR;

		if (!Write(GL_RGBA16I, ivec4(1, -2, 3, -4), ivec4(1, -2, 3, -4)))
			return ERROR;
		if (!Write(GL_RG16I, ivec4(1, -2, 3, -4), ivec4(1, -2, 0, 1)))
			return ERROR;
		if (!Write(GL_R16I, ivec4(1, -2, 3, -4), ivec4(1, 0, 0, 1)))
			return ERROR;

		if (!Write(GL_RGBA8I, ivec4(1, -2, 3, -4), ivec4(1, -2, 3, -4)))
			return ERROR;
		if (!Write(GL_RG8I, ivec4(1, -2, 3, -4), ivec4(1, -2, 0, 1)))
			return ERROR;
		if (!Write(GL_R8I, ivec4(1, -2, 3, -4), ivec4(1, 0, 0, 1)))
			return ERROR;

		if (!Write(GL_RGBA32UI, uvec4(0, 1, 2, 3), uvec4(0, 1, 2, 3)))
			return ERROR;
		if (!Write(GL_RGB10_A2UI, uvec4(0, 1, 2, 3), uvec4(0, 1, 2, 3)))
			return ERROR;
		if (!Write(GL_RG32UI, uvec4(0, 1, 2, 3), uvec4(0, 1, 0, 1)))
			return ERROR;
		if (!Write(GL_R32UI, uvec4(7, 2, 3, 4), uvec4(7, 0, 0, 1)))
			return ERROR;

		if (!Write(GL_RGBA16UI, uvec4(0, 1, 2, 3), uvec4(0, 1, 2, 3)))
			return ERROR;
		if (!Write(GL_RG16UI, uvec4(0, 1, 2, 3), uvec4(0, 1, 0, 1)))
			return ERROR;
		if (!Write(GL_R16UI, uvec4(7, 2, 3, 4), uvec4(7, 0, 0, 1)))
			return ERROR;

		if (!Write(GL_RGBA8UI, uvec4(0, 1, 2, 3), uvec4(0, 1, 2, 3)))
			return ERROR;
		if (!Write(GL_RG8UI, uvec4(0, 1, 2, 3), uvec4(0, 1, 0, 1)))
			return ERROR;
		if (!Write(GL_R8UI, uvec4(7, 2, 3, 4), uvec4(7, 0, 0, 1)))
			return ERROR;

		if (!Write(GL_RGBA16, vec4(1.0f), vec4(1.0f)))
			return ERROR;
		if (!Write(GL_RGB10_A2, vec4(1.0f), vec4(1.0f)))
			return ERROR;
		if (!Write(GL_RG16, vec4(1.0f), vec4(1.0f, 1.0f, 0.0f, 1.0f)))
			return ERROR;
		if (!Write(GL_R16, vec4(1.0f), vec4(1.0f, 0.0f, 0.0f, 1.0f)))
			return ERROR;

		if (!Write(GL_RGBA8, vec4(1.0f), vec4(1.0f)))
			return ERROR;
		if (!Write(GL_RG8, vec4(1.0f), vec4(1.0f, 1.0f, 0.0f, 1.0f)))
			return ERROR;
		if (!Write(GL_R8, vec4(1.0f), vec4(1.0f, 0.0f, 0.0f, 1.0f)))
			return ERROR;

		if (!Write(GL_RGBA16_SNORM, vec4(1.0f, -1.0f, 1.0f, -1.0f), vec4(1.0f, -1.0f, 1.0f, -1.0f)))
			return ERROR;
		if (!Write(GL_RG16_SNORM, vec4(-1.0f), vec4(-1.0f, -1.0f, 0.0f, 1.0f)))
			return ERROR;
		if (!Write(GL_R16_SNORM, vec4(-1.0f, 1.0f, -1.0f, 1.0f), vec4(-1.0f, 0.0f, 0.0f, 1.0f)))
			return ERROR;

		if (!Write(GL_RGBA8_SNORM, vec4(1.0f, -1.0f, 1.0f, -1.0f), vec4(1.0f, -1.0f, 1.0f, -1.0f)))
			return ERROR;
		if (!Write(GL_RG8_SNORM, vec4(-1.0f), vec4(-1.0f, -1.0f, 0.0f, 1.0f)))
			return ERROR;
		if (!Write(GL_R8_SNORM, vec4(-1.0f, 1.0f, -1.0f, 1.0f), vec4(-1.0f, 0.0f, 0.0f, 1.0f)))
			return ERROR;

		return NO_ERROR;
	}

	template <typename T>
	bool Write(GLenum internalformat, const T& write_value, const T& expected_value)
	{
		const GLuint program =
			BuildProgram(GenVS(internalformat, write_value).c_str(), GenTCS(internalformat, write_value).c_str(),
						 GenTES(internalformat, write_value).c_str(), GenGS(internalformat, write_value).c_str(), NULL);
		const int	  kSize = 1;
		std::vector<T> data(kSize * kSize);
		GLuint		   texture[4];
		glGenTextures(4, texture);

		for (int i = 0; i < 4; ++i)
		{
			glBindTexture(GL_TEXTURE_2D_ARRAY, texture[i]);
			glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
			glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
			glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, internalformat, kSize, kSize, 1, 0, Format<T>(), Type<T>(), &data[0]);
		}
		glBindTexture(GL_TEXTURE_2D_ARRAY, 0);

		glUseProgram(program);
		glUniform1i(glGetUniformLocation(program, "g_image0"), 0);
		glUniform1i(glGetUniformLocation(program, "g_image1"), 1);
		glUniform1i(glGetUniformLocation(program, "g_image2"), 2);
		glUniform1i(glGetUniformLocation(program, "g_image3"), 3);
		for (GLuint i = 0; i < 4; ++i)
		{
			glBindImageTexture(i, texture[i], 0, GL_TRUE, 0, GL_WRITE_ONLY, internalformat);
		}
		glBindVertexArray(m_vao);
		glPatchParameteri(GL_PATCH_VERTICES, 1);
		glDrawArrays(GL_PATCHES, 0, 1);
		glPatchParameteri(GL_PATCH_VERTICES, 3);

		for (int i = 0; i < 4; ++i)
		{
			glBindTexture(GL_TEXTURE_2D_ARRAY, texture[i]);
			glMemoryBarrier(GL_TEXTURE_UPDATE_BARRIER_BIT);
			glGetTexImage(GL_TEXTURE_2D_ARRAY, 0, Format<T>(), Type<T>(), &data[0]);

			if (!Equal(data[0], expected_value, internalformat))
			{
				glDeleteTextures(4, texture);
				glUseProgram(0);
				glDeleteProgram(program);
				m_context.getTestContext().getLog() << tcu::TestLog::Message << "Value is: " << ToString(data[0])
													<< ". Value should be: " << ToString(expected_value)
													<< ". Format is: " << FormatEnumToString(internalformat)
													<< ". Stage is: " << StageName(i) << tcu::TestLog::EndMessage;
				return false;
			}
		}
		glDeleteTextures(4, texture);
		glUseProgram(0);
		glDeleteProgram(program);
		return true;
	}

	virtual long Cleanup()
	{
		glDisable(GL_RASTERIZER_DISCARD);
		glDeleteVertexArrays(1, &m_vao);
		return NO_ERROR;
	}

	template <typename T>
	std::string GenVS(GLenum internalformat, const T& value)
	{
		std::ostringstream os;
		os << "#version 420 core" NL "layout(" << FormatEnumToString(internalformat) << ") writeonly uniform "
		   << TypePrefix<T>() << "image2DArray g_image0;" NL "void main() {" NL
								 "  ivec3 coord = ivec3(gl_VertexID, 0, 0);" NL "  imageStore(g_image0, coord, "
		   << TypePrefix<T>() << "vec4" << value << ");" NL "}";
		return os.str();
	}

	template <typename T>
	std::string GenTCS(GLenum internalformat, const T& value)
	{
		std::ostringstream os;
		os << "#version 420 core" NL "layout(vertices = 1) out;" NL "layout(" << FormatEnumToString(internalformat)
		   << ") writeonly uniform " << TypePrefix<T>()
		   << "image2DArray g_image1;" NL "void main() {" NL "  gl_TessLevelInner[0] = 1;" NL
			  "  gl_TessLevelInner[1] = 1;" NL "  gl_TessLevelOuter[0] = 1;" NL "  gl_TessLevelOuter[1] = 1;" NL
			  "  gl_TessLevelOuter[2] = 1;" NL "  gl_TessLevelOuter[3] = 1;" NL
			  "  ivec3 coord = ivec3(gl_PrimitiveID, 0, 0);" NL "  imageStore(g_image1, coord, "
		   << TypePrefix<T>() << "vec4" << value << ");" NL "}";
		return os.str();
	}

	template <typename T>
	std::string GenTES(GLenum internalformat, const T& value)
	{
		std::ostringstream os;
		os << "#version 420 core" NL "layout(triangles, point_mode) in;" NL "layout("
		   << FormatEnumToString(internalformat) << ") writeonly uniform " << TypePrefix<T>()
		   << "image2DArray g_image2;" NL "void main() {" NL "  ivec3 coord = ivec3(gl_PrimitiveID, 0, 0);" NL
			  "  imageStore(g_image2, coord, "
		   << TypePrefix<T>() << "vec4" << value << ");" NL "}";
		return os.str();
	}

	template <typename T>
	std::string GenGS(GLenum internalformat, const T& value)
	{
		std::ostringstream os;
		os << "#version 420 core" NL "layout(points) in;" NL "layout(points, max_vertices = 1) out;" NL "layout("
		   << FormatEnumToString(internalformat) << ") writeonly uniform " << TypePrefix<T>()
		   << "image2DArray g_image3;" NL "void main() {" NL "  ivec3 coord = ivec3(gl_PrimitiveIDIn, 0, 0);" NL
			  "  imageStore(g_image3, coord, "
		   << TypePrefix<T>() << "vec4" << value << ");" NL "}";
		return os.str();
	}
};
//-----------------------------------------------------------------------------
// 1.2.4 BasicAllFormatsLoadGeometryStages
//-----------------------------------------------------------------------------
class BasicAllFormatsLoadGeometryStages : public ShaderImageLoadStoreBase
{
	GLuint m_vao;

	virtual long Setup()
	{
		glGenVertexArrays(1, &m_vao);
		return NO_ERROR;
	}

	virtual long Run()
	{
		if (!SupportedInGeomStages(2))
			return NOT_SUPPORTED;
		glEnable(GL_RASTERIZER_DISCARD);

		if (!Read(GL_RGBA32F, vec4(1.0f, 2.0f, 3.0f, 4.0f), vec4(1.0f, 2.0f, 3.0f, 4.0f)))
			return ERROR;
		if (!Read(GL_RG32F, vec4(1.0f, 2.0f, 3.0f, 4.0f), vec4(1.0f, 2.0f, 0.0f, 1.0f)))
			return ERROR;
		if (!Read(GL_R32F, vec4(1.0f, 2.0f, 3.0f, 4.0f), vec4(1.0f, 0.0f, 0.0f, 1.0f)))
			return ERROR;

		if (!Read(GL_RGBA16F, vec4(1.0f, 2.0f, 3.0f, 4.0f), vec4(1.0f, 2.0f, 3.0f, 4.0f)))
			return ERROR;
		if (!Read(GL_RG16F, vec4(1.0f, 2.0f, 3.0f, 4.0f), vec4(1.0f, 2.0f, 0.0f, 1.0f)))
			return ERROR;
		if (!Read(GL_R16F, vec4(1.0f, 2.0f, 3.0f, 4.0f), vec4(1.0f, 0.0f, 0.0f, 1.0f)))
			return ERROR;

		if (!Read(GL_RGBA32I, ivec4(1, -2, 3, -4), ivec4(1, -2, 3, -4)))
			return ERROR;
		if (!Read(GL_RG32I, ivec4(1, -2, 3, -4), ivec4(1, -2, 0, 1)))
			return ERROR;
		if (!Read(GL_R32I, ivec4(1, -2, 3, -4), ivec4(1, 0, 0, 1)))
			return ERROR;

		if (!Read(GL_R11F_G11F_B10F, vec4(1.0f, 2.0f, 3.0f, 4.0f), vec4(1.0f, 2.0f, 3.0f, 1.0f)))
			return ERROR;

		if (!Read(GL_RGBA16I, ivec4(1, -2, 3, -4), ivec4(1, -2, 3, -4)))
			return ERROR;
		if (!Read(GL_RG16I, ivec4(1, -2, 3, -4), ivec4(1, -2, 0, 1)))
			return ERROR;
		if (!Read(GL_R16I, ivec4(1, -2, 3, -4), ivec4(1, 0, 0, 1)))
			return ERROR;

		if (!Read(GL_RGBA8I, ivec4(1, -2, 3, -4), ivec4(1, -2, 3, -4)))
			return ERROR;
		if (!Read(GL_RG8I, ivec4(1, -2, 3, -4), ivec4(1, -2, 0, 1)))
			return ERROR;
		if (!Read(GL_R8I, ivec4(1, -2, 3, -4), ivec4(1, 0, 0, 1)))
			return ERROR;

		if (!Read(GL_RGBA32UI, uvec4(0, 1, 2, 3), uvec4(0, 1, 2, 3)))
			return ERROR;
		if (!Read(GL_RGB10_A2UI, uvec4(0, 1, 2, 3), uvec4(0, 1, 2, 3)))
			return ERROR;
		if (!Read(GL_RG32UI, uvec4(0, 1, 2, 3), uvec4(0, 1, 0, 1)))
			return ERROR;
		if (!Read(GL_R32UI, uvec4(7, 2, 3, 4), uvec4(7, 0, 0, 1)))
			return ERROR;

		if (!Read(GL_RGBA16UI, uvec4(0, 1, 2, 3), uvec4(0, 1, 2, 3)))
			return ERROR;
		if (!Read(GL_RG16UI, uvec4(0, 1, 2, 3), uvec4(0, 1, 0, 1)))
			return ERROR;
		if (!Read(GL_R16UI, uvec4(7, 2, 3, 4), uvec4(7, 0, 0, 1)))
			return ERROR;

		if (!Read(GL_RGBA8UI, uvec4(0, 1, 2, 3), uvec4(0, 1, 2, 3)))
			return ERROR;
		if (!Read(GL_RG8UI, uvec4(0, 1, 2, 3), uvec4(0, 1, 0, 1)))
			return ERROR;
		if (!Read(GL_R8UI, uvec4(7, 2, 3, 4), uvec4(7, 0, 0, 1)))
			return ERROR;

		if (!Read(GL_RGBA16, vec4(1.0f), vec4(1.0f)))
			return ERROR;
		if (!Read(GL_RGB10_A2, vec4(1.0f), vec4(1.0f)))
			return ERROR;
		if (!Read(GL_RG16, vec4(1.0f), vec4(1.0f, 1.0f, 0.0f, 1.0f)))
			return ERROR;
		if (!Read(GL_R16, vec4(1.0f), vec4(1.0f, 0.0f, 0.0f, 1.0f)))
			return ERROR;

		if (!Read(GL_RGBA8, vec4(1.0f), vec4(1.0f)))
			return ERROR;
		if (!Read(GL_RG8, vec4(1.0f), vec4(1.0f, 1.0f, 0.0f, 1.0f)))
			return ERROR;
		if (!Read(GL_R8, vec4(1.0f), vec4(1.0f, 0.0f, 0.0f, 1.0f)))
			return ERROR;

		if (!Read(GL_RGBA16_SNORM, vec4(1.0f, -1.0f, 1.0f, -1.0f), vec4(1.0f, -1.0f, 1.0f, -1.0f)))
			return ERROR;
		if (!Read(GL_RG16_SNORM, vec4(-1.0f), vec4(-1.0f, -1.0f, 0.0f, 1.0f)))
			return ERROR;
		if (!Read(GL_R16_SNORM, vec4(-1.0f, 1.0f, -1.0f, 1.0f), vec4(-1.0f, 0.0f, 0.0f, 1.0f)))
			return ERROR;

		if (!Read(GL_RGBA8_SNORM, vec4(1.0f, -1.0f, 1.0f, -1.0f), vec4(1.0f, -1.0f, 1.0f, -1.0f)))
			return ERROR;
		if (!Read(GL_RG8_SNORM, vec4(-1.0f), vec4(-1.0f, -1.0f, 0.0f, 1.0f)))
			return ERROR;
		if (!Read(GL_R8_SNORM, vec4(-1.0f, 1.0f, -1.0f, 1.0f), vec4(-1.0f, 0.0f, 0.0f, 1.0f)))
			return ERROR;

		return NO_ERROR;
	}

	template <typename T>
	bool Read(GLenum internalformat, const T& value, const T& expected_value)
	{
		const GLuint program = BuildProgram(
			GenVS(internalformat, expected_value).c_str(), GenTCS(internalformat, expected_value).c_str(),
			GenTES(internalformat, expected_value).c_str(), GenGS(internalformat, expected_value).c_str(), NULL);
		const int	  kSize = 1;
		std::vector<T> data(kSize * kSize, value);
		GLuint		   texture[8];
		glGenTextures(8, texture);

		for (int i = 0; i < 4; ++i)
		{
			glBindTexture(GL_TEXTURE_2D_ARRAY, texture[i]);
			glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
			glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
			glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, internalformat, kSize, kSize, 1, 0, Format<T>(), Type<T>(), &data[0]);
		}
		glBindTexture(GL_TEXTURE_2D_ARRAY, 0);
		vec4 zero(0);
		for (int i = 4; i < 8; ++i)
		{
			glBindTexture(GL_TEXTURE_2D, texture[i]);
			glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
			glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
			glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, kSize, kSize, 0, GL_RGBA, GL_FLOAT, &zero);
		}
		glBindTexture(GL_TEXTURE_2D, 0);

		glUseProgram(program);
		glUniform1i(glGetUniformLocation(program, "g_image0"), 0);
		glUniform1i(glGetUniformLocation(program, "g_image1"), 1);
		glUniform1i(glGetUniformLocation(program, "g_image2"), 2);
		glUniform1i(glGetUniformLocation(program, "g_image3"), 3);
		glUniform1i(glGetUniformLocation(program, "g_image0_result"), 4);
		glUniform1i(glGetUniformLocation(program, "g_image1_result"), 5);
		glUniform1i(glGetUniformLocation(program, "g_image2_result"), 6);
		glUniform1i(glGetUniformLocation(program, "g_image3_result"), 7);

		for (GLuint i = 0; i < 4; ++i)
		{
			glBindImageTexture(i, texture[i], 0, GL_TRUE, 0, GL_READ_ONLY, internalformat);
		}
		for (GLuint i = 4; i < 8; ++i)
		{
			glBindImageTexture(i, texture[i], 0, GL_FALSE, 0, GL_WRITE_ONLY, GL_RGBA32F);
		}
		glBindVertexArray(m_vao);
		glPatchParameteri(GL_PATCH_VERTICES, 1);
		glDrawArrays(GL_PATCHES, 0, 1);
		glPatchParameteri(GL_PATCH_VERTICES, 3);

		const tcu::RenderTarget& renderTarget = m_context.getRenderContext().getRenderTarget();
		const tcu::PixelFormat&  pixelFormat  = renderTarget.getPixelFormat();
		vec4					 g_color_eps  = vec4(
			1.f / static_cast<float>(1 << pixelFormat.redBits), 1.f / static_cast<float>(1 << pixelFormat.greenBits),
			1.f / static_cast<float>(1 << pixelFormat.blueBits), 1.f / static_cast<float>(1 << pixelFormat.alphaBits));

		for (int i = 0; i < 4; ++i)
		{
			glBindTexture(GL_TEXTURE_2D, texture[i + 4]);
			glMemoryBarrier(GL_TEXTURE_UPDATE_BARRIER_BIT);
			vec4 result;
			glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_FLOAT, &result[0]);
			if (!ColorEqual(result, vec4(0, 1, 0, 1), g_color_eps))
			{
				glDeleteTextures(8, texture);
				glUseProgram(0);
				glDeleteProgram(program);
				m_context.getTestContext().getLog()
					<< tcu::TestLog::Message << "Bad load value. Format is: " << FormatEnumToString(internalformat)
					<< ". Stage is: " << StageName(i) << tcu::TestLog::EndMessage;
				return false;
			}
		}
		glDeleteTextures(8, texture);
		glUseProgram(0);
		glDeleteProgram(program);
		return true;
	}

	virtual long Cleanup()
	{
		glDisable(GL_RASTERIZER_DISCARD);
		glDeleteVertexArrays(1, &m_vao);
		return NO_ERROR;
	}

	template <typename T>
	std::string GenVS(GLenum internalformat, const T& expected_value)
	{
		std::ostringstream os;
		os << "#version 420 core" NL "layout(" << FormatEnumToString(internalformat) << ") readonly uniform "
		   << TypePrefix<T>()
		   << "image2DArray g_image0;" NL "layout(rgba32f) writeonly uniform image2D g_image0_result;" NL
			  "void main() {" NL "  ivec3 coord = ivec3(gl_VertexID, 0, 0);" NL "  "
		   << TypePrefix<T>() << "vec4 v = imageLoad(g_image0, coord);" NL "  if (v != " << TypePrefix<T>() << "vec4"
		   << expected_value << ") imageStore(g_image0_result, coord.xy, vec4(1.0, 0.0, 0.0, 1.0));" NL
								"  else imageStore(g_image0_result, coord.xy, vec4(0.0, 1.0, 0.0, 1.0));" NL "}";
		return os.str();
	}

	template <typename T>
	std::string GenTCS(GLenum internalformat, const T& expected_value)
	{
		std::ostringstream os;
		os << "#version 420 core" NL "layout(vertices = 1) out;" NL "layout(" << FormatEnumToString(internalformat)
		   << ") readonly uniform " << TypePrefix<T>()
		   << "image2DArray g_image1;" NL "layout(rgba32f) writeonly uniform image2D g_image1_result;" NL
			  "void main() {" NL "  gl_TessLevelInner[0] = 1;" NL "  gl_TessLevelInner[1] = 1;" NL
			  "  gl_TessLevelOuter[0] = 1;" NL "  gl_TessLevelOuter[1] = 1;" NL "  gl_TessLevelOuter[2] = 1;" NL
			  "  gl_TessLevelOuter[3] = 1;" NL "  ivec3 coord = ivec3(gl_PrimitiveID, 0, 0);" NL "  "
		   << TypePrefix<T>() << "vec4 v = imageLoad(g_image1, coord);" NL "  if (v != " << TypePrefix<T>() << "vec4"
		   << expected_value << ") imageStore(g_image1_result, coord.xy, vec4(1.0, 0.0, 0.0, 1.0));" NL
								"  else imageStore(g_image1_result, coord.xy, vec4(0.0, 1.0, 0.0, 1.0));" NL "}";
		return os.str();
	}

	template <typename T>
	std::string GenTES(GLenum internalformat, const T& expected_value)
	{
		std::ostringstream os;
		os << "#version 420 core" NL "layout(triangles, point_mode) in;" NL "layout("
		   << FormatEnumToString(internalformat) << ") readonly uniform " << TypePrefix<T>()
		   << "image2DArray g_image2;" NL "layout(rgba32f) writeonly uniform image2D g_image2_result;" NL
			  "void main() {" NL "  ivec3 coord = ivec3(gl_PrimitiveID, 0, 0);" NL "  "
		   << TypePrefix<T>() << "vec4 v = imageLoad(g_image2, coord);" NL "  if (v != " << TypePrefix<T>() << "vec4"
		   << expected_value << ") imageStore(g_image2_result, coord.xy, vec4(1.0, 0.0, 0.0, 1.0));" NL
								"  else imageStore(g_image2_result, coord.xy, vec4(0.0, 1.0, 0.0, 1.0));" NL "}";
		return os.str();
	}

	template <typename T>
	std::string GenGS(GLenum internalformat, const T& expected_value)
	{
		std::ostringstream os;
		os << "#version 420 core" NL "layout(points) in;" NL "layout(points, max_vertices = 1) out;" NL "layout("
		   << FormatEnumToString(internalformat) << ") readonly uniform " << TypePrefix<T>()
		   << "image2DArray g_image3;" NL "layout(rgba32f) writeonly uniform image2D g_image3_result;" NL
			  "void main() {" NL "  ivec3 coord = ivec3(gl_PrimitiveIDIn, 0, 0);" NL "  "
		   << TypePrefix<T>() << "vec4 v = imageLoad(g_image3, coord);" NL "  if (v != " << TypePrefix<T>() << "vec4"
		   << expected_value << ") imageStore(g_image3_result, coord.xy, vec4(1.0, 0.0, 0.0, 1.0));" NL
								"  else imageStore(g_image3_result, coord.xy, vec4(0.0, 1.0, 0.0, 1.0));" NL "}";
		return os.str();
	}
};
//-----------------------------------------------------------------------------
// 1.2.5 BasicAllFormatsLoadStoreComputeStage
//-----------------------------------------------------------------------------
class BasicAllFormatsLoadStoreComputeStage : public ShaderImageLoadStoreBase
{
	virtual long Run()
	{
		if (!m_context.getContextInfo().isExtensionSupported("GL_ARB_compute_shader"))
		{
			m_context.getTestContext().getLog()
				<< tcu::TestLog::Message << "GL_ARB_compute_shader not supported, skipping test"
				<< tcu::TestLog::EndMessage;
			return NOT_SUPPORTED;
		}

		if (!Read(GL_RGBA32F, vec4(1.0f, 2.0f, 3.0f, 4.0f), vec4(1.0f, 2.0f, 3.0f, 4.0f)))
			return ERROR;
		if (!Read(GL_RG32F, vec4(1.0f, 2.0f, 3.0f, 4.0f), vec4(1.0f, 2.0f, 0.0f, 1.0f)))
			return ERROR;
		if (!Read(GL_R32F, vec4(1.0f, 2.0f, 3.0f, 4.0f), vec4(1.0f, 0.0f, 0.0f, 1.0f)))
			return ERROR;

		if (!Read(GL_RGBA16F, vec4(1.0f, 2.0f, 3.0f, 4.0f), vec4(1.0f, 2.0f, 3.0f, 4.0f)))
			return ERROR;
		if (!Read(GL_RG16F, vec4(1.0f, 2.0f, 3.0f, 4.0f), vec4(1.0f, 2.0f, 0.0f, 1.0f)))
			return ERROR;
		if (!Read(GL_R16F, vec4(1.0f, 2.0f, 3.0f, 4.0f), vec4(1.0f, 0.0f, 0.0f, 1.0f)))
			return ERROR;

		if (!Read(GL_RGBA32I, ivec4(1, -2, 3, -4), ivec4(1, -2, 3, -4)))
			return ERROR;
		if (!Read(GL_RG32I, ivec4(1, -2, 3, -4), ivec4(1, -2, 0, 1)))
			return ERROR;
		if (!Read(GL_R32I, ivec4(1, -2, 3, -4), ivec4(1, 0, 0, 1)))
			return ERROR;

		if (!Read(GL_R11F_G11F_B10F, vec4(1.0f, 2.0f, 3.0f, 4.0f), vec4(1.0f, 2.0f, 3.0f, 1.0f)))
			return ERROR;

		if (!Read(GL_RGBA16I, ivec4(1, -2, 3, -4), ivec4(1, -2, 3, -4)))
			return ERROR;
		if (!Read(GL_RG16I, ivec4(1, -2, 3, -4), ivec4(1, -2, 0, 1)))
			return ERROR;
		if (!Read(GL_R16I, ivec4(1, -2, 3, -4), ivec4(1, 0, 0, 1)))
			return ERROR;

		if (!Read(GL_RGBA8I, ivec4(1, -2, 3, -4), ivec4(1, -2, 3, -4)))
			return ERROR;
		if (!Read(GL_RG8I, ivec4(1, -2, 3, -4), ivec4(1, -2, 0, 1)))
			return ERROR;
		if (!Read(GL_R8I, ivec4(1, -2, 3, -4), ivec4(1, 0, 0, 1)))
			return ERROR;

		if (!Read(GL_RGBA32UI, uvec4(0, 1, 2, 3), uvec4(0, 1, 2, 3)))
			return ERROR;
		if (!Read(GL_RGB10_A2UI, uvec4(0, 1, 2, 3), uvec4(0, 1, 2, 3)))
			return ERROR;
		if (!Read(GL_RG32UI, uvec4(0, 1, 2, 3), uvec4(0, 1, 0, 1)))
			return ERROR;
		if (!Read(GL_R32UI, uvec4(7, 2, 3, 4), uvec4(7, 0, 0, 1)))
			return ERROR;

		if (!Read(GL_RGBA16UI, uvec4(0, 1, 2, 3), uvec4(0, 1, 2, 3)))
			return ERROR;
		if (!Read(GL_RG16UI, uvec4(0, 1, 2, 3), uvec4(0, 1, 0, 1)))
			return ERROR;
		if (!Read(GL_R16UI, uvec4(7, 2, 3, 4), uvec4(7, 0, 0, 1)))
			return ERROR;

		if (!Read(GL_RGBA8UI, uvec4(0, 1, 2, 3), uvec4(0, 1, 2, 3)))
			return ERROR;
		if (!Read(GL_RG8UI, uvec4(0, 1, 2, 3), uvec4(0, 1, 0, 1)))
			return ERROR;
		if (!Read(GL_R8UI, uvec4(7, 2, 3, 4), uvec4(7, 0, 0, 1)))
			return ERROR;

		if (!Read(GL_RGBA16, vec4(1.0f), vec4(1.0f)))
			return ERROR;
		if (!Read(GL_RGB10_A2, vec4(1.0f), vec4(1.0f)))
			return ERROR;
		if (!Read(GL_RG16, vec4(1.0f), vec4(1.0f, 1.0f, 0.0f, 1.0f)))
			return ERROR;
		if (!Read(GL_R16, vec4(1.0f), vec4(1.0f, 0.0f, 0.0f, 1.0f)))
			return ERROR;

		if (!Read(GL_RGBA8, vec4(1.0f), vec4(1.0f)))
			return ERROR;
		if (!Read(GL_RG8, vec4(1.0f), vec4(1.0f, 1.0f, 0.0f, 1.0f)))
			return ERROR;
		if (!Read(GL_R8, vec4(1.0f), vec4(1.0f, 0.0f, 0.0f, 1.0f)))
			return ERROR;

		if (!Read(GL_RGBA16_SNORM, vec4(1.0f, -1.0f, 1.0f, -1.0f), vec4(1.0f, -1.0f, 1.0f, -1.0f)))
			return ERROR;
		if (!Read(GL_RG16_SNORM, vec4(-1.0f), vec4(-1.0f, -1.0f, 0.0f, 1.0f)))
			return ERROR;
		if (!Read(GL_R16_SNORM, vec4(-1.0f, 1.0f, -1.0f, 1.0f), vec4(-1.0f, 0.0f, 0.0f, 1.0f)))
			return ERROR;

		if (!Read(GL_RGBA8_SNORM, vec4(1.0f, -1.0f, 1.0f, -1.0f), vec4(1.0f, -1.0f, 1.0f, -1.0f)))
			return ERROR;
		if (!Read(GL_RG8_SNORM, vec4(-1.0f), vec4(-1.0f, -1.0f, 0.0f, 1.0f)))
			return ERROR;
		if (!Read(GL_R8_SNORM, vec4(-1.0f, 1.0f, -1.0f, 1.0f), vec4(-1.0f, 0.0f, 0.0f, 1.0f)))
			return ERROR;

		return NO_ERROR;
	}

	template <typename T>
	bool Read(GLenum internalformat, const T& value, const T& expected_value)
	{
		GLuint			  program;
		std::string		  source = GenCS<T>(internalformat);
		const char* const src	= source.c_str();
		GLuint			  sh	 = glCreateShader(GL_COMPUTE_SHADER);
		glShaderSource(sh, 1, &src, NULL);
		glCompileShader(sh);
		program = glCreateProgram();
		glAttachShader(program, sh);
		glLinkProgram(program);
		glDeleteShader(sh);

		const int	  kSize = 1;
		std::vector<T> data(kSize * kSize, value);
		GLuint		   texture[2];
		glGenTextures(2, texture);

		glBindTexture(GL_TEXTURE_2D, texture[0]);
		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
		glTexImage2D(GL_TEXTURE_2D, 0, internalformat, kSize, kSize, 0, Format<T>(), Type<T>(), &data[0]);
		glBindTexture(GL_TEXTURE_2D, texture[1]);
		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
		vec4 zero(0);
		glTexImage2D(GL_TEXTURE_2D, 0, internalformat, kSize, kSize, 0, Format<T>(), Type<T>(), &zero);

		glBindTexture(GL_TEXTURE_2D, 0);

		glUseProgram(program);
		glUniform1i(glGetUniformLocation(program, "g_image_read"), 0);
		glUniform1i(glGetUniformLocation(program, "g_image_write"), 1);

		glBindImageTexture(0, texture[0], 0, GL_TRUE, 0, GL_READ_ONLY, internalformat);
		glBindImageTexture(1, texture[1], 0, GL_TRUE, 0, GL_WRITE_ONLY, internalformat);

		glDispatchCompute(1, 1, 1);

		for (int i = 0; i < 2; ++i)
		{
			glBindTexture(GL_TEXTURE_2D, texture[i]);
			glMemoryBarrier(GL_TEXTURE_UPDATE_BARRIER_BIT);
			glGetTexImage(GL_TEXTURE_2D, 0, Format<T>(), Type<T>(), &data[0]);

			if (!Equal(data[0], expected_value, internalformat))
			{
				glDeleteTextures(4, texture);
				glUseProgram(0);
				glDeleteProgram(program);
				m_context.getTestContext().getLog()
					<< tcu::TestLog::Message << "Value is: " << ToString(data[0])
					<< ". Value should be: " << ToString(expected_value)
					<< ". Format is: " << FormatEnumToString(internalformat) << tcu::TestLog::EndMessage;
				return false;
			}
		}
		glDeleteTextures(2, texture);
		glUseProgram(0);
		glDeleteProgram(program);
		return true;
	}

	template <typename T>
	std::string GenCS(GLenum internalformat)
	{
		std::ostringstream os;
		os << "#version 420 core" NL "#extension GL_ARB_compute_shader : require" NL "layout(local_size_x = 1) in;" NL
			  "layout("
		   << FormatEnumToString(internalformat) << ") readonly uniform " << TypePrefix<T>()
		   << "image2D g_image_read;" NL "layout(" << FormatEnumToString(internalformat) << ") writeonly uniform "
		   << TypePrefix<T>() << "image2D g_image_write;" NL "void main() {" NL
								 "  ivec2 coord = ivec2(int(gl_GlobalInvocationID.x), 0);" NL "  "
		   << TypePrefix<T>()
		   << "vec4 v = imageLoad(g_image_read, coord);" NL "  imageStore(g_image_write, coord, v);" NL "}";
		return os.str();
	}
};
//-----------------------------------------------------------------------------
// 1.3.1 BasicAllTargetsStore
//-----------------------------------------------------------------------------
class BasicAllTargetsStore : public ShaderImageLoadStoreBase
{
	GLuint m_vao;
	GLuint m_vbo;

	virtual long Setup()
	{
		m_vao = 0;
		m_vbo = 0;
		return NO_ERROR;
	}

	virtual long Run()
	{
		CreateFullViewportQuad(&m_vao, &m_vbo, NULL);

		if (!Write(GL_RGBA32F, vec4(-1.0f, 2.0f, 3.0f, -4.0f), vec4(-1.0f, 2.0f, 3.0f, -4.0f)))
			return ERROR;
		if (!Write(GL_RGBA32I, ivec4(1, -2, 3, -4), ivec4(1, -2, 3, -4)))
			return ERROR;
		if (!Write(GL_RGBA32UI, uvec4(1, 2, 3, 4), uvec4(1, 2, 3, 4)))
			return ERROR;

		if (!WriteCubeArray(GL_RGBA32F, vec4(-1.0f, 2.0f, 3.0f, -4.0f), vec4(-1.0f, 2.0f, 3.0f, -4.0f)))
			return ERROR;
		if (!WriteCubeArray(GL_RGBA32I, ivec4(1, -2, 3, -4), ivec4(1, -2, 3, -4)))
			return ERROR;
		if (!WriteCubeArray(GL_RGBA32UI, uvec4(1, 2, 3, 4), uvec4(1, 2, 3, 4)))
			return ERROR;

		if (SupportedSamples(4))
		{
			if (!WriteMS(GL_RGBA32F, vec4(-1.0f, 2.0f, 3.0f, -4.0f), vec4(-1.0f, 2.0f, 3.0f, -4.0f)))
				return ERROR;

			GLint isamples;
			glGetIntegerv(GL_MAX_INTEGER_SAMPLES, &isamples);
			if (isamples >= 4)
			{
				if (!WriteMS(GL_RGBA32I, ivec4(1, -2, 3, -4), ivec4(1, -2, 3, -4)))
					return ERROR;
				if (!WriteMS(GL_RGBA32UI, uvec4(1, 2, 3, 4), uvec4(1, 2, 3, 4)))
					return ERROR;
			}
		}
		return NO_ERROR;
	}

	virtual long Cleanup()
	{
		glViewport(0, 0, getWindowWidth(), getWindowHeight());
		glDeleteVertexArrays(1, &m_vao);
		glDeleteBuffers(1, &m_vbo);
		return NO_ERROR;
	}

	template <typename T>
	bool Write(GLenum internalformat, const T& write_value, const T& expected_value)
	{
		const char* src_vs = "#version 420 core" NL "layout(location = 0) in vec4 i_position;" NL "void main() {" NL
							 "  gl_Position = i_position;" NL "}";
		const GLuint program = BuildProgram(src_vs, NULL, NULL, NULL, GenFS(internalformat, write_value).c_str());
		GLuint		 textures[8];
		GLuint		 buffer;
		glGenTextures(8, textures);
		glGenBuffers(1, &buffer);

		const int	  kSize = 16;
		std::vector<T> data(kSize * kSize * 2);

		glBindTexture(GL_TEXTURE_1D, textures[0]);
		glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
		glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
		glTexImage1D(GL_TEXTURE_1D, 0, internalformat, kSize, 0, Format<T>(), Type<T>(), &data[0]);
		glBindTexture(GL_TEXTURE_1D, 0);

		glBindTexture(GL_TEXTURE_2D, textures[1]);
		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
		glTexImage2D(GL_TEXTURE_2D, 0, internalformat, kSize, kSize, 0, Format<T>(), Type<T>(), &data[0]);
		glBindTexture(GL_TEXTURE_2D, 0);

		glBindTexture(GL_TEXTURE_3D, textures[2]);
		glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
		glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
		glTexImage3D(GL_TEXTURE_3D, 0, internalformat, kSize, kSize, 2, 0, Format<T>(), Type<T>(), &data[0]);
		glBindTexture(GL_TEXTURE_3D, 0);

		glBindTexture(GL_TEXTURE_RECTANGLE, textures[3]);
		glTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
		glTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
		glTexImage2D(GL_TEXTURE_RECTANGLE, 0, internalformat, kSize, kSize, 0, Format<T>(), Type<T>(), &data[0]);
		glBindTexture(GL_TEXTURE_RECTANGLE, 0);

		glBindTexture(GL_TEXTURE_CUBE_MAP, textures[4]);
		glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
		glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
		glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, internalformat, kSize, kSize, 0, Format<T>(), Type<T>(),
					 &data[0]);
		glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, internalformat, kSize, kSize, 0, Format<T>(), Type<T>(),
					 &data[0]);
		glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, internalformat, kSize, kSize, 0, Format<T>(), Type<T>(),
					 &data[0]);
		glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, internalformat, kSize, kSize, 0, Format<T>(), Type<T>(),
					 &data[0]);
		glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, internalformat, kSize, kSize, 0, Format<T>(), Type<T>(),
					 &data[0]);
		glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, internalformat, kSize, kSize, 0, Format<T>(), Type<T>(),
					 &data[0]);
		glBindTexture(GL_TEXTURE_CUBE_MAP, 0);

		glBindBuffer(GL_TEXTURE_BUFFER, buffer);
		glBufferData(GL_TEXTURE_BUFFER, kSize * sizeof(T), &data[0], GL_DYNAMIC_DRAW);
		glBindBuffer(GL_TEXTURE_BUFFER, 0);
		glBindTexture(GL_TEXTURE_BUFFER, textures[5]);
		glTexBuffer(GL_TEXTURE_BUFFER, internalformat, buffer);
		glBindTexture(GL_TEXTURE_BUFFER, 0);

		glBindTexture(GL_TEXTURE_1D_ARRAY, textures[6]);
		glTexParameteri(GL_TEXTURE_1D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
		glTexParameteri(GL_TEXTURE_1D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
		glTexImage2D(GL_TEXTURE_1D_ARRAY, 0, internalformat, kSize, 2, 0, Format<T>(), Type<T>(), &data[0]);
		glBindTexture(GL_TEXTURE_1D_ARRAY, 0);

		glBindTexture(GL_TEXTURE_2D_ARRAY, textures[7]);
		glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
		glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
		glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, internalformat, kSize, kSize, 2, 0, Format<T>(), Type<T>(), &data[0]);
		glBindTexture(GL_TEXTURE_2D_ARRAY, 0);

		glBindImageTexture(0, textures[0], 0, GL_FALSE, 0, GL_WRITE_ONLY, internalformat);
		glBindImageTexture(1, textures[1], 0, GL_FALSE, 0, GL_WRITE_ONLY, internalformat);
		glBindImageTexture(2, textures[2], 0, GL_TRUE, 0, GL_WRITE_ONLY, internalformat);
		glBindImageTexture(3, textures[3], 0, GL_FALSE, 0, GL_WRITE_ONLY, internalformat);
		glBindImageTexture(4, textures[4], 0, GL_TRUE, 0, GL_WRITE_ONLY, internalformat);
		glBindImageTexture(5, textures[5], 0, GL_FALSE, 0, GL_WRITE_ONLY, internalformat);
		glBindImageTexture(6, textures[6], 0, GL_TRUE, 0, GL_WRITE_ONLY, internalformat);
		glBindImageTexture(7, textures[7], 0, GL_TRUE, 0, GL_WRITE_ONLY, internalformat);

		glUseProgram(program);
		glUniform1i(glGetUniformLocation(program, "g_image_1d"), 0);
		glUniform1i(glGetUniformLocation(program, "g_image_2d"), 1);
		glUniform1i(glGetUniformLocation(program, "g_image_3d"), 2);
		glUniform1i(glGetUniformLocation(program, "g_image_2drect"), 3);
		glUniform1i(glGetUniformLocation(program, "g_image_cube"), 4);
		glUniform1i(glGetUniformLocation(program, "g_image_buffer"), 5);
		glUniform1i(glGetUniformLocation(program, "g_image_1darray"), 6);
		glUniform1i(glGetUniformLocation(program, "g_image_2darray"), 7);

		glBindVertexArray(m_vao);
		glViewport(0, 0, kSize, kSize);
		glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

		bool status = true;

		glBindTexture(GL_TEXTURE_1D, textures[0]);
		glMemoryBarrier(GL_TEXTURE_UPDATE_BARRIER_BIT);
		glGetTexImage(GL_TEXTURE_1D, 0, Format<T>(), Type<T>(), &data[0]);
		glBindTexture(GL_TEXTURE_1D, 0);
		for (int i = 0; i < kSize; ++i)
		{
			if (!tcu::allEqual(data[i], expected_value))
			{
				status = false;
				m_context.getTestContext().getLog()
					<< tcu::TestLog::Message << "GL_TEXTURE_1D target failed. Value is: " << ToString(data[i])
					<< ". Value should be: " << ToString(expected_value) << tcu::TestLog::EndMessage;
				break;
			}
		}
		std::fill(data.begin(), data.end(), T(0));

		glBindTexture(GL_TEXTURE_2D, textures[1]);
		glMemoryBarrier(GL_TEXTURE_UPDATE_BARRIER_BIT);
		glGetTexImage(GL_TEXTURE_2D, 0, Format<T>(), Type<T>(), &data[0]);
		glBindTexture(GL_TEXTURE_2D, 0);
		for (int i = 0; i < kSize * kSize; ++i)
		{
			if (!tcu::allEqual(data[i], expected_value))
			{
				status = false;
				m_context.getTestContext().getLog()
					<< tcu::TestLog::Message << "GL_TEXTURE_2D target failed. Value is: " << ToString(data[i])
					<< ". Value should be: " << ToString(expected_value) << tcu::TestLog::EndMessage;
				break;
			}
		}

		glBindTexture(GL_TEXTURE_3D, textures[2]);
		glMemoryBarrier(GL_TEXTURE_UPDATE_BARRIER_BIT);
		glGetTexImage(GL_TEXTURE_3D, 0, Format<T>(), Type<T>(), &data[0]);
		glBindTexture(GL_TEXTURE_3D, 0);
		for (int i = 0; i < kSize * kSize * 2; ++i)
		{
			if (!tcu::allEqual(data[i], expected_value))
			{
				status = false;
				m_context.getTestContext().getLog()
					<< tcu::TestLog::Message << "GL_TEXTURE_3D target failed. Value is: " << ToString(data[i])
					<< ". Value should be: " << ToString(expected_value) << tcu::TestLog::EndMessage;
				break;
			}
		}

		glBindTexture(GL_TEXTURE_RECTANGLE, textures[3]);
		glMemoryBarrier(GL_TEXTURE_UPDATE_BARRIER_BIT);
		glGetTexImage(GL_TEXTURE_RECTANGLE, 0, Format<T>(), Type<T>(), &data[0]);
		glBindTexture(GL_TEXTURE_RECTANGLE, 0);
		for (int i = 0; i < kSize * kSize; ++i)
		{
			if (!tcu::allEqual(data[i], expected_value))
			{
				status = false;
				m_context.getTestContext().getLog()
					<< tcu::TestLog::Message << "GL_TEXTURE_RECTANGLE target failed. Value is: " << ToString(data[i])
					<< ". Value should be: " << ToString(expected_value) << tcu::TestLog::EndMessage;
				break;
			}
		}

		{
			glBindTexture(GL_TEXTURE_CUBE_MAP, textures[4]);
			glMemoryBarrier(GL_TEXTURE_UPDATE_BARRIER_BIT);
			for (int face = 0; face < 6; ++face)
			{
				glGetTexImage(GL_TEXTURE_CUBE_MAP_POSITIVE_X + face, 0, Format<T>(), Type<T>(), &data[0]);
				for (int i = 0; i < kSize * kSize; ++i)
				{
					if (!tcu::allEqual(data[i], expected_value))
					{
						status = false;
						m_context.getTestContext().getLog()
							<< tcu::TestLog::Message
							<< "GL_TEXTURE_CUBE_MAP_POSITIVE_X target failed. Value is: " << ToString(data[i])
							<< ". Value should be: " << ToString(expected_value) << tcu::TestLog::EndMessage;
						break;
					}
				}
			}
			glBindTexture(GL_TEXTURE_CUBE_MAP, 0);
		}

		glBindTexture(GL_TEXTURE_BUFFER, textures[5]);
		glMemoryBarrier(GL_TEXTURE_UPDATE_BARRIER_BIT);
		glBindTexture(GL_TEXTURE_BUFFER, 0);
		glBindBuffer(GL_TEXTURE_BUFFER, buffer);
		glGetBufferSubData(GL_TEXTURE_BUFFER, 0, kSize * sizeof(T), &data[0]);
		glBindBuffer(GL_TEXTURE_BUFFER, 0);
		for (int i = 0; i < kSize; ++i)
		{
			if (!tcu::allEqual(data[i], expected_value))
			{
				status = false;
				m_context.getTestContext().getLog()
					<< tcu::TestLog::Message << "GL_TEXTURE_BUFFER target failed. Value is: " << ToString(data[i])
					<< ". Value should be: " << ToString(expected_value) << tcu::TestLog::EndMessage;
				break;
			}
		}

		glBindTexture(GL_TEXTURE_1D_ARRAY, textures[6]);
		glMemoryBarrier(GL_TEXTURE_UPDATE_BARRIER_BIT);
		glGetTexImage(GL_TEXTURE_1D_ARRAY, 0, Format<T>(), Type<T>(), &data[0]);
		glBindTexture(GL_TEXTURE_1D_ARRAY, 0);
		for (int i = 0; i < kSize * 2; ++i)
		{
			if (!tcu::allEqual(data[i], expected_value))
			{
				status = false;
				m_context.getTestContext().getLog()
					<< tcu::TestLog::Message << "GL_TEXTURE_1D_ARRAY target failed. Value is: " << ToString(data[i])
					<< ". Value should be: " << ToString(expected_value) << tcu::TestLog::EndMessage;
				break;
			}
		}

		glBindTexture(GL_TEXTURE_2D_ARRAY, textures[7]);
		glMemoryBarrier(GL_TEXTURE_UPDATE_BARRIER_BIT);
		glGetTexImage(GL_TEXTURE_2D_ARRAY, 0, Format<T>(), Type<T>(), &data[0]);
		glBindTexture(GL_TEXTURE_2D_ARRAY, 0);
		for (int i = 0; i < kSize * kSize * 2; ++i)
		{
			if (!tcu::allEqual(data[i], expected_value))
			{
				status = false;
				m_context.getTestContext().getLog()
					<< tcu::TestLog::Message << "GL_TEXTURE_2D_ARRAY target failed. Value is: " << ToString(data[i])
					<< ". Value should be: " << ToString(expected_value) << tcu::TestLog::EndMessage;
				break;
			}
		}

		glUseProgram(0);
		glDeleteProgram(program);
		glDeleteTextures(8, textures);
		glDeleteBuffers(1, &buffer);

		return status;
	}

	template <typename T>
	bool WriteMS(GLenum internalformat, const T& write_value, const T& expected_value)
	{

		const char* src_vs = "#version 420 core" NL "layout(location = 0) in vec4 i_position;" NL "void main() {" NL
							 "  gl_Position = i_position;" NL "}";
		const GLuint program	 = BuildProgram(src_vs, NULL, NULL, NULL, GenFSMS(internalformat, write_value).c_str());
		const GLuint val_program = BuildProgram(src_vs, NULL, NULL, NULL, GenFSMSVal(expected_value).c_str());
		GLuint		 textures[2];
		glGenTextures(2, textures);

		const int kSize = 16;

		glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, textures[0]);
		glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 4, internalformat, kSize, kSize, GL_FALSE);
		glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, 0);

		glBindTexture(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, textures[1]);
		glTexImage3DMultisample(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, 4, internalformat, kSize, kSize, 2, GL_FALSE);
		glBindTexture(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, 0);

		glBindImageTexture(1, textures[0], 0, GL_FALSE, 0, GL_WRITE_ONLY, internalformat);
		glBindImageTexture(4, textures[1], 0, GL_TRUE, 0, GL_WRITE_ONLY, internalformat);

		glClear(GL_COLOR_BUFFER_BIT);
		glUseProgram(program);
		glUniform1i(glGetUniformLocation(program, "g_image_2dms"), 1);
		glUniform1i(glGetUniformLocation(program, "g_image_2dms_array"), 4);

		glBindVertexArray(m_vao);
		glViewport(0, 0, kSize, kSize);
		glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

		bool status = true;

		glActiveTexture(GL_TEXTURE0);
		glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, textures[0]);
		glActiveTexture(GL_TEXTURE1);
		glBindTexture(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, textures[1]);

		glUseProgram(val_program);
		glUniform1i(glGetUniformLocation(val_program, "g_sampler_2dms"), 0);
		glUniform1i(glGetUniformLocation(val_program, "g_sampler_2dms_array"), 1);

		glBindVertexArray(m_vao);
		glViewport(0, 0, kSize, kSize);
		glMemoryBarrier(GL_SHADER_IMAGE_ACCESS_BARRIER_BIT);
		glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

		if (!ValidateReadBuffer(0, 0, kSize, kSize, vec4(0, 1, 0, 1)))
		{
			status = false;
			m_context.getTestContext().getLog()
				<< tcu::TestLog::Message
				<< "GL_TEXTURE_2D_MULTISAMPLE or GL_TEXTURE_2D_MULTISAMPLE_ARRAY target failed."
				<< tcu::TestLog::EndMessage;
		}

		glActiveTexture(GL_TEXTURE0);
		glDeleteTextures(2, textures);
		glUseProgram(0);
		glDeleteProgram(program);
		glDeleteProgram(val_program);

		return status;
	}

	template <typename T>
	bool WriteCubeArray(GLenum internalformat, const T& write_value, const T& expected_value)
	{
		const char* src_vs = "#version 420 core" NL "layout(location = 0) in vec4 i_position;" NL "void main() {" NL
							 "  gl_Position = i_position;" NL "}";
		const GLuint program =
			BuildProgram(src_vs, NULL, NULL, NULL, GenFSCubeArray(internalformat, write_value).c_str());
		GLuint textures[1];
		glGenTextures(1, textures);

		const int kSize = 16;

		std::vector<T> data(kSize * kSize * 12);
		glBindTexture(GL_TEXTURE_CUBE_MAP_ARRAY, textures[0]);
		glTexParameteri(GL_TEXTURE_CUBE_MAP_ARRAY, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
		glTexImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 0, internalformat, kSize, kSize, 12, 0, Format<T>(), Type<T>(),
					 &data[0]);
		glBindTexture(GL_TEXTURE_CUBE_MAP_ARRAY, 0);

		glBindImageTexture(0, textures[0], 0, GL_TRUE, 0, GL_WRITE_ONLY, internalformat);

		glUseProgram(program);
		glBindVertexArray(m_vao);
		glViewport(0, 0, kSize, kSize);
		glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

		bool status = true;

		std::fill(data.begin(), data.end(), T(0));
		glBindTexture(GL_TEXTURE_CUBE_MAP_ARRAY, textures[0]);
		glMemoryBarrier(GL_TEXTURE_UPDATE_BARRIER_BIT);
		glGetTexImage(GL_TEXTURE_CUBE_MAP_ARRAY, 0, Format<T>(), Type<T>(), &data[0]);
		glBindTexture(GL_TEXTURE_CUBE_MAP_ARRAY, 0);
		for (int i = 0; i < kSize * kSize * 12; ++i)
		{
			if (!tcu::allEqual(data[i], expected_value))
			{
				status = false;
				m_context.getTestContext().getLog()
					<< tcu::TestLog::Message
					<< "GL_TEXTURE_CUBE_MAP_ARRAY target failed. Value is: " << ToString(data[i])
					<< ". Value should be: " << ToString(expected_value) << tcu::TestLog::EndMessage;
				break;
			}
		}

		glDeleteTextures(1, textures);
		glUseProgram(0);
		glDeleteProgram(program);

		return status;
	}

	template <typename T>
	std::string GenFS(GLenum internalformat, const T& write_value)
	{
		std::ostringstream os;
		os << "#version 420 core" NL "layout(" << FormatEnumToString(internalformat) << ") writeonly uniform "
		   << TypePrefix<T>() << "image1D g_image_1d;" NL "layout(" << FormatEnumToString(internalformat)
		   << ") writeonly uniform " << TypePrefix<T>() << "image2D g_image_2d;" NL "layout("
		   << FormatEnumToString(internalformat) << ") writeonly uniform " << TypePrefix<T>()
		   << "image3D g_image_3d;" NL "layout(" << FormatEnumToString(internalformat) << ") writeonly uniform "
		   << TypePrefix<T>() << "image2DRect g_image_2drect;" NL "layout(" << FormatEnumToString(internalformat)
		   << ") writeonly uniform " << TypePrefix<T>() << "imageCube g_image_cube;" NL "layout("
		   << FormatEnumToString(internalformat) << ") writeonly uniform " << TypePrefix<T>()
		   << "imageBuffer g_image_buffer;" NL "layout(" << FormatEnumToString(internalformat) << ") writeonly uniform "
		   << TypePrefix<T>() << "image1DArray g_image_1darray;" NL "layout(" << FormatEnumToString(internalformat)
		   << ") writeonly uniform " << TypePrefix<T>()
		   << "image2DArray g_image_2darray;" NL "void main() {" NL "  ivec2 coord = ivec2(gl_FragCoord.xy);" NL
			  "  imageStore(g_image_1d, coord.x, "
		   << TypePrefix<T>() << "vec4" << write_value << ");" NL "  imageStore(g_image_2d, coord, " << TypePrefix<T>()
		   << "vec4" << write_value << ");" NL "  imageStore(g_image_3d, ivec3(coord.xy, 0), " << TypePrefix<T>()
		   << "vec4" << write_value << ");" NL "  imageStore(g_image_3d, ivec3(coord.xy, 1), " << TypePrefix<T>()
		   << "vec4" << write_value << ");" NL "  imageStore(g_image_2drect, coord, " << TypePrefix<T>() << "vec4"
		   << write_value << ");" NL "  imageStore(g_image_cube, ivec3(coord, 0), " << TypePrefix<T>() << "vec4"
		   << write_value << ");" NL "  imageStore(g_image_cube, ivec3(coord, 1), " << TypePrefix<T>() << "vec4"
		   << write_value << ");" NL "  imageStore(g_image_cube, ivec3(coord, 2), " << TypePrefix<T>() << "vec4"
		   << write_value << ");" NL "  imageStore(g_image_cube, ivec3(coord, 3), " << TypePrefix<T>() << "vec4"
		   << write_value << ");" NL "  imageStore(g_image_cube, ivec3(coord, 4), " << TypePrefix<T>() << "vec4"
		   << write_value << ");" NL "  imageStore(g_image_cube, ivec3(coord, 5), " << TypePrefix<T>() << "vec4"
		   << write_value << ");" NL "  imageStore(g_image_buffer, coord.x, " << TypePrefix<T>() << "vec4"
		   << write_value << ");" NL "  imageStore(g_image_1darray, ivec2(coord.x, 0), " << TypePrefix<T>() << "vec4"
		   << write_value << ");" NL "  imageStore(g_image_1darray, ivec2(coord.x, 1), " << TypePrefix<T>() << "vec4"
		   << write_value << ");" NL "  imageStore(g_image_2darray, ivec3(coord, 0), " << TypePrefix<T>() << "vec4"
		   << write_value << ");" NL "  imageStore(g_image_2darray, ivec3(coord, 1), " << TypePrefix<T>() << "vec4"
		   << write_value << ");" NL "  discard;" NL "}";
		return os.str();
	}

	template <typename T>
	std::string GenFSMS(GLenum internalformat, const T& write_value)
	{
		std::ostringstream os;
		os << "#version 420 core" NL "layout(" << FormatEnumToString(internalformat) << ") writeonly uniform "
		   << TypePrefix<T>() << "image2DMS g_image_2dms;" NL "layout(" << FormatEnumToString(internalformat)
		   << ") writeonly uniform " << TypePrefix<T>()
		   << "image2DMSArray g_image_2dms_array;" NL "void main() {" NL "  ivec2 coord = ivec2(gl_FragCoord.xy);" NL
			  "  imageStore(g_image_2dms, coord, 0, "
		   << TypePrefix<T>() << "vec4" << write_value << ");" NL "  imageStore(g_image_2dms, coord, 1, "
		   << TypePrefix<T>() << "vec4" << write_value << ");" NL "  imageStore(g_image_2dms, coord, 2, "
		   << TypePrefix<T>() << "vec4" << write_value << ");" NL "  imageStore(g_image_2dms, coord, 3, "
		   << TypePrefix<T>() << "vec4" << write_value
		   << ");" NL "  imageStore(g_image_2dms_array, ivec3(coord, 0), 0, " << TypePrefix<T>() << "vec4"
		   << write_value << ");" NL "  imageStore(g_image_2dms_array, ivec3(coord, 0), 1, " << TypePrefix<T>()
		   << "vec4" << write_value << ");" NL "  imageStore(g_image_2dms_array, ivec3(coord, 0), 2, "
		   << TypePrefix<T>() << "vec4" << write_value
		   << ");" NL "  imageStore(g_image_2dms_array, ivec3(coord, 0), 3, " << TypePrefix<T>() << "vec4"
		   << write_value << ");" NL "  imageStore(g_image_2dms_array, ivec3(coord, 1), 0, " << TypePrefix<T>()
		   << "vec4" << write_value << ");" NL "  imageStore(g_image_2dms_array, ivec3(coord, 1), 1, "
		   << TypePrefix<T>() << "vec4" << write_value
		   << ");" NL "  imageStore(g_image_2dms_array, ivec3(coord, 1), 2, " << TypePrefix<T>() << "vec4"
		   << write_value << ");" NL "  imageStore(g_image_2dms_array, ivec3(coord, 1), 3, " << TypePrefix<T>()
		   << "vec4" << write_value << ");" NL "  discard;" NL "}";
		return os.str();
	}

	template <typename T>
	std::string GenFSMSVal(const T& expected_value)
	{
		std::ostringstream os;
		os << "#version 420 core" NL "layout(location = 0) out vec4 o_color;" NL "uniform " << TypePrefix<T>()
		   << "sampler2DMS g_sampler_2dms;" NL "uniform " << TypePrefix<T>()
		   << "sampler2DMSArray g_sampler_2dms_array;" NL "void main() {" NL "  o_color = vec4(0.0, 1.0, 0.0, 1.0);" NL
			  "  ivec2 coord = ivec2(gl_FragCoord.xy);" NL "  if (texelFetch(g_sampler_2dms, coord, 0) != "
		   << TypePrefix<T>() << "vec4" << expected_value
		   << ") o_color = vec4(1.0, 0.0, 0.0, 0.1);" NL "  if (texelFetch(g_sampler_2dms, coord, 1) != "
		   << TypePrefix<T>() << "vec4" << expected_value
		   << ") o_color = vec4(1.0, 0.0, 0.0, 0.1);" NL "  if (texelFetch(g_sampler_2dms, coord, 2) != "
		   << TypePrefix<T>() << "vec4" << expected_value
		   << ") o_color = vec4(1.0, 0.0, 0.0, 0.1);" NL "  if (texelFetch(g_sampler_2dms, coord, 3) != "
		   << TypePrefix<T>() << "vec4" << expected_value
		   << ") o_color = vec4(1.0, 0.0, 0.0, 0.1);" NL
			  "  if (texelFetch(g_sampler_2dms_array, ivec3(coord, 0), 0) != "
		   << TypePrefix<T>() << "vec4" << expected_value
		   << ") o_color = vec4(1.0, 0.0, 0.0, 0.2);" NL
			  "  if (texelFetch(g_sampler_2dms_array, ivec3(coord, 0), 1) != "
		   << TypePrefix<T>() << "vec4" << expected_value
		   << ") o_color = vec4(1.0, 0.0, 0.0, 0.2);" NL
			  "  if (texelFetch(g_sampler_2dms_array, ivec3(coord, 0), 2) != "
		   << TypePrefix<T>() << "vec4" << expected_value
		   << ") o_color = vec4(1.0, 0.0, 0.0, 0.2);" NL
			  "  if (texelFetch(g_sampler_2dms_array, ivec3(coord, 0), 3) != "
		   << TypePrefix<T>() << "vec4" << expected_value
		   << ") o_color = vec4(1.0, 0.0, 0.0, 0.2);" NL
			  "  if (texelFetch(g_sampler_2dms_array, ivec3(coord, 1), 0) != "
		   << TypePrefix<T>() << "vec4" << expected_value
		   << ") o_color = vec4(1.0, 0.0, 0.0, 0.3);" NL
			  "  if (texelFetch(g_sampler_2dms_array, ivec3(coord, 1), 1) != "
		   << TypePrefix<T>() << "vec4" << expected_value
		   << ") o_color = vec4(1.0, 0.0, 0.0, 0.3);" NL
			  "  if (texelFetch(g_sampler_2dms_array, ivec3(coord, 1), 2) != "
		   << TypePrefix<T>() << "vec4" << expected_value
		   << ") o_color = vec4(1.0, 0.0, 0.0, 0.3);" NL
			  "  if (texelFetch(g_sampler_2dms_array, ivec3(coord, 1), 3) != "
		   << TypePrefix<T>() << "vec4" << expected_value << ") o_color = vec4(1.0, 0.0, 0.0, 0.3);" NL "}";
		return os.str();
	}

	template <typename T>
	std::string GenFSCubeArray(GLenum internalformat, const T& write_value)
	{
		std::ostringstream os;
		os << "#version 420 core" NL "layout(" << FormatEnumToString(internalformat) << ") writeonly uniform "
		   << TypePrefix<T>()
		   << "imageCubeArray g_image_cube_array;" NL "void main() {" NL "  ivec2 coord = ivec2(gl_FragCoord.xy);" NL
			  "  imageStore(g_image_cube_array, ivec3(coord, 0), "
		   << TypePrefix<T>() << "vec4" << write_value << ");" NL "  imageStore(g_image_cube_array, ivec3(coord, 1), "
		   << TypePrefix<T>() << "vec4" << write_value << ");" NL "  imageStore(g_image_cube_array, ivec3(coord, 2), "
		   << TypePrefix<T>() << "vec4" << write_value << ");" NL "  imageStore(g_image_cube_array, ivec3(coord, 3), "
		   << TypePrefix<T>() << "vec4" << write_value << ");" NL "  imageStore(g_image_cube_array, ivec3(coord, 4), "
		   << TypePrefix<T>() << "vec4" << write_value << ");" NL "  imageStore(g_image_cube_array, ivec3(coord, 5), "
		   << TypePrefix<T>() << "vec4" << write_value << ");" NL "  imageStore(g_image_cube_array, ivec3(coord, 6), "
		   << TypePrefix<T>() << "vec4" << write_value << ");" NL "  imageStore(g_image_cube_array, ivec3(coord, 7), "
		   << TypePrefix<T>() << "vec4" << write_value << ");" NL "  imageStore(g_image_cube_array, ivec3(coord, 8), "
		   << TypePrefix<T>() << "vec4" << write_value << ");" NL "  imageStore(g_image_cube_array, ivec3(coord, 9), "
		   << TypePrefix<T>() << "vec4" << write_value << ");" NL "  imageStore(g_image_cube_array, ivec3(coord, 10), "
		   << TypePrefix<T>() << "vec4" << write_value << ");" NL "  imageStore(g_image_cube_array, ivec3(coord, 11), "
		   << TypePrefix<T>() << "vec4" << write_value << ");" NL "  discard;" NL "}";
		return os.str();
	}
};
//-----------------------------------------------------------------------------
// 1.3.2.1 BasicAllTargetsLoadNonMS
//-----------------------------------------------------------------------------
class BasicAllTargetsLoadNonMS : public ShaderImageLoadStoreBase
{
	GLuint m_vao;
	GLuint m_vbo;

	virtual long Setup()
	{
		m_vao = 0;
		m_vbo = 0;
		return NO_ERROR;
	}

	virtual long Run()
	{
		CreateFullViewportQuad(&m_vao, &m_vbo, NULL);

		if (!Read(GL_RGBA32F, vec4(-1.0f, 10.0f, -200.0f, 3000.0f), vec4(-1.0f, 10.0f, -200.0f, 3000.0f)))
			return ERROR;
		if (!Read(GL_RGBA32I, ivec4(-1, 10, -200, 3000), ivec4(-1, 10, -200, 3000)))
			return ERROR;
		if (!Read(GL_RGBA32UI, uvec4(1, 10, 200, 3000), uvec4(1, 10, 200, 3000)))
			return ERROR;

		if (!ReadCube(GL_RGBA32F, vec4(-1.0f, 10.0f, -200.0f, 3000.0f), vec4(-1.0f, 10.0f, -200.0f, 3000.0f)))
			return ERROR;
		if (!ReadCube(GL_RGBA32I, ivec4(-1, 10, -200, 3000), ivec4(-1, 10, -200, 3000)))
			return ERROR;
		if (!ReadCube(GL_RGBA32UI, uvec4(1, 10, 200, 3000), uvec4(1, 10, 200, 3000)))
			return ERROR;

		return NO_ERROR;
	}

	virtual long Cleanup()
	{
		glViewport(0, 0, getWindowWidth(), getWindowHeight());
		glDeleteVertexArrays(1, &m_vao);
		glDeleteBuffers(1, &m_vbo);
		return NO_ERROR;
	}

	template <typename T>
	bool Read(GLenum internalformat, const T& value, const T& expected_value)
	{
		const char* src_vs = "#version 420 core" NL "layout(location = 0) in vec4 i_position;" NL "void main() {" NL
							 "  gl_Position = i_position;" NL "}";
		const GLuint program = BuildProgram(src_vs, NULL, NULL, NULL, GenFS(internalformat, expected_value).c_str());
		GLuint		 textures[7];
		GLuint		 buffer;
		glGenTextures(7, textures);
		glGenBuffers(1, &buffer);

		const int	  kSize = 16;
		std::vector<T> data(kSize * kSize * 2, value);

		glBindTexture(GL_TEXTURE_1D, textures[0]);
		glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
		glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
		glTexImage1D(GL_TEXTURE_1D, 0, internalformat, kSize, 0, Format<T>(), Type<T>(), &data[0]);
		glBindTexture(GL_TEXTURE_1D, 0);

		glBindTexture(GL_TEXTURE_2D, textures[1]);
		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
		glTexImage2D(GL_TEXTURE_2D, 0, internalformat, kSize, kSize, 0, Format<T>(), Type<T>(), &data[0]);
		glBindTexture(GL_TEXTURE_2D, 0);

		glBindTexture(GL_TEXTURE_3D, textures[2]);
		glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
		glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
		glTexImage3D(GL_TEXTURE_3D, 0, internalformat, kSize, kSize, 2, 0, Format<T>(), Type<T>(), &data[0]);
		glBindTexture(GL_TEXTURE_3D, 0);

		glBindTexture(GL_TEXTURE_RECTANGLE, textures[3]);
		glTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
		glTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
		glTexImage2D(GL_TEXTURE_RECTANGLE, 0, internalformat, kSize, kSize, 0, Format<T>(), Type<T>(), &data[0]);
		glBindTexture(GL_TEXTURE_RECTANGLE, 0);

		glBindBuffer(GL_TEXTURE_BUFFER, buffer);
		glBufferData(GL_TEXTURE_BUFFER, kSize * sizeof(T), &data[0], GL_DYNAMIC_DRAW);
		glBindBuffer(GL_TEXTURE_BUFFER, 0);
		glBindTexture(GL_TEXTURE_BUFFER, textures[4]);
		glTexBuffer(GL_TEXTURE_BUFFER, internalformat, buffer);
		glBindTexture(GL_TEXTURE_BUFFER, 0);

		glBindTexture(GL_TEXTURE_1D_ARRAY, textures[5]);
		glTexParameteri(GL_TEXTURE_1D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
		glTexParameteri(GL_TEXTURE_1D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
		glTexImage2D(GL_TEXTURE_1D_ARRAY, 0, internalformat, kSize, 2, 0, Format<T>(), Type<T>(), &data[0]);
		glBindTexture(GL_TEXTURE_1D_ARRAY, 0);

		glBindTexture(GL_TEXTURE_2D_ARRAY, textures[6]);
		glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
		glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
		glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, internalformat, kSize, kSize, 2, 0, Format<T>(), Type<T>(), &data[0]);
		glBindTexture(GL_TEXTURE_2D_ARRAY, 0);

		glBindImageTexture(0, textures[0], 0, GL_FALSE, 0, GL_READ_ONLY, internalformat);
		glBindImageTexture(1, textures[1], 0, GL_FALSE, 0, GL_READ_ONLY, internalformat);
		glBindImageTexture(2, textures[2], 0, GL_TRUE, 0, GL_READ_ONLY, internalformat);
		glBindImageTexture(3, textures[3], 0, GL_FALSE, 0, GL_READ_ONLY, internalformat);
		glBindImageTexture(4, textures[4], 0, GL_FALSE, 0, GL_READ_ONLY, internalformat);
		glBindImageTexture(5, textures[5], 0, GL_TRUE, 0, GL_READ_ONLY, internalformat);
		glBindImageTexture(6, textures[6], 0, GL_TRUE, 0, GL_READ_ONLY, internalformat);

		glClear(GL_COLOR_BUFFER_BIT);

		glUseProgram(program);
		glUniform1i(glGetUniformLocation(program, "g_image_1d"), 0);
		glUniform1i(glGetUniformLocation(program, "g_image_2d"), 1);
		glUniform1i(glGetUniformLocation(program, "g_image_3d"), 2);
		glUniform1i(glGetUniformLocation(program, "g_image_2drect"), 3);
		glUniform1i(glGetUniformLocation(program, "g_image_buffer"), 4);
		glUniform1i(glGetUniformLocation(program, "g_image_1darray"), 5);
		glUniform1i(glGetUniformLocation(program, "g_image_2darray"), 6);

		glBindVertexArray(m_vao);
		glViewport(0, 0, kSize, kSize);
		glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

		bool status = true;

		if (!ValidateReadBuffer(0, 0, kSize, kSize, vec4(0, 1, 0, 1)))
		{
			status = false;
		}

		std::map<std::string, GLuint> name_index_map;
		GLint uniforms;
		glGetProgramiv(program, GL_ACTIVE_UNIFORMS, &uniforms);
		if (uniforms != 7)
		{
			status = false;
			m_context.getTestContext().getLog() << tcu::TestLog::Message << "ACTIVE_UNIFORMS is " << uniforms
												<< " should be 7." << tcu::TestLog::EndMessage;
		}
		for (GLuint index = 0; index < static_cast<GLuint>(uniforms); ++index)
		{
			GLchar name[32];
			glGetActiveUniformName(program, index, sizeof(name), NULL, name);
			name_index_map.insert(std::make_pair(std::string(name), index));
		}

		if (!CheckUniform(program, "g_image_1d", name_index_map, 1, ImageType<T>(GL_TEXTURE_1D)))
			status = false;
		if (!CheckUniform(program, "g_image_2d", name_index_map, 1, ImageType<T>(GL_TEXTURE_2D)))
			status = false;
		if (!CheckUniform(program, "g_image_3d", name_index_map, 1, ImageType<T>(GL_TEXTURE_3D)))
			status = false;
		if (!CheckUniform(program, "g_image_2drect", name_index_map, 1, ImageType<T>(GL_TEXTURE_RECTANGLE)))
			status = false;
		if (!CheckUniform(program, "g_image_buffer", name_index_map, 1, ImageType<T>(GL_TEXTURE_BUFFER)))
			status = false;
		if (!CheckUniform(program, "g_image_1darray", name_index_map, 1, ImageType<T>(GL_TEXTURE_1D_ARRAY)))
			status = false;
		if (!CheckUniform(program, "g_image_2darray", name_index_map, 1, ImageType<T>(GL_TEXTURE_2D_ARRAY)))
			status = false;

		glUseProgram(0);
		glDeleteProgram(program);
		glDeleteTextures(7, textures);
		glDeleteBuffers(1, &buffer);

		return status;
	}

	template <typename T>
	bool ReadCube(GLenum internalformat, const T& value, const T& expected_value)
	{
		const char* src_vs = "#version 420 core" NL "layout(location = 0) in vec4 i_position;" NL "void main() {" NL
							 "  gl_Position = i_position;" NL "}";
		const GLuint program =
			BuildProgram(src_vs, NULL, NULL, NULL, GenFSCube(internalformat, expected_value).c_str());
		GLuint textures[2];
		glGenTextures(2, textures);

		const int	  kSize = 16;
		std::vector<T> data(kSize * kSize * 12, value);

		glBindTexture(GL_TEXTURE_CUBE_MAP, textures[0]);
		glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
		glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
		glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, internalformat, kSize, kSize, 0, Format<T>(), Type<T>(),
					 &data[0]);
		glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, internalformat, kSize, kSize, 0, Format<T>(), Type<T>(),
					 &data[0]);
		glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, internalformat, kSize, kSize, 0, Format<T>(), Type<T>(),
					 &data[0]);
		glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, internalformat, kSize, kSize, 0, Format<T>(), Type<T>(),
					 &data[0]);
		glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, internalformat, kSize, kSize, 0, Format<T>(), Type<T>(),
					 &data[0]);
		glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, internalformat, kSize, kSize, 0, Format<T>(), Type<T>(),
					 &data[0]);
		glBindTexture(GL_TEXTURE_CUBE_MAP, 0);

		glBindTexture(GL_TEXTURE_CUBE_MAP_ARRAY, textures[1]);
		glTexParameteri(GL_TEXTURE_CUBE_MAP_ARRAY, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
		glTexParameteri(GL_TEXTURE_CUBE_MAP_ARRAY, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
		glTexImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 0, internalformat, kSize, kSize, 12, 0, Format<T>(), Type<T>(),
					 &data[0]);
		glBindTexture(GL_TEXTURE_CUBE_MAP_ARRAY, 0);

		glBindImageTexture(0, textures[0], 0, GL_TRUE, 0, GL_READ_ONLY, internalformat);
		glBindImageTexture(1, textures[1], 0, GL_TRUE, 0, GL_READ_ONLY, internalformat);

		glClear(GL_COLOR_BUFFER_BIT);

		glUseProgram(program);
		glUniform1i(glGetUniformLocation(program, "g_image_cube"), 0);
		glUniform1i(glGetUniformLocation(program, "g_image_cube_array"), 1);

		glBindVertexArray(m_vao);
		glViewport(0, 0, kSize, kSize);
		glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

		bool status = true;

		if (!ValidateReadBuffer(0, 0, kSize, kSize, vec4(0, 1, 0, 1)))
		{
			status = false;
		}

		std::map<std::string, GLuint> name_index_map;
		GLint uniforms;
		glGetProgramiv(program, GL_ACTIVE_UNIFORMS, &uniforms);
		if (uniforms != 2)
		{
			status = false;
			m_context.getTestContext().getLog() << tcu::TestLog::Message << "ACTIVE_UNIFORMS is " << uniforms
												<< " should be 2." << tcu::TestLog::EndMessage;
		}
		for (GLuint index = 0; index < static_cast<GLuint>(uniforms); ++index)
		{
			GLchar name[32];
			glGetActiveUniformName(program, index, sizeof(name), NULL, name);
			name_index_map.insert(std::make_pair(std::string(name), index));
		}

		if (!CheckUniform(program, "g_image_cube", name_index_map, 1, ImageType<T>(GL_TEXTURE_CUBE_MAP)))
			status = false;
		if (!CheckUniform(program, "g_image_cube_array", name_index_map, 1, ImageType<T>(GL_TEXTURE_CUBE_MAP_ARRAY)))
			status = false;

		glUseProgram(0);
		glDeleteProgram(program);
		glDeleteTextures(2, textures);

		return status;
	}

	template <typename T>
	std::string GenFS(GLenum internalformat, const T& expected_value)
	{
		std::ostringstream os;
		os << "#version 420 core" NL "layout(location = 0) out vec4 o_color;" NL "layout("
		   << FormatEnumToString(internalformat) << ") readonly uniform " << TypePrefix<T>()
		   << "image1D g_image_1d;" NL "layout(" << FormatEnumToString(internalformat) << ") readonly uniform "
		   << TypePrefix<T>() << "image2D g_image_2d;" NL "layout(" << FormatEnumToString(internalformat)
		   << ") readonly uniform " << TypePrefix<T>() << "image3D g_image_3d;" NL "layout("
		   << FormatEnumToString(internalformat) << ") readonly uniform " << TypePrefix<T>()
		   << "image2DRect g_image_2drect;" NL "layout(" << FormatEnumToString(internalformat) << ") readonly uniform "
		   << TypePrefix<T>() << "imageBuffer g_image_buffer;" NL "layout(" << FormatEnumToString(internalformat)
		   << ") readonly uniform " << TypePrefix<T>() << "image1DArray g_image_1darray;" NL "layout("
		   << FormatEnumToString(internalformat) << ") readonly uniform " << TypePrefix<T>()
		   << "image2DArray g_image_2darray;" NL "void main() {" NL "  o_color = vec4(0.0, 1.0, 0.0, 1.0);" NL
			  "  ivec2 coord = ivec2(gl_FragCoord.xy);" NL "  "
		   << TypePrefix<T>()
		   << "vec4 v;" NL "  v = imageLoad(g_image_1d, coord.x);" NL "  if (v != " << TypePrefix<T>() << "vec4"
		   << expected_value
		   << ") o_color = vec4(1.0, 0.0, 0.0, 0.05);" NL "  v = imageLoad(g_image_2d, coord);" NL "  if (v != "
		   << TypePrefix<T>() << "vec4" << expected_value
		   << ") o_color = vec4(1.0, 0.0, 0.0, 0.1);" NL "  v = imageLoad(g_image_3d, ivec3(coord.xy, 0));" NL
			  "  if (v != "
		   << TypePrefix<T>() << "vec4" << expected_value
		   << ") o_color = vec4(1.0, 0.0, 0.0, 0.15);" NL "  v = imageLoad(g_image_3d, ivec3(coord.xy, 1));" NL
			  "  if (v != "
		   << TypePrefix<T>() << "vec4" << expected_value
		   << ") o_color = vec4(1.0, 0.0, 0.0, 0.2);" NL "  v = imageLoad(g_image_2drect, coord);" NL "  if (v != "
		   << TypePrefix<T>() << "vec4" << expected_value
		   << ") o_color = vec4(1.0, 0.0, 0.0, 0.25);" NL "  v = imageLoad(g_image_buffer, coord.x);" NL "  if (v != "
		   << TypePrefix<T>() << "vec4" << expected_value
		   << ") o_color = vec4(1.0, 0.0, 0.0, 0.6);" NL "  v = imageLoad(g_image_1darray, ivec2(coord.x, 0));" NL
			  "  if (v != "
		   << TypePrefix<T>() << "vec4" << expected_value
		   << ") o_color = vec4(1.0, 0.0, 0.0, 0.65);" NL "  v = imageLoad(g_image_1darray, ivec2(coord.x, 1));" NL
			  "  if (v != "
		   << TypePrefix<T>() << "vec4" << expected_value
		   << ") o_color = vec4(1.0, 0.0, 0.0, 0.7);" NL "  v = imageLoad(g_image_2darray, ivec3(coord, 0));" NL
			  "  if (v != "
		   << TypePrefix<T>() << "vec4" << expected_value
		   << ") o_color = vec4(1.0, 0.0, 0.0, 0.75);" NL "  v = imageLoad(g_image_2darray, ivec3(coord, 1));" NL
			  "  if (v != "
		   << TypePrefix<T>() << "vec4" << expected_value << ") o_color = vec4(1.0, 0.0, 0.0, 0.8);" NL "}";
		return os.str();
	}

	template <typename T>
	std::string GenFSCube(GLenum internalformat, const T& expected_value)
	{
		std::ostringstream os;
		os << "#version 420 core" NL "layout(location = 0) out vec4 o_color;" NL "layout("
		   << FormatEnumToString(internalformat) << ") readonly uniform " << TypePrefix<T>()
		   << "imageCube g_image_cube;" NL "layout(" << FormatEnumToString(internalformat) << ") readonly uniform "
		   << TypePrefix<T>()
		   << "imageCubeArray g_image_cube_array;" NL "void main() {" NL "  o_color = vec4(0.0, 1.0, 0.0, 1.0);" NL
			  "  ivec2 coord = ivec2(gl_FragCoord.xy);" NL "  "
		   << TypePrefix<T>()
		   << "vec4 v;" NL "  v = imageLoad(g_image_cube, ivec3(coord, 0));" NL "  if (v != " << TypePrefix<T>()
		   << "vec4" << expected_value << ") o_color = vec4(1.0, 0.0, 0.0, 0.3);" NL
										  "  v = imageLoad(g_image_cube, ivec3(coord, 1));" NL "  if (v != "
		   << TypePrefix<T>() << "vec4" << expected_value
		   << ") o_color = vec4(1.0, 0.0, 0.0, 0.35);" NL "  v = imageLoad(g_image_cube, ivec3(coord, 2));" NL
			  "  if (v != "
		   << TypePrefix<T>() << "vec4" << expected_value
		   << ") o_color = vec4(1.0, 0.0, 0.0, 0.4);" NL "  v = imageLoad(g_image_cube, ivec3(coord, 3));" NL
			  "  if (v != "
		   << TypePrefix<T>() << "vec4" << expected_value
		   << ") o_color = vec4(1.0, 0.0, 0.0, 0.45);" NL "  v = imageLoad(g_image_cube, ivec3(coord, 4));" NL
			  "  if (v != "
		   << TypePrefix<T>() << "vec4" << expected_value
		   << ") o_color = vec4(1.0, 0.0, 0.0, 0.5);" NL "  v = imageLoad(g_image_cube, ivec3(coord, 5));" NL
			  "  if (v != "
		   << TypePrefix<T>() << "vec4" << expected_value
		   << ") o_color = vec4(1.0, 0.0, 0.0, 0.55);" NL "  v = imageLoad(g_image_cube_array, ivec3(coord, 0));" NL
			  "  if (v != "
		   << TypePrefix<T>() << "vec4" << expected_value
		   << ") o_color = vec4(1.0, 0.0, 0.0, 0.05);" NL "  v = imageLoad(g_image_cube_array, ivec3(coord, 1));" NL
			  "  if (v != "
		   << TypePrefix<T>() << "vec4" << expected_value
		   << ") o_color = vec4(1.0, 0.0, 0.0, 0.1);" NL "  v = imageLoad(g_image_cube_array, ivec3(coord, 2));" NL
			  "  if (v != "
		   << TypePrefix<T>() << "vec4" << expected_value
		   << ") o_color = vec4(1.0, 0.0, 0.0, 0.15);" NL "  v = imageLoad(g_image_cube_array, ivec3(coord, 3));" NL
			  "  if (v != "
		   << TypePrefix<T>() << "vec4" << expected_value
		   << ") o_color = vec4(1.0, 0.0, 0.0, 0.2);" NL "  v = imageLoad(g_image_cube_array, ivec3(coord, 4));" NL
			  "  if (v != "
		   << TypePrefix<T>() << "vec4" << expected_value
		   << ") o_color = vec4(1.0, 0.0, 0.0, 0.25);" NL "  v = imageLoad(g_image_cube_array, ivec3(coord, 5));" NL
			  "  if (v != "
		   << TypePrefix<T>() << "vec4" << expected_value
		   << ") o_color = vec4(1.0, 0.0, 0.0, 0.3);" NL "  v = imageLoad(g_image_cube_array, ivec3(coord, 6));" NL
			  "  if (v != "
		   << TypePrefix<T>() << "vec4" << expected_value
		   << ") o_color = vec4(1.0, 0.0, 0.0, 0.35);" NL "  v = imageLoad(g_image_cube_array, ivec3(coord, 7));" NL
			  "  if (v != "
		   << TypePrefix<T>() << "vec4" << expected_value
		   << ") o_color = vec4(1.0, 0.0, 0.0, 0.4);" NL "  v = imageLoad(g_image_cube_array, ivec3(coord, 8));" NL
			  "  if (v != "
		   << TypePrefix<T>() << "vec4" << expected_value
		   << ") o_color = vec4(1.0, 0.0, 0.0, 0.45);" NL "  v = imageLoad(g_image_cube_array, ivec3(coord, 9));" NL
			  "  if (v != "
		   << TypePrefix<T>() << "vec4" << expected_value
		   << ") o_color = vec4(1.0, 0.0, 0.0, 0.5);" NL "  v = imageLoad(g_image_cube_array, ivec3(coord, 10));" NL
			  "  if (v != "
		   << TypePrefix<T>() << "vec4" << expected_value
		   << ") o_color = vec4(1.0, 0.0, 0.0, 0.55);" NL "  v = imageLoad(g_image_cube_array, ivec3(coord, 11));" NL
			  "  if (v != "
		   << TypePrefix<T>() << "vec4" << expected_value << ") o_color = vec4(1.0, 0.0, 0.0, 0.6);" NL "}";
		return os.str();
	}
};
//-----------------------------------------------------------------------------
// 1.3.2.2 BasicAllTargetsLoadMS
//-----------------------------------------------------------------------------
class BasicAllTargetsLoadMS : public ShaderImageLoadStoreBase
{
	GLuint m_vao;
	GLuint m_vbo;

	virtual long Setup()
	{
		m_vao = 0;
		m_vbo = 0;
		return NO_ERROR;
	}

	virtual long Run()
	{
		if (!SupportedSamples(4))
			return NOT_SUPPORTED;

		CreateFullViewportQuad(&m_vao, &m_vbo, NULL);

		if (!ReadMS(GL_RGBA32F, vec4(-1.0f, 10.0f, -200.0f, 3000.0f), vec4(-1.0f, 10.0f, -200.0f, 3000.0f)))
			return ERROR;

		GLint isamples;
		glGetIntegerv(GL_MAX_INTEGER_SAMPLES, &isamples);
		if (isamples >= 4)
		{
			if (!ReadMS(GL_RGBA32I, ivec4(1, -2, 3, -4), ivec4(1, -2, 3, -4)))
				return ERROR;
			if (!ReadMS(GL_RGBA32UI, uvec4(1, 2, 3, 4), uvec4(1, 2, 3, 4)))
				return ERROR;
		}

		return NO_ERROR;
	}

	virtual long Cleanup()
	{
		glViewport(0, 0, getWindowWidth(), getWindowHeight());
		glDeleteVertexArrays(1, &m_vao);
		glDeleteBuffers(1, &m_vbo);
		return NO_ERROR;
	}

	template <typename T>
	bool ReadMS(GLenum internalformat, const T& value, const T& expected_value)
	{
		const char* src_vs = "#version 420 core" NL "layout(location = 0) in vec4 i_position;" NL "void main() {" NL
							 "  gl_Position = i_position;" NL "}";
		const GLuint program = BuildProgram(src_vs, NULL, NULL, NULL, GenFSMS(internalformat, expected_value).c_str());
		GLuint		 textures[2];
		glGenTextures(2, textures);

		const int kSize = 16;

		glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, textures[0]);
		glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 4, internalformat, kSize, kSize, GL_FALSE);
		glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, 0);

		glBindTexture(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, textures[1]);
		glTexImage3DMultisample(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, 4, internalformat, kSize, kSize, 2, GL_FALSE);
		glBindTexture(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, 0);

		GLuint fbo;
		glGenFramebuffers(1, &fbo);
		glBindFramebuffer(GL_FRAMEBUFFER, fbo);
		glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE, textures[0], 0);
		glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, textures[1], 0, 0);
		glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT2, textures[1], 0, 1);
		const GLenum draw_buffers[3] = { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1, GL_COLOR_ATTACHMENT2 };
		glDrawBuffers(3, draw_buffers);
		ClearBuffer(GL_COLOR, 0, value);
		ClearBuffer(GL_COLOR, 1, value);
		ClearBuffer(GL_COLOR, 2, value);
		glDeleteFramebuffers(1, &fbo);

		glBindImageTexture(1, textures[0], 0, GL_FALSE, 0, GL_READ_ONLY, internalformat);
		glBindImageTexture(4, textures[1], 0, GL_TRUE, 0, GL_READ_ONLY, internalformat);

		glUseProgram(program);
		glUniform1i(glGetUniformLocation(program, "g_image_2dms"), 1);
		glUniform1i(glGetUniformLocation(program, "g_image_2dms_array"), 4);

		glClear(GL_COLOR_BUFFER_BIT);
		glBindVertexArray(m_vao);
		glViewport(0, 0, kSize, kSize);
		glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

		bool status = true;

		if (!ValidateReadBuffer(0, 0, kSize, kSize, vec4(0, 1, 0, 1)))
		{
			status = false;
		}

		std::map<std::string, GLuint> name_index_map;
		GLint uniforms;
		glGetProgramiv(program, GL_ACTIVE_UNIFORMS, &uniforms);
		if (uniforms != 2)
		{
			status = false;
			m_context.getTestContext().getLog() << tcu::TestLog::Message << "ACTIVE_UNIFORMS is " << uniforms
												<< " should be 2." << tcu::TestLog::EndMessage;
		}
		for (GLuint index = 0; index < static_cast<GLuint>(uniforms); ++index)
		{
			GLchar name[32];
			glGetActiveUniformName(program, index, sizeof(name), NULL, name);
			name_index_map.insert(std::make_pair(std::string(name), index));
		}

		if (!CheckUniform(program, "g_image_2dms", name_index_map, 1, ImageType<T>(GL_TEXTURE_2D_MULTISAMPLE)))
			status = false;
		if (!CheckUniform(program, "g_image_2dms_array", name_index_map, 1,
						  ImageType<T>(GL_TEXTURE_2D_MULTISAMPLE_ARRAY)))
			status = false;

		glDeleteTextures(2, textures);
		glUseProgram(0);
		glDeleteProgram(program);

		return status;
	}

	template <typename T>
	std::string GenFSMS(GLenum internalformat, const T& expected_value)
	{
		std::ostringstream os;
		os << "#version 420 core" NL "layout(location = 0) out vec4 o_color;" NL "layout("
		   << FormatEnumToString(internalformat) << ") readonly uniform " << TypePrefix<T>()
		   << "image2DMS g_image_2dms;" NL "layout(" << FormatEnumToString(internalformat) << ") readonly uniform "
		   << TypePrefix<T>()
		   << "image2DMSArray g_image_2dms_array;" NL "void main() {" NL "  o_color = vec4(0.0, 1.0, 0.0, 1.0);" NL
			  "  ivec2 coord = ivec2(gl_FragCoord.xy);" NL "  if (imageLoad(g_image_2dms, coord, 0) != "
		   << TypePrefix<T>() << "vec4" << expected_value
		   << ") o_color = vec4(1.0, 0.0, 0.0, 0.1);" NL "  if (imageLoad(g_image_2dms, coord, 1) != "
		   << TypePrefix<T>() << "vec4" << expected_value
		   << ") o_color = vec4(1.0, 0.0, 0.0, 0.1);" NL "  if (imageLoad(g_image_2dms, coord, 2) != "
		   << TypePrefix<T>() << "vec4" << expected_value
		   << ") o_color = vec4(1.0, 0.0, 0.0, 0.1);" NL "  if (imageLoad(g_image_2dms, coord, 3) != "
		   << TypePrefix<T>() << "vec4" << expected_value
		   << ") o_color = vec4(1.0, 0.0, 0.0, 0.1);" NL "  if (imageLoad(g_image_2dms_array, ivec3(coord, 0), 0) != "
		   << TypePrefix<T>() << "vec4" << expected_value
		   << ") o_color = vec4(1.0, 0.0, 0.0, 0.2);" NL "  if (imageLoad(g_image_2dms_array, ivec3(coord, 0), 1) != "
		   << TypePrefix<T>() << "vec4" << expected_value
		   << ") o_color = vec4(1.0, 0.0, 0.0, 0.2);" NL "  if (imageLoad(g_image_2dms_array, ivec3(coord, 0), 2) != "
		   << TypePrefix<T>() << "vec4" << expected_value
		   << ") o_color = vec4(1.0, 0.0, 0.0, 0.2);" NL "  if (imageLoad(g_image_2dms_array, ivec3(coord, 0), 3) != "
		   << TypePrefix<T>() << "vec4" << expected_value
		   << ") o_color = vec4(1.0, 0.0, 0.0, 0.2);" NL "  if (imageLoad(g_image_2dms_array, ivec3(coord, 1), 0) != "
		   << TypePrefix<T>() << "vec4" << expected_value
		   << ") o_color = vec4(1.0, 0.0, 0.0, 0.3);" NL "  if (imageLoad(g_image_2dms_array, ivec3(coord, 1), 1) != "
		   << TypePrefix<T>() << "vec4" << expected_value
		   << ") o_color = vec4(1.0, 0.0, 0.0, 0.3);" NL "  if (imageLoad(g_image_2dms_array, ivec3(coord, 1), 2) != "
		   << TypePrefix<T>() << "vec4" << expected_value
		   << ") o_color = vec4(1.0, 0.0, 0.0, 0.3);" NL "  if (imageLoad(g_image_2dms_array, ivec3(coord, 1), 3) != "
		   << TypePrefix<T>() << "vec4" << expected_value << ") o_color = vec4(1.0, 0.0, 0.0, 0.3);" NL "}";
		return os.str();
	}
};
//-----------------------------------------------------------------------------
// 1.3.3 BasicAllTargetsAtomic
//-----------------------------------------------------------------------------
class BasicAllTargetsAtomic : public ShaderImageLoadStoreBase
{
	GLuint m_vao;
	GLuint m_vbo;

	virtual long Setup()
	{
		m_vao = 0;
		m_vbo = 0;
		return NO_ERROR;
	}

	virtual long Run()
	{
		CreateFullViewportQuad(&m_vao, &m_vbo, NULL);

		if (!Atomic<GLint>(GL_R32I))
			return ERROR;
		if (!Atomic<GLuint>(GL_R32UI))
			return ERROR;

		if (!AtomicCube<GLint>(GL_R32I))
			return ERROR;
		if (!AtomicCube<GLuint>(GL_R32UI))
			return ERROR;

		GLint isamples;
		glGetIntegerv(GL_MAX_INTEGER_SAMPLES, &isamples);
		if (SupportedSamples(4) && isamples >= 4)
		{
			if (!AtomicMS<GLint>(GL_R32I))
				return ERROR;
			if (!AtomicMS<GLuint>(GL_R32UI))
				return ERROR;
		}

		return NO_ERROR;
	}

	virtual long Cleanup()
	{
		glViewport(0, 0, getWindowWidth(), getWindowHeight());
		glDeleteVertexArrays(1, &m_vao);
		glDeleteBuffers(1, &m_vbo);
		return NO_ERROR;
	}

	template <typename T>
	bool Atomic(GLenum internalformat)
	{
		const char* src_vs = "#version 420 core" NL "layout(location = 0) in vec4 i_position;" NL "void main() {" NL
							 "  gl_Position = i_position;" NL "}";
		const GLuint program = BuildProgram(src_vs, NULL, NULL, NULL, GenFS<T>(internalformat).c_str());
		GLuint		 textures[7];
		GLuint		 buffer;
		glGenTextures(7, textures);
		glGenBuffers(1, &buffer);

		const int	  kSize = 16;
		std::vector<T> data(kSize * kSize * 2);

		glBindTexture(GL_TEXTURE_1D, textures[0]);
		glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
		glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
		glTexImage1D(GL_TEXTURE_1D, 0, internalformat, kSize, 0, Format<T>(), Type<T>(), &data[0]);
		glBindTexture(GL_TEXTURE_1D, 0);

		glBindTexture(GL_TEXTURE_2D, textures[1]);
		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
		glTexImage2D(GL_TEXTURE_2D, 0, internalformat, kSize, kSize, 0, Format<T>(), Type<T>(), &data[0]);
		glBindTexture(GL_TEXTURE_2D, 0);

		glBindTexture(GL_TEXTURE_3D, textures[2]);
		glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
		glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
		glTexImage3D(GL_TEXTURE_3D, 0, internalformat, kSize, kSize, 2, 0, Format<T>(), Type<T>(), &data[0]);
		glBindTexture(GL_TEXTURE_3D, 0);

		glBindTexture(GL_TEXTURE_RECTANGLE, textures[3]);
		glTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
		glTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
		glTexImage2D(GL_TEXTURE_RECTANGLE, 0, internalformat, kSize, kSize, 0, Format<T>(), Type<T>(), &data[0]);
		glBindTexture(GL_TEXTURE_RECTANGLE, 0);

		glBindBuffer(GL_TEXTURE_BUFFER, buffer);
		glBufferData(GL_TEXTURE_BUFFER, kSize * sizeof(T), &data[0], GL_DYNAMIC_DRAW);
		glBindBuffer(GL_TEXTURE_BUFFER, 0);
		glBindTexture(GL_TEXTURE_BUFFER, textures[4]);
		glTexBuffer(GL_TEXTURE_BUFFER, internalformat, buffer);
		glBindTexture(GL_TEXTURE_BUFFER, 0);

		glBindTexture(GL_TEXTURE_1D_ARRAY, textures[5]);
		glTexParameteri(GL_TEXTURE_1D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
		glTexParameteri(GL_TEXTURE_1D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
		glTexImage2D(GL_TEXTURE_1D_ARRAY, 0, internalformat, kSize, 2, 0, Format<T>(), Type<T>(), &data[0]);
		glBindTexture(GL_TEXTURE_1D_ARRAY, 0);

		glBindTexture(GL_TEXTURE_2D_ARRAY, textures[6]);
		glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
		glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
		glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, internalformat, kSize, kSize, 2, 0, Format<T>(), Type<T>(), &data[0]);
		glBindTexture(GL_TEXTURE_2D_ARRAY, 0);

		glBindImageTexture(0, textures[0], 0, GL_FALSE, 0, GL_READ_WRITE, internalformat);
		glBindImageTexture(1, textures[1], 0, GL_FALSE, 0, GL_READ_WRITE, internalformat);
		glBindImageTexture(2, textures[2], 0, GL_TRUE, 0, GL_READ_WRITE, internalformat);
		glBindImageTexture(3, textures[3], 0, GL_FALSE, 0, GL_READ_WRITE, internalformat);
		glBindImageTexture(4, textures[4], 0, GL_FALSE, 0, GL_READ_WRITE, internalformat);
		glBindImageTexture(5, textures[5], 0, GL_TRUE, 0, GL_READ_WRITE, internalformat);
		glBindImageTexture(6, textures[6], 0, GL_TRUE, 0, GL_READ_WRITE, internalformat);

		glClear(GL_COLOR_BUFFER_BIT);

		glUseProgram(program);
		glUniform1i(glGetUniformLocation(program, "g_image_1d"), 0);
		glUniform1i(glGetUniformLocation(program, "g_image_2d"), 1);
		glUniform1i(glGetUniformLocation(program, "g_image_3d"), 2);
		glUniform1i(glGetUniformLocation(program, "g_image_2drect"), 3);
		glUniform1i(glGetUniformLocation(program, "g_image_buffer"), 4);
		glUniform1i(glGetUniformLocation(program, "g_image_1darray"), 5);
		glUniform1i(glGetUniformLocation(program, "g_image_2darray"), 6);

		glBindVertexArray(m_vao);
		glViewport(0, 0, kSize, 1);
		glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

		bool status = true;

		if (!ValidateReadBuffer(0, 0, kSize, 1, vec4(0, 1, 0, 1)))
		{
			status = false;
		}

		glUseProgram(0);
		glDeleteProgram(program);
		glDeleteTextures(7, textures);
		glDeleteBuffers(1, &buffer);

		return status;
	}

	template <typename T>
	bool AtomicCube(GLenum internalformat)
	{
		const char* src_vs = "#version 420 core" NL "layout(location = 0) in vec4 i_position;" NL "void main() {" NL
							 "  gl_Position = i_position;" NL "}";
		const GLuint program = BuildProgram(src_vs, NULL, NULL, NULL, GenFSCube<T>(internalformat).c_str());
		GLuint		 textures[2];
		glGenTextures(2, textures);

		const int	  kSize = 16;
		std::vector<T> data(kSize * kSize * 12);

		glBindTexture(GL_TEXTURE_CUBE_MAP, textures[0]);
		glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
		glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
		glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, internalformat, kSize, kSize, 0, Format<T>(), Type<T>(),
					 &data[0]);
		glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, internalformat, kSize, kSize, 0, Format<T>(), Type<T>(),
					 &data[0]);
		glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, internalformat, kSize, kSize, 0, Format<T>(), Type<T>(),
					 &data[0]);
		glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, internalformat, kSize, kSize, 0, Format<T>(), Type<T>(),
					 &data[0]);
		glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, internalformat, kSize, kSize, 0, Format<T>(), Type<T>(),
					 &data[0]);
		glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, internalformat, kSize, kSize, 0, Format<T>(), Type<T>(),
					 &data[0]);
		glBindTexture(GL_TEXTURE_CUBE_MAP, 0);

		glBindTexture(GL_TEXTURE_CUBE_MAP_ARRAY, textures[1]);
		glTexParameteri(GL_TEXTURE_CUBE_MAP_ARRAY, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
		glTexParameteri(GL_TEXTURE_CUBE_MAP_ARRAY, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
		glTexImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 0, internalformat, kSize, kSize, 12, 0, Format<T>(), Type<T>(),
					 &data[0]);
		glBindTexture(GL_TEXTURE_CUBE_MAP_ARRAY, 0);

		glBindImageTexture(0, textures[0], 0, GL_TRUE, 0, GL_READ_WRITE, internalformat);
		glBindImageTexture(1, textures[1], 0, GL_TRUE, 0, GL_READ_WRITE, internalformat);

		glClear(GL_COLOR_BUFFER_BIT);

		glUseProgram(program);
		glUniform1i(glGetUniformLocation(program, "g_image_cube"), 0);
		glUniform1i(glGetUniformLocation(program, "g_image_cube_array"), 1);

		glBindVertexArray(m_vao);
		glViewport(0, 0, kSize, kSize);
		glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

		bool status = true;

		if (!ValidateReadBuffer(0, 0, kSize, kSize, vec4(0, 1, 0, 1)))
		{
			status = false;
		}

		glUseProgram(0);
		glDeleteProgram(program);
		glDeleteTextures(2, textures);

		return status;
	}

	template <typename T>
	bool AtomicMS(GLenum internalformat)
	{
		const char* src_vs = "#version 420 core" NL "layout(location = 0) in vec4 i_position;" NL "void main() {" NL
							 "  gl_Position = i_position;" NL "}";
		const GLuint program = BuildProgram(src_vs, NULL, NULL, NULL, GenFSMS<T>(internalformat).c_str());
		GLuint		 textures[2];
		glGenTextures(2, textures);

		const int kSize = 16;

		glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, textures[0]);
		glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 4, internalformat, kSize, kSize, GL_FALSE);
		glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, 0);

		glBindTexture(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, textures[1]);
		glTexImage3DMultisample(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, 4, internalformat, kSize, kSize, 2, GL_FALSE);
		glBindTexture(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, 0);

		GLuint fbo;
		glGenFramebuffers(1, &fbo);
		glBindFramebuffer(GL_FRAMEBUFFER, fbo);
		glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE, textures[0], 0);
		glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, textures[1], 0, 0);
		glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT2, textures[1], 0, 1);
		const GLenum draw_buffers[3] = { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1, GL_COLOR_ATTACHMENT2 };
		glDrawBuffers(3, draw_buffers);
		if (internalformat == GL_R32I)
		{
			const GLint value[4] = { 0, 0, 0, 0 };
			glClearBufferiv(GL_COLOR, 0, value);
			glClearBufferiv(GL_COLOR, 1, value);
			glClearBufferiv(GL_COLOR, 2, value);
		}
		else
		{
			const GLuint value[4] = { 0, 0, 0, 0 };
			glClearBufferuiv(GL_COLOR, 0, value);
			glClearBufferuiv(GL_COLOR, 1, value);
			glClearBufferuiv(GL_COLOR, 2, value);
		}
		glDeleteFramebuffers(1, &fbo);

		glBindImageTexture(1, textures[0], 0, GL_FALSE, 0, GL_READ_WRITE, internalformat);
		glBindImageTexture(4, textures[1], 0, GL_TRUE, 0, GL_READ_WRITE, internalformat);

		glUseProgram(program);
		glUniform1i(glGetUniformLocation(program, "g_image_2dms"), 1);
		glUniform1i(glGetUniformLocation(program, "g_image_2dms_array"), 4);

		glClear(GL_COLOR_BUFFER_BIT);
		glBindVertexArray(m_vao);
		glViewport(0, 0, kSize, kSize);
		glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

		bool status = true;

		if (!ValidateReadBuffer(0, 0, kSize, kSize, vec4(0, 1, 0, 1)))
		{
			status = false;
		}

		glDeleteTextures(2, textures);
		glUseProgram(0);
		glDeleteProgram(program);

		return status;
	}

	template <typename T>
	std::string GenFS(GLenum internalformat)
	{
		std::ostringstream os;
		os << "#version 420 core" NL "layout(location = 0) out vec4 o_color;" NL "layout("
		   << FormatEnumToString(internalformat) << ") coherent uniform " << TypePrefix<T>()
		   << "image1D g_image_1d;" NL "layout(" << FormatEnumToString(internalformat) << ") coherent uniform "
		   << TypePrefix<T>() << "image2D g_image_2d;" NL "layout(" << FormatEnumToString(internalformat)
		   << ") coherent uniform " << TypePrefix<T>() << "image3D g_image_3d;" NL "layout("
		   << FormatEnumToString(internalformat) << ") coherent uniform " << TypePrefix<T>()
		   << "image2DRect g_image_2drect;" NL "layout(" << FormatEnumToString(internalformat) << ") coherent uniform "
		   << TypePrefix<T>() << "imageBuffer g_image_buffer;" NL "layout(" << FormatEnumToString(internalformat)
		   << ") coherent uniform " << TypePrefix<T>() << "image1DArray g_image_1darray;" NL "layout("
		   << FormatEnumToString(internalformat) << ") coherent uniform " << TypePrefix<T>()
		   << "image2DArray g_image_2darray;" NL "void main() {" NL "  o_color = vec4(0.0, 1.0, 0.0, 1.0);" NL
			  "  ivec2 coord = ivec2(gl_FragCoord.xy);"

			NL "  if (imageAtomicAdd(g_image_1d, coord.x, 2) != 0) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			  "  if (imageAtomicMin(g_image_1d, coord.x, 3) != 2) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			  "  if (imageAtomicMax(g_image_1d, coord.x, 4) != 2) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			  "  if (imageAtomicAnd(g_image_1d, coord.x, 0) != 4) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			  "  if (imageAtomicOr(g_image_1d, coord.x, 7) != 0) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			  "  if (imageAtomicXor(g_image_1d, coord.x, 4) != 7) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			  "  if (imageAtomicExchange(g_image_1d, coord.x, 1) != 3) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			  "  if (imageAtomicCompSwap(g_image_1d, coord.x, 1, 6) != 1) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			  "  if (imageAtomicExchange(g_image_1d, coord.x, 0) != 6) o_color = vec4(1.0, 0.0, 0.0, 1.0);"

			NL "  if (imageAtomicAdd(g_image_2d, coord, 2) != 0) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			  "  if (imageAtomicMin(g_image_2d, coord, 3) != 2) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			  "  if (imageAtomicMax(g_image_2d, coord, 4) != 2) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			  "  if (imageAtomicAnd(g_image_2d, coord, 0) != 4) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			  "  if (imageAtomicOr(g_image_2d, coord, 7) != 0) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			  "  if (imageAtomicXor(g_image_2d, coord, 4) != 7) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			  "  if (imageAtomicExchange(g_image_2d, coord, 1) != 3) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			  "  if (imageAtomicCompSwap(g_image_2d, coord, 1, 6) != 1) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			  "  if (imageAtomicExchange(g_image_2d, coord, 0) != 6) o_color = vec4(1.0, 0.0, 0.0, 1.0);"

			NL "  if (imageAtomicAdd(g_image_3d, ivec3(coord, 0), 2) != 0) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			  "  if (imageAtomicMin(g_image_3d, ivec3(coord, 0), 3) != 2) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			  "  if (imageAtomicMax(g_image_3d, ivec3(coord, 0), 4) != 2) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			  "  if (imageAtomicAnd(g_image_3d, ivec3(coord, 0), 0) != 4) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			  "  if (imageAtomicOr(g_image_3d, ivec3(coord, 0), 7) != 0) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			  "  if (imageAtomicXor(g_image_3d, ivec3(coord, 0), 4) != 7) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			  "  if (imageAtomicExchange(g_image_3d, ivec3(coord, 0), 1) != 3) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			  "  if (imageAtomicCompSwap(g_image_3d, ivec3(coord, 0), 1, 6) != 1) o_color = vec4(1.0, 0.0, 0.0, "
			  "1.0);" NL
			  "  if (imageAtomicExchange(g_image_3d, ivec3(coord, 0), 0) != 6) o_color = vec4(1.0, 0.0, 0.0, 1.0);"

			NL "  if (imageAtomicAdd(g_image_2drect, coord, 2) != 0) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			  "  if (imageAtomicMin(g_image_2drect, coord, 3) != 2) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			  "  if (imageAtomicMax(g_image_2drect, coord, 4) != 2) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			  "  if (imageAtomicAnd(g_image_2drect, coord, 0) != 4) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			  "  if (imageAtomicOr(g_image_2drect, coord, 7) != 0) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			  "  if (imageAtomicXor(g_image_2drect, coord, 4) != 7) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			  "  if (imageAtomicExchange(g_image_2drect, coord, 1) != 3) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			  "  if (imageAtomicCompSwap(g_image_2drect, coord, 1, 6) != 1) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			  "  if (imageAtomicExchange(g_image_2drect, coord, 0) != 6) o_color = vec4(1.0, 0.0, 0.0, 1.0);"

			NL "  if (imageAtomicAdd(g_image_buffer, coord.x, 2) != 0) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			  "  if (imageAtomicMin(g_image_buffer, coord.x, 3) != 2) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			  "  if (imageAtomicMax(g_image_buffer, coord.x, 4) != 2) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			  "  if (imageAtomicAnd(g_image_buffer, coord.x, 0) != 4) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			  "  if (imageAtomicOr(g_image_buffer, coord.x, 7) != 0) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			  "  if (imageAtomicXor(g_image_buffer, coord.x, 4) != 7) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			  "  if (imageAtomicExchange(g_image_buffer, coord.x, 1) != 3) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			  "  if (imageAtomicCompSwap(g_image_buffer, coord.x, 1, 6) != 1) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			  "  if (imageAtomicExchange(g_image_buffer, coord.x, 0) != 6) o_color = vec4(1.0, 0.0, 0.0, 1.0);"

			NL
			  "  if (imageAtomicAdd(g_image_1darray, ivec2(coord.x, 0), 2) != 0) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			  "  if (imageAtomicMin(g_image_1darray, ivec2(coord.x, 0), 3) != 2) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			  "  if (imageAtomicMax(g_image_1darray, ivec2(coord.x, 0), 4) != 2) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			  "  if (imageAtomicAnd(g_image_1darray, ivec2(coord.x, 0), 0) != 4) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			  "  if (imageAtomicOr(g_image_1darray, ivec2(coord.x, 0), 7) != 0) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			  "  if (imageAtomicXor(g_image_1darray, ivec2(coord.x, 0), 4) != 7) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			  "  if (imageAtomicExchange(g_image_1darray, ivec2(coord.x, 0), 1) != 3) o_color = vec4(1.0, 0.0, 0.0, "
			  "1.0);" NL "  if (imageAtomicCompSwap(g_image_1darray, ivec2(coord.x, 0), 1, 6) != 1) o_color = "
			  "vec4(1.0, 0.0, 0.0, 1.0);" NL "  if (imageAtomicExchange(g_image_1darray, ivec2(coord.x, 0), "
			  "0) != 6) o_color = vec4(1.0, 0.0, 0.0, 1.0);"

			NL "  if (imageAtomicAdd(g_image_2darray, ivec3(coord, 0), 2) != 0) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			  "  if (imageAtomicMin(g_image_2darray, ivec3(coord, 0), 3) != 2) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			  "  if (imageAtomicMax(g_image_2darray, ivec3(coord, 0), 4) != 2) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			  "  if (imageAtomicAnd(g_image_2darray, ivec3(coord, 0), 0) != 4) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			  "  if (imageAtomicOr(g_image_2darray, ivec3(coord, 0), 7) != 0) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			  "  if (imageAtomicXor(g_image_2darray, ivec3(coord, 0), 4) != 7) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			  "  if (imageAtomicExchange(g_image_2darray, ivec3(coord, 0), 1) != 3) o_color = vec4(1.0, 0.0, 0.0, "
			  "1.0);" NL "  if (imageAtomicCompSwap(g_image_2darray, ivec3(coord, 0), 1, 6) != 1) o_color = vec4(1.0, "
			  "0.0, 0.0, 1.0);" NL "  if (imageAtomicExchange(g_image_2darray, ivec3(coord, 0), 0) != 6) "
			  "o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL "}";
		return os.str();
	}

	template <typename T>
	std::string GenFSCube(GLenum internalformat)
	{
		std::ostringstream os;
		os << "#version 420 core" NL "layout(location = 0) out vec4 o_color;" NL "layout("
		   << FormatEnumToString(internalformat) << ") coherent uniform " << TypePrefix<T>()
		   << "imageCube g_image_cube;" NL "layout(" << FormatEnumToString(internalformat) << ") coherent uniform "
		   << TypePrefix<T>()
		   << "imageCube g_image_cube_array;" NL "void main() {" NL "  o_color = vec4(0.0, 1.0, 0.0, 1.0);" NL
			  "  ivec2 coord = ivec2(gl_FragCoord.xy);"

			NL "  if (imageAtomicAdd(g_image_cube, ivec3(coord, 0), 2) != 0) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			  "  if (imageAtomicMin(g_image_cube, ivec3(coord, 0), 3) != 2) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			  "  if (imageAtomicMax(g_image_cube, ivec3(coord, 0), 4) != 2) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			  "  if (imageAtomicAnd(g_image_cube, ivec3(coord, 0), 0) != 4) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			  "  if (imageAtomicOr(g_image_cube, ivec3(coord, 0), 7) != 0) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			  "  if (imageAtomicXor(g_image_cube, ivec3(coord, 0), 4) != 7) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			  "  if (imageAtomicExchange(g_image_cube, ivec3(coord, 0), 1) != 3) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			  "  if (imageAtomicCompSwap(g_image_cube, ivec3(coord, 0), 1, 6) != 1) o_color = vec4(1.0, 0.0, 0.0, "
			  "1.0);" NL
			  "  if (imageAtomicExchange(g_image_cube, ivec3(coord, 0), 0) != 6) o_color = vec4(1.0, 0.0, 0.0, 1.0);"

			NL "  if (imageAtomicAdd(g_image_cube_array, ivec3(coord, 0), 2) != 0) o_color = vec4(1.0, 0.0, 0.0, "
			  "1.0);" NL "  if (imageAtomicMin(g_image_cube_array, ivec3(coord, 0), 3) != 2) o_color = vec4(1.0, 0.0, "
			  "0.0, 1.0);" NL "  if (imageAtomicMax(g_image_cube_array, ivec3(coord, 0), 4) != 2) o_color "
			  "= vec4(1.0, 0.0, 0.0, 1.0);" NL "  if (imageAtomicAnd(g_image_cube_array, "
			  "ivec3(coord, 0), 0) != 4) o_color = "
			  "vec4(1.0, 0.0, 0.0, 1.0);" NL
			  "  if (imageAtomicOr(g_image_cube_array, ivec3(coord, 0), 7) != 0) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			  "  if (imageAtomicXor(g_image_cube_array, ivec3(coord, 0), 4) != 7) o_color = vec4(1.0, 0.0, 0.0, "
			  "1.0);" NL "  if (imageAtomicExchange(g_image_cube_array, ivec3(coord, 0), 1) != 3) o_color = vec4(1.0, "
			  "0.0, 0.0, 1.0);" NL "  if (imageAtomicCompSwap(g_image_cube_array, ivec3(coord, 0), 1, 6) != "
			  "1) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			  "  if (imageAtomicExchange(g_image_cube_array, ivec3(coord, 0), 0) != 6) o_color = vec4(1.0, 0.0, 0.0, "
			  "1.0);" NL "}";
		return os.str();
	}

	template <typename T>
	std::string GenFSMS(GLenum internalformat)
	{
		std::ostringstream os;
		os << "#version 420 core" NL "layout(location = 0) out vec4 o_color;" NL "layout("
		   << FormatEnumToString(internalformat) << ") coherent uniform " << TypePrefix<T>()
		   << "image2DMS g_image_2dms;" NL "layout(" << FormatEnumToString(internalformat) << ") coherent uniform "
		   << TypePrefix<T>()
		   << "image2DMSArray g_image_2dms_array;" NL "void main() {" NL "  o_color = vec4(0.0, 1.0, 0.0, 1.0);" NL
			  "  ivec2 coord = ivec2(gl_FragCoord.xy);" NL
			  "  if (imageAtomicAdd(g_image_2dms, coord, 1, 2) != 0) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			  "  if (imageAtomicMin(g_image_2dms, coord, 1, 3) != 2) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			  "  if (imageAtomicMax(g_image_2dms, coord, 1, 4) != 2) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			  "  if (imageAtomicAnd(g_image_2dms, coord, 1, 0) != 4) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			  "  if (imageAtomicOr(g_image_2dms, coord, 1, 7) != 0) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			  "  if (imageAtomicXor(g_image_2dms, coord, 1, 4) != 7) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			  "  if (imageAtomicExchange(g_image_2dms, coord, 1, 1) != 3) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			  "  if (imageAtomicCompSwap(g_image_2dms, coord, 1, 1, 6) != 1) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			  "  if (imageAtomicExchange(g_image_2dms, coord, 1, 0) != 6) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL NL
			  "  if (imageAtomicAdd(g_image_2dms_array, ivec3(coord, 1), 1, 2) != 0) o_color = vec4(1.0, 0.0, 0.0, "
			  "1.0);" NL "  if (imageAtomicMin(g_image_2dms_array, ivec3(coord, 1), 1, 3) != 2) o_color = vec4(1.0, "
			  "0.0, 0.0, 1.0);" NL "  if (imageAtomicMax(g_image_2dms_array, ivec3(coord, 1), 1, 4) != 2) "
			  "o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			  "  if (imageAtomicAnd(g_image_2dms_array, ivec3(coord, 1), 1, 0) != 4) o_color = vec4(1.0, 0.0, 0.0, "
			  "1.0);" NL "  if (imageAtomicOr(g_image_2dms_array, ivec3(coord, 1), 1, 7) != 0) o_color = vec4(1.0, "
			  "0.0, 0.0, 1.0);" NL "  if (imageAtomicXor(g_image_2dms_array, ivec3(coord, 1), 1, 4) != 7) "
			  "o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			  "  if (imageAtomicExchange(g_image_2dms_array, ivec3(coord, 1), 1, 1) != 3) o_color = vec4(1.0, 0.0, "
			  "0.0, 1.0);" NL "  if (imageAtomicCompSwap(g_image_2dms_array, ivec3(coord, 1), 1, 1, 6) != 1) o_color = "
			  "vec4(1.0, 0.0, 0.0, 1.0);" NL "  if (imageAtomicExchange(g_image_2dms_array, "
			  "ivec3(coord, 1), 1, 0) != 6) o_color = vec4(1.0, 0.0, "
			  "0.0, 1.0);" NL "}";
		return os.str();
	}
};
//-----------------------------------------------------------------------------
// LoadStoreMachine
//-----------------------------------------------------------------------------
class LoadStoreMachine : public ShaderImageLoadStoreBase
{
	GLuint m_vao;
	int	m_stage;

	virtual long Setup()
	{
		glGenVertexArrays(1, &m_vao);
		return NO_ERROR;
	}

	virtual long Cleanup()
	{
		glDisable(GL_RASTERIZER_DISCARD);
		glDeleteVertexArrays(1, &m_vao);
		return NO_ERROR;
	}

	template <typename T>
	bool Write(GLenum internalformat, const T& write_value, const T& expected_value)
	{
		const GLenum targets[] = { GL_TEXTURE_1D,		GL_TEXTURE_2D,
								   GL_TEXTURE_3D,		GL_TEXTURE_RECTANGLE,
								   GL_TEXTURE_CUBE_MAP, GL_TEXTURE_1D_ARRAY,
								   GL_TEXTURE_2D_ARRAY, GL_TEXTURE_CUBE_MAP_ARRAY };
		const int kTargets		= sizeof(targets) / sizeof(targets[0]);
		GLuint	program_store = 0;
		GLuint	program_load  = 0;
		if (m_stage == 0)
		{ // VS
			program_store =
				BuildProgram(GenStoreShader(m_stage, internalformat, write_value).c_str(), NULL, NULL, NULL, NULL);
			program_load =
				BuildProgram(GenLoadShader(m_stage, internalformat, expected_value).c_str(), NULL, NULL, NULL, NULL);
		}
		else if (m_stage == 1)
		{ // TCS
			const char* const glsl_vs  = "#version 420 core" NL "void main() {}";
			const char* const glsl_tes = "#version 420 core" NL "layout(quads, point_mode) in;" NL "void main() {}";
			program_store = BuildProgram(glsl_vs, GenStoreShader(m_stage, internalformat, write_value).c_str(),
										 glsl_tes, NULL, NULL);
			program_load = BuildProgram(glsl_vs, GenLoadShader(m_stage, internalformat, expected_value).c_str(),
										glsl_tes, NULL, NULL);
		}
		else if (m_stage == 2)
		{ // TES
			const char* const glsl_vs = "#version 420 core" NL "void main() {}";
			program_store =
				BuildProgram(glsl_vs, NULL, GenStoreShader(m_stage, internalformat, write_value).c_str(), NULL, NULL);
			program_load =
				BuildProgram(glsl_vs, NULL, GenLoadShader(m_stage, internalformat, expected_value).c_str(), NULL, NULL);
		}
		else if (m_stage == 3)
		{ // GS
			const char* const glsl_vs = "#version 420 core" NL "void main() {}";
			program_store =
				BuildProgram(glsl_vs, NULL, NULL, GenStoreShader(m_stage, internalformat, write_value).c_str(), NULL);
			program_load =
				BuildProgram(glsl_vs, NULL, NULL, GenLoadShader(m_stage, internalformat, expected_value).c_str(), NULL);
		}
		else if (m_stage == 4)
		{ // CS
			{
				std::string		  source = GenStoreShader(m_stage, internalformat, write_value);
				const char* const src	= source.c_str();
				GLuint			  sh	 = glCreateShader(GL_COMPUTE_SHADER);
				glShaderSource(sh, 1, &src, NULL);
				glCompileShader(sh);
				program_store = glCreateProgram();
				glAttachShader(program_store, sh);
				glLinkProgram(program_store);
				glDeleteShader(sh);
			}
			{
				std::string		  source = GenLoadShader(m_stage, internalformat, expected_value);
				const char* const src	= source.c_str();
				GLuint			  sh	 = glCreateShader(GL_COMPUTE_SHADER);
				glShaderSource(sh, 1, &src, NULL);
				glCompileShader(sh);
				program_load = glCreateProgram();
				glAttachShader(program_load, sh);
				glLinkProgram(program_load);
				glDeleteShader(sh);
			}
		}
		GLuint textures[kTargets], texture_result;
		glGenTextures(kTargets, textures);
		glGenTextures(1, &texture_result);

		glBindTexture(GL_TEXTURE_2D, texture_result);
		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
		glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA32F, 1, 1);

		for (int i = 0; i < kTargets; ++i)
		{
			glBindTexture(targets[i], textures[i]);
			glTexParameteri(targets[i], GL_TEXTURE_MIN_FILTER, GL_NEAREST);
			glTexParameteri(targets[i], GL_TEXTURE_MAG_FILTER, GL_NEAREST);

			if (targets[i] == GL_TEXTURE_1D)
			{
				glTexStorage1D(targets[i], 1, internalformat, 1);
			}
			else if (targets[i] == GL_TEXTURE_2D || targets[i] == GL_TEXTURE_RECTANGLE)
			{
				glTexStorage2D(targets[i], 1, internalformat, 1, 1);
			}
			else if (targets[i] == GL_TEXTURE_3D || targets[i] == GL_TEXTURE_2D_ARRAY)
			{
				glTexStorage3D(targets[i], 1, internalformat, 1, 1, 2);
			}
			else if (targets[i] == GL_TEXTURE_CUBE_MAP)
			{
				glTexStorage2D(targets[i], 1, internalformat, 1, 1);
			}
			else if (targets[i] == GL_TEXTURE_CUBE_MAP_ARRAY)
			{
				glTexStorage3D(targets[i], 1, internalformat, 1, 1, 12);
			}
			else if (targets[i] == GL_TEXTURE_1D_ARRAY)
			{
				glTexStorage2D(targets[i], 1, internalformat, 1, 2);
			}
		}
		glBindImageTexture(0, textures[0], 0, GL_FALSE, 0, GL_WRITE_ONLY, internalformat);
		glBindImageTexture(1, textures[1], 0, GL_FALSE, 0, GL_WRITE_ONLY, internalformat);
		glBindImageTexture(2, textures[2], 0, GL_TRUE, 0, GL_WRITE_ONLY, internalformat);
		glBindImageTexture(3, textures[3], 0, GL_FALSE, 0, GL_WRITE_ONLY, internalformat);
		glBindImageTexture(4, textures[4], 0, GL_TRUE, 0, GL_WRITE_ONLY, internalformat);
		glBindImageTexture(5, textures[5], 0, GL_TRUE, 0, GL_WRITE_ONLY, internalformat);
		glBindImageTexture(6, textures[6], 0, GL_TRUE, 0, GL_WRITE_ONLY, internalformat);
		glBindImageTexture(7, textures[7], 0, GL_TRUE, 0, GL_WRITE_ONLY, internalformat);

		glUseProgram(program_store);
		glUniform1i(glGetUniformLocation(program_store, "g_image_1d"), 0);
		glUniform1i(glGetUniformLocation(program_store, "g_image_2d"), 1);
		glUniform1i(glGetUniformLocation(program_store, "g_image_3d"), 2);
		glUniform1i(glGetUniformLocation(program_store, "g_image_2drect"), 3);
		glUniform1i(glGetUniformLocation(program_store, "g_image_cube"), 4);
		glUniform1i(glGetUniformLocation(program_store, "g_image_1darray"), 5);
		glUniform1i(glGetUniformLocation(program_store, "g_image_2darray"), 6);
		glUniform1i(glGetUniformLocation(program_store, "g_image_cube_array"), 7);

		glBindVertexArray(m_vao);
		if (m_stage == 1 || m_stage == 2)
		{ // TCS or TES
			glPatchParameteri(GL_PATCH_VERTICES, 1);
			glDrawArrays(GL_PATCHES, 0, 1);
			glPatchParameteri(GL_PATCH_VERTICES, 3);
		}
		else if (m_stage == 4)
		{ // CS
			glDispatchCompute(1, 1, 1);
		}
		else
		{
			glDrawArrays(GL_POINTS, 0, 1);
		}

		bool status = true;
		for (int i = 0; i < kTargets; ++i)
		{
			glBindTexture(targets[i], textures[i]);
			glMemoryBarrier(GL_TEXTURE_UPDATE_BARRIER_BIT);

			if (targets[i] == GL_TEXTURE_CUBE_MAP)
			{
				for (int face = 0; face < 6; ++face)
				{
					T data;
					glGetTexImage(GL_TEXTURE_CUBE_MAP_POSITIVE_X + face, 0, Format<T>(), Type<T>(), &data[0]);
					if (!Equal(data, expected_value, internalformat))
					{
						status = false;
						m_context.getTestContext().getLog()
							<< tcu::TestLog::Message << "Value is: " << ToString(data)
							<< ". Value should be: " << ToString(expected_value)
							<< ". Format is: " << FormatEnumToString(internalformat)
							<< ". Target is: " << EnumToString(targets[i]) << ". Stage is: " << StageName(m_stage)
							<< tcu::TestLog::EndMessage;
					}
				}
			}
			else
			{
				T data[12];

				for (deUint32 ndx = 0; ndx < DE_LENGTH_OF_ARRAY(data); ndx++)
					data[ndx] = T(0);

				glGetTexImage(targets[i], 0, Format<T>(), Type<T>(), &data[0]);

				int count = 1;
				if (targets[i] == GL_TEXTURE_3D || targets[i] == GL_TEXTURE_2D_ARRAY)
					count = 2;
				else if (targets[i] == GL_TEXTURE_CUBE_MAP_ARRAY)
					count = 12;
				else if (targets[i] == GL_TEXTURE_1D_ARRAY)
					count = 2;

				for (int j = 0; j < count; ++j)
				{
					if (!Equal(data[j], expected_value, internalformat))
					{
						status = false;
						m_context.getTestContext().getLog()
							<< tcu::TestLog::Message << "Value is: " << ToString(data[j])
							<< ". Value should be: " << ToString(expected_value)
							<< ". Format is: " << FormatEnumToString(internalformat)
							<< ". Target is: " << EnumToString(targets[i]) << ". Stage is: " << StageName(m_stage)
							<< tcu::TestLog::EndMessage;
					}
				}
			}
		}
		glBindImageTexture(0, texture_result, 0, GL_FALSE, 0, GL_WRITE_ONLY, GL_RGBA32F);
		glBindImageTexture(1, textures[1], 0, GL_FALSE, 0, GL_READ_ONLY, internalformat);
		glBindImageTexture(2, textures[2], 0, GL_TRUE, 0, GL_READ_ONLY, internalformat);
		glBindImageTexture(3, textures[3], 0, GL_FALSE, 0, GL_READ_ONLY, internalformat);
		glBindImageTexture(4, textures[4], 0, GL_TRUE, 0, GL_READ_ONLY, internalformat);
		glBindImageTexture(5, textures[5], 0, GL_TRUE, 0, GL_READ_ONLY, internalformat);
		glBindImageTexture(6, textures[6], 0, GL_TRUE, 0, GL_READ_ONLY, internalformat);
		glBindImageTexture(7, textures[7], 0, GL_TRUE, 0, GL_READ_ONLY, internalformat);

		glUseProgram(program_load);
		glUniform1i(glGetUniformLocation(program_load, "g_image_result"), 0);
		glUniform1i(glGetUniformLocation(program_load, "g_image_2d"), 1);
		glUniform1i(glGetUniformLocation(program_load, "g_image_3d"), 2);
		glUniform1i(glGetUniformLocation(program_load, "g_image_2drect"), 3);
		glUniform1i(glGetUniformLocation(program_load, "g_image_cube"), 4);
		glUniform1i(glGetUniformLocation(program_load, "g_image_1darray"), 5);
		glUniform1i(glGetUniformLocation(program_load, "g_image_2darray"), 6);
		glUniform1i(glGetUniformLocation(program_load, "g_image_cube_array"), 7);

		if (m_stage == 1 || m_stage == 2)
		{ // TCS or TES
			glPatchParameteri(GL_PATCH_VERTICES, 1);
			glDrawArrays(GL_PATCHES, 0, 1);
			glPatchParameteri(GL_PATCH_VERTICES, 3);
		}
		else if (m_stage == 4)
		{ // CS
			glDispatchCompute(1, 1, 1);
		}
		else
		{
			glDrawArrays(GL_POINTS, 0, 1);
		}
		{
			vec4 color;
			glBindTexture(GL_TEXTURE_2D, texture_result);
			glMemoryBarrier(GL_TEXTURE_UPDATE_BARRIER_BIT);
			glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_FLOAT, &color[0]);
			if (!tcu::allEqual(color, vec4(0, 1, 0, 1)))
			{
				status = false;
				m_context.getTestContext().getLog() << tcu::TestLog::Message << "Color is: " << ToString(color)
													<< ". Format is: " << FormatEnumToString(internalformat)
													<< ". Stage is: " << StageName(m_stage) << tcu::TestLog::EndMessage;
			}
		}
		glUseProgram(0);
		glDeleteProgram(program_store);
		glDeleteProgram(program_load);
		glDeleteTextures(kTargets, textures);
		glDeleteTextures(1, &texture_result);
		return status;
	}

	template <typename T>
	std::string GenStoreShader(int stage, GLenum internalformat, const T& write_value)
	{
		std::ostringstream os;
		os << "#version 420 core";
		if (stage == 4)
		{ // CS
			os << NL "#extension GL_ARB_compute_shader : require";
		}
		os << NL "layout(" << FormatEnumToString(internalformat) << ") writeonly uniform " << TypePrefix<T>()
		   << "image1D g_image_1d;" NL "layout(" << FormatEnumToString(internalformat) << ") writeonly uniform "
		   << TypePrefix<T>() << "image2D g_image_2d;" NL "layout(" << FormatEnumToString(internalformat)
		   << ") writeonly uniform " << TypePrefix<T>() << "image3D g_image_3d;" NL "layout("
		   << FormatEnumToString(internalformat) << ") writeonly uniform " << TypePrefix<T>()
		   << "image2DRect g_image_2drect;" NL "layout(" << FormatEnumToString(internalformat) << ") writeonly uniform "
		   << TypePrefix<T>() << "imageCube g_image_cube;" NL "layout(" << FormatEnumToString(internalformat)
		   << ") writeonly uniform " << TypePrefix<T>() << "image1DArray g_image_1darray;" NL "layout("
		   << FormatEnumToString(internalformat) << ") writeonly uniform " << TypePrefix<T>()
		   << "image2DArray g_image_2darray;" NL "layout(" << FormatEnumToString(internalformat)
		   << ") writeonly uniform " << TypePrefix<T>() << "imageCubeArray g_image_cube_array;" NL "uniform "
		   << TypePrefix<T>() << "vec4 g_value = " << TypePrefix<T>() << "vec4" << write_value
		   << ";" NL "uniform int g_index[6] = int[](0, 1, 2, 3, 4, 5);";
		if (stage == 0)
		{ // VS
			os << NL "void main() {" NL "  ivec2 coord = ivec2(gl_VertexID, g_index[0]);";
		}
		else if (stage == 1)
		{ // TCS
			os << NL "layout(vertices = 1) out;" NL "void main() {" NL "  gl_TessLevelInner[0] = 1;" NL
					 "  gl_TessLevelInner[1] = 1;" NL "  gl_TessLevelOuter[0] = 1;" NL "  gl_TessLevelOuter[1] = 1;" NL
					 "  gl_TessLevelOuter[2] = 1;" NL "  gl_TessLevelOuter[3] = 1;" NL
					 "  ivec2 coord = ivec2(gl_PrimitiveID, g_index[0]);";
		}
		else if (stage == 2)
		{ // TES
			os << NL "layout(quads, point_mode) in;" NL "void main() {" NL
					 "  ivec2 coord = ivec2(gl_PrimitiveID, g_index[0]);";
		}
		else if (stage == 3)
		{ // GS
			os << NL "layout(points) in;" NL "layout(points, max_vertices = 1) out;" NL "void main() {" NL
					 "  ivec2 coord = ivec2(gl_PrimitiveIDIn, g_index[0]);";
		}
		else if (stage == 4)
		{ // CS
			os << NL "layout(local_size_x = 1) in;" NL "void main() {" NL
					 "  ivec2 coord = ivec2(gl_GlobalInvocationID.x, g_index[0]);";
		}
		os << NL "  imageStore(g_image_1d, coord.x, g_value);" NL "  imageStore(g_image_2d, coord, g_value);" NL
				 "  imageStore(g_image_3d, ivec3(coord.xy, g_index[0]), g_value);" NL
				 "  imageStore(g_image_3d, ivec3(coord.xy, g_index[1]), g_value);" NL
				 "  imageStore(g_image_2drect, coord, g_value);" NL "  for (int i = 0; i < 6; ++i) {" NL
				 "    imageStore(g_image_cube, ivec3(coord, g_index[i]), g_value);" NL "  }" NL
				 "  imageStore(g_image_1darray, ivec2(coord.x, g_index[0]), g_value);" NL
				 "  imageStore(g_image_1darray, ivec2(coord.x, g_index[1]), g_value);" NL
				 "  imageStore(g_image_2darray, ivec3(coord, g_index[0]), g_value);" NL
				 "  imageStore(g_image_2darray, ivec3(coord, g_index[1]), g_value);" NL
				 "  for (int i = 0; i < 6; ++i) {" NL
				 "    imageStore(g_image_cube_array, ivec3(coord, g_index[i]), g_value);" NL "  }" NL
				 "  for (int i = 0; i < 6; ++i) {" NL
				 "    imageStore(g_image_cube_array, ivec3(coord, g_index[i] + 6), g_value);" NL "  }" NL "}";
		return os.str();
	}

	template <typename T>
	std::string GenLoadShader(int stage, GLenum internalformat, const T& expected_value)
	{
		std::ostringstream os;
		os << "#version 420 core";
		if (stage == 4)
		{ // CS
			os << NL "#extension GL_ARB_compute_shader : require";
		}
		os << NL "layout(" << FormatEnumToString(internalformat) << ") readonly uniform " << TypePrefix<T>()
		   << "image2D g_image_2d;" NL "layout(" << FormatEnumToString(internalformat) << ") readonly uniform "
		   << TypePrefix<T>() << "image3D g_image_3d;" NL "layout(" << FormatEnumToString(internalformat)
		   << ") readonly uniform " << TypePrefix<T>() << "image2DRect g_image_2drect;" NL "layout("
		   << FormatEnumToString(internalformat) << ") readonly uniform " << TypePrefix<T>()
		   << "imageCube g_image_cube;" NL "layout(" << FormatEnumToString(internalformat) << ") readonly uniform "
		   << TypePrefix<T>() << "image1DArray g_image_1darray;" NL "layout(" << FormatEnumToString(internalformat)
		   << ") readonly uniform " << TypePrefix<T>() << "image2DArray g_image_2darray;" NL "layout("
		   << FormatEnumToString(internalformat) << ") readonly uniform " << TypePrefix<T>()
		   << "imageCubeArray g_image_cube_array;" NL "layout(rgba32f) writeonly uniform image2D g_image_result;" NL
			  "uniform "
		   << TypePrefix<T>() << "vec4 g_value = " << TypePrefix<T>() << "vec4" << expected_value
		   << ";" NL "uniform int g_index[6] = int[](0, 1, 2, 3, 4, 5);";
		if (stage == 0)
		{ // VS
			os << NL "void main() {" NL "  ivec2 coord = ivec2(gl_VertexID, g_index[0]);";
		}
		else if (stage == 1)
		{ // TCS
			os << NL "layout(vertices = 1) out;" NL "void main() {" NL "  gl_TessLevelInner[0] = 1;" NL
					 "  gl_TessLevelInner[1] = 1;" NL "  gl_TessLevelOuter[0] = 1;" NL "  gl_TessLevelOuter[1] = 1;" NL
					 "  gl_TessLevelOuter[2] = 1;" NL "  gl_TessLevelOuter[3] = 1;" NL
					 "  ivec2 coord = ivec2(gl_PrimitiveID, g_index[0]);";
		}
		else if (stage == 2)
		{ // TES
			os << NL "layout(quads, point_mode) in;" NL "void main() {" NL
					 "  ivec2 coord = ivec2(gl_PrimitiveID, g_index[0]);";
		}
		else if (stage == 3)
		{ // GS
			os << NL "layout(points) in;" NL "layout(points, max_vertices = 1) out;" NL "void main() {" NL
					 "  ivec2 coord = ivec2(gl_PrimitiveIDIn, g_index[0]);";
		}
		else if (stage == 4)
		{ // CS
			os << NL "layout(local_size_x = 1) in;" NL "void main() {" NL
					 "  ivec2 coord = ivec2(gl_GlobalInvocationID.x, g_index[0]);";
		}
		os << NL "  vec4 r = vec4(0, 1, 0, 1);" NL "  " << TypePrefix<T>()
		   << "vec4 v;" NL "  v = imageLoad(g_image_2d, coord);" NL
			  "  if (v != g_value) r = vec4(1.0, 0.0, 0.0, 1.0);" NL
			  "  v = imageLoad(g_image_3d, ivec3(coord, g_index[0]));" NL
			  "  if (v != g_value) r = vec4(1.0, 0.0, 0.0, 1.0);" NL "  v = imageLoad(g_image_2drect, coord);" NL
			  "  if (v != g_value) r = vec4(1.0, 0.0, 0.0, 1.0);" NL
			  "  v = imageLoad(g_image_cube, ivec3(coord, g_index[0]));" NL
			  "  if (v != g_value) r = vec4(1.0, 0.0, 0.0, 1.0);" NL "  v = imageLoad(g_image_1darray, coord);" NL
			  "  if (v != g_value) r = vec4(1.0, 0.0, 0.0, 1.0);" NL
			  "  v = imageLoad(g_image_2darray, ivec3(coord, g_index[0]));" NL
			  "  if (v != g_value) r = vec4(1.0, 0.0, 0.0, 1.0);" NL
			  "  v = imageLoad(g_image_cube_array, ivec3(coord, g_index[0]));" NL
			  "  if (v != g_value) r = vec4(1.0, 0.0, 0.0, 1.0);" NL "  imageStore(g_image_result, coord, r);" NL "}";
		return os.str();
	}

protected:
	long RunStage(int stage)
	{
		if (!SupportedInStage(stage, 8))
			return NOT_SUPPORTED;

		glEnable(GL_RASTERIZER_DISCARD);
		m_stage = stage;

		if (!Write(GL_RGBA32F, vec4(1.0f, 2.0f, 3.0f, 4.0f), vec4(1.0f, 2.0f, 3.0f, 4.0f)))
			return ERROR;
		if (!Write(GL_RG32F, vec4(1.0f, 2.0f, 3.0f, 4.0f), vec4(1.0f, 2.0f, 0.0f, 1.0f)))
			return ERROR;
		if (!Write(GL_R32F, vec4(1.0f, 2.0f, 3.0f, 4.0f), vec4(1.0f, 0.0f, 0.0f, 1.0f)))
			return ERROR;

		if (!Write(GL_RGBA16F, vec4(1.0f, 2.0f, 3.0f, 4.0f), vec4(1.0f, 2.0f, 3.0f, 4.0f)))
			return ERROR;
		if (!Write(GL_RG16F, vec4(1.0f, 2.0f, 3.0f, 4.0f), vec4(1.0f, 2.0f, 0.0f, 1.0f)))
			return ERROR;
		if (!Write(GL_R16F, vec4(1.0f, 2.0f, 3.0f, 4.0f), vec4(1.0f, 0.0f, 0.0f, 1.0f)))
			return ERROR;

		if (!Write(GL_RGBA32I, ivec4(1, -2, 3, -4), ivec4(1, -2, 3, -4)))
			return ERROR;
		if (!Write(GL_RG32I, ivec4(1, -2, 3, -4), ivec4(1, -2, 0, 1)))
			return ERROR;
		if (!Write(GL_R32I, ivec4(1, -2, 3, -4), ivec4(1, 0, 0, 1)))
			return ERROR;

		if (!Write(GL_R11F_G11F_B10F, vec4(1.0f, 2.0f, 3.0f, 4.0f), vec4(1.0f, 2.0f, 3.0f, 1.0f)))
			return ERROR;

		if (!Write(GL_RGBA16I, ivec4(1, -2, 3, -4), ivec4(1, -2, 3, -4)))
			return ERROR;
		if (!Write(GL_RG16I, ivec4(1, -2, 3, -4), ivec4(1, -2, 0, 1)))
			return ERROR;
		if (!Write(GL_R16I, ivec4(1, -2, 3, -4), ivec4(1, 0, 0, 1)))
			return ERROR;

		if (!Write(GL_RGBA8I, ivec4(1, -2, 3, -4), ivec4(1, -2, 3, -4)))
			return ERROR;
		if (!Write(GL_RG8I, ivec4(1, -2, 3, -4), ivec4(1, -2, 0, 1)))
			return ERROR;
		if (!Write(GL_R8I, ivec4(1, -2, 3, -4), ivec4(1, 0, 0, 1)))
			return ERROR;

		if (!Write(GL_RGBA32UI, uvec4(0, 1, 2, 3), uvec4(0, 1, 2, 3)))
			return ERROR;
		if (!Write(GL_RGB10_A2UI, uvec4(0, 1, 2, 3), uvec4(0, 1, 2, 3)))
			return ERROR;
		if (!Write(GL_RG32UI, uvec4(0, 1, 2, 3), uvec4(0, 1, 0, 1)))
			return ERROR;
		if (!Write(GL_R32UI, uvec4(7, 2, 3, 4), uvec4(7, 0, 0, 1)))
			return ERROR;

		if (!Write(GL_RGBA16UI, uvec4(0, 1, 2, 3), uvec4(0, 1, 2, 3)))
			return ERROR;
		if (!Write(GL_RG16UI, uvec4(0, 1, 2, 3), uvec4(0, 1, 0, 1)))
			return ERROR;
		if (!Write(GL_R16UI, uvec4(7, 2, 3, 4), uvec4(7, 0, 0, 1)))
			return ERROR;

		if (!Write(GL_RGBA8UI, uvec4(0, 1, 2, 3), uvec4(0, 1, 2, 3)))
			return ERROR;
		if (!Write(GL_RG8UI, uvec4(0, 1, 2, 3), uvec4(0, 1, 0, 1)))
			return ERROR;
		if (!Write(GL_R8UI, uvec4(7, 2, 3, 4), uvec4(7, 0, 0, 1)))
			return ERROR;

		if (!Write(GL_RGBA16, vec4(1.0f), vec4(1.0f)))
			return ERROR;
		if (!Write(GL_RGB10_A2, vec4(1.0f), vec4(1.0f)))
			return ERROR;
		if (!Write(GL_RG16, vec4(1.0f), vec4(1.0f, 1.0f, 0.0f, 1.0f)))
			return ERROR;
		if (!Write(GL_R16, vec4(1.0f), vec4(1.0f, 0.0f, 0.0f, 1.0f)))
			return ERROR;

		if (!Write(GL_RGBA8, vec4(1.0f), vec4(1.0f)))
			return ERROR;
		if (!Write(GL_RG8, vec4(1.0f), vec4(1.0f, 1.0f, 0.0f, 1.0f)))
			return ERROR;
		if (!Write(GL_R8, vec4(1.0f), vec4(1.0f, 0.0f, 0.0f, 1.0f)))
			return ERROR;

		//
		{
			if (!Write(GL_RGBA16_SNORM, vec4(1.0f, -1.0f, 1.0f, -1.0f), vec4(1.0f, -1.0f, 1.0f, -1.0f)))
				return ERROR;
			if (!Write(GL_RG16_SNORM, vec4(-1.0f), vec4(-1.0f, -1.0f, 0.0f, 1.0f)))
				return ERROR;
			if (!Write(GL_R16_SNORM, vec4(-1.0f, 1.0f, -1.0f, 1.0f), vec4(-1.0f, 0.0f, 0.0f, 1.0f)))
				return ERROR;

			if (!Write(GL_RGBA8_SNORM, vec4(1.0f, -1.0f, 1.0f, -1.0f), vec4(1.0f, -1.0f, 1.0f, -1.0f)))
				return ERROR;
			if (!Write(GL_RG8_SNORM, vec4(-1.0f), vec4(-1.0f, -1.0f, 0.0f, 1.0f)))
				return ERROR;
			if (!Write(GL_R8_SNORM, vec4(-1.0f, 1.0f, -1.0f, 1.0f), vec4(-1.0f, 0.0f, 0.0f, 1.0f)))
				return ERROR;
		}
		return NO_ERROR;
	}
};
//-----------------------------------------------------------------------------
// AtomicMachine
//-----------------------------------------------------------------------------
class AtomicMachine : public ShaderImageLoadStoreBase
{
	GLuint m_vao;

	virtual long Setup()
	{
		glEnable(GL_RASTERIZER_DISCARD);
		glGenVertexArrays(1, &m_vao);
		return NO_ERROR;
	}

	virtual long Cleanup()
	{
		glDisable(GL_RASTERIZER_DISCARD);
		glDeleteVertexArrays(1, &m_vao);
		return NO_ERROR;
	}

	template <typename T>
	bool Atomic(int stage, GLenum internalformat)
	{
		GLuint program = 0;
		if (stage == 0)
		{ // VS
			program = BuildProgram(GenShader<T>(stage, internalformat).c_str(), NULL, NULL, NULL, NULL);
		}
		else if (stage == 1)
		{ // TCS
			const char* const glsl_vs  = "#version 420 core" NL "void main() {}";
			const char* const glsl_tes = "#version 420 core" NL "layout(quads, point_mode) in;" NL "void main() {}";
			program = BuildProgram(glsl_vs, GenShader<T>(stage, internalformat).c_str(), glsl_tes, NULL, NULL);
		}
		else if (stage == 2)
		{ // TES
			const char* const glsl_vs = "#version 420 core" NL "void main() {}";
			program = BuildProgram(glsl_vs, NULL, GenShader<T>(stage, internalformat).c_str(), NULL, NULL);
		}
		else if (stage == 3)
		{ // GS
			const char* const glsl_vs = "#version 420 core" NL "void main() {}";
			program = BuildProgram(glsl_vs, NULL, NULL, GenShader<T>(stage, internalformat).c_str(), NULL);
		}
		else if (stage == 4)
		{ // CS
			std::string		  source = GenShader<T>(stage, internalformat);
			const char* const src	= source.c_str();
			GLuint			  sh	 = glCreateShader(GL_COMPUTE_SHADER);
			glShaderSource(sh, 1, &src, NULL);
			glCompileShader(sh);
			program = glCreateProgram();
			glAttachShader(program, sh);
			glLinkProgram(program);
			glDeleteShader(sh);
		}
		GLuint texture_result;
		glGenTextures(1, &texture_result);
		glBindTexture(GL_TEXTURE_2D, texture_result);
		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
		glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA32F, 1, 1);

		const GLenum targets[] = { GL_TEXTURE_2D,	 GL_TEXTURE_3D,	   GL_TEXTURE_RECTANGLE, GL_TEXTURE_CUBE_MAP,
								   GL_TEXTURE_BUFFER, GL_TEXTURE_1D_ARRAY, GL_TEXTURE_2D_ARRAY };
		const int kTargets = sizeof(targets) / sizeof(targets[0]);

		GLuint textures[kTargets];
		GLuint buffer;
		glGenTextures(kTargets, textures);
		glGenBuffers(1, &buffer);

		for (int i = 0; i < kTargets; ++i)
		{
			glBindTexture(targets[i], textures[i]);
			if (targets[i] != GL_TEXTURE_BUFFER)
			{
				glTexParameteri(targets[i], GL_TEXTURE_MIN_FILTER, GL_NEAREST);
				glTexParameteri(targets[i], GL_TEXTURE_MAG_FILTER, GL_NEAREST);
			}
			if (targets[i] == GL_TEXTURE_2D || targets[i] == GL_TEXTURE_RECTANGLE)
			{
				glTexStorage2D(targets[i], 1, internalformat, 1, 1);
			}
			else if (targets[i] == GL_TEXTURE_3D || targets[i] == GL_TEXTURE_2D_ARRAY)
			{
				glTexStorage3D(targets[i], 1, internalformat, 1, 1, 2);
			}
			else if (targets[i] == GL_TEXTURE_CUBE_MAP)
			{
				glTexStorage2D(targets[i], 1, internalformat, 1, 1);
			}
			else if (targets[i] == GL_TEXTURE_BUFFER)
			{
				glBindBuffer(GL_TEXTURE_BUFFER, buffer);
				glBufferData(GL_TEXTURE_BUFFER, 4, NULL, GL_DYNAMIC_DRAW);
				glBindBuffer(GL_TEXTURE_BUFFER, 0);
				glTexBuffer(targets[i], internalformat, buffer);
			}
			else if (targets[i] == GL_TEXTURE_1D_ARRAY)
			{
				glTexStorage2D(targets[i], 1, internalformat, 1, 2);
			}
		}
		glBindImageTexture(0, texture_result, 0, GL_FALSE, 0, GL_WRITE_ONLY, GL_RGBA32F);
		glBindImageTexture(1, textures[0], 0, GL_FALSE, 0, GL_READ_WRITE, internalformat);
		glBindImageTexture(2, textures[1], 0, GL_TRUE, 0, GL_READ_WRITE, internalformat);
		glBindImageTexture(3, textures[2], 0, GL_FALSE, 0, GL_READ_WRITE, internalformat);
		glBindImageTexture(4, textures[3], 0, GL_TRUE, 0, GL_READ_WRITE, internalformat);
		glBindImageTexture(5, textures[4], 0, GL_FALSE, 0, GL_READ_WRITE, internalformat);
		glBindImageTexture(6, textures[5], 0, GL_TRUE, 0, GL_READ_WRITE, internalformat);
		glBindImageTexture(7, textures[6], 0, GL_TRUE, 0, GL_READ_WRITE, internalformat);

		glUseProgram(program);
		glUniform1i(glGetUniformLocation(program, "g_image_result"), 0);
		glUniform1i(glGetUniformLocation(program, "g_image_2d"), 1);
		glUniform1i(glGetUniformLocation(program, "g_image_3d"), 2);
		glUniform1i(glGetUniformLocation(program, "g_image_2drect"), 3);
		glUniform1i(glGetUniformLocation(program, "g_image_cube"), 4);
		glUniform1i(glGetUniformLocation(program, "g_image_buffer"), 5);
		glUniform1i(glGetUniformLocation(program, "g_image_1darray"), 6);
		glUniform1i(glGetUniformLocation(program, "g_image_2darray"), 7);

		glBindVertexArray(m_vao);
		if (stage == 1 || stage == 2)
		{ // TCS or TES
			glPatchParameteri(GL_PATCH_VERTICES, 1);
			glDrawArrays(GL_PATCHES, 0, 1);
			glPatchParameteri(GL_PATCH_VERTICES, 3);
		}
		else if (stage == 4)
		{ // CS
			glDispatchCompute(1, 1, 1);
		}
		else
		{
			glDrawArrays(GL_POINTS, 0, 1);
		}

		bool status = true;
		{
			vec4 color;
			glBindTexture(GL_TEXTURE_2D, texture_result);
			glMemoryBarrier(GL_TEXTURE_UPDATE_BARRIER_BIT);
			glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_FLOAT, &color[0]);
			if (!tcu::allEqual(color, vec4(0, 1, 0, 1)))
			{
				status = false;
				m_context.getTestContext().getLog() << tcu::TestLog::Message << "Color is: " << ToString(color)
													<< ". Format is: " << FormatEnumToString(internalformat)
													<< ". Stage is: " << StageName(stage) << tcu::TestLog::EndMessage;
			}
		}
		glUseProgram(0);
		glDeleteProgram(program);
		glDeleteTextures(7, textures);
		glDeleteTextures(1, &texture_result);
		glDeleteBuffers(1, &buffer);
		return status;
	}

	template <typename T>
	std::string GenShader(int stage, GLenum internalformat)
	{
		std::ostringstream os;
		os << "#version 420 core";
		if (stage == 4)
		{ // CS
			os << NL "#extension GL_ARB_compute_shader : require";
		}
		os << NL "layout(" << FormatEnumToString(internalformat) << ") coherent uniform " << TypePrefix<T>()
		   << "image2D g_image_2d;" NL "layout(" << FormatEnumToString(internalformat) << ") coherent uniform "
		   << TypePrefix<T>() << "image3D g_image_3d;" NL "layout(" << FormatEnumToString(internalformat)
		   << ") coherent uniform " << TypePrefix<T>() << "image2DRect g_image_2drect;" NL "layout("
		   << FormatEnumToString(internalformat) << ") coherent uniform " << TypePrefix<T>()
		   << "imageCube g_image_cube;" NL "layout(" << FormatEnumToString(internalformat) << ") coherent uniform "
		   << TypePrefix<T>() << "imageBuffer g_image_buffer;" NL "layout(" << FormatEnumToString(internalformat)
		   << ") coherent uniform " << TypePrefix<T>() << "image1DArray g_image_1darray;" NL "layout("
		   << FormatEnumToString(internalformat) << ") coherent uniform " << TypePrefix<T>()
		   << "image2DArray g_image_2darray;" NL "layout(rgba32f) writeonly uniform image2D g_image_result;" NL
			  "uniform int g_value[6] = int[](0, 1, 2, 3, 4, 5);";
		if (stage == 0)
		{ // VS
			os << NL "void main() {" NL "  ivec2 coord = ivec2(gl_VertexID, g_value[0]);";
		}
		else if (stage == 1)
		{ // TCS
			os << NL "layout(vertices = 1) out;" NL "void main() {" NL "  gl_TessLevelInner[0] = 1;" NL
					 "  gl_TessLevelInner[1] = 1;" NL "  gl_TessLevelOuter[0] = 1;" NL "  gl_TessLevelOuter[1] = 1;" NL
					 "  gl_TessLevelOuter[2] = 1;" NL "  gl_TessLevelOuter[3] = 1;" NL
					 "  ivec2 coord = ivec2(gl_PrimitiveID, g_value[0]);";
		}
		else if (stage == 2)
		{ // TES
			os << NL "layout(quads, point_mode) in;" NL "void main() {" NL
					 "  ivec2 coord = ivec2(gl_PrimitiveID, g_value[0]);";
		}
		else if (stage == 3)
		{ // GS
			os << NL "layout(points) in;" NL "layout(points, max_vertices = 1) out;" NL "void main() {" NL
					 "  ivec2 coord = ivec2(gl_PrimitiveIDIn, g_value[0]);";
		}
		else if (stage == 4)
		{ // CS
			os << NL "layout(local_size_x = 1) in;" NL "void main() {" NL
					 "  ivec2 coord = ivec2(gl_GlobalInvocationID.x, g_value[0]);";
		}
		os << NL
			"  vec4 o_color = vec4(0, 1, 0, 1);" NL "  imageAtomicExchange(g_image_2d, coord, 0);" NL
			"  if (imageAtomicAdd(g_image_2d, coord, 2) != 0) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			"  if (imageAtomicMin(g_image_2d, coord, 3) != 2) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			"  if (imageAtomicMax(g_image_2d, coord, 4) != 2) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			"  if (imageAtomicAnd(g_image_2d, coord, 0) != 4) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			"  if (imageAtomicOr(g_image_2d, coord, 7) != 0) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			"  if (imageAtomicXor(g_image_2d, coord, 4) != 7) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			"  if (imageAtomicExchange(g_image_2d, coord, 1) != 3) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			"  if (imageAtomicCompSwap(g_image_2d, coord, 1, 6) != 1) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			"  if (imageAtomicExchange(g_image_2d, coord, 0) != 6) o_color = vec4(1.0, 0.0, 0.0, 1.0);"

			NL "  imageAtomicExchange(g_image_3d, ivec3(coord, 0), 0);" NL
			"  if (imageAtomicAdd(g_image_3d, ivec3(coord, 0), 2) != 0) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			"  if (imageAtomicMin(g_image_3d, ivec3(coord, 0), 3) != 2) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			"  if (imageAtomicMax(g_image_3d, ivec3(coord, g_value[0]), 4) != 2) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			"  if (imageAtomicAnd(g_image_3d, ivec3(coord, 0), 0) != 4) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			"  if (imageAtomicOr(g_image_3d, ivec3(coord, 0), 7) != 0) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			"  if (imageAtomicXor(g_image_3d, ivec3(coord, 0), 4) != 7) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			"  if (imageAtomicExchange(g_image_3d, ivec3(coord, 0), 1) != 3) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			"  if (imageAtomicCompSwap(g_image_3d, ivec3(coord, 0), 1, 6) != 1) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			"  if (imageAtomicExchange(g_image_3d, ivec3(coord, 0), 0) != 6) o_color = vec4(1.0, 0.0, 0.0, 1.0);"

			NL "  imageAtomicExchange(g_image_2drect, coord, 0);" NL
			"  if (imageAtomicAdd(g_image_2drect, coord, 2) != 0) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			"  if (imageAtomicMin(g_image_2drect, coord, 3) != 2) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			"  if (imageAtomicMax(g_image_2drect, coord, 4) != 2) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			"  if (imageAtomicAnd(g_image_2drect, coord, 0) != g_value[4]) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			"  if (imageAtomicOr(g_image_2drect, coord, 7) != 0) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			"  if (imageAtomicXor(g_image_2drect, coord, 4) != 7) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			"  if (imageAtomicExchange(g_image_2drect, coord, 1) != 3) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			"  if (imageAtomicCompSwap(g_image_2drect, coord, g_value[1], 6) != 1) o_color = vec4(1.0, 0.0, 0.0, "
			"1.0);" NL "  if (imageAtomicExchange(g_image_2drect, coord, 0) != 6) o_color = vec4(1.0, 0.0, 0.0, 1.0);"

			NL "  imageAtomicExchange(g_image_cube, ivec3(coord, 0), 0);" NL "  if (imageAtomicAdd(g_image_cube, "
			"ivec3(coord, 0), g_value[2]) != 0) "
			"o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			"  if (imageAtomicMin(g_image_cube, ivec3(coord, 0), 3) != 2) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			"  if (imageAtomicMax(g_image_cube, ivec3(coord, 0), 4) != 2) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			"  if (imageAtomicAnd(g_image_cube, ivec3(coord, 0), 0) != 4) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			"  if (imageAtomicOr(g_image_cube, ivec3(coord, 0), 7) != 0) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			"  if (imageAtomicXor(g_image_cube, ivec3(coord, 0), 4) != 7) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			"  if (imageAtomicExchange(g_image_cube, ivec3(coord, 0), 1) != 3) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			"  if (imageAtomicCompSwap(g_image_cube, ivec3(coord, g_value[0]), 1, 6) != 1) o_color = vec4(1.0, 0.0, "
			"0.0, 1.0);" NL
			"  if (imageAtomicExchange(g_image_cube, ivec3(coord, 0), 0) != 6) o_color = vec4(1.0, 0.0, 0.0, 1.0);"

			NL "  imageAtomicExchange(g_image_buffer, coord.x, g_value[0]);" NL
			"  if (imageAtomicAdd(g_image_buffer, coord.x, 2) != 0) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			"  if (imageAtomicMin(g_image_buffer, coord.x, g_value[3]) != 2) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			"  if (imageAtomicMax(g_image_buffer, coord.x, 4) != 2) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			"  if (imageAtomicAnd(g_image_buffer, coord.x, 0) != 4) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			"  if (imageAtomicOr(g_image_buffer, coord.x, 7) != 0) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			"  if (imageAtomicXor(g_image_buffer, coord.x, 4) != 7) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			"  if (imageAtomicExchange(g_image_buffer, coord.x, g_value[1]) != 3) o_color = vec4(1.0, 0.0, 0.0, "
			"1.0);" NL
			"  if (imageAtomicCompSwap(g_image_buffer, coord.x, 1, 6) != 1) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			"  if (imageAtomicExchange(g_image_buffer, coord.x, 0) != 6) o_color = vec4(1.0, 0.0, 0.0, 1.0);"

			NL "  imageAtomicExchange(g_image_1darray, ivec2(coord.x, 0), 0);" NL
			"  if (imageAtomicAdd(g_image_1darray, ivec2(coord.x, 0), 2) != 0) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			"  if (imageAtomicMin(g_image_1darray, ivec2(coord.x, 0), 3) != 2) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			"  if (imageAtomicMax(g_image_1darray, ivec2(coord.x, g_value[0]), 4) != 2) o_color = vec4(1.0, 0.0, 0.0, "
			"1.0);" NL
			"  if (imageAtomicAnd(g_image_1darray, ivec2(coord.x, 0), 0) != 4) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			"  if (imageAtomicOr(g_image_1darray, ivec2(coord.x, 0), 7) != 0) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			"  if (imageAtomicXor(g_image_1darray, ivec2(coord.x, 0), 4) != 7) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			"  if (imageAtomicExchange(g_image_1darray, ivec2(coord.x, 0), 1) != 3) o_color = vec4(1.0, 0.0, 0.0, "
			"1.0);" NL "  if (imageAtomicCompSwap(g_image_1darray, ivec2(coord.x, 0), 1, 6) != 1) o_color = vec4(1.0, "
			"0.0, 0.0, 1.0);" NL
			"  if (imageAtomicExchange(g_image_1darray, ivec2(coord.x, 0), 0) != 6) o_color = vec4(1.0, 0.0, 0.0, 1.0);"

			NL "  imageAtomicExchange(g_image_2darray, ivec3(coord, 0), 0);" NL
			"  if (imageAtomicAdd(g_image_2darray, ivec3(coord, 0), 2) != 0) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			"  if (imageAtomicMin(g_image_2darray, ivec3(coord, 0), 3) != 2) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			"  if (imageAtomicMax(g_image_2darray, ivec3(coord, 0), 4) != 2) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			"  if (imageAtomicAnd(g_image_2darray, ivec3(coord, 0), 0) != 4) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			"  if (imageAtomicOr(g_image_2darray, ivec3(coord, 0), 7) != 0) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			"  if (imageAtomicXor(g_image_2darray, ivec3(coord, 0), g_value[4]) != 7) o_color = vec4(1.0, 0.0, 0.0, "
			"1.0);" NL "  if (imageAtomicExchange(g_image_2darray, ivec3(coord, 0), 1) != 3) o_color = vec4(1.0, 0.0, "
			"0.0, 1.0);" NL "  if (imageAtomicCompSwap(g_image_2darray, ivec3(coord, 0), 1, 6) != 1) "
			"o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			"  if (imageAtomicExchange(g_image_2darray, ivec3(coord, 0), 0) != 6) o_color = vec4(1.0, 0.0, 0.0, 1.0);"

			NL "  imageStore(g_image_result, coord, o_color);" NL "}";
		return os.str();
	}

protected:
	long RunStage(int stage)
	{
		if (!SupportedInStage(stage, 8))
			return NOT_SUPPORTED;
		if (!Atomic<GLint>(stage, GL_R32I))
			return ERROR;
		if (!Atomic<GLuint>(stage, GL_R32UI))
			return ERROR;
		return NO_ERROR;
	}
};
//-----------------------------------------------------------------------------
// 1.3.4 BasicAllTargetsLoadStoreVS
//-----------------------------------------------------------------------------
class BasicAllTargetsLoadStoreVS : public LoadStoreMachine
{
	virtual long Run()
	{
		return RunStage(0);
	}
};
//-----------------------------------------------------------------------------
// 1.3.5 BasicAllTargetsLoadStoreTCS
//-----------------------------------------------------------------------------
class BasicAllTargetsLoadStoreTCS : public LoadStoreMachine
{
	virtual long Run()
	{
		return RunStage(1);
	}
};
//-----------------------------------------------------------------------------
// 1.3.6 BasicAllTargetsLoadStoreTES
//-----------------------------------------------------------------------------
class BasicAllTargetsLoadStoreTES : public LoadStoreMachine
{
	virtual long Run()
	{
		return RunStage(2);
	}
};
//-----------------------------------------------------------------------------
// 1.3.7 BasicAllTargetsLoadStoreGS
//-----------------------------------------------------------------------------
class BasicAllTargetsLoadStoreGS : public LoadStoreMachine
{
	virtual long Run()
	{
		return RunStage(3);
	}
};
//-----------------------------------------------------------------------------
// 1.3.8 BasicAllTargetsLoadStoreCS
//-----------------------------------------------------------------------------
class BasicAllTargetsLoadStoreCS : public LoadStoreMachine
{
	virtual long Run()
	{
		if (!m_context.getContextInfo().isExtensionSupported("GL_ARB_compute_shader"))
		{
			m_context.getTestContext().getLog()
				<< tcu::TestLog::Message << "GL_ARB_compute_shader not supported, skipping test"
				<< tcu::TestLog::EndMessage;
			return NO_ERROR;
		}

		return RunStage(4);
	}
};
//-----------------------------------------------------------------------------
// 1.3.9 BasicAllTargetsAtomicVS
//-----------------------------------------------------------------------------
class BasicAllTargetsAtomicVS : public AtomicMachine
{
	virtual long Run()
	{
		return RunStage(0);
	}
};
//-----------------------------------------------------------------------------
// 1.3.10 BasicAllTargetsAtomicTCS
//-----------------------------------------------------------------------------
class BasicAllTargetsAtomicTCS : public AtomicMachine
{
	virtual long Run()
	{
		return RunStage(1);
	}
};
//-----------------------------------------------------------------------------
// 1.3.11 BasicAllTargetsAtomicTES
//-----------------------------------------------------------------------------
class BasicAllTargetsAtomicTES : public AtomicMachine
{
	virtual long Run()
	{
		return RunStage(2);
	}
};
//-----------------------------------------------------------------------------
// 1.3.12 BasicAllTargetsAtomicGS
//-----------------------------------------------------------------------------
class BasicAllTargetsAtomicGS : public AtomicMachine
{
	virtual long Run()
	{
		return RunStage(3);
	}
};
//-----------------------------------------------------------------------------
// 1.3.13 BasicAllTargetsAtomicCS
//-----------------------------------------------------------------------------
class BasicAllTargetsAtomicCS : public AtomicMachine
{
	virtual long Run()
	{
		if (!m_context.getContextInfo().isExtensionSupported("GL_ARB_compute_shader"))
		{
			m_context.getTestContext().getLog()
				<< tcu::TestLog::Message << "GL_ARB_compute_shader not supported, skipping test"
				<< tcu::TestLog::EndMessage;
			return NO_ERROR;
		}

		return RunStage(4);
	}
};
//-----------------------------------------------------------------------------
// 1.4.1 BasicGLSLMisc
//-----------------------------------------------------------------------------
class BasicGLSLMisc : public ShaderImageLoadStoreBase
{
	GLuint m_texture;
	GLuint m_program;
	GLuint m_vao, m_vbo;

	virtual long Setup()
	{
		m_texture = 0;
		m_program = 0;
		m_vao = m_vbo = 0;
		return NO_ERROR;
	}

	virtual long Run()
	{
		const int		  kSize = 32;
		std::vector<vec4> data(kSize * kSize * 4, vec4(0.0f));

		glGenTextures(1, &m_texture);
		glBindTexture(GL_TEXTURE_2D_ARRAY, m_texture);
		glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
		glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA32F, kSize, kSize, 4, 0, GL_RGBA, GL_FLOAT, &data[0]);
		glBindTexture(GL_TEXTURE_2D_ARRAY, 0);

		const char* src_vs = "#version 420 core" NL "layout(location = 0) in vec4 i_position;" NL "void main() {" NL
							 "  gl_Position = i_position;" NL "}";
		const char* src_fs =
			"#version 420 core" NL "layout(location = 0) out vec4 o_color;" NL
			"layout(rgba32f) coherent volatile restrict uniform image2D g_image_layer0;" NL
			"layout(rgba32f) volatile uniform image2D g_image_layer1;" NL
			"void main() {" NL "  ivec2 coord = ivec2(gl_FragCoord.xy);" NL
			"  imageStore(g_image_layer0, coord, vec4(1.0));" NL "  memoryBarrier();" NL
			"  imageStore(g_image_layer0, coord, vec4(2.0));" NL "  memoryBarrier();" NL
			"  imageStore(g_image_layer0, coord, vec4(0.0, 1.0, 0.0, 1.0));" NL "  memoryBarrier();" NL
			"  o_color = imageLoad(g_image_layer0, coord) + imageLoad(g_image_layer1, coord);" NL "}";
		m_program = BuildProgram(src_vs, NULL, NULL, NULL, src_fs);

		CreateFullViewportQuad(&m_vao, &m_vbo, NULL);

		glBindImageTexture(0, m_texture, 0, GL_FALSE, 0, GL_READ_WRITE, GL_RGBA32F);
		glBindImageTexture(1, m_texture, 0, GL_FALSE, 1, GL_READ_ONLY, GL_RGBA32F);

		glClear(GL_COLOR_BUFFER_BIT);
		glViewport(0, 0, kSize, kSize);

		glUseProgram(m_program);
		glUniform1i(glGetUniformLocation(m_program, "g_image_layer0"), 0);
		glUniform1i(glGetUniformLocation(m_program, "g_image_layer1"), 1);

		glBindVertexArray(m_vao);
		glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

		if (!ValidateReadBuffer(0, 0, kSize, kSize, vec4(0, 1, 0, 1)))
		{
			return ERROR;
		}
		return NO_ERROR;
	}

	virtual long Cleanup()
	{
		glViewport(0, 0, getWindowWidth(), getWindowHeight());
		glDeleteTextures(1, &m_texture);
		glDeleteVertexArrays(1, &m_vao);
		glDeleteBuffers(1, &m_vbo);
		glUseProgram(0);
		glDeleteProgram(m_program);
		return NO_ERROR;
	}
};
//-----------------------------------------------------------------------------
// 1.4.2 BasicGLSLEarlyFragTests
//-----------------------------------------------------------------------------
class BasicGLSLEarlyFragTests : public ShaderImageLoadStoreBase
{
	GLuint m_texture[2];
	GLuint m_program[2];
	GLuint m_vao, m_vbo;

	virtual long Setup()
	{
		m_texture[0] = m_texture[1] = 0;
		m_program[0] = m_program[1] = 0;
		m_vao = m_vbo = 0;
		return NO_ERROR;
	}

	virtual long Run()
	{
		int ds = m_context.getRenderContext().getRenderTarget().getDepthBits();

		const int		  kSize = 32;
		std::vector<vec4> data(kSize * kSize);

		glGenTextures(2, m_texture);
		glBindTexture(GL_TEXTURE_2D, m_texture[0]);
		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
		glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, kSize, kSize, 0, GL_RGBA, GL_FLOAT, &data[0]);
		glBindTexture(GL_TEXTURE_2D, 0);

		glBindTexture(GL_TEXTURE_2D, m_texture[1]);
		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
		glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, kSize, kSize, 0, GL_RGBA, GL_FLOAT, &data[0]);
		glBindTexture(GL_TEXTURE_2D, 0);

		const char* glsl_vs = "#version 420 core" NL "layout(location = 0) in vec4 i_position;" NL "void main() {" NL
							  "  gl_Position = i_position;" NL "}";
		const char* glsl_early_frag_tests_fs =
			"#version 420 core" NL "layout(early_fragment_tests) in;" NL "layout(location = 0) out vec4 o_color;" NL
			"layout(rgba32f) coherent uniform image2D g_image;" NL "void main() {" NL
			"  ivec2 coord = ivec2(gl_FragCoord.xy);" NL "  imageStore(g_image, coord, vec4(1.0));" NL
			"  o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL "}";
		const char* glsl_fs = "#version 420 core" NL "layout(location = 0) out vec4 o_color;" NL
							  "layout(rgba32f) coherent uniform image2D g_image;" NL "void main() {" NL
							  "  ivec2 coord = ivec2(gl_FragCoord.xy);" NL "  imageStore(g_image, coord, vec4(1.0));" NL
							  "  o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL "}";
		m_program[0] = BuildProgram(glsl_vs, NULL, NULL, NULL, glsl_early_frag_tests_fs);
		m_program[1] = BuildProgram(glsl_vs, NULL, NULL, NULL, glsl_fs);

		CreateFullViewportQuad(&m_vao, &m_vbo, NULL);

		glBindImageTexture(0, m_texture[0], 0, GL_FALSE, 0, GL_READ_WRITE, GL_RGBA32F);
		glBindImageTexture(1, m_texture[1], 0, GL_FALSE, 0, GL_READ_WRITE, GL_RGBA32F);

		glViewport(0, 0, kSize, kSize);
		glBindVertexArray(m_vao);

		glEnable(GL_DEPTH_TEST);
		glClearColor(0.0, 1.0f, 0.0, 1.0f);
		glClearDepthf(0.0f);

		glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
		glUseProgram(m_program[0]);
		glUniform1i(glGetUniformLocation(m_program[0], "g_image"), 0);

		glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

		glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
		glUseProgram(m_program[1]);
		glUniform1i(glGetUniformLocation(m_program[1], "g_image"), 1);
		glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

		glBindTexture(GL_TEXTURE_2D, m_texture[0]);
		glMemoryBarrier(GL_TEXTURE_UPDATE_BARRIER_BIT);
		glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_FLOAT, &data[0]);
		for (int i = 0; i < kSize * kSize; ++i)
		{
			if (IsEqual(data[i], vec4(1.0f)) && ds != 0)
				return ERROR;
		}

		glBindTexture(GL_TEXTURE_2D, m_texture[1]);
		glMemoryBarrier(GL_TEXTURE_UPDATE_BARRIER_BIT);
		glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_FLOAT, &data[0]);
		for (int i = 0; i < kSize * kSize; ++i)
		{
			if (!IsEqual(data[i], vec4(1.0f)) && ds != 0)
				return ERROR;
		}

		return NO_ERROR;
	}

	virtual long Cleanup()
	{
		glDisable(GL_DEPTH_TEST);
		glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
		glClearDepthf(1.0f);
		glViewport(0, 0, getWindowWidth(), getWindowHeight());
		glDeleteTextures(2, m_texture);
		glDeleteVertexArrays(1, &m_vao);
		glDeleteBuffers(1, &m_vbo);
		glUseProgram(0);
		glDeleteProgram(m_program[0]);
		glDeleteProgram(m_program[1]);
		return NO_ERROR;
	}
};
//-----------------------------------------------------------------------------
// 1.4.3 BasicGLSLConst
//-----------------------------------------------------------------------------
class BasicGLSLConst : public ShaderImageLoadStoreBase
{
	GLuint m_program;
	GLuint m_vao, m_vbo;

	virtual long Setup()
	{
		m_program = 0;
		m_vao = m_vbo = 0;
		return NO_ERROR;
	}

	virtual long Run()
	{
		bool isAtLeast44Context =
			glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::core(4, 4));

		const char* src_vs = "#version 420 core" NL "layout(location = 0) in vec4 i_position;" NL "void main() {" NL
							 "  gl_Position = i_position;" NL "}";
		std::ostringstream src_fs;
		src_fs << "#version " << (isAtLeast44Context ? "440" : "420") << " core";
		src_fs << NL "layout(location = 0) out vec4 o_color;" NL "uniform int MaxImageUnits;" NL
					 "uniform int MaxCombinedShaderOutputResources;" NL "uniform int MaxImageSamples;" NL
					 "uniform int MaxVertexImageUniforms;" NL "uniform int MaxTessControlImageUniforms;" NL
					 "uniform int MaxTessEvaluationImageUniforms;" NL "uniform int MaxGeometryImageUniforms;" NL
					 "uniform int MaxFragmentImageUniforms;" NL "uniform int MaxCombinedImageUniforms;" NL
					 "void main() {" NL "  o_color = vec4(0.0, 1.0, 0.0, 1.0);" NL
					 "  if (gl_MaxImageUnits != MaxImageUnits) o_color = vec4(1.0, 0.0, 0.0, 0.1);";
		if (isAtLeast44Context)
			src_fs << NL "  if (gl_MaxCombinedShaderOutputResources != MaxCombinedShaderOutputResources) o_color = "
						 "vec4(0.2, 0.0, 0.0, 0.2);";
		else
			src_fs << NL "  if (gl_MaxCombinedImageUnitsAndFragmentOutputs != MaxCombinedShaderOutputResources) "
						 "o_color = vec4(0.2, 0.0, 0.0, 0.2);";
		src_fs << NL
			"  if (gl_MaxImageSamples != MaxImageSamples) o_color = vec4(1.0, 0.0, 0.0, 0.3);" NL
			"  if (gl_MaxVertexImageUniforms != MaxVertexImageUniforms) o_color = vec4(1.0, 0.0, 0.0, 0.4);" NL
			"  if (gl_MaxTessControlImageUniforms != MaxTessControlImageUniforms) o_color = vec4(1.0, 0.0, 0.0, "
			"0.5);" NL "  if (gl_MaxTessEvaluationImageUniforms != MaxTessEvaluationImageUniforms) o_color = vec4(1.0, "
			"0.0, 0.0, 0.6);" NL
			"  if (gl_MaxGeometryImageUniforms != MaxGeometryImageUniforms) o_color = vec4(1.0, 0.0, 0.0, 0.7);" NL
			"  if (gl_MaxFragmentImageUniforms != MaxFragmentImageUniforms) o_color = vec4(1.0, 0.0, 0.0, 0.8);" NL
			"  if (gl_MaxCombinedImageUniforms != MaxCombinedImageUniforms) o_color = vec4(1.0, 0.0, 0.0, 0.9);" NL "}";

		m_program = BuildProgram(src_vs, NULL, NULL, NULL, src_fs.str().c_str());
		glUseProgram(m_program);

		GLint i;
		glGetIntegerv(GL_MAX_IMAGE_UNITS, &i);
		glUniform1i(glGetUniformLocation(m_program, "MaxImageUnits"), i);

		glGetIntegerv(GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES, &i);
		glUniform1i(glGetUniformLocation(m_program, "MaxCombinedShaderOutputResources"), i);

		glGetIntegerv(GL_MAX_IMAGE_SAMPLES, &i);
		glUniform1i(glGetUniformLocation(m_program, "MaxImageSamples"), i);

		glGetIntegerv(GL_MAX_VERTEX_IMAGE_UNIFORMS, &i);
		glUniform1i(glGetUniformLocation(m_program, "MaxVertexImageUniforms"), i);

		glGetIntegerv(GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS, &i);
		glUniform1i(glGetUniformLocation(m_program, "MaxTessControlImageUniforms"), i);

		glGetIntegerv(GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS, &i);
		glUniform1i(glGetUniformLocation(m_program, "MaxTessEvaluationImageUniforms"), i);

		glGetIntegerv(GL_MAX_GEOMETRY_IMAGE_UNIFORMS, &i);
		glUniform1i(glGetUniformLocation(m_program, "MaxGeometryImageUniforms"), i);

		glGetIntegerv(GL_MAX_FRAGMENT_IMAGE_UNIFORMS, &i);
		glUniform1i(glGetUniformLocation(m_program, "MaxFragmentImageUniforms"), i);

		glGetIntegerv(GL_MAX_COMBINED_IMAGE_UNIFORMS, &i);
		glUniform1i(glGetUniformLocation(m_program, "MaxCombinedImageUniforms"), i);

		CreateFullViewportQuad(&m_vao, &m_vbo, NULL);

		glClear(GL_COLOR_BUFFER_BIT);
		glBindVertexArray(m_vao);
		glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

		if (!ValidateReadBuffer(0, 0, getWindowWidth(), getWindowHeight(), vec4(0, 1, 0, 1)))
		{
			return ERROR;
		}
		return NO_ERROR;
	}

	virtual long Cleanup()
	{
		glDeleteVertexArrays(1, &m_vao);
		glDeleteBuffers(1, &m_vbo);
		glUseProgram(0);
		glDeleteProgram(m_program);
		return NO_ERROR;
	}
};
//-----------------------------------------------------------------------------
// 2.1.1 AdvancedSyncImageAccess
//-----------------------------------------------------------------------------
class AdvancedSyncImageAccess : public ShaderImageLoadStoreBase
{
	GLuint m_buffer;
	GLuint m_buffer_tex;
	GLuint m_store_program;
	GLuint m_draw_program;
	GLuint m_attribless_vao;

	virtual long Setup()
	{
		m_buffer		 = 0;
		m_buffer_tex	 = 0;
		m_store_program  = 0;
		m_draw_program   = 0;
		m_attribless_vao = 0;
		return NO_ERROR;
	}

	virtual long Run()
	{
		if (!SupportedInVS(1))
			return NOT_SUPPORTED;
		const char* const glsl_store_vs =
			"#version 420 core" NL "writeonly uniform imageBuffer g_output_data;" NL "void main() {" NL
			"  vec2[4] data = vec2[4](vec2(-1, -1), vec2(1, -1), vec2(-1, 1), vec2(1, 1));" NL
			"  imageStore(g_output_data, gl_VertexID, vec4(data[gl_VertexID], 0.0, 1.0));" NL "}";
		const char* const glsl_draw_vs =
			"#version 420 core" NL "out vec4 vs_color;" NL "layout(rg32f) readonly uniform imageBuffer g_image;" NL
			"uniform samplerBuffer g_sampler;" NL "void main() {" NL "  vec4 pi = imageLoad(g_image, gl_VertexID);" NL
			"  vec4 ps = texelFetch(g_sampler, gl_VertexID);" NL
			"  if (pi != ps) vs_color = vec4(1.0, 0.0, 0.0, 1.0);" NL "  else vs_color = vec4(0.0, 1.0, 0.0, 1.0);" NL
			"  gl_Position = pi;" NL "}";
		const char* const glsl_draw_fs =
			"#version 420 core" NL "in vec4 vs_color;" NL "layout(location = 0) out vec4 o_color;" NL "void main() {" NL
			"  o_color = vs_color;" NL "}";
		m_store_program = BuildProgram(glsl_store_vs, NULL, NULL, NULL, NULL);
		m_draw_program  = BuildProgram(glsl_draw_vs, NULL, NULL, NULL, glsl_draw_fs);

		glGenVertexArrays(1, &m_attribless_vao);
		glBindVertexArray(m_attribless_vao);

		glGenBuffers(1, &m_buffer);
		glBindBuffer(GL_TEXTURE_BUFFER, m_buffer);
		glBufferData(GL_TEXTURE_BUFFER, sizeof(vec2) * 4, NULL, GL_DYNAMIC_DRAW);
		glBindBuffer(GL_TEXTURE_BUFFER, 0);

		glGenTextures(1, &m_buffer_tex);
		glBindTexture(GL_TEXTURE_BUFFER, m_buffer_tex);
		glTexBuffer(GL_TEXTURE_BUFFER, GL_RG32F, m_buffer);

		glBindImageTexture(0, m_buffer_tex, 0, GL_FALSE, 0, GL_READ_WRITE, GL_RG32F);

		glEnable(GL_RASTERIZER_DISCARD);
		glUseProgram(m_store_program);
		glDrawArrays(GL_POINTS, 0, 4);

		glMemoryBarrier(GL_SHADER_IMAGE_ACCESS_BARRIER_BIT | GL_TEXTURE_FETCH_BARRIER_BIT);

		glDisable(GL_RASTERIZER_DISCARD);
		glClear(GL_COLOR_BUFFER_BIT);
		glUseProgram(m_draw_program);
		glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

		if (!ValidateReadBuffer(0, 0, getWindowWidth(), getWindowHeight(), vec4(0, 1, 0, 1)))
		{
			return ERROR;
		}
		return NO_ERROR;
	}

	virtual long Cleanup()
	{
		glUseProgram(0);
		glDeleteBuffers(1, &m_buffer);
		glDeleteTextures(1, &m_buffer_tex);
		glDeleteProgram(m_store_program);
		glDeleteProgram(m_draw_program);
		glDeleteVertexArrays(1, &m_attribless_vao);
		return NO_ERROR;
	}
};
//-----------------------------------------------------------------------------
// 2.1.2 AdvancedSyncVertexArray
//-----------------------------------------------------------------------------
class AdvancedSyncVertexArray : public ShaderImageLoadStoreBase
{
	GLuint m_position_buffer;
	GLuint m_color_buffer;
	GLuint m_element_buffer;
	GLuint m_position_buffer_tex;
	GLuint m_color_buffer_tex;
	GLuint m_element_buffer_tex;
	GLuint m_store_program;
	GLuint m_draw_program;
	GLuint m_attribless_vao;
	GLuint m_draw_vao;

	virtual long Setup()
	{
		m_position_buffer	 = 0;
		m_color_buffer		  = 0;
		m_element_buffer	  = 0;
		m_position_buffer_tex = 0;
		m_color_buffer_tex	= 0;
		m_element_buffer_tex  = 0;
		m_store_program		  = 0;
		m_draw_program		  = 0;
		m_attribless_vao	  = 0;
		m_draw_vao			  = 0;
		return NO_ERROR;
	}

	virtual long Run()
	{
		if (!SupportedInVS(3))
			return NOT_SUPPORTED;
		const char* const glsl_store_vs =
			"#version 420 core" NL "layout(rg32f) writeonly uniform imageBuffer g_position_buffer;" NL
			"layout(rgba32f) writeonly uniform imageBuffer g_color_buffer;" NL
			"layout(r32ui) writeonly uniform uimageBuffer g_element_buffer;" NL "uniform vec4 g_color;" NL
			"void main() {" NL "  vec2[4] data = vec2[4](vec2(-1, -1), vec2(1, -1), vec2(-1, 1), vec2(1, 1));" NL
			"  imageStore(g_position_buffer, gl_VertexID, vec4(data[gl_VertexID], 0.0, 1.0));" NL
			"  imageStore(g_color_buffer, gl_VertexID, g_color);" NL
			"  imageStore(g_element_buffer, gl_VertexID, uvec4(gl_VertexID));" NL "}";
		const char* const glsl_draw_vs =
			"#version 420 core" NL "layout(location = 0) in vec4 i_position;" NL
			"layout(location = 1) in vec4 i_color;" NL "out vec4 vs_color;" NL "void main() {" NL
			"  gl_Position = i_position;" NL "  vs_color = i_color;" NL "}";
		const char* const glsl_draw_fs =
			"#version 420 core" NL "in vec4 vs_color;" NL "layout(location = 0) out vec4 o_color;" NL "void main() {" NL
			"  o_color = vs_color;" NL "}";
		m_store_program = BuildProgram(glsl_store_vs, NULL, NULL, NULL, NULL);
		glUseProgram(m_store_program);
		glUniform1i(glGetUniformLocation(m_store_program, "g_position_buffer"), 0);
		glUniform1i(glGetUniformLocation(m_store_program, "g_color_buffer"), 1);
		glUniform1i(glGetUniformLocation(m_store_program, "g_element_buffer"), 2);
		glUseProgram(0);

		m_draw_program = BuildProgram(glsl_draw_vs, NULL, NULL, NULL, glsl_draw_fs);

		glGenBuffers(1, &m_position_buffer);
		glBindBuffer(GL_TEXTURE_BUFFER, m_position_buffer);
		glBufferData(GL_TEXTURE_BUFFER, sizeof(vec2) * 4, NULL, GL_DYNAMIC_DRAW);
		glBindBuffer(GL_TEXTURE_BUFFER, 0);

		glGenBuffers(1, &m_color_buffer);
		glBindBuffer(GL_TEXTURE_BUFFER, m_color_buffer);
		glBufferData(GL_TEXTURE_BUFFER, sizeof(vec4) * 4, NULL, GL_DYNAMIC_DRAW);
		glBindBuffer(GL_TEXTURE_BUFFER, 0);

		glGenBuffers(1, &m_element_buffer);
		glBindBuffer(GL_TEXTURE_BUFFER, m_element_buffer);
		glBufferData(GL_TEXTURE_BUFFER, sizeof(GLuint) * 4, NULL, GL_DYNAMIC_DRAW);
		glBindBuffer(GL_TEXTURE_BUFFER, 0);

		glGenTextures(1, &m_position_buffer_tex);
		glBindTexture(GL_TEXTURE_BUFFER, m_position_buffer_tex);
		glTexBuffer(GL_TEXTURE_BUFFER, GL_RG32F, m_position_buffer);
		glBindTexture(GL_TEXTURE_BUFFER, 0);

		glGenTextures(1, &m_color_buffer_tex);
		glBindTexture(GL_TEXTURE_BUFFER, m_color_buffer_tex);
		glTexBuffer(GL_TEXTURE_BUFFER, GL_RGBA32F, m_color_buffer);
		glBindTexture(GL_TEXTURE_BUFFER, 0);

		glGenTextures(1, &m_element_buffer_tex);
		glBindTexture(GL_TEXTURE_BUFFER, m_element_buffer_tex);
		glTexBuffer(GL_TEXTURE_BUFFER, GL_R32UI, m_element_buffer);
		glBindTexture(GL_TEXTURE_BUFFER, 0);

		glGenVertexArrays(1, &m_attribless_vao);

		glGenVertexArrays(1, &m_draw_vao);
		glBindVertexArray(m_draw_vao);
		glBindBuffer(GL_ARRAY_BUFFER, m_position_buffer);
		glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, 0);
		glBindBuffer(GL_ARRAY_BUFFER, m_color_buffer);
		glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 0, 0);
		glBindBuffer(GL_ARRAY_BUFFER, 0);
		glEnableVertexAttribArray(0);
		glEnableVertexAttribArray(1);
		glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_element_buffer);
		glBindVertexArray(0);

		glEnable(GL_RASTERIZER_DISCARD);
		glBindImageTexture(0, m_position_buffer_tex, 0, GL_FALSE, 0, GL_WRITE_ONLY, GL_RG32F);
		glBindImageTexture(1, m_color_buffer_tex, 0, GL_FALSE, 0, GL_WRITE_ONLY, GL_RGBA32F);
		glBindImageTexture(2, m_element_buffer_tex, 0, GL_FALSE, 0, GL_WRITE_ONLY, GL_R32UI);
		glUseProgram(m_store_program);
		glUniform4f(glGetUniformLocation(m_store_program, "g_color"), 0.0f, 1.0f, 0.0f, 1.0f);
		glBindVertexArray(m_attribless_vao);
		glDrawArrays(GL_POINTS, 0, 4);

		glDisable(GL_RASTERIZER_DISCARD);
		glClear(GL_COLOR_BUFFER_BIT);
		glUseProgram(m_draw_program);
		glBindVertexArray(m_draw_vao);
		glMemoryBarrier(GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT | GL_ELEMENT_ARRAY_BARRIER_BIT);
		glDrawElements(GL_TRIANGLE_STRIP, 4, GL_UNSIGNED_INT, 0);

		if (!ValidateReadBuffer(0, 0, getWindowWidth(), getWindowHeight(), vec4(0, 1, 0, 1)))
		{
			return ERROR;
		}

		glEnable(GL_RASTERIZER_DISCARD);
		glUseProgram(m_store_program);
		glUniform4f(glGetUniformLocation(m_store_program, "g_color"), 0.0f, 0.0f, 1.0f, 1.0f);
		glBindVertexArray(m_attribless_vao);
		glDrawArrays(GL_POINTS, 0, 4);

		glDisable(GL_RASTERIZER_DISCARD);
		glClear(GL_COLOR_BUFFER_BIT);
		glUseProgram(m_draw_program);
		glBindVertexArray(m_draw_vao);
		glMemoryBarrier(GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT | GL_ELEMENT_ARRAY_BARRIER_BIT);
		glDrawElements(GL_TRIANGLE_STRIP, 4, GL_UNSIGNED_INT, 0);

		if (!ValidateReadBuffer(0, 0, getWindowWidth(), getWindowHeight(), vec4(0, 0, 1, 1)))
		{
			return ERROR;
		}
		return NO_ERROR;
	}

	virtual long Cleanup()
	{
		glDisable(GL_RASTERIZER_DISCARD);
		glUseProgram(0);
		glDeleteBuffers(1, &m_position_buffer);
		glDeleteBuffers(1, &m_color_buffer);
		glDeleteBuffers(1, &m_element_buffer);
		glDeleteTextures(1, &m_position_buffer_tex);
		glDeleteTextures(1, &m_color_buffer_tex);
		glDeleteTextures(1, &m_element_buffer_tex);
		glDeleteProgram(m_store_program);
		glDeleteProgram(m_draw_program);
		glDeleteVertexArrays(1, &m_attribless_vao);
		glDeleteVertexArrays(1, &m_draw_vao);
		return NO_ERROR;
	}
};

//-----------------------------------------------------------------------------
// 2.1.4 AdvancedSyncDrawIndirect
//-----------------------------------------------------------------------------
class AdvancedSyncDrawIndirect : public ShaderImageLoadStoreBase
{
	GLuint m_draw_command_buffer;
	GLuint m_draw_command_buffer_tex;
	GLuint m_store_program;
	GLuint m_draw_program;
	GLuint m_attribless_vao;
	GLuint m_draw_vao;
	GLuint m_draw_vbo;

	virtual long Setup()
	{
		m_draw_command_buffer	 = 0;
		m_draw_command_buffer_tex = 0;
		m_store_program			  = 0;
		m_draw_program			  = 0;
		m_attribless_vao		  = 0;
		m_draw_vao				  = 0;
		m_draw_vbo				  = 0;
		return NO_ERROR;
	}

	virtual long Run()
	{
		if (!SupportedInVS(1))
			return NOT_SUPPORTED;
		const char* const glsl_store_vs =
			"#version 420 core" NL "writeonly uniform uimageBuffer g_draw_command_buffer;" NL "void main() {" NL
			"  imageStore(g_draw_command_buffer, 0, uvec4(4, 1, 0, 0));" NL "}";
		const char* const glsl_draw_vs = "#version 420 core" NL "layout(location = 0) in vec4 i_position;" NL
										 "void main() {" NL "  gl_Position = i_position;" NL "}";
		const char* const glsl_draw_fs = "#version 420 core" NL "layout(location = 0) out vec4 o_color;" NL
										 "void main() {" NL "  o_color = vec4(0.0, 1.0, 0.0, 1.0);" NL "}";
		m_store_program = BuildProgram(glsl_store_vs, NULL, NULL, NULL, NULL);
		m_draw_program  = BuildProgram(glsl_draw_vs, NULL, NULL, NULL, glsl_draw_fs);

		glGenBuffers(1, &m_draw_command_buffer);
		glBindBuffer(GL_DRAW_INDIRECT_BUFFER, m_draw_command_buffer);
		glBufferData(GL_DRAW_INDIRECT_BUFFER, sizeof(uvec4), NULL, GL_DYNAMIC_DRAW);
		glBindBuffer(GL_DRAW_INDIRECT_BUFFER, 0);

		glGenTextures(1, &m_draw_command_buffer_tex);
		glBindTexture(GL_TEXTURE_BUFFER, m_draw_command_buffer_tex);
		glTexBuffer(GL_TEXTURE_BUFFER, GL_RGBA32UI, m_draw_command_buffer);
		glBindTexture(GL_TEXTURE_BUFFER, 0);

		glGenVertexArrays(1, &m_attribless_vao);
		CreateFullViewportQuad(&m_draw_vao, &m_draw_vbo, NULL);

		glBindImageTexture(0, m_draw_command_buffer_tex, 0, GL_FALSE, 0, GL_READ_WRITE, GL_RGBA32UI);

		glEnable(GL_RASTERIZER_DISCARD);
		glUseProgram(m_store_program);
		glBindVertexArray(m_attribless_vao);
		glDrawArrays(GL_POINTS, 0, 1);

		glDisable(GL_RASTERIZER_DISCARD);
		glClear(GL_COLOR_BUFFER_BIT);
		glUseProgram(m_draw_program);
		glBindVertexArray(m_draw_vao);
		glBindBuffer(GL_DRAW_INDIRECT_BUFFER, m_draw_command_buffer);
		glMemoryBarrier(GL_COMMAND_BARRIER_BIT);
		glDrawArraysIndirect(GL_TRIANGLE_STRIP, 0);

		if (!ValidateReadBuffer(0, 0, getWindowWidth(), getWindowHeight(), vec4(0, 1, 0, 1)))
		{
			return ERROR;
		}
		return NO_ERROR;
	}

	virtual long Cleanup()
	{
		glUseProgram(0);
		glDeleteBuffers(1, &m_draw_command_buffer);
		glDeleteTextures(1, &m_draw_command_buffer_tex);
		glDeleteProgram(m_store_program);
		glDeleteProgram(m_draw_program);
		glDeleteVertexArrays(1, &m_attribless_vao);
		glDeleteVertexArrays(1, &m_draw_vao);
		glDeleteBuffers(1, &m_draw_vbo);
		return NO_ERROR;
	}
};
//-----------------------------------------------------------------------------
// 2.1.5 AdvancedSyncTextureUpdate
//-----------------------------------------------------------------------------
class AdvancedSyncTextureUpdate : public ShaderImageLoadStoreBase
{
	GLuint m_texture;
	GLuint m_store_program;
	GLuint m_draw_program;
	GLuint m_vao;
	GLuint m_vbo;
	GLuint m_pbo;

	virtual long Setup()
	{
		m_texture		= 0;
		m_store_program = 0;
		m_draw_program  = 0;
		m_vao			= 0;
		m_vbo			= 0;
		m_pbo			= 0;
		return NO_ERROR;
	}

	virtual long Run()
	{
		const char* const glsl_vs =
			"#version 420 core" NL "layout(location = 0) in vec4 i_position;" NL "out vec2 vs_texcoord;" NL
			"void main() {" NL "  gl_Position = i_position;" NL "  vs_texcoord = 0.5 + 0.5 * i_position.xy;" NL "}";
		const char* const glsl_store_fs =
			"#version 420 core" NL "writeonly uniform image2D g_image;" NL "void main() {" NL
			"  imageStore(g_image, ivec2(gl_FragCoord.xy), gl_FragCoord);" NL "  discard;" NL "}";
		const char* const glsl_draw_fs =
			"#version 420 core" NL "in vec2 vs_texcoord;" NL "layout(location = 0) out vec4 o_color;" NL
			"uniform sampler2D g_sampler;" NL "void main() {" NL "  o_color = texture(g_sampler, vs_texcoord);" NL "}";
		m_store_program = BuildProgram(glsl_vs, NULL, NULL, NULL, glsl_store_fs);
		m_draw_program  = BuildProgram(glsl_vs, NULL, NULL, NULL, glsl_draw_fs);

		std::vector<vec4> data(16 * 16, vec4(1.0f));
		glGenBuffers(1, &m_pbo);
		glBindBuffer(GL_PIXEL_UNPACK_BUFFER, m_pbo);
		glBufferData(GL_PIXEL_UNPACK_BUFFER, 16 * 16 * sizeof(vec4), &data[0], GL_DYNAMIC_READ);
		glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0);

		glGenTextures(1, &m_texture);
		glBindTexture(GL_TEXTURE_2D, m_texture);
		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
		glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, 16, 16, 0, GL_RGBA, GL_FLOAT, NULL);
		glBindTexture(GL_TEXTURE_2D, 0);

		CreateFullViewportQuad(&m_vao, &m_vbo, NULL);

		glViewport(0, 0, 16, 16);
		glBindImageTexture(0, m_texture, 0, GL_FALSE, 0, GL_WRITE_ONLY, GL_RGBA32F);
		glUseProgram(m_store_program);
		glBindVertexArray(m_vao);
		glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

		glBindBuffer(GL_PIXEL_UNPACK_BUFFER, m_pbo);
		glBindTexture(GL_TEXTURE_2D, m_texture);
		glMemoryBarrier(GL_TEXTURE_UPDATE_BARRIER_BIT);
		glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 16, 16, GL_RGBA, GL_FLOAT, 0);
		glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0);

		glViewport(0, 0, getWindowWidth(), getWindowHeight());
		glClear(GL_COLOR_BUFFER_BIT);
		glUseProgram(m_draw_program);
		glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

		if (!ValidateReadBuffer(0, 0, getWindowWidth(), getWindowHeight(), vec4(1, 1, 1, 1)))
		{
			return ERROR;
		}
		return NO_ERROR;
	}

	virtual long Cleanup()
	{
		glUseProgram(0);
		glDeleteBuffers(1, &m_vbo);
		glDeleteBuffers(1, &m_pbo);
		glDeleteTextures(1, &m_texture);
		glDeleteProgram(m_store_program);
		glDeleteProgram(m_draw_program);
		glDeleteVertexArrays(1, &m_vao);
		return NO_ERROR;
	}
};
//-----------------------------------------------------------------------------
// 2.1.6 AdvancedSyncImageAccess2
//-----------------------------------------------------------------------------
class AdvancedSyncImageAccess2 : public ShaderImageLoadStoreBase
{
	GLuint m_texture;
	GLuint m_store_program;
	GLuint m_draw_program;
	GLuint m_vao;
	GLuint m_vbo;

	virtual long Setup()
	{
		m_texture		= 0;
		m_store_program = 0;
		m_draw_program  = 0;
		m_vao			= 0;
		m_vbo			= 0;
		return NO_ERROR;
	}

	virtual long Run()
	{
		const char* const glsl_vs =
			"#version 420 core" NL "layout(location = 0) in vec4 i_position;" NL "out vec2 vs_texcoord;" NL
			"void main() {" NL "  gl_Position = i_position;" NL "  vs_texcoord = 0.5 + 0.5 * i_position.xy;" NL "}";
		const char* const glsl_store_fs =
			"#version 420 core" NL "writeonly uniform image2D g_image;" NL "uniform vec4 g_color;" NL "void main() {" NL
			"  imageStore(g_image, ivec2(gl_FragCoord.xy), g_color);" NL "  discard;" NL "}";
		const char* const glsl_draw_fs =
			"#version 420 core" NL "in vec2 vs_texcoord;" NL "layout(location = 0) out vec4 o_color;" NL
			"uniform sampler2D g_sampler;" NL "void main() {" NL "  o_color = texture(g_sampler, vs_texcoord);" NL "}";
		m_store_program = BuildProgram(glsl_vs, NULL, NULL, NULL, glsl_store_fs);
		m_draw_program  = BuildProgram(glsl_vs, NULL, NULL, NULL, glsl_draw_fs);

		int width  = getWindowWidth();
		int height = getWindowHeight();
		scaleDimensionsToMemory(width, height, 1, 1, 16, 16);

		glGenTextures(1, &m_texture);
		glBindTexture(GL_TEXTURE_2D, m_texture);
		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
		glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, width, height, 0, GL_RGBA, GL_FLOAT, NULL);
		glBindTexture(GL_TEXTURE_2D, 0);

		CreateFullViewportQuad(&m_vao, &m_vbo, NULL);

		glViewport(0, 0, width, height);
		glBindImageTexture(0, m_texture, 0, GL_FALSE, 0, GL_WRITE_ONLY, GL_RGBA32F);
		glUseProgram(m_store_program);
		glUniform4f(glGetUniformLocation(m_store_program, "g_color"), 1.0f, 0.0f, 0.0f, 1.0f);
		glBindVertexArray(m_vao);
		glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

		glMemoryBarrier(GL_SHADER_IMAGE_ACCESS_BARRIER_BIT);

		glUniform4f(glGetUniformLocation(m_store_program, "g_color"), 0.0f, 1.0f, 0.0f, 1.0f);
		glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

		glClear(GL_COLOR_BUFFER_BIT);
		glBindTexture(GL_TEXTURE_2D, m_texture);
		glUseProgram(m_draw_program);
		glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

		if (!ValidateReadBuffer(0, 0, width, height, vec4(0, 1, 0, 1)))
		{
			return ERROR;
		}
		return NO_ERROR;
	}

	virtual long Cleanup()
	{
		glViewport(0, 0, getWindowWidth(), getWindowHeight());
		glUseProgram(0);
		glDeleteBuffers(1, &m_vbo);
		glDeleteTextures(1, &m_texture);
		glDeleteProgram(m_store_program);
		glDeleteProgram(m_draw_program);
		glDeleteVertexArrays(1, &m_vao);
		return NO_ERROR;
	}
};
//-----------------------------------------------------------------------------
// 2.1.7 AdvancedSyncBufferUpdate
//-----------------------------------------------------------------------------
class AdvancedSyncBufferUpdate : public ShaderImageLoadStoreBase
{
	GLuint m_buffer;
	GLuint m_buffer_tex;
	GLuint m_store_program;
	GLuint m_attribless_vao;

	virtual long Setup()
	{
		m_buffer		 = 0;
		m_buffer_tex	 = 0;
		m_store_program  = 0;
		m_attribless_vao = 0;
		return NO_ERROR;
	}

	virtual long Run()
	{
		if (!SupportedInVS(1))
			return NOT_SUPPORTED;
		const char* const glsl_store_vs =
			"#version 420 core" NL "writeonly uniform imageBuffer g_output_data;" NL "void main() {" NL
			"  imageStore(g_output_data, gl_VertexID, vec4(gl_VertexID));" NL "}";
		m_store_program = BuildProgram(glsl_store_vs, NULL, NULL, NULL, NULL);

		glGenVertexArrays(1, &m_attribless_vao);
		glBindVertexArray(m_attribless_vao);

		glGenBuffers(1, &m_buffer);
		glBindBuffer(GL_TEXTURE_BUFFER, m_buffer);
		glBufferData(GL_TEXTURE_BUFFER, sizeof(vec4) * 1000, NULL, GL_DYNAMIC_DRAW);
		glBindBuffer(GL_TEXTURE_BUFFER, 0);

		glGenTextures(1, &m_buffer_tex);
		glBindTexture(GL_TEXTURE_BUFFER, m_buffer_tex);
		glTexBuffer(GL_TEXTURE_BUFFER, GL_RGBA32F, m_buffer);

		glBindImageTexture(0, m_buffer_tex, 0, GL_FALSE, 0, GL_READ_WRITE, GL_RGBA32F);

		glEnable(GL_RASTERIZER_DISCARD);
		glUseProgram(m_store_program);
		glDrawArrays(GL_POINTS, 0, 1000);

		glMemoryBarrier(GL_BUFFER_UPDATE_BARRIER_BIT);

		glBindBuffer(GL_TEXTURE_BUFFER, m_buffer);
		vec4* ptr =
			reinterpret_cast<vec4*>(glMapBufferRange(GL_TEXTURE_BUFFER, 0, 1000 * sizeof(vec4), GL_MAP_READ_BIT));
		for (int i = 0; i < 1000; ++i)
		{
			if (!IsEqual(ptr[i], vec4(static_cast<float>(i))))
			{
				m_context.getTestContext().getLog()
					<< tcu::TestLog::Message << "Bad buffer value found at index " << i << tcu::TestLog::EndMessage;
				return ERROR;
			}
		}
		return NO_ERROR;
	}

	virtual long Cleanup()
	{
		glDisable(GL_RASTERIZER_DISCARD);
		glUseProgram(0);
		glDeleteBuffers(1, &m_buffer);
		glDeleteTextures(1, &m_buffer_tex);
		glDeleteProgram(m_store_program);
		glDeleteVertexArrays(1, &m_attribless_vao);
		return NO_ERROR;
	}
};
//-----------------------------------------------------------------------------
// 2.2.1 AdvancedAllStagesOneImage
//-----------------------------------------------------------------------------
class AdvancedAllStagesOneImage : public ShaderImageLoadStoreBase
{
	GLuint m_program;
	GLuint m_vao;
	GLuint m_vbo;
	GLuint m_ebo;
	GLuint m_buffer;
	GLuint m_buffer_tex;
	GLuint m_texture;

	virtual long Setup()
	{
		m_program	= 0;
		m_vao		 = 0;
		m_vbo		 = 0;
		m_ebo		 = 0;
		m_buffer	 = 0;
		m_buffer_tex = 0;
		m_texture	= 0;
		return NO_ERROR;
	}

	virtual long Run()
	{
		if (!SupportedInGeomStages(2))
			return NOT_SUPPORTED;
		const char* const glsl_vs =
			"#version 420 core" NL "layout(location = 0) in vec4 i_position;" NL
			"layout(r32i) coherent uniform iimageBuffer g_buffer;" NL
			"layout(r32ui) coherent uniform uimage2D g_image;" NL "void main() {" NL
			"  gl_Position = i_position + vec4(1.0, 1.0, 0.0, 0.0);" NL "  imageAtomicAdd(g_buffer, 0, 1);" NL
			"  imageAtomicAdd(g_image, ivec2(0, 0), 2u);" NL "}";
		const char* const glsl_tcs =
			"#version 420 core" NL "layout(vertices = 1) out;" NL
			"layout(r32i) coherent uniform iimageBuffer g_buffer;" NL
			"layout(r32ui) coherent uniform uimage2D g_image;" NL "void main() {" NL
			"  gl_out[gl_InvocationID].gl_Position = gl_in[0].gl_Position;" NL "  gl_TessLevelInner[0] = 1.0;" NL
			"  gl_TessLevelInner[1] = 1.0;" NL "  gl_TessLevelOuter[0] = 1.0;" NL "  gl_TessLevelOuter[1] = 1.0;" NL
			"  gl_TessLevelOuter[2] = 1.0;" NL "  gl_TessLevelOuter[3] = 1.0;" NL "  imageAtomicAdd(g_buffer, 0, 1);" NL
			"  imageAtomicAdd(g_image, ivec2(0, 0), 2u);" NL "}";
		const char* const glsl_tes =
			"#version 420 core" NL "layout(triangles, point_mode) in;" NL
			"layout(r32i) coherent uniform iimageBuffer g_buffer;" NL
			"layout(r32ui) coherent uniform uimage2D g_image;" NL "void main() {" NL
			"  imageAtomicAdd(g_buffer, 0, 1);" NL "  imageAtomicAdd(g_image, ivec2(0, 0), 2u);" NL
			"  gl_Position = gl_in[0].gl_Position;" NL "}";
		const char* const glsl_gs =
			"#version 420 core" NL "layout(points) in;" NL "layout(points, max_vertices = 1) out;" NL
			"layout(r32i) coherent uniform iimageBuffer g_buffer;" NL
			"layout(r32ui) coherent uniform uimage2D g_image;" NL "void main() {" NL
			"  imageAtomicAdd(g_buffer, 0, 1);" NL "  imageAtomicAdd(g_image, ivec2(0, 0), 2u);" NL
			"  gl_Position = gl_in[0].gl_Position;" NL "  EmitVertex();" NL "}";
		const char* const glsl_fs =
			"#version 420 core" NL "layout(location = 0) out vec4 o_color;" NL
			"layout(r32i) coherent uniform iimageBuffer g_buffer;" NL
			"layout(r32ui) coherent uniform uimage2D g_image;" NL "void main() {" NL
			"  imageAtomicAdd(g_buffer, 0, 1);" NL "  imageAtomicAdd(g_image, ivec2(0, 0), 2u);" NL
			"  o_color = vec4(0.0, 1.0, 0.0, 1.0);" NL "}";
		m_program = BuildProgram(glsl_vs, glsl_tcs, glsl_tes, glsl_gs, glsl_fs);
		glUseProgram(m_program);
		glUniform1i(glGetUniformLocation(m_program, "g_buffer"), 0);
		glUniform1i(glGetUniformLocation(m_program, "g_image"), 1);

		CreateFullViewportQuad(&m_vao, &m_vbo, &m_ebo);

		GLint i32 = 0;
		glGenBuffers(1, &m_buffer);
		glBindBuffer(GL_TEXTURE_BUFFER, m_buffer);
		glBufferData(GL_TEXTURE_BUFFER, 4, &i32, GL_STATIC_DRAW);
		glBindBuffer(GL_TEXTURE_BUFFER, 0);

		glGenTextures(1, &m_buffer_tex);
		glBindTexture(GL_TEXTURE_BUFFER, m_buffer_tex);
		glTexBuffer(GL_TEXTURE_BUFFER, GL_R32I, m_buffer);
		glBindTexture(GL_TEXTURE_BUFFER, 0);

		GLuint ui32 = 0;
		glGenTextures(1, &m_texture);
		glBindTexture(GL_TEXTURE_2D, m_texture);
		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
		glTexImage2D(GL_TEXTURE_2D, 0, GL_R32UI, 1, 1, 0, GL_RED_INTEGER, GL_UNSIGNED_INT, &ui32);
		glBindTexture(GL_TEXTURE_2D, 0);

		glBindImageTexture(0, m_buffer_tex, 0, GL_FALSE, 0, GL_READ_WRITE, GL_R32I);
		glBindImageTexture(1, m_texture, 0, GL_FALSE, 0, GL_READ_WRITE, GL_R32UI);

		glBindVertexArray(m_vao);
		glPatchParameteri(GL_PATCH_VERTICES, 1);

		glDrawElementsInstancedBaseVertex(GL_PATCHES, 1, GL_UNSIGNED_SHORT, 0, 1, 0);
		glDrawElementsInstanced(GL_PATCHES, 1, GL_UNSIGNED_SHORT, 0, 1);

		glMemoryBarrier(GL_BUFFER_UPDATE_BARRIER_BIT);
		glBindBuffer(GL_TEXTURE_BUFFER, m_buffer);
		glGetBufferSubData(GL_TEXTURE_BUFFER, 0, 4, &i32);
		if (i32 < 20 || i32 > 50)
		{
			m_context.getTestContext().getLog() << tcu::TestLog::Message << "Buffer value is " << i32
												<< " should be in the range [20;50]" << tcu::TestLog::EndMessage;
			return ERROR;
		}

		glBindTexture(GL_TEXTURE_2D, m_texture);
		glGetTexImage(GL_TEXTURE_2D, 0, GL_RED_INTEGER, GL_UNSIGNED_INT, &ui32);
		if (ui32 < 40 || ui32 != static_cast<GLuint>(2 * i32))
		{
			m_context.getTestContext().getLog() << tcu::TestLog::Message << "Texture value is " << ui32 << " should be "
												<< (2 * i32) << tcu::TestLog::EndMessage;
			return ERROR;
		}

		return NO_ERROR;
	}

	virtual long Cleanup()
	{
		glPatchParameteri(GL_PATCH_VERTICES, 3);
		glUseProgram(0);
		glDeleteBuffers(1, &m_buffer);
		glDeleteBuffers(1, &m_vbo);
		glDeleteBuffers(1, &m_ebo);
		glDeleteTextures(1, &m_buffer_tex);
		glDeleteTextures(1, &m_texture);
		glDeleteProgram(m_program);
		glDeleteVertexArrays(1, &m_vao);
		return NO_ERROR;
	}
};
//-----------------------------------------------------------------------------
// 2.3.1 AdvancedMemoryDependentInvocation
//-----------------------------------------------------------------------------
class AdvancedMemoryDependentInvocation : public ShaderImageLoadStoreBase
{
	GLuint m_buffer;
	GLuint m_buffer_tex;
	GLuint m_texture;
	GLuint m_program;
	GLuint m_vao;
	GLuint m_vbo;

	virtual long Setup()
	{
		m_buffer	 = 0;
		m_buffer_tex = 0;
		m_texture	= 0;
		m_program	= 0;
		m_vao		 = 0;
		m_vbo		 = 0;
		return NO_ERROR;
	}

	virtual long Run()
	{
		if (!SupportedInVS(2))
			return NOT_SUPPORTED;
		const char* const glsl_vs =
			"#version 420 core" NL "layout(location = 0) in vec4 i_position;" NL
			"layout(location = 1) in vec4 i_color;" NL "out vec4 vs_color;" NL
			"layout(rgba32f) coherent uniform imageBuffer g_buffer;" NL
			"layout(rgba32f) coherent uniform image2D g_image;" NL "void main() {" NL "  gl_Position = i_position;" NL
			"  vs_color = i_color;" NL "  imageStore(g_buffer, 0, vec4(1.0));" NL
			"  imageStore(g_image, ivec2(0, 0), vec4(2.0));" NL "  memoryBarrier();" NL "}";
		const char* const glsl_fs =
			"#version 420 core" NL "in vec4 vs_color;" NL "layout(location = 0) out vec4 o_color;" NL
			"layout(rgba32f) coherent uniform imageBuffer g_buffer;" NL
			"layout(rgba32f) coherent uniform image2D g_image;" NL "void main() {" NL "  o_color = vs_color;" NL
			"  if (imageLoad(g_buffer, 0) != vec4(1.0)) o_color = vec4(1.0, 0.0, 0.0, 0.1);" NL
			"  if (imageLoad(g_image, ivec2(0, 0)) != vec4(2.0)) o_color = vec4(1.0, 0.0, 0.0, 0.2);" NL "}";
		m_program = BuildProgram(glsl_vs, NULL, NULL, NULL, glsl_fs);
		glUseProgram(m_program);
		glUniform1i(glGetUniformLocation(m_program, "g_buffer"), 0);
		glUniform1i(glGetUniformLocation(m_program, "g_image"), 1);

		vec4 zero(0);
		glGenBuffers(1, &m_buffer);
		glBindBuffer(GL_TEXTURE_BUFFER, m_buffer);
		glBufferData(GL_TEXTURE_BUFFER, sizeof(vec4), &zero, GL_STATIC_DRAW);
		glBindBuffer(GL_TEXTURE_BUFFER, 0);

		glGenTextures(1, &m_buffer_tex);
		glBindTexture(GL_TEXTURE_BUFFER, m_buffer_tex);
		glTexBuffer(GL_TEXTURE_BUFFER, GL_RGBA32F, m_buffer);
		glBindTexture(GL_TEXTURE_BUFFER, 0);

		glGenTextures(1, &m_texture);
		glBindTexture(GL_TEXTURE_2D, m_texture);
		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
		glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, 1, 1, 0, GL_RGBA, GL_FLOAT, &zero);
		glBindTexture(GL_TEXTURE_2D, 0);

		glBindImageTexture(0, m_buffer_tex, 0, GL_FALSE, 0, GL_READ_WRITE, GL_RGBA32F);
		glBindImageTexture(1, m_texture, 0, GL_FALSE, 0, GL_READ_WRITE, GL_RGBA32F);

		CreateFullViewportQuad(&m_vao, &m_vbo, NULL);

		glClear(GL_COLOR_BUFFER_BIT);
		glBindVertexArray(m_vao);
		glDrawArraysInstancedBaseInstance(GL_TRIANGLE_STRIP, 0, 4, 1, 0);

		if (!ValidateReadBuffer(0, 0, getWindowWidth(), getWindowHeight(), vec4(0, 1, 0, 1)))
		{
			return ERROR;
		}
		return NO_ERROR;
	}

	virtual long Cleanup()
	{
		glUseProgram(0);
		glDeleteBuffers(1, &m_vbo);
		glDeleteBuffers(1, &m_buffer);
		glDeleteTextures(1, &m_texture);
		glDeleteTextures(1, &m_buffer_tex);
		glDeleteProgram(m_program);
		glDeleteVertexArrays(1, &m_vao);
		return NO_ERROR;
	}
};
//-----------------------------------------------------------------------------
// 2.3.2 AdvancedMemoryOrder
//-----------------------------------------------------------------------------
class AdvancedMemoryOrder : public ShaderImageLoadStoreBase
{
	GLuint m_buffer;
	GLuint m_buffer_tex;
	GLuint m_texture;
	GLuint m_program;
	GLuint m_vao;
	GLuint m_vbo;

	virtual long Setup()
	{
		m_buffer	 = 0;
		m_buffer_tex = 0;
		m_texture	= 0;
		m_program	= 0;
		m_vao		 = 0;
		m_vbo		 = 0;
		return NO_ERROR;
	}

	virtual long Run()
	{
		if (!SupportedInVS(1))
			return NOT_SUPPORTED;
		const char* const glsl_vs =
			"#version 420 core" NL "layout(location = 0) in vec4 i_position;" NL "out vec4 vs_color;" NL
			"layout(rgba32f) coherent uniform imageBuffer g_buffer;" NL "void main() {" NL
			"  gl_Position = i_position;" NL "  vs_color = vec4(0, 1, 0, 1);" NL
			"  imageStore(g_buffer, gl_VertexID, vec4(1.0));" NL "  imageStore(g_buffer, gl_VertexID, vec4(2.0));" NL
			"  imageStore(g_buffer, gl_VertexID, vec4(3.0));" NL
			"  if (imageLoad(g_buffer, gl_VertexID) != vec4(3.0)) vs_color = vec4(1, 0, 0, 1);" NL "}";
		const char* const glsl_fs =
			"#version 420 core" NL "in vec4 vs_color;" NL "layout(location = 0) out vec4 o_color;" NL
			"layout(rgba32f) uniform image2D g_image;" NL "void main() {" NL "  o_color = vs_color;" NL
			"  ivec2 coord = ivec2(gl_FragCoord);" NL "  for (int i = 0; i < 3; ++i) {" NL
			"    imageStore(g_image, coord, vec4(i));" NL "    vec4 v = imageLoad(g_image, coord);" NL
			"    if (v != vec4(i)) {" NL "      o_color = vec4(v.xyz, 0.0);" NL "      break;" NL "    }" NL "  }" NL
			"}";
		m_program = BuildProgram(glsl_vs, NULL, NULL, NULL, glsl_fs);
		glUseProgram(m_program);
		glUniform1i(glGetUniformLocation(m_program, "g_buffer"), 0);
		glUniform1i(glGetUniformLocation(m_program, "g_image"), 1);

		glGenBuffers(1, &m_buffer);
		glBindBuffer(GL_TEXTURE_BUFFER, m_buffer);
		glBufferData(GL_TEXTURE_BUFFER, sizeof(vec4) * 4, NULL, GL_STATIC_DRAW);
		glBindBuffer(GL_TEXTURE_BUFFER, 0);

		glGenTextures(1, &m_buffer_tex);
		glBindTexture(GL_TEXTURE_BUFFER, m_buffer_tex);
		glTexBuffer(GL_TEXTURE_BUFFER, GL_RGBA32F, m_buffer);
		glBindTexture(GL_TEXTURE_BUFFER, 0);

		int width  = getWindowWidth();
		int height = getWindowHeight();
		scaleDimensionsToMemory(width, height, 1, 2, 16, 16);

		std::vector<vec4> data(width * height);
		glGenTextures(1, &m_texture);
		glBindTexture(GL_TEXTURE_2D, m_texture);
		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
		glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, width, height, 0, GL_RGBA, GL_FLOAT, &data[0]);
		glBindTexture(GL_TEXTURE_2D, 0);

		glBindImageTexture(0, m_buffer_tex, 0, GL_FALSE, 0, GL_READ_WRITE, GL_RGBA32F);
		glBindImageTexture(1, m_texture, 0, GL_FALSE, 0, GL_READ_WRITE, GL_RGBA32F);

		CreateFullViewportQuad(&m_vao, &m_vbo, NULL);

		glClear(GL_COLOR_BUFFER_BIT);
		glViewport(0, 0, width, height);
		glBindVertexArray(m_vao);
		glDrawArraysInstancedBaseInstance(GL_TRIANGLE_STRIP, 0, 4, 1, 0);

		if (!ValidateReadBuffer(0, 0, width, height, vec4(0, 1, 0, 1)))
		{
			return ERROR;
		}
		return NO_ERROR;
	}

	virtual long Cleanup()
	{
		glViewport(0, 0, getWindowWidth(), getWindowHeight());
		glUseProgram(0);
		glDeleteBuffers(1, &m_vbo);
		glDeleteBuffers(1, &m_buffer);
		glDeleteTextures(1, &m_texture);
		glDeleteTextures(1, &m_buffer_tex);
		glDeleteProgram(m_program);
		glDeleteVertexArrays(1, &m_vao);
		return NO_ERROR;
	}
};
//-----------------------------------------------------------------------------
// 2.4.1 AdvancedSSOSimple
//-----------------------------------------------------------------------------
class AdvancedSSOSimple : public ShaderImageLoadStoreBase
{
	GLuint m_texture;
	GLuint m_pipeline[2];
	GLuint m_vsp, m_fsp0, m_fsp1;
	GLuint m_vao, m_vbo;

	virtual long Setup()
	{
		glGenTextures(1, &m_texture);
		glGenProgramPipelines(2, m_pipeline);
		CreateFullViewportQuad(&m_vao, &m_vbo, NULL);

		const char* const glsl_vs =
			"#version 420 core" NL "layout(location = 0) in vec4 i_position;" NL "out gl_PerVertex {" NL
			"  vec4 gl_Position;" NL "};" NL "void main() {" NL "  gl_Position = i_position;" NL "}";
		const char* const glsl_fs0 =
			"#version 420 core" NL "layout(rgba32f) uniform image2D g_image[4];" NL "void main() {" NL
			"  for (int i = 0; i < g_image.length(); ++i) {" NL
			"    imageStore(g_image[i], ivec2(gl_FragCoord), vec4(1.0));" NL "  }" NL "  discard;" NL "}";
		const char* const glsl_fs1 =
			"#version 420 core" NL "writeonly uniform image2D g_image[4];" NL "void main() {" NL
			"  for (int i = 0; i < g_image.length(); ++i) {" NL
			"    imageStore(g_image[i], ivec2(gl_FragCoord), vec4(2.0));" NL "  }" NL "  discard;" NL "}";
		m_vsp  = BuildShaderProgram(GL_VERTEX_SHADER, glsl_vs);
		m_fsp0 = BuildShaderProgram(GL_FRAGMENT_SHADER, glsl_fs0);
		m_fsp1 = BuildShaderProgram(GL_FRAGMENT_SHADER, glsl_fs1);

		return NO_ERROR;
	}

	virtual long Run()
	{
		glProgramUniform1i(m_fsp0, glGetUniformLocation(m_fsp0, "g_image[0]"), 0);
		glProgramUniform1i(m_fsp0, glGetUniformLocation(m_fsp0, "g_image[1]"), 2);
		glProgramUniform1i(m_fsp0, glGetUniformLocation(m_fsp0, "g_image[2]"), 4);
		glProgramUniform1i(m_fsp0, glGetUniformLocation(m_fsp0, "g_image[3]"), 6);

		glProgramUniform1i(m_fsp1, glGetUniformLocation(m_fsp1, "g_image[0]"), 1);
		glProgramUniform1i(m_fsp1, glGetUniformLocation(m_fsp1, "g_image[1]"), 3);
		glProgramUniform1i(m_fsp1, glGetUniformLocation(m_fsp1, "g_image[2]"), 5);
		glProgramUniform1i(m_fsp1, glGetUniformLocation(m_fsp1, "g_image[3]"), 7);

		glUseProgramStages(m_pipeline[0], GL_VERTEX_SHADER_BIT, m_vsp);
		glUseProgramStages(m_pipeline[0], GL_FRAGMENT_SHADER_BIT, m_fsp0);

		glUseProgramStages(m_pipeline[1], GL_VERTEX_SHADER_BIT, m_vsp);
		glUseProgramStages(m_pipeline[1], GL_FRAGMENT_SHADER_BIT, m_fsp1);

		int width  = getWindowWidth();
		int height = getWindowHeight();
		scaleDimensionsToMemory(width, height, 8, 8, 16, 16);

		glBindTexture(GL_TEXTURE_2D_ARRAY, m_texture);
		glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
		glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA32F, width, height, 8, 0, GL_RGBA, GL_FLOAT, NULL);

		glBindImageTexture(0, m_texture, 0, GL_FALSE, 0, GL_READ_WRITE, GL_RGBA32F);
		glBindImageTexture(1, m_texture, 0, GL_FALSE, 1, GL_READ_WRITE, GL_RGBA32F);
		glBindImageTexture(2, m_texture, 0, GL_FALSE, 2, GL_READ_WRITE, GL_RGBA32F);
		glBindImageTexture(3, m_texture, 0, GL_FALSE, 3, GL_READ_WRITE, GL_RGBA32F);
		glBindImageTexture(4, m_texture, 0, GL_FALSE, 4, GL_READ_WRITE, GL_RGBA32F);
		glBindImageTexture(5, m_texture, 0, GL_FALSE, 5, GL_READ_WRITE, GL_RGBA32F);
		glBindImageTexture(6, m_texture, 0, GL_FALSE, 6, GL_READ_WRITE, GL_RGBA32F);
		glBindImageTexture(7, m_texture, 0, GL_FALSE, 7, GL_READ_WRITE, GL_RGBA32F);

		glBindVertexArray(m_vao);

		glViewport(0, 0, width, height);
		glBindProgramPipeline(m_pipeline[0]);
		glDrawArraysInstancedBaseInstance(GL_TRIANGLE_STRIP, 0, 4, 1, 0);

		glBindProgramPipeline(m_pipeline[1]);
		glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

		std::vector<vec4> data(width * height * 8);
		glGetTexImage(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA, GL_FLOAT, &data[0]);

		for (int layer = 0; layer < 8; ++layer)
		{
			for (int h = 0; h < height; ++h)
			{
				for (int w = 0; w < width; ++w)
				{
					const vec4 c = data[layer * width * height + h * width + w];
					if (layer % 2)
					{
						if (!IsEqual(c, vec4(2.0f)))
						{
							return ERROR;
						}
					}
					else
					{
						if (!IsEqual(c, vec4(1.0f)))
						{
							return ERROR;
						}
					}
				}
			}
		}
		return NO_ERROR;
	}

	virtual long Cleanup()
	{
		glViewport(0, 0, getWindowWidth(), getWindowHeight());
		glDeleteBuffers(1, &m_vbo);
		glDeleteTextures(1, &m_texture);
		glDeleteProgram(m_vsp);
		glDeleteProgram(m_fsp0);
		glDeleteProgram(m_fsp1);
		glDeleteVertexArrays(1, &m_vao);
		glDeleteProgramPipelines(2, m_pipeline);
		return NO_ERROR;
	}
};
//-----------------------------------------------------------------------------
// 2.4.2 AdvancedSSOAtomicCounters
//-----------------------------------------------------------------------------
class AdvancedSSOAtomicCounters : public ShaderImageLoadStoreBase
{
	GLuint m_buffer, m_buffer_tex;
	GLuint m_counter_buffer;
	GLuint m_transform_buffer;
	GLuint m_pipeline;
	GLuint m_vao, m_vbo;
	GLuint m_vsp, m_fsp;

	virtual long Setup()
	{
		m_vao = 0;
		m_vbo = 0;
		m_vsp = 0;
		m_fsp = 0;
		glGenBuffers(1, &m_buffer);
		glGenTextures(1, &m_buffer_tex);
		glGenBuffers(1, &m_counter_buffer);
		glGenBuffers(1, &m_transform_buffer);
		glGenProgramPipelines(1, &m_pipeline);
		return NO_ERROR;
	}

	virtual long Run()
	{
		if (!SupportedInVS(1))
			return NOT_SUPPORTED;

		CreateFullViewportQuad(&m_vao, &m_vbo, NULL);
		const char* const glsl_vs =
			"#version 420 core" NL "layout(location = 0) in vec4 i_position;" NL
			"layout(location = 1) in vec4 i_color;" NL "layout(location = 3) out vec4 o_color;" NL
			"out gl_PerVertex {" NL "  vec4 gl_Position;" NL "};" NL "layout(std140) uniform Transform {" NL
			"  mat4 mvp;" NL "} g_transform;" NL "writeonly uniform imageBuffer g_buffer;" NL
			"layout(binding = 0, offset = 0) uniform atomic_uint g_counter;" NL "void main() {" NL
			"  gl_Position = g_transform.mvp * i_position;" NL "  o_color = i_color;" NL
			"  const uint index = atomicCounterIncrement(g_counter);" NL
			"  imageStore(g_buffer, int(index), gl_Position);" NL "}";
		const char* const glsl_fs =
			"#version 420 core" NL "layout(location = 3) in vec4 i_color;" NL
			"layout(location = 0) out vec4 o_color;" NL "void main() {" NL "  o_color = i_color;" NL "}";
		m_vsp = BuildShaderProgram(GL_VERTEX_SHADER, glsl_vs);
		m_fsp = BuildShaderProgram(GL_FRAGMENT_SHADER, glsl_fs);

		glUseProgramStages(m_pipeline, GL_VERTEX_SHADER_BIT, m_vsp);
		glUseProgramStages(m_pipeline, GL_FRAGMENT_SHADER_BIT, m_fsp);

		glBindBuffer(GL_TEXTURE_BUFFER, m_buffer);
		glBufferData(GL_TEXTURE_BUFFER, sizeof(vec4) * 4, NULL, GL_STATIC_DRAW);

		glBindTexture(GL_TEXTURE_BUFFER, m_buffer_tex);
		glTexBuffer(GL_TEXTURE_BUFFER, GL_RGBA32F, m_buffer);

		glBindBuffer(GL_ATOMIC_COUNTER_BUFFER, m_counter_buffer);
		vec4 zero(0);
		glBufferData(GL_ATOMIC_COUNTER_BUFFER, sizeof(GLuint), &zero, GL_STATIC_DRAW);

		glBindBuffer(GL_UNIFORM_BUFFER, m_transform_buffer);
		mat4 identity(1);
		glBufferData(GL_UNIFORM_BUFFER, sizeof(mat4), &identity, GL_STATIC_DRAW);

		glClear(GL_COLOR_BUFFER_BIT);
		glBindBufferBase(GL_ATOMIC_COUNTER_BUFFER, 0, m_counter_buffer);
		glBindBufferBase(GL_UNIFORM_BUFFER, 0, m_transform_buffer);
		glBindImageTexture(0, m_buffer_tex, 0, GL_FALSE, 0, GL_READ_WRITE, GL_RGBA32F);
		glBindVertexArray(m_vao);
		glBindProgramPipeline(m_pipeline);
		glDrawArraysInstancedBaseInstance(GL_TRIANGLE_STRIP, 0, 4, 1, 0);

		if (!ValidateReadBuffer(0, 0, getWindowWidth(), getWindowHeight(), vec4(0, 1, 0, 1)))
		{
			return ERROR;
		}

		std::vector<vec4> data(4);
		glBindBuffer(GL_TEXTURE_BUFFER, m_buffer);
		glGetBufferSubData(GL_TEXTURE_BUFFER, 0, sizeof(vec4) * 4, &data[0]);

		for (int i = 0; i < 4; ++i)
		{
			if (!IsEqual(data[i], vec4(-1.0f, -1.0f, 0.0f, 1.0f)) && !IsEqual(data[i], vec4(1.0f, -1.0f, 0.0f, 1.0f)) &&
				!IsEqual(data[i], vec4(-1.0f, 1.0f, 0.0f, 1.0f)) && !IsEqual(data[i], vec4(1.0f, 1.0f, 0.0f, 1.0f)))
			{
				return ERROR;
			}
		}

		return NO_ERROR;
	}

	virtual long Cleanup()
	{
		glDeleteBuffers(1, &m_buffer);
		glDeleteBuffers(1, &m_vbo);
		glDeleteBuffers(1, &m_counter_buffer);
		glDeleteBuffers(1, &m_transform_buffer);
		glDeleteTextures(1, &m_buffer_tex);
		glDeleteProgram(m_vsp);
		glDeleteProgram(m_fsp);
		glDeleteVertexArrays(1, &m_vao);
		glDeleteProgramPipelines(1, &m_pipeline);
		return NO_ERROR;
	}
};
//-----------------------------------------------------------------------------
// 2.4.3 AdvancedSSOSubroutine
//-----------------------------------------------------------------------------
class AdvancedSSOSubroutine : public ShaderImageLoadStoreBase
{
	GLuint m_texture;
	GLuint m_attribless_vao;
	GLuint m_program;
	GLint  m_draw_buffer;

	virtual long Setup()
	{
		glGenTextures(1, &m_texture);
		glGenVertexArrays(1, &m_attribless_vao);

		const char* const glsl_vs = "#version 420 core" NL "const int kSize = 3;" NL
									"const vec2 g_triangle[kSize] = vec2[3](vec2(-1, -1), vec2(3, -1), vec2(-1, 3));" NL
									"void main() {" NL "  gl_Position = vec4(g_triangle[gl_VertexID], 0, 1);" NL "}";
		const char* const glsl_fs =
			"#version 420 core" NL "writeonly uniform image2DArray g_image0;" NL
			"writeonly uniform image2DArray g_image1;" NL "subroutine void Brush(ivec2 coord);" NL
			"subroutine uniform Brush g_brush;" NL "subroutine(Brush) void Brush0(ivec2 coord) {" NL
			"  imageStore(g_image0, ivec3(coord, 0), vec4(1.0, 0.0, 0.0, 1.0));" NL
			"  imageStore(g_image0, ivec3(coord, 1), vec4(0.0, 1.0, 0.0, 1.0));" NL
			"  imageStore(g_image0, ivec3(coord, 2), vec4(0.0, 0.0, 1.0, 1.0));" NL "}" NL
			"subroutine(Brush) void Brush1(ivec2 coord) {" NL
			"  imageStore(g_image1, ivec3(coord, 0), vec4(0.0, 1.0, 0.0, 1.0));" NL
			"  imageStore(g_image1, ivec3(coord, 1), vec4(0.0, 0.0, 1.0, 1.0));" NL
			"  imageStore(g_image1, ivec3(coord, 2), vec4(1.0, 0.0, 0.0, 1.0));" NL "}" NL "void main() {" NL
			"  g_brush(ivec2(gl_FragCoord));" NL "}";
		m_program = BuildProgram(glsl_vs, NULL, NULL, NULL, glsl_fs);

		return NO_ERROR;
	}

	virtual long Run()
	{
		int width  = getWindowWidth();
		int height = getWindowHeight();
		scaleDimensionsToMemory(width, height, 3, 3, 16, 16);

		glProgramUniform1i(m_program, glGetUniformLocation(m_program, "g_image0"), 1);
		glProgramUniform1i(m_program, glGetUniformLocation(m_program, "g_image1"), 1);

		glBindTexture(GL_TEXTURE_2D_ARRAY, m_texture);
		glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
		glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA32F, width, height, 3, 0, GL_RGBA, GL_FLOAT, NULL);

		glGetIntegerv(GL_DRAW_BUFFER, &m_draw_buffer);

		glDrawBuffer(GL_NONE);
		glBindImageTexture(1, m_texture, 0, GL_TRUE, 0, GL_READ_WRITE, GL_RGBA32F);
		glUseProgram(m_program);
		glBindVertexArray(m_attribless_vao);

		const GLuint indices[2] = { glGetSubroutineIndex(m_program, GL_FRAGMENT_SHADER, "Brush0"),
									glGetSubroutineIndex(m_program, GL_FRAGMENT_SHADER, "Brush1") };

		glViewport(0, 0, width, height);
		glUniformSubroutinesuiv(GL_FRAGMENT_SHADER, 1, &indices[0]);
		glDrawArraysInstancedBaseInstance(GL_TRIANGLES, 0, 3, 1, 0);

		std::vector<vec4> data(width * height * 3);
		glMemoryBarrier(GL_TEXTURE_UPDATE_BARRIER_BIT);
		glGetTexImage(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA, GL_FLOAT, &data[0]);

		for (int layer = 0; layer < 3; ++layer)
		{
			for (int h = 0; h < height; ++h)
			{
				for (int w = 0; w < width; ++w)
				{
					const vec4 c = data[layer * width * height + h * width + w];
					if (layer == 0 && !IsEqual(c, vec4(1.0f, 0.0f, 0.0f, 1.0f)))
					{
						m_context.getTestContext().getLog()
							<< tcu::TestLog::Message << "Color is (" << c[0] << " " << c[1] << c[2] << " " << c[3]
							<< ") should be (1 0 0 1)" << tcu::TestLog::EndMessage;
						return ERROR;
					}
					else if (layer == 1 && !IsEqual(c, vec4(0.0f, 1.0f, 0.0f, 1.0f)))
					{
						m_context.getTestContext().getLog()
							<< tcu::TestLog::Message << "Color is (" << c[0] << " " << c[1] << c[2] << " " << c[3]
							<< ") should be (0 1 0 1)" << tcu::TestLog::EndMessage;
						return ERROR;
					}
					else if (layer == 2 && !IsEqual(c, vec4(0.0f, 0.0f, 1.0f, 1.0f)))
					{
						m_context.getTestContext().getLog()
							<< tcu::TestLog::Message << "Color is (" << c[0] << " " << c[1] << c[2] << " " << c[3]
							<< ") should be (0 0 1 1)" << tcu::TestLog::EndMessage;
						return ERROR;
					}
				}
			}
		}

		glUniformSubroutinesuiv(GL_FRAGMENT_SHADER, 1, &indices[1]);
		glDrawArraysInstancedBaseInstance(GL_TRIANGLES, 0, 3, 1, 0);

		glMemoryBarrier(GL_TEXTURE_UPDATE_BARRIER_BIT);
		glGetTexImage(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA, GL_FLOAT, &data[0]);

		for (int layer = 0; layer < 3; ++layer)
		{
			for (int h = 0; h < height; ++h)
			{
				for (int w = 0; w < width; ++w)
				{
					const vec4 c = data[layer * width * height + h * width + w];
					if (layer == 0 && !IsEqual(c, vec4(0.0f, 1.0f, 0.0f, 1.0f)))
					{
						m_context.getTestContext().getLog()
							<< tcu::TestLog::Message << "Color is (" << c[0] << " " << c[1] << c[2] << " " << c[3]
							<< ") should be (0 1 0 1)" << tcu::TestLog::EndMessage;
						return ERROR;
					}
					else if (layer == 1 && !IsEqual(c, vec4(0.0f, 0.0f, 1.0f, 1.0f)))
					{
						m_context.getTestContext().getLog()
							<< tcu::TestLog::Message << "Color is (" << c[0] << " " << c[1] << c[2] << " " << c[3]
							<< ") should be (0 0 1 1)" << tcu::TestLog::EndMessage;
						return ERROR;
					}
					else if (layer == 2 && !IsEqual(c, vec4(1.0f, 0.0f, 0.0f, 1.0f)))
					{
						m_context.getTestContext().getLog()
							<< tcu::TestLog::Message << "Color is (" << c[0] << " " << c[1] << c[2] << " " << c[3]
							<< ") should be (1 0 0 1)" << tcu::TestLog::EndMessage;
						return ERROR;
					}
				}
			}
		}
		return NO_ERROR;
	}

	virtual long Cleanup()
	{
		glViewport(0, 0, getWindowWidth(), getWindowHeight());
		glDrawBuffer(m_draw_buffer);
		glDeleteTextures(1, &m_texture);
		glUseProgram(0);
		glDeleteProgram(m_program);
		glDeleteVertexArrays(1, &m_attribless_vao);
		return NO_ERROR;
	}
};
//-----------------------------------------------------------------------------
// 2.4.4 AdvancedSSOPerSample
//-----------------------------------------------------------------------------
class AdvancedSSOPerSample : public ShaderImageLoadStoreBase
{
	GLuint m_texture;
	GLuint m_pipeline;
	GLuint m_vao, m_vbo, m_ebo;
	GLuint m_vsp, m_store_fsp, m_load_fsp;

	virtual long Setup()
	{
		m_vao		= 0;
		m_vbo		= 0;
		m_ebo		= 0;
		m_vsp		= 0;
		m_store_fsp = 0;
		m_load_fsp  = 0;
		glGenTextures(1, &m_texture);
		glGenProgramPipelines(1, &m_pipeline);

		return NO_ERROR;
	}

	virtual long Run()
	{
		if (!SupportedSamples(4))
			return NOT_SUPPORTED;

		CreateFullViewportQuad(&m_vao, &m_vbo, &m_ebo);

		const char* const glsl_vs =
			"#version 420 core" NL "layout(location = 0) in vec4 i_position;" NL "out gl_PerVertex {" NL
			"  vec4 gl_Position;" NL "};" NL "void main() {" NL "  gl_Position = i_position;" NL "}";
		const char* const glsl_store_fs =
			"#version 420 core" NL "layout(rgba32f) writeonly uniform image2DMS g_image;" NL "void main() {" NL
			"  imageStore(g_image, ivec2(gl_FragCoord), gl_SampleID, vec4(gl_SampleID+1));" NL "}";
		const char* const glsl_load_fs =
			"#version 420 core" NL "layout(location = 0) out vec4 o_color;" NL
			"layout(rgba32f) readonly uniform image2DMS g_image;" NL "void main() {" NL
			"  o_color = vec4(0.0, 1.0, 0.0, 1.0);" NL "  if (imageLoad(g_image, ivec2(gl_FragCoord), gl_SampleID) != "
			"vec4(gl_SampleID+1)) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL "}";
		m_vsp		= BuildShaderProgram(GL_VERTEX_SHADER, glsl_vs);
		m_store_fsp = BuildShaderProgram(GL_FRAGMENT_SHADER, glsl_store_fs);
		m_load_fsp  = BuildShaderProgram(GL_FRAGMENT_SHADER, glsl_load_fs);

		int width  = getWindowWidth();
		int height = getWindowHeight();
		scaleDimensionsToMemory(width, height, 1, 1, /* bpp*samples */ 16 * 4, 16);

		glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, m_texture);
		glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 4, GL_RGBA32F, width, height, GL_FALSE);
		glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, 0);

		glUseProgramStages(m_pipeline, GL_VERTEX_SHADER_BIT, m_vsp);
		glUseProgramStages(m_pipeline, GL_FRAGMENT_SHADER_BIT, m_store_fsp);

		glBindImageTexture(0, m_texture, 0, GL_FALSE, 0, GL_READ_WRITE, GL_RGBA32F);

		glClear(GL_COLOR_BUFFER_BIT);
		glViewport(0, 0, width, height);
		glBindVertexArray(m_vao);
		glBindProgramPipeline(m_pipeline);
		glDrawElementsInstancedBaseInstance(GL_TRIANGLE_STRIP, 4, GL_UNSIGNED_SHORT, 0, 1, 0);

		glMemoryBarrier(GL_SHADER_IMAGE_ACCESS_BARRIER_BIT);

		glUseProgramStages(m_pipeline, GL_FRAGMENT_SHADER_BIT, m_load_fsp);
		glDrawElementsInstancedBaseInstance(GL_TRIANGLE_STRIP, 4, GL_UNSIGNED_SHORT, 0, 1, 0);

		if (!ValidateReadBuffer(0, 0, width, height, vec4(0, 1, 0, 1)))
		{
			return ERROR;
		}
		return NO_ERROR;
	}

	virtual long Cleanup()
	{
		glViewport(0, 0, getWindowWidth(), getWindowHeight());
		glDeleteBuffers(1, &m_vbo);
		glDeleteBuffers(1, &m_ebo);
		glDeleteTextures(1, &m_texture);
		glDeleteProgram(m_vsp);
		glDeleteProgram(m_store_fsp);
		glDeleteProgram(m_load_fsp);
		glDeleteVertexArrays(1, &m_vao);
		glDeleteProgramPipelines(1, &m_pipeline);
		return NO_ERROR;
	}
};

//-----------------------------------------------------------------------------
// 2.5 AdvancedCopyImage
//-----------------------------------------------------------------------------
class AdvancedCopyImage : public ShaderImageLoadStoreBase
{
	GLuint m_texture[2];
	GLuint m_program;
	GLuint m_vao, m_vbo, m_ebo;

	virtual long Setup()
	{
		glGenTextures(2, m_texture);
		CreateFullViewportQuad(&m_vao, &m_vbo, &m_ebo);

		const char* const glsl_vs = "#version 420 core" NL "layout(location = 0) in vec4 i_position;" NL
									"void main() {" NL "  gl_Position = i_position;" NL "}";
		const char* const glsl_fs =
			"#version 420 core" NL "layout(rgba32f) readonly uniform image2D g_input_image;" NL
			"layout(rgba32f) writeonly uniform image2D g_output_image;" NL "void main() {" NL
			"  ivec2 coord = ivec2(gl_FragCoord);" NL
			"  imageStore(g_output_image, coord, imageLoad(g_input_image, coord));" NL "  discard;" NL "}";
		m_program = BuildProgram(glsl_vs, NULL, NULL, NULL, glsl_fs);

		return NO_ERROR;
	}

	virtual long Run()
	{
		int width  = getWindowWidth();
		int height = getWindowHeight();
		scaleDimensionsToMemory(width, height, 2, 2, 16, 16);

		glUseProgram(m_program);
		glUniform1i(glGetUniformLocation(m_program, "g_input_image"), 0);
		glUniform1i(glGetUniformLocation(m_program, "g_output_image"), 1);

		std::vector<vec4> data(width * height, vec4(7.0f));
		glBindTexture(GL_TEXTURE_2D, m_texture[0]);
		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
		glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, width, height, 0, GL_RGBA, GL_FLOAT, &data[0]);

		glBindTexture(GL_TEXTURE_2D, m_texture[1]);
		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
		glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, width, height, 0, GL_RGBA, GL_FLOAT, NULL);

		glBindTexture(GL_TEXTURE_2D, 0);

		glBindImageTexture(0, m_texture[0], 0, GL_FALSE, 0, GL_READ_ONLY, GL_RGBA32F);
		glBindImageTexture(1, m_texture[1], 0, GL_FALSE, 0, GL_WRITE_ONLY, GL_RGBA32F);

		glClear(GL_COLOR_BUFFER_BIT);
		glViewport(0, 0, width, height);
		glBindVertexArray(m_vao);
		glDrawElementsInstancedBaseInstance(GL_TRIANGLE_STRIP, 4, GL_UNSIGNED_SHORT, 0, 1, 0);

		std::vector<vec4> rdata(width * height);
		glBindTexture(GL_TEXTURE_2D, m_texture[1]);
		glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_FLOAT, &rdata[0]);

		for (int h = 0; h < height; ++h)
		{
			for (int w = 0; w < width; ++w)
			{
				if (!IsEqual(rdata[h * width + w], vec4(7.0f)))
				{
					return ERROR;
				}
			}
		}
		return NO_ERROR;
	}

	virtual long Cleanup()
	{
		glViewport(0, 0, getWindowWidth(), getWindowHeight());
		glUseProgram(0);
		glDeleteBuffers(1, &m_vbo);
		glDeleteBuffers(1, &m_ebo);
		glDeleteTextures(2, m_texture);
		glDeleteProgram(m_program);
		glDeleteVertexArrays(1, &m_vao);
		return NO_ERROR;
	}
};
//-----------------------------------------------------------------------------
// 2.6 AdvancedAllMips
//-----------------------------------------------------------------------------
class AdvancedAllMips : public ShaderImageLoadStoreBase
{
	GLuint m_texture;
	GLuint m_store_program, m_load_program;
	GLuint m_vao, m_vbo, m_ebo;

	virtual long Setup()
	{
		glGenTextures(1, &m_texture);
		CreateFullViewportQuad(&m_vao, &m_vbo, &m_ebo);

		const char* const glsl_vs = "#version 420 core" NL "layout(location = 0) in vec4 i_position;" NL
									"void main() {" NL "  gl_Position = i_position;" NL "}";
		const char* const glsl_store_fs =
			"#version 420 core" NL "layout(rgba32f) uniform image2D g_image[6];" NL "void main() {" NL
			"  for (int i = 0; i < 6; ++i) {" NL "    imageStore(g_image[i], ivec2(gl_FragCoord), vec4(i));" NL "  }" NL
			"  discard;" NL "}";
		const char* const glsl_load_fs =
			"#version 420 core" NL "layout(location = 0) out vec4 o_color;" NL
			"layout(rgba32f) uniform image2D g_image[6];" NL "void main() {" NL
			"  o_color = vec4(0.0, 1.0, 0.0, 1.0);" NL "  for (int i = 0; i < 6; ++i) {" NL
			"    const ivec2 coord = ivec2(gl_FragCoord);" NL "    const vec4 c = imageLoad(g_image[i], coord);" NL
			"    if (c != vec4(i) && c != vec4(0.0)) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL "  }" NL "}";
		m_store_program = BuildProgram(glsl_vs, NULL, NULL, NULL, glsl_store_fs);
		m_load_program  = BuildProgram(glsl_vs, NULL, NULL, NULL, glsl_load_fs);

		return NO_ERROR;
	}

	virtual long Run()
	{
		glUseProgram(m_store_program);
		glUniform1i(glGetUniformLocation(m_store_program, "g_image[0]"), 0);
		glUniform1i(glGetUniformLocation(m_store_program, "g_image[1]"), 1);
		glUniform1i(glGetUniformLocation(m_store_program, "g_image[2]"), 2);
		glUniform1i(glGetUniformLocation(m_store_program, "g_image[3]"), 3);
		glUniform1i(glGetUniformLocation(m_store_program, "g_image[4]"), 4);
		glUniform1i(glGetUniformLocation(m_store_program, "g_image[5]"), 5);
		glUseProgram(0);

		glUseProgram(m_load_program);
		glUniform1i(glGetUniformLocation(m_load_program, "g_image[0]"), 0);
		glUniform1i(glGetUniformLocation(m_load_program, "g_image[1]"), 1);
		glUniform1i(glGetUniformLocation(m_load_program, "g_image[2]"), 2);
		glUniform1i(glGetUniformLocation(m_load_program, "g_image[3]"), 3);
		glUniform1i(glGetUniformLocation(m_load_program, "g_image[4]"), 4);
		glUniform1i(glGetUniformLocation(m_load_program, "g_image[5]"), 5);
		glUseProgram(0);

		glBindTexture(GL_TEXTURE_2D, m_texture);
		glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, 32, 32, 0, GL_RGBA, GL_FLOAT, NULL);
		glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA32F, 16, 16, 0, GL_RGBA, GL_FLOAT, NULL);
		glTexImage2D(GL_TEXTURE_2D, 2, GL_RGBA32F, 8, 8, 0, GL_RGBA, GL_FLOAT, NULL);
		glTexImage2D(GL_TEXTURE_2D, 3, GL_RGBA32F, 4, 4, 0, GL_RGBA, GL_FLOAT, NULL);
		glTexImage2D(GL_TEXTURE_2D, 4, GL_RGBA32F, 2, 2, 0, GL_RGBA, GL_FLOAT, NULL);
		glTexImage2D(GL_TEXTURE_2D, 5, GL_RGBA32F, 1, 1, 0, GL_RGBA, GL_FLOAT, NULL);
		glBindTexture(GL_TEXTURE_2D, 0);

		glBindImageTexture(0, m_texture, 0, GL_FALSE, 0, GL_READ_WRITE, GL_RGBA32F);
		glBindImageTexture(1, m_texture, 1, GL_FALSE, 0, GL_READ_WRITE, GL_RGBA32F);
		glBindImageTexture(2, m_texture, 2, GL_FALSE, 0, GL_READ_WRITE, GL_RGBA32F);
		glBindImageTexture(3, m_texture, 3, GL_FALSE, 0, GL_READ_WRITE, GL_RGBA32F);
		glBindImageTexture(4, m_texture, 4, GL_FALSE, 0, GL_READ_WRITE, GL_RGBA32F);
		glBindImageTexture(5, m_texture, 5, GL_FALSE, 0, GL_READ_WRITE, GL_RGBA32F);

		glViewport(0, 0, 32, 32);
		glBindVertexArray(m_vao);

		glClear(GL_COLOR_BUFFER_BIT);
		glUseProgram(m_store_program);
		glDrawElementsInstancedBaseInstance(GL_TRIANGLE_STRIP, 4, GL_UNSIGNED_SHORT, 0, 1, 0);

		glMemoryBarrier(GL_SHADER_IMAGE_ACCESS_BARRIER_BIT);

		glUseProgram(m_load_program);
		glDrawElementsInstancedBaseVertex(GL_TRIANGLE_STRIP, 4, GL_UNSIGNED_SHORT, 0, 1, 0);

		if (!ValidateReadBuffer(0, 0, 32, 32, vec4(0, 1, 0, 1)))
		{
			return ERROR;
		}
		return NO_ERROR;
	}

	virtual long Cleanup()
	{
		glViewport(0, 0, getWindowWidth(), getWindowHeight());
		glUseProgram(0);
		glDeleteBuffers(1, &m_vbo);
		glDeleteBuffers(1, &m_ebo);
		glDeleteTextures(1, &m_texture);
		glDeleteProgram(m_store_program);
		glDeleteProgram(m_load_program);
		glDeleteVertexArrays(1, &m_vao);
		return NO_ERROR;
	}
};
//-----------------------------------------------------------------------------
// 2.7 AdvancedCast
//-----------------------------------------------------------------------------
class AdvancedCast : public ShaderImageLoadStoreBase
{
	GLuint m_texture[2];
	GLuint m_program;
	GLuint m_vao, m_vbo, m_ebo;

	virtual long Setup()
	{
		glGenTextures(2, m_texture);
		CreateFullViewportQuad(&m_vao, &m_vbo, &m_ebo);

		const char* const glsl_vs = "#version 420 core" NL "layout(location = 0) in vec4 i_position;" NL
									"void main() {" NL "  gl_Position = i_position;" NL "}";
		const char* const glsl_fs =
			"#version 420 core" NL "layout(location = 0) out vec4 o_color;" NL
			"layout(r32i) coherent uniform iimage2D g_image0;" NL "layout(r32ui) coherent uniform uimage2D g_image1;" NL
			"void main() {" NL "  o_color = vec4(0.0, 1.0, 0.0, 1.0);" NL "  ivec2 coord = ivec2(gl_FragCoord);" NL
			"  if (imageAtomicAdd(g_image0, coord, 2) != 0) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			"  if (imageAtomicAdd(g_image0, coord, -1) != 2) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			"  if (imageAtomicAdd(g_image1, coord, 1) != 0) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL
			"  if (imageAtomicAdd(g_image1, coord, 2) != 1) o_color = vec4(1.0, 0.0, 0.0, 1.0);" NL "}";
		m_program = BuildProgram(glsl_vs, NULL, NULL, NULL, glsl_fs);

		return NO_ERROR;
	}

	virtual long Run()
	{
		glUseProgram(m_program);
		glUniform1i(glGetUniformLocation(m_program, "g_image0"), 0);
		glUniform1i(glGetUniformLocation(m_program, "g_image1"), 1);

		{
			std::vector<GLubyte> data(getWindowWidth() * getWindowHeight() * 4);
			glBindTexture(GL_TEXTURE_2D, m_texture[0]);
			glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
			glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, getWindowWidth(), getWindowHeight(), 0, GL_RGBA, GL_UNSIGNED_BYTE,
						 &data[0]);

			glBindTexture(GL_TEXTURE_2D, m_texture[1]);
			glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
			glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, getWindowWidth(), getWindowHeight(), 0, GL_RGBA, GL_UNSIGNED_BYTE,
						 &data[0]);

			glBindTexture(GL_TEXTURE_2D, 0);
		}

		glBindImageTexture(0, m_texture[0], 0, GL_FALSE, 0, GL_READ_WRITE, GL_R32I);
		glBindImageTexture(1, m_texture[1], 0, GL_FALSE, 0, GL_READ_WRITE, GL_R32UI);

		glClear(GL_COLOR_BUFFER_BIT);
		glBindVertexArray(m_vao);
		glDrawElementsInstancedBaseInstance(GL_TRIANGLE_STRIP, 4, GL_UNSIGNED_SHORT, 0, 1, 0);

		std::vector<GLubyte> data(getWindowWidth() * getWindowHeight() * 4);
		glBindTexture(GL_TEXTURE_2D, m_texture[0]);
		glMemoryBarrier(GL_TEXTURE_UPDATE_BARRIER_BIT);
		glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, &data[0]);

		for (int h = 0; h < getWindowHeight(); ++h)
		{
			for (int w = 0; w < getWindowWidth(); ++w)
			{
				const GLubyte c[4] = {
					data[h * (getWindowWidth() * 4) + w * 4 + 0], data[h * (getWindowWidth() * 4) + w * 4 + 1],
					data[h * (getWindowWidth() * 4) + w * 4 + 2], data[h * (getWindowWidth() * 4) + w * 4 + 3],
				};
				if (c[0] != 1 || c[1] != 0 || c[2] != 0 || c[3] != 0)
				{
					m_context.getTestContext().getLog()
						<< tcu::TestLog::Message << "Color is (" << c[0] << " " << c[1] << c[2] << " " << c[3]
						<< ") should be (1 0 0 0)" << tcu::TestLog::EndMessage;
					return ERROR;
				}
			}
		}

		glBindTexture(GL_TEXTURE_2D, m_texture[1]);
		glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, &data[0]);

		for (int h = 0; h < getWindowHeight(); ++h)
		{
			for (int w = 0; w < getWindowWidth(); ++w)
			{
				const GLubyte c[4] = {
					data[h * (getWindowWidth() * 4) + w * 4 + 0], data[h * (getWindowWidth() * 4) + w * 4 + 1],
					data[h * (getWindowWidth() * 4) + w * 4 + 2], data[h * (getWindowWidth() * 4) + w * 4 + 3],
				};
				if (c[0] != 3 || c[1] != 0 || c[2] != 0 || c[3] != 0)
				{
					m_context.getTestContext().getLog()
						<< tcu::TestLog::Message << "Color is (" << c[0] << " " << c[1] << c[2] << " " << c[3]
						<< ") should be (3 0 0 0)" << tcu::TestLog::EndMessage;
					return ERROR;
				}
			}
		}

		if (!ValidateReadBuffer(0, 0, getWindowWidth(), getWindowHeight(), vec4(0, 1, 0, 1)))
		{
			return ERROR;
		}
		return NO_ERROR;
	}

	virtual long Cleanup()
	{
		glUseProgram(0);
		glDeleteBuffers(1, &m_vbo);
		glDeleteBuffers(1, &m_ebo);
		glDeleteTextures(2, m_texture);
		glDeleteProgram(m_program);
		glDeleteVertexArrays(1, &m_vao);
		return NO_ERROR;
	}
};

/** Test "imageLoad() and imageStore() for single-byte data alignment" description follows.
 *
 *  Steps:
 *  - create two textures: "source" and "destination". Fill "source"
 *  texture with unique values. Fill "destination" texture with zeros,
 *  - prepare a program object that will read texel from "source" image at given
 *  coordinates and write its value to "destination" image at same
 *  coordinates,
 *  - bind "source" and "destination" textures as "source" and "destination"
 *  image uniforms,
 *  - render "full screen" quad (left bottom corner at -1,-1 and right top
 *  corner at 1,1),
 *  - verify that texel values in "destination" texture match those in
 *  "source" texture (use glGetTexImage).
 *
 *  Test with 2D R8UI textures with following dimensions:
 *  - 16x16,
 *  - 16x17,
 *  - 17x16,
 *  - 17x17,
 *  - 16x18,
 *  - 18x16,
 *  - 18x18,
 *  - 19x16,
 *  - 16x19,
 *  - 19x19.
 *
 *  Note that default data alignment should cause problems with packing/
 *  /unpacking. Therefore GL_PACK_ALIGNMENT and GL_UNPACK_ALIGNMENT parameters
 *  of pixel storage mode have to be changed to one byte alignment.
 *
 *  Program should consist of vertex and fragment shader. Vertex shader should
 *  pass vertex position through. Fragment shader should do imageLoad() and
 *  imageStore() operations at coordinates gl_FragCoord.
 **/
class ImageLoadStoreDataAlignmentTest : public ShaderImageLoadStoreBase
{
private:
	/* Structures */
	struct TextureDimensions
	{
		GLuint m_width;
		GLuint m_height;

		TextureDimensions(GLuint width, GLuint height) : m_width(width), m_height(height)
		{
		}
	};

	/* Typedefs */
	typedef std::deque<TextureDimensions> TextureDimensionsList;

	/* Fields */
	GLuint				  m_destination_texture_id;
	GLuint				  m_program_id;
	TextureDimensionsList m_texture_dimensions;
	GLuint				  m_source_texture_id;
	GLuint				  m_vertex_array_object_id;
	GLuint				  m_vertex_buffer_id;

public:
	/* Constructor */
	ImageLoadStoreDataAlignmentTest()
		: m_destination_texture_id(0)
		, m_program_id(0)
		, m_source_texture_id(0)
		, m_vertex_array_object_id(0)
		, m_vertex_buffer_id(0)
	{
		/* Nothing to be done here */
	}

	/* Methods inherited from SubcaseBase */
	virtual long Setup()
	{
		/* Shaders code */
		const char* const vertex_shader_code = "#version 400 core\n"
											   "#extension GL_ARB_shader_image_load_store : require\n"
											   "\n"
											   "precision highp float;\n"
											   "\n"
											   "in vec4 vs_in_position;\n"
											   "\n"
											   "void main()\n"
											   "{\n"
											   "    gl_Position = vs_in_position;\n"
											   "}\n";

		const char* const fragment_shader_code =
			"#version 400 core\n"
			"#extension GL_ARB_shader_image_load_store : require\n"
			"\n"
			"precision highp float;\n"
			"\n"
			"layout(r8ui) writeonly uniform uimage2D u_destination_image;\n"
			"layout(r8ui) readonly  uniform uimage2D u_source_image;\n"
			"\n"
			"void main()\n"
			"{\n"
			"    uvec4 loaded_color = imageLoad (u_source_image,      ivec2(gl_FragCoord));\n"
			"                         imageStore(u_destination_image, ivec2(gl_FragCoord), loaded_color);\n"
			"\n"
			"    discard;\n"
			"}\n";

		/* Vertex postions for "full screen" quad, made with triangle strip */
		static const GLfloat m_vertex_buffer_data[] = {
			-1.0f, -1.0f, 0.0f, 1.0f, /* left bottom */
			-1.0f, 1.0f,  0.0f, 1.0f, /* left top */
			1.0f,  -1.0f, 0.0f, 1.0f, /* right bottom */
			1.0f,  1.0f,  0.0f, 1.0f, /* right top */
		};

		/* Result of BuildProgram operation */
		bool is_program_correct = true; /* BuildProgram set false when it fails, but it does not set true on success */

		/* Add all tested texture dimensions */
		m_texture_dimensions.push_back(TextureDimensions(16, 16));
		m_texture_dimensions.push_back(TextureDimensions(16, 17));
		m_texture_dimensions.push_back(TextureDimensions(17, 16));
		m_texture_dimensions.push_back(TextureDimensions(17, 17));
		m_texture_dimensions.push_back(TextureDimensions(16, 18));
		m_texture_dimensions.push_back(TextureDimensions(18, 16));
		m_texture_dimensions.push_back(TextureDimensions(18, 18));
		m_texture_dimensions.push_back(TextureDimensions(16, 19));
		m_texture_dimensions.push_back(TextureDimensions(19, 16));
		m_texture_dimensions.push_back(TextureDimensions(19, 19));

		/* Clean previous error */
		glGetError();

		/* Set single-byte data alignment */
		glPixelStorei(GL_PACK_ALIGNMENT, 1);
		glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
		GLU_EXPECT_NO_ERROR(glGetError(), "PixelStorei");

		/* Prepare buffer with vertex positions of "full screen" quad" */
		glGenBuffers(1, &m_vertex_buffer_id);
		GLU_EXPECT_NO_ERROR(glGetError(), "GenBuffers");

		glBindBuffer(GL_ARRAY_BUFFER, m_vertex_buffer_id);
		GLU_EXPECT_NO_ERROR(glGetError(), "BindBuffer");

		glBufferData(GL_ARRAY_BUFFER, sizeof(m_vertex_buffer_data), m_vertex_buffer_data, GL_STATIC_DRAW);
		GLU_EXPECT_NO_ERROR(glGetError(), "BufferData");

		/* Generate vertex array object */
		glGenVertexArrays(1, &m_vertex_array_object_id);
		GLU_EXPECT_NO_ERROR(glGetError(), "GenVertexArrays");

		/* Prepare program object */
		m_program_id = BuildProgram(vertex_shader_code, 0 /* src_tcs */, 0 /* src_tes */, 0 /*src_gs */,
									fragment_shader_code, &is_program_correct);
		if (false == is_program_correct)
		{
			return ERROR;
		}

		/* Done */
		return NO_ERROR;
	}

	virtual long Cleanup()
	{
		/* Reset OpenGL state */
		glBindBuffer(GL_ARRAY_BUFFER, 0);
		glBindTexture(GL_TEXTURE_2D, 0);
		glBindVertexArray(0);
		glUseProgram(0);

		/* Delete program */
		if (0 != m_program_id)
		{
			glDeleteProgram(m_program_id);
			m_program_id = 0;
		}

		/* Delete textures */
		if (0 != m_destination_texture_id)
		{
			glDeleteTextures(1, &m_destination_texture_id);
			m_destination_texture_id = 0;
		}

		if (0 != m_source_texture_id)
		{
			glDeleteTextures(1, &m_source_texture_id);
			m_source_texture_id = 0;
		}

		/* Delete vertex array object */
		if (0 != m_vertex_array_object_id)
		{
			glDeleteVertexArrays(1, &m_vertex_array_object_id);
			m_vertex_array_object_id = 0;
		}

		/* Delete buffer */
		if (0 != m_vertex_buffer_id)
		{
			glDeleteBuffers(1, &m_vertex_buffer_id);
			m_vertex_buffer_id = 0;
		}

		/* Done */
		return NO_ERROR;
	}

	virtual long Run()
	{
		bool result = true;

		/* For each dimension */
		for (TextureDimensionsList::const_iterator it = m_texture_dimensions.begin(); m_texture_dimensions.end() != it;
			 ++it)
		{
			/* Prepare "source" and "destination" textures */
			GLU_EXPECT_NO_ERROR(Create2DR8UIDestinationTexture(it->m_width, it->m_height, m_destination_texture_id),
								"Create2DR8UIDestinationTexture");
			GLU_EXPECT_NO_ERROR(Create2DR8UISourceTexture(it->m_width, it->m_height, m_source_texture_id),
								"Create2DR8UISourceTexture");

			/* Copy texture data with imageLoad() and imageStore() operations */
			Copy2DR8UITexture(m_destination_texture_id, m_source_texture_id);

			/* Compare "source" and "destination" textures */
			if (false ==
				Compare2DR8UITextures(m_destination_texture_id, m_source_texture_id, it->m_width, it->m_height))
			{
				m_context.getTestContext().getLog()
					<< tcu::TestLog::Message
					<< "Copy with imageLoad and imageStore failed for textures: " << it->m_width << "x" << it->m_height
					<< ". Source and destination textures are different" << tcu::TestLog::EndMessage;

				result = false;
			}

			/* Destroy "source" and "destination" textures */
			glDeleteTextures(1, &m_destination_texture_id);
			glDeleteTextures(1, &m_source_texture_id);

			m_destination_texture_id = 0;
			m_source_texture_id		 = 0;
		}

		if (false == result)
		{
			return ERROR;
		}

		/* Done */
		return NO_ERROR;
	}

private:
	/* Private methods */

	/** Binds a texture to user-specified image unit and updates relevant sampler uniform
	 *
	 * @param program_id   Program object id
	 * @param texture_id   Texture id
	 * @param image_unit   Index of image unit
	 * @param uniform_name Name of image uniform
	 **/
	void BindTextureToImage(GLuint program_id, GLuint texture_id, GLuint image_unit, const char* uniform_name)
	{
		/* Uniform location and invalid value */
		static const GLint invalid_uniform_location = -1;
		GLint			   image_uniform_location   = 0;

		/* Get uniform location */
		image_uniform_location = glGetUniformLocation(program_id, uniform_name);
		GLU_EXPECT_NO_ERROR(glGetError(), "GetUniformLocation");
		if (invalid_uniform_location == image_uniform_location)
		{
			throw tcu::InternalError("A required uniform is considered inactive", uniform_name, __FILE__, __LINE__);
		}

		/* Bind texture to image unit */
		glBindImageTexture(image_unit, texture_id, 0 /* level */, GL_FALSE, 0 /* layer */, GL_READ_WRITE, GL_R8UI);
		GLU_EXPECT_NO_ERROR(glGetError(), "BindImageTexture");

		/* Set uniform to image unit */
		glUniform1i(image_uniform_location, image_unit);
		GLU_EXPECT_NO_ERROR(glGetError(), "Uniform1i");
	}

	/** Compare two 2D R8UI textures
	 *
	 * @param left_texture_id  Id of "left" texture object
	 * @param right_texture_id Id of "right" texture object
	 * @param width            Width of the textures
	 * @param height           Height of the textures
	 *
	 * @return true when texture data is identical, false otherwise
	 **/
	bool Compare2DR8UITextures(GLuint left_texture_id, GLuint right_texture_id, GLuint width, GLuint height)
	{
		/* Size of textures */
		const GLuint texture_data_size = width * height;

		/* Storage for texture data */
		std::vector<GLubyte> left_texture_data;
		std::vector<GLubyte> right_texture_data;

		/* Alocate memory for texture data */
		left_texture_data.resize(texture_data_size);
		right_texture_data.resize(texture_data_size);

		/* Get "left" texture data */
		glBindTexture(GL_TEXTURE_2D, left_texture_id);
		GLU_EXPECT_NO_ERROR(glGetError(), "BindTexture");

		glGetTexImage(GL_TEXTURE_2D, 0, GL_RED_INTEGER, GL_UNSIGNED_BYTE, &left_texture_data[0]);
		GLU_EXPECT_NO_ERROR(glGetError(), "GetTexImage");

		/* Get "right" texture data */
		glBindTexture(GL_TEXTURE_2D, right_texture_id);
		GLU_EXPECT_NO_ERROR(glGetError(), "BindTexture");

		glGetTexImage(GL_TEXTURE_2D, 0, GL_RED_INTEGER, GL_UNSIGNED_BYTE, &right_texture_data[0]);
		GLU_EXPECT_NO_ERROR(glGetError(), "GetTexImage");

		/* Compare texels */
		return (0 == memcmp(&left_texture_data[0], &right_texture_data[0], texture_data_size));
	}

	/** Copy contents of "source" texture to "destination" texture with imageLoad() and imageStore() operations
	 *
	 * @param destination_texture_id Id of "destination" texture object
	 * @param source_texture_id      Id of "source" texture object
	 **/
	void Copy2DR8UITexture(GLuint destination_texture_id, GLuint source_texture_id)
	{
		/* Uniform names */
		static const char* const destination_image_uniform_name = "u_destination_image";
		static const char* const source_image_uniform_name		= "u_source_image";

		/* Attribute name */
		static const char* const position_attribute_name = "vs_in_position";

		/* Attribute location and invalid value */
		static const GLint invalid_attribute_location  = -1;
		GLint			   position_attribute_location = 0;

		/* Set current program */
		glUseProgram(m_program_id);
		GLU_EXPECT_NO_ERROR(glGetError(), "UseProgram");

		/* Bind vertex array object */
		glBindVertexArray(m_vertex_array_object_id);
		GLU_EXPECT_NO_ERROR(glGetError(), "BindVertexArray");

		/* Bind buffer with quad vertex positions */
		glBindBuffer(GL_ARRAY_BUFFER, m_vertex_buffer_id);
		GLU_EXPECT_NO_ERROR(glGetError(), "BindBuffer");

		/* Set up position attribute */
		position_attribute_location = glGetAttribLocation(m_program_id, position_attribute_name);
		GLU_EXPECT_NO_ERROR(glGetError(), "GetAttribLocation");
		if (invalid_attribute_location == position_attribute_location)
		{
			throw tcu::InternalError("Attribute location is not available", position_attribute_name, __FILE__,
									 __LINE__);
		}

		glVertexAttribPointer(position_attribute_location, 4 /*size */, GL_FLOAT, GL_FALSE /* normalized */,
							  0 /* stride */, 0);
		GLU_EXPECT_NO_ERROR(glGetError(), "VertexAttribPointer");

		glEnableVertexAttribArray(position_attribute_location);
		GLU_EXPECT_NO_ERROR(glGetError(), "EnableVertexAttribArray");

		/* Set up textures as source and destination images */
		BindTextureToImage(m_program_id, destination_texture_id, 0 /* image_unit */, destination_image_uniform_name);
		BindTextureToImage(m_program_id, source_texture_id, 1 /* image_unit */, source_image_uniform_name);

		/* Execute draw */
		glDrawArrays(GL_TRIANGLE_STRIP, 0 /* first vertex */, 4 /* number of vertices */);
		GLU_EXPECT_NO_ERROR(glGetError(), "DrawArrays");
	}

	/** Create 2D R8UI texture and fills it with zeros
	 *
	 * @param width          Width of created texture
	 * @param height         Height of created texture
	 * @param out_texture_id Id of created texture, not modified if operation fails
	 *
	 * @return GL_NO_ERROR if operation was successful, GL error code otherwise
	 **/
	GLenum Create2DR8UIDestinationTexture(GLuint width, GLuint height, GLuint& out_texture_id)
	{
		/* Texture size */
		const GLuint texture_size = width * height;

		/* Prepare storage for texture data */
		std::vector<GLubyte> texture_data;
		texture_data.resize(texture_size);

		/* Set all texels */
		for (GLuint i = 0; i < texture_size; ++i)
		{
			texture_data[i] = 0;
		}

		/* Create texture */
		return Create2DR8UITexture(width, height, texture_data, out_texture_id);
	}

	/** Create 2D R8UI texture and fills it with increasing values, starting from 0
	 *
	 * @param width          Width of created texture
	 * @param height         Height of created texture
	 * @param out_texture_id Id of created texture, not modified if operation fails
	 *
	 * @return GL_NO_ERROR if operation was successful, GL error code otherwise
	 **/
	GLenum Create2DR8UISourceTexture(GLuint width, GLuint height, GLuint& out_texture_id)
	{
		/* Texture size */
		const GLuint texture_size = width * height;

		/* Value of texel */
		GLubyte texel_value = 0;

		/* Prepare storage for texture data */
		std::vector<GLubyte> texture_data;
		texture_data.resize(texture_size);

		/* Set all texels */
		for (GLuint i = 0; i < texture_size; ++i)
		{
			texture_data[i] = texel_value++;
		}

		/* Create texture */
		return Create2DR8UITexture(width, height, texture_data, out_texture_id);
	}

	/** Create 2D R8UI texture and fills it with user-provided data
	 *
	 * @param width          Width of created texture
	 * @param height         Height of created texture
	 * @param texture_data   Texture data
	 * @param out_texture_id Id of created texture, not modified if operation fails
	 *
	 * @return GL_NO_ERROR if operation was successful, GL error code otherwise
	 **/
	GLenum Create2DR8UITexture(GLuint width, GLuint height, const std::vector<GLubyte>& texture_data,
							   GLuint& out_texture_id)
	{
		GLenum err		  = 0;
		GLuint texture_id = 0;

		/* Generate texture */
		glGenTextures(1, &texture_id);
		err = glGetError();
		if (GL_NO_ERROR != err)
		{
			return err;
		}

		/* Bind texture */
		glBindTexture(GL_TEXTURE_2D, texture_id);
		err = glGetError();
		if (GL_NO_ERROR != err)
		{
			glDeleteTextures(1, &texture_id);
			return err;
		}

		/* Allocate storage and fill texture */
		glTexImage2D(GL_TEXTURE_2D, 0 /* level */, GL_R8UI, width, height, 0 /* border */, GL_RED_INTEGER,
					 GL_UNSIGNED_BYTE, &texture_data[0]);
		err = glGetError();
		if (GL_NO_ERROR != err)
		{
			glDeleteTextures(1, &texture_id);
			return err;
		}

		/* Make texture complete */
		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0);
		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);
		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
		err = glGetError();
		if (GL_NO_ERROR != err)
		{
			glDeleteTextures(1, &texture_id);
			return err;
		}

		/* Set out_texture_id */
		out_texture_id = texture_id;

		/* Done */
		return GL_NO_ERROR;
	}
};

/** Test "imageLoad() and imageStore() for non-layered image bindings" description follows.
 *
 *  Steps: same as in test 1 (ImageLoadStoreDataAlignmentTest).
 *
 *  Test non-layered image bindings (BindImageTexture <layered>: false) with:
 *  | Type           | Dimensions |
 *  | 2D_ARRAY       | 64x64x6    |
 *  | 3D             | 64x64x6    |
 *  | CUBE_MAP       | 64         |
 *  | CUBE_MAP_ARRAY | 64x3       |
 *
 *  Use RGBA8 format. All layers shall be tested.
 *
 *  Program should consist of vertex and fragment shader. Vertex shader should
 *  pass vertex position through. Fragment shader should do imageLoad() and
 *  imageStore() operations at coordinates gl_FragCoord. Fragment shader should
 *  use image2D as image type.
 **/
class ImageLoadStoreNonLayeredBindingTest : public ShaderImageLoadStoreBase
{
private:
	/* Structures */
	struct TextureShapeDefinition
	{
		GLuint m_edge;
		GLuint m_n_elements;
		GLenum m_type;

		TextureShapeDefinition(GLuint edge, GLuint n_elements, GLenum type)
			: m_edge(edge), m_n_elements(n_elements), m_type(type)
		{
		}
	};

	/* Typedefs */
	typedef std::deque<TextureShapeDefinition> TextureShapeDefinitionList;

	/* Fields */
	GLuint					   m_destination_texture_id;
	GLuint					   m_program_id;
	TextureShapeDefinitionList m_texture_shape_definitions;
	GLuint					   m_source_texture_id;
	GLuint					   m_vertex_array_object_id;
	GLuint					   m_vertex_buffer_id;

public:
	/* Constructor */
	ImageLoadStoreNonLayeredBindingTest()
		: m_destination_texture_id(0)
		, m_program_id(0)
		, m_source_texture_id(0)
		, m_vertex_array_object_id(0)
		, m_vertex_buffer_id(0)
	{
		/* Nothing to be done here */
	}

	/* Methods inherited from SubcaseBase */
	virtual long Setup()
	{
		/* Shaders code */
		const char* const vertex_shader_code = "#version 400 core\n"
											   "#extension GL_ARB_shader_image_load_store : require\n"
											   "\n"
											   "precision highp float;\n"
											   "\n"
											   "in vec4 vs_in_position;\n"
											   "\n"
											   "void main()\n"
											   "{\n"
											   "    gl_Position = vs_in_position;\n"
											   "}\n";

		const char* const fragment_shader_code =
			"#version 400 core\n"
			"#extension GL_ARB_shader_image_load_store : require\n"
			"\n"
			"precision highp float;\n"
			"\n"
			"layout(rgba8) writeonly uniform image2D u_destination_image;\n"
			"layout(rgba8) readonly  uniform image2D u_source_image;\n"
			"\n"
			"void main()\n"
			"{\n"
			"    vec4 loaded_color = imageLoad (u_source_image,      ivec2(gl_FragCoord));\n"
			"                        imageStore(u_destination_image, ivec2(gl_FragCoord), loaded_color);\n"
			"\n"
			"    discard;\n"
			"}\n";

		/* Vertex postions for "full screen" quad, defined as a triangle strip */
		static const GLfloat m_vertex_buffer_data[] = {
			-1.0f, -1.0f, 0.0f, 1.0f, /* left bottom */
			-1.0f, 1.0f,  0.0f, 1.0f, /* left top */
			1.0f,  -1.0f, 0.0f, 1.0f, /* right bottom */
			1.0f,  1.0f,  0.0f, 1.0f, /* right top */
		};

		/* Result of BuildProgram operation */
		bool is_program_correct = true; /* BuildProgram set false when it fails, but it does not set true on success */

		/* Add all tested texture shapes */
		int texture_edge = de::min(64, de::min(getWindowHeight(), getWindowWidth()));
		m_texture_shape_definitions.push_back(
			TextureShapeDefinition(texture_edge /* edge */, 6 /* n_elements */, GL_TEXTURE_2D_ARRAY));
		m_texture_shape_definitions.push_back(
			TextureShapeDefinition(texture_edge /* edge */, 6 /* n_elements */, GL_TEXTURE_3D));
		m_texture_shape_definitions.push_back(
			TextureShapeDefinition(texture_edge /* edge */, 1 /* n_elements */, GL_TEXTURE_CUBE_MAP));
		m_texture_shape_definitions.push_back(
			TextureShapeDefinition(texture_edge /* edge */, 3 /* n_elements */, GL_TEXTURE_CUBE_MAP_ARRAY));

		/* Prepare buffer with vertex positions of "full screen" quad" */
		glGenBuffers(1, &m_vertex_buffer_id);
		GLU_EXPECT_NO_ERROR(glGetError(), "GenBuffers");

		glBindBuffer(GL_ARRAY_BUFFER, m_vertex_buffer_id);
		GLU_EXPECT_NO_ERROR(glGetError(), "BindBuffer");

		glBufferData(GL_ARRAY_BUFFER, sizeof(m_vertex_buffer_data), m_vertex_buffer_data, GL_STATIC_DRAW);
		GLU_EXPECT_NO_ERROR(glGetError(), "BufferData");

		/* Generate vertex array object */
		glGenVertexArrays(1, &m_vertex_array_object_id);
		GLU_EXPECT_NO_ERROR(glGetError(), "GenVertexArrays");

		/* Prepare program object */
		m_program_id = BuildProgram(vertex_shader_code, 0 /* src_tcs */, 0 /* src_tes */, 0 /* src_gs */,
									fragment_shader_code, &is_program_correct);
		if (false == is_program_correct)
		{
			return ERROR;
		}

		/* Done */
		return NO_ERROR;
	}

	virtual long Cleanup()
	{
		/* Reset OpenGL state */
		glBindBuffer(GL_ARRAY_BUFFER, 0);
		glBindTexture(GL_TEXTURE_2D_ARRAY, 0);
		glBindTexture(GL_TEXTURE_3D, 0);
		glBindTexture(GL_TEXTURE_CUBE_MAP, 0);
		glBindTexture(GL_TEXTURE_CUBE_MAP_ARRAY, 0);
		glBindVertexArray(0);
		glUseProgram(0);

		/* Delete program */
		if (0 != m_program_id)
		{
			glDeleteProgram(m_program_id);
			m_program_id = 0;
		}

		/* Delete textures */
		if (0 != m_destination_texture_id)
		{
			glDeleteTextures(1, &m_destination_texture_id);
			m_destination_texture_id = 0;
		}

		if (0 != m_source_texture_id)
		{
			glDeleteTextures(1, &m_source_texture_id);
			m_source_texture_id = 0;
		}

		/* Delete vertex array object */
		if (0 != m_vertex_array_object_id)
		{
			glDeleteVertexArrays(1, &m_vertex_array_object_id);
			m_vertex_array_object_id = 0;
		}

		/* Delete buffer */
		if (0 != m_vertex_buffer_id)
		{
			glDeleteBuffers(1, &m_vertex_buffer_id);
			m_vertex_buffer_id = 0;
		}

		/* Done */
		return NO_ERROR;
	}

	virtual long Run()
	{
		bool result = true;

		/* For each shape */
		for (TextureShapeDefinitionList::const_iterator it = m_texture_shape_definitions.begin();
			 m_texture_shape_definitions.end() != it; ++it)
		{
			const GLuint n_layers = GetTotalNumberOfLayers(it->m_n_elements, it->m_type);

			/* Prepare "source" and "destination" textures */
			GLU_EXPECT_NO_ERROR(
				CreateRGBA8DestinationTexture(it->m_edge, it->m_n_elements, it->m_type, m_destination_texture_id),
				"Create2DR8UIDestinationTexture");
			GLU_EXPECT_NO_ERROR(CreateRGBA8SourceTexture(it->m_edge, it->m_n_elements, it->m_type, m_source_texture_id),
								"Create2DR8UISourceTexture");

			/* Copy texture data with imageLoad() and imageStore() operations */
			CopyRGBA8Texture(m_destination_texture_id, m_source_texture_id, n_layers);

			/* Compare "source" and "destination" textures */
			if (false ==
				CompareRGBA8Textures(m_destination_texture_id, m_source_texture_id, it->m_edge, n_layers, it->m_type))
			{
				const char* texture_type = "";
				switch (it->m_type)
				{
				case GL_TEXTURE_2D_ARRAY:
					texture_type = "2d array";
					break;
				case GL_TEXTURE_3D:
					texture_type = "3d";
					break;
				case GL_TEXTURE_CUBE_MAP:
					texture_type = "Cube map";
					break;
				case GL_TEXTURE_CUBE_MAP_ARRAY:
					texture_type = "Cube map array";
					break;
				}

				m_context.getTestContext().getLog()
					<< tcu::TestLog::Message
					<< "Copy  with imageLoad and imageStore failed for texture type: " << texture_type
					<< ". Source and destination textures are different" << tcu::TestLog::EndMessage;

				result = false;
			}

			/* Destroy "source" and "destination" textures */
			glDeleteTextures(1, &m_destination_texture_id);
			glDeleteTextures(1, &m_source_texture_id);

			m_destination_texture_id = 0;
			m_source_texture_id		 = 0;
		}

		if (false == result)
		{
			return ERROR;
		}

		/* Done */
		return NO_ERROR;
	}

private:
	/* Private methods */

	/** Binds a texture to user-specified image unit and update relevant sampler uniform
	 *
	 * @param program_id   Program object id
	 * @param texture_id   Texture id
	 * @param image_unit   Index of image unit
	 * @param layer        Index of layer bound to unit
	 * @param uniform_name Name of image uniform
	 **/
	void BindTextureToImage(GLuint program_id, GLuint texture_id, GLuint image_unit, GLuint layer,
							const char* uniform_name)
	{
		static const GLint invalid_uniform_location = -1;
		GLint			   image_uniform_location   = 0;

		/* Get uniform location */
		image_uniform_location = glGetUniformLocation(program_id, uniform_name);
		GLU_EXPECT_NO_ERROR(glGetError(), "GetUniformLocation");
		if (invalid_uniform_location == image_uniform_location)
		{
			throw tcu::InternalError("Uniform location is not available", uniform_name, __FILE__, __LINE__);
		}

		/* Bind texture to image unit */
		glBindImageTexture(image_unit, texture_id, 0 /* level */, GL_FALSE /* layered */, layer, GL_READ_WRITE,
						   GL_RGBA8);
		GLU_EXPECT_NO_ERROR(glGetError(), "BindImageTexture");

		/* Set uniform to image unit */
		glUniform1i(image_uniform_location, image_unit);
		GLU_EXPECT_NO_ERROR(glGetError(), "Uniform1i");
	}

	/** Compare two 2D R8UI textures
	 *
	 * @param left_texture_id  Id of "left" texture object
	 * @param right_texture_id Id of "right" texture object
	 * @param edge             Length of texture edge
	 * @param n_layers         Number of layers to compare
	 * @param type             Type of texture
	 *
	 * @return true when texture data is found identical, false otherwise
	 **/
	bool CompareRGBA8Textures(GLuint left_texture_id, GLuint right_texture_id, GLuint edge, GLuint n_layers,
							  GLenum type)
	{
		static const GLuint n_components	  = 4; /* RGBA */
		const GLuint		texture_data_size = edge * edge * n_layers * n_components;

		/* Storage for texture data */
		std::vector<GLubyte> left_texture_data;
		std::vector<GLubyte> right_texture_data;

		ExtractTextureData(left_texture_id, edge, n_layers, type, left_texture_data);
		ExtractTextureData(right_texture_id, edge, n_layers, type, right_texture_data);

		/* Compare texels */
		return (0 == memcmp(&left_texture_data[0], &right_texture_data[0], texture_data_size));
	}

	/** Copy contents of "source" texture to "destination" texture with imageLoad() and imageStore() operations
	 *
	 * @param destination_texture_id Id of "destination" texture object
	 * @param source_texture_id      Id of "source" texture object
	 * @param n_layers               Number of layers
	 **/
	void CopyRGBA8Texture(GLuint destination_texture_id, GLuint source_texture_id, GLuint n_layers)
	{
		for (GLuint layer = 0; layer < n_layers; ++layer)
		{
			CopyRGBA8TextureLayer(destination_texture_id, source_texture_id, layer);
		}
	}

	/** Copy contents of layer from "source" texture to "destination" texture with imageLoad() and imageStore() operations
	 *
	 * @param destination_texture_id Id of "destination" texture object
	 * @param source_texture_id      Id of "source" texture object
	 * @param layer                  Index of layer
	 **/
	void CopyRGBA8TextureLayer(GLuint destination_texture_id, GLuint source_texture_id, GLuint layer)
	{
		/* Uniform names */
		static const char* const destination_image_uniform_name = "u_destination_image";
		static const char* const source_image_uniform_name		= "u_source_image";

		/* Attribute name */
		static const char* const position_attribute_name = "vs_in_position";

		/* Attribute location and invalid value */
		static const GLint invalid_attribute_location  = -1;
		GLint			   position_attribute_location = 0;

		/* Set current program */
		glUseProgram(m_program_id);
		GLU_EXPECT_NO_ERROR(glGetError(), "UseProgram");

		/* Bind vertex array object */
		glBindVertexArray(m_vertex_array_object_id);
		GLU_EXPECT_NO_ERROR(glGetError(), "BindVertexArray");

		/* Bind buffer with quad vertex positions */
		glBindBuffer(GL_ARRAY_BUFFER, m_vertex_buffer_id);
		GLU_EXPECT_NO_ERROR(glGetError(), "BindBuffer");

		/* Set up vertex attribute array for position attribute */
		position_attribute_location = glGetAttribLocation(m_program_id, position_attribute_name);
		GLU_EXPECT_NO_ERROR(glGetError(), "GetAttribLocation");
		if (invalid_attribute_location == position_attribute_location)
		{
			throw tcu::InternalError("Attribute location is not available", position_attribute_name, __FILE__,
									 __LINE__);
		}

		glVertexAttribPointer(position_attribute_location, 4 /*size */, GL_FLOAT, GL_FALSE /* normalized */,
							  0 /* stride */, 0 /* pointer */);
		GLU_EXPECT_NO_ERROR(glGetError(), "VertexAttribPointer");

		glEnableVertexAttribArray(position_attribute_location);
		GLU_EXPECT_NO_ERROR(glGetError(), "EnableVertexAttribArray");

		/* Set up textures as source and destination image samplers */
		BindTextureToImage(m_program_id, destination_texture_id, 0 /* image_unit */, layer,
						   destination_image_uniform_name);
		BindTextureToImage(m_program_id, source_texture_id, 1 /* image_unit */, layer, source_image_uniform_name);

		/* Execute draw */
		glDrawArrays(GL_TRIANGLE_STRIP, 0 /* first vertex */, 4 /* number of vertices */);
		GLU_EXPECT_NO_ERROR(glGetError(), "DrawArrays");
	}

	/** Creates RGBA8 texture of given type and fills it with zeros
	 *
	 * @param edge           Edge of created texture
	 * @param n_elements     Number of elements in texture array
	 * @param target         Target of created texture
	 * @param out_texture_id Id of created texture, not modified if operation fails
	 *
	 * @return GL_NO_ERROR if operation was successful, GL error code otherwise
	 **/
	GLenum CreateRGBA8DestinationTexture(GLuint edge, GLuint n_elements, GLenum target, GLuint& out_texture_id)
	{
		/* Constasts to calculate texture size */
		static const GLuint n_components = 4; /* RGBA */
		const GLuint		layer_size   = edge * edge * n_components;
		const GLuint		n_layers	 = GetTotalNumberOfLayers(n_elements, target);
		const GLuint		texture_size = layer_size * n_layers;

		/* Prepare storage for texture data */
		std::vector<GLubyte> texture_data;
		texture_data.resize(texture_size);

		/* Set all texels */
		for (GLuint i = 0; i < texture_size; ++i)
		{
			texture_data[i] = 0;
		}

		/* Create texture */
		return CreateRGBA8Texture(edge, target, n_layers, texture_data, out_texture_id);
	}

	/** Creates RGBA8 texture and fills it with [x, y, layer, 0xaa]
	 *
	 * @param edge           Edge of created texture
	 * @param n_elements     Number of elements in texture array
	 * @param target         Target of created texture
	 * @param out_texture_id Id of created texture, not modified if operation fails
	 *
	 * @return GL_NO_ERROR if operation was successful, GL error code otherwise
	 **/
	GLenum CreateRGBA8SourceTexture(GLuint edge, GLuint n_elements, GLenum target, GLuint& out_texture_id)
	{
		/* Constants to calculate texture size */
		static const GLuint n_components = 4; /* RGBA */
		const GLuint		layer_size   = edge * edge * n_components;
		const GLuint		n_layers	 = GetTotalNumberOfLayers(n_elements, target);
		const GLuint		texture_size = layer_size * n_layers;

		/* Value of texel */
		GLubyte texel[4] = { 0, 0, 0, 0xaa };

		/* Prepare storage for texture data */
		std::vector<GLubyte> texture_data;
		texture_data.resize(texture_size);

		/* Set all texels */
		for (GLuint layer = 0; layer < n_layers; ++layer)
		{
			const GLuint layer_offset = layer_size * layer;

			texel[2] = static_cast<GLubyte>(layer);

			for (GLuint y = 0; y < edge; ++y)
			{
				const GLuint line_offset = y * edge * n_components + layer_offset;

				texel[1] = static_cast<GLubyte>(y);

				for (GLuint x = 0; x < edge; ++x)
				{
					const GLuint texel_offset = x * n_components + line_offset;
					texel[0]				  = static_cast<GLubyte>(x);

					for (GLuint component = 0; component < n_components; ++component)
					{
						texture_data[texel_offset + component] = texel[component];
					}
				}
			}
		}

		/* Create texture */
		return CreateRGBA8Texture(edge, target, n_layers, texture_data, out_texture_id);
	}

	/** Creates RGBA8 texture of given type and fills it provided data
	 *
	 * @param edge           Edge of created texture
	 * @param n_elements     Number of elements in texture array
	 * @param target         Target of created texture
	 * @param texture_data   Texture data
	 * @param out_texture_id Id of created texture, not modified if operation fails
	 *
	 * @return GL_NO_ERROR if operation was successful, GL error code otherwise
	 **/
	GLenum CreateRGBA8Texture(GLuint edge, GLenum target, GLuint n_layers, const std::vector<GLubyte>& texture_data,
							  GLuint& out_texture_id)
	{
		GLenum err		  = 0;
		GLuint texture_id = 0;

		/* Generate texture */
		glGenTextures(1, &texture_id);
		err = glGetError();
		if (GL_NO_ERROR != err)
		{
			return err;
		}

		/* Bind texture */
		glBindTexture(target, texture_id);
		err = glGetError();
		if (GL_NO_ERROR != err)
		{
			glDeleteTextures(1, &texture_id);
			return err;
		}

		/* Allocate storage and fill texture */
		if (GL_TEXTURE_CUBE_MAP != target)
		{
			glTexImage3D(target, 0 /* level */, GL_RGBA8, edge, edge, n_layers, 0 /* border */, GL_RGBA,
						 GL_UNSIGNED_BYTE, &texture_data[0]);
		}
		else
		{
			const GLuint n_components = 4;
			const GLuint layer_size   = edge * edge * n_components;

			glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0 /* level */, GL_RGBA8, edge, edge, 0 /* border */, GL_RGBA,
						 GL_UNSIGNED_BYTE, &texture_data[0 * layer_size]);
			glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0 /* level */, GL_RGBA8, edge, edge, 0 /* border */, GL_RGBA,
						 GL_UNSIGNED_BYTE, &texture_data[1 * layer_size]);
			glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0 /* level */, GL_RGBA8, edge, edge, 0 /* border */, GL_RGBA,
						 GL_UNSIGNED_BYTE, &texture_data[2 * layer_size]);
			glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0 /* level */, GL_RGBA8, edge, edge, 0 /* border */, GL_RGBA,
						 GL_UNSIGNED_BYTE, &texture_data[3 * layer_size]);
			glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0 /* level */, GL_RGBA8, edge, edge, 0 /* border */, GL_RGBA,
						 GL_UNSIGNED_BYTE, &texture_data[4 * layer_size]);
			glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0 /* level */, GL_RGBA8, edge, edge, 0 /* border */, GL_RGBA,
						 GL_UNSIGNED_BYTE, &texture_data[5 * layer_size]);
		}
		err = glGetError();
		if (GL_NO_ERROR != err)
		{
			glDeleteTextures(1, &texture_id);
			return err;
		}

		/* Make texture complete */
		glTexParameteri(target, GL_TEXTURE_BASE_LEVEL, 0);
		glTexParameteri(target, GL_TEXTURE_MAX_LEVEL, 0);
		glTexParameteri(target, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
		err = glGetError();
		if (GL_NO_ERROR != err)
		{
			glDeleteTextures(1, &texture_id);
			return err;
		}

		/* Set out_texture_id */
		out_texture_id = texture_id;

		/* Done */
		return GL_NO_ERROR;
	}

	/** Extracts texture data
	 *
	 * @param texture_id   Id of texture object
	 * @param edge         Length of texture edge
	 * @param n_layers     Number of layers
	 * @param target       Target of texture
	 * @param texture_data Extracted texture data
	 **/
	void ExtractTextureData(GLuint texture_id, GLuint edge, GLuint n_layers, GLenum target,
							std::vector<GLubyte>& texture_data)
	{
		static const GLuint n_components	  = 4; /* RGBA */
		const GLuint		texture_data_size = edge * edge * n_layers * n_components;

		/* Alocate memory for texture data */
		texture_data.resize(texture_data_size);

		/* Bind texture */
		glBindTexture(target, texture_id);
		GLU_EXPECT_NO_ERROR(glGetError(), "BindTexture");

		/* Get data */
		if (GL_TEXTURE_CUBE_MAP != target)
		{
			glGetTexImage(target, 0, GL_RGBA, GL_UNSIGNED_BYTE, &texture_data[0]);
		}
		else
		{
			const GLuint layer_size = edge * edge * n_components;

			glGetTexImage(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGBA, GL_UNSIGNED_BYTE, &texture_data[0 * layer_size]);
			glGetTexImage(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGBA, GL_UNSIGNED_BYTE, &texture_data[1 * layer_size]);
			glGetTexImage(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGBA, GL_UNSIGNED_BYTE, &texture_data[2 * layer_size]);
			glGetTexImage(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGBA, GL_UNSIGNED_BYTE, &texture_data[3 * layer_size]);
			glGetTexImage(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGBA, GL_UNSIGNED_BYTE, &texture_data[4 * layer_size]);
			glGetTexImage(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGBA, GL_UNSIGNED_BYTE, &texture_data[5 * layer_size]);
		}

		GLU_EXPECT_NO_ERROR(glGetError(), "GetTexImage");
	}

	/** Get number of layers per single element for given type of texture
	 *
	 * @param target Target of texture
	 *
	 * @return Number of layers
	 **/
	GLuint GetLayersPerElement(GLenum target)
	{
		switch (target)
		{
		case GL_TEXTURE_2D_ARRAY:
		case GL_TEXTURE_3D:
			return 1;
		case GL_TEXTURE_CUBE_MAP:
		case GL_TEXTURE_CUBE_MAP_ARRAY:
			return 6;
		default:
			throw tcu::InternalError("Not supported texture type", "", __FILE__, __LINE__);
		}
	}

	/** Get total number of layers in texture of given type and number of array elements
	 *
	 * @param n_elements Number of elements in texture array
	 * @param target     Target of texture
	 *
	 * @return Number of layers
	 **/
	GLuint GetTotalNumberOfLayers(GLuint n_elements, GLenum target)
	{
		return GetLayersPerElement(target) * n_elements;
	}
};

/** Test "imageLoad() and imageStore() for incomplete textures" description follows.
 *
 *  Load from incomplete textures should return 0.
 *  Store to incomplete textures should be ignored.
 *
 *  Steps:
 *  - create two incomplete textures: "incomplete_source" and
 *  "incomplete_destination",
 *  - create two complete textures: "complete_source" and
 *  "complete_destination",
 *  - fill all textures with unique values,
 *  - prepare program that will:
 *      * load texel from "incomplete_source" and store its value to
 *      "complete_destination",
 *      * load texel from "complete_source" and store its value to
 *      "incomplete_destination".
 *  - bind textures to corresponding image uniforms
 *  - execute program for all texels,
 *  - verify that "incomplete_destination" was not modified and
 *  "complete_destination" is filled with zeros.
 *
 *  Texture is considered incomplete when it has enabled mipmaping (see below)
 *  and does not have all mipmap levels defined.  But for the case of Image
 *  accessing, it is considered invalid if it is mipmap-incomplete and the
 *  level is different to the base level (base-incomplete).
 *
 *  Creation of incomplete texture:
 *  - generate and bind texture object id,
 *  - call TexImage2D with <level>: 0,
 *  - set GL_TEXTURE_MIN_FILTER? parameter to GL_NEAREST_MIPMAP_LINEAR, (to make
 *  sure, it should be initial value),
 *  - set GL_TEXTURE_BASE_LEVEL parameter to 0.
 *  - set GL_TEXTURE_MAX_LEVEL parameter, for 64x64 set 7 (log2(min(width,
 *  height)).
 *
 *  Creation of complete texture:
 *  - generate and bind texture object id,
 *  - call TexImage2D with <level>: 0,
 *  - set GL_TEXTURE_BASE_LEVEL parameter to 0.
 *  - set GL_TEXTURE_MAX_LEVEL parameter to 0.
 *
 *  Binding:
 *  - Set level == base_level for complete destinations.
 *  - Set level != base_level for incomplete destinations that are using
 *    mipmap-incomplete textures.
 *
 *  Test with 2D 64x64 RGBA8 textures.
 *
 *  Program should consist of vertex and fragment shader. Vertex shader should
 *  pass vertex position through. Fragment shader should do imageLoad() and
 *  imageStore() operations at coordinates gl_FragCoord.
 **/
class ImageLoadStoreIncompleteTexturesTest : public ShaderImageLoadStoreBase
{
private:
	/* Constants */
	/* Magic numbers that will identify textures, which will be used as their
	 * texel value.
	 */
	static const GLubyte m_complete_destination_magic_number   = 0x11;
	static const GLubyte m_complete_source_magic_number		   = 0x22;
	static const GLubyte m_incomplete_destination_magic_number = 0x33;
	static const GLubyte m_incomplete_source_magic_number	  = 0x44;

	/* Texture edge */
	GLuint m_texture_edge;

	/* Fields */
	GLuint m_complete_destination_texture_id;
	GLuint m_complete_source_texture_id;
	GLuint m_incomplete_destination_texture_id;
	GLuint m_incomplete_source_texture_id;
	GLuint m_program_id;
	GLuint m_vertex_array_object_id;
	GLuint m_vertex_buffer_id;

public:
	/* Constructor */
	ImageLoadStoreIncompleteTexturesTest()
		: m_texture_edge(0)
		, m_complete_destination_texture_id(0)
		, m_complete_source_texture_id(0)
		, m_incomplete_destination_texture_id(0)
		, m_incomplete_source_texture_id(0)
		, m_program_id(0)
		, m_vertex_array_object_id(0)
		, m_vertex_buffer_id(0)
	{
		/* Nothing to be done here */
	}

	/* Methods inherited from SubcaseBase */
	virtual long Setup()
	{
		/* Shaders code */
		const char* const vertex_shader_code = "#version 400 core\n"
											   "#extension GL_ARB_shader_image_load_store : require\n"
											   "\n"
											   "precision highp float;\n"
											   "\n"
											   "in vec4 vs_in_position;\n"
											   "\n"
											   "void main()\n"
											   "{\n"
											   "    gl_Position = vs_in_position;\n"
											   "}\n";

		const char* const fragment_shader_code =
			"#version 400 core\n"
			"#extension GL_ARB_shader_image_load_store : require\n"
			"\n"
			"precision highp float;\n"
			"\n"
			"layout(rgba8) writeonly uniform image2D u_complete_destination_image;\n"
			"layout(rgba8) readonly  uniform image2D u_complete_source_image;\n"
			"layout(rgba8) writeonly uniform image2D u_incomplete_destination_image;\n"
			"layout(rgba8) readonly  uniform image2D u_incomplete_source_image;\n"
			"\n"
			"void main()\n"
			"{\n"
			"    vec4 complete_loaded_color   = imageLoad (u_complete_source_image,   ivec2(gl_FragCoord));\n"
			"    vec4 incomplete_loaded_color = imageLoad (u_incomplete_source_image, ivec2(gl_FragCoord));\n"

			"    imageStore(u_complete_destination_image,\n"
			"               ivec2(gl_FragCoord),\n"
			"               incomplete_loaded_color);\n"
			"    imageStore(u_incomplete_destination_image,\n"
			"               ivec2(gl_FragCoord),\n"
			"               complete_loaded_color);\n"
			"\n"
			"    discard;\n"
			"}\n";

		/* Vertex postions for "full screen" quad, made with triangle strip */
		static const GLfloat m_vertex_buffer_data[] = {
			-1.0f, -1.0f, 0.0f, 1.0f, /* left bottom */
			-1.0f, 1.0f,  0.0f, 1.0f, /* left top */
			1.0f,  -1.0f, 0.0f, 1.0f, /* right bottom */
			1.0f,  1.0f,  0.0f, 1.0f, /* right top */
		};

		/* Result of BuildProgram operation */
		bool is_program_correct = true; /* BuildProgram set false when it fails, but it does not set true on success */

		/* Clean previous error */
		glGetError();

		m_texture_edge = de::min(64, de::min(getWindowHeight(), getWindowWidth()));

		/* Prepare textures */
		GLU_EXPECT_NO_ERROR(
			Create2DRGBA8CompleteTexture(m_complete_destination_magic_number, m_complete_destination_texture_id),
			"Create2DRGBA8CompleteTexture");
		GLU_EXPECT_NO_ERROR(Create2DRGBA8CompleteTexture(m_complete_source_magic_number, m_complete_source_texture_id),
							"Create2DRGBA8CompleteTexture");
		GLU_EXPECT_NO_ERROR(
			Create2DRGBA8IncompleteTexture(m_incomplete_destination_magic_number, m_incomplete_destination_texture_id),
			"Create2DRGBA8IncompleteTexture");
		GLU_EXPECT_NO_ERROR(
			Create2DRGBA8IncompleteTexture(m_incomplete_source_magic_number, m_incomplete_source_texture_id),
			"Create2DRGBA8IncompleteTexture");

		/* Prepare buffer with vertex positions of "full screen" quad" */
		glGenBuffers(1, &m_vertex_buffer_id);
		GLU_EXPECT_NO_ERROR(glGetError(), "GenBuffers");

		glBindBuffer(GL_ARRAY_BUFFER, m_vertex_buffer_id);
		GLU_EXPECT_NO_ERROR(glGetError(), "BindBuffer");

		glBufferData(GL_ARRAY_BUFFER, sizeof(m_vertex_buffer_data), m_vertex_buffer_data, GL_STATIC_DRAW);
		GLU_EXPECT_NO_ERROR(glGetError(), "BufferData");

		/* Generate vertex array object */
		glGenVertexArrays(1, &m_vertex_array_object_id);
		GLU_EXPECT_NO_ERROR(glGetError(), "GenVertexArrays");

		/* Prepare program object */
		m_program_id = BuildProgram(vertex_shader_code, 0 /* src_tcs */, 0 /* src_tes */, 0 /*src_gs */,
									fragment_shader_code, &is_program_correct);

		if (false == is_program_correct)
		{
			return ERROR;
		}

		/* Done */
		return NO_ERROR;
	}

	virtual long Cleanup()
	{
		/* Reset OpenGL state */
		glBindBuffer(GL_ARRAY_BUFFER, 0);
		glBindTexture(GL_TEXTURE_2D, 0);
		glBindVertexArray(0);
		glUseProgram(0);

		/* Delete program */
		if (0 != m_program_id)
		{
			glDeleteProgram(m_program_id);
			m_program_id = 0;
		}

		/* Delete textures */
		if (0 != m_complete_destination_texture_id)
		{
			glDeleteTextures(1, &m_complete_destination_texture_id);
			m_complete_destination_texture_id = 0;
		}

		if (0 != m_complete_source_texture_id)
		{
			glDeleteTextures(1, &m_complete_source_texture_id);
			m_complete_source_texture_id = 0;
		}

		if (0 != m_incomplete_destination_texture_id)
		{
			glDeleteTextures(1, &m_incomplete_destination_texture_id);
			m_incomplete_destination_texture_id = 0;
		}

		if (0 != m_incomplete_source_texture_id)
		{
			glDeleteTextures(1, &m_incomplete_source_texture_id);
			m_incomplete_source_texture_id = 0;
		}

		/* Delete vertex array object */
		if (0 != m_vertex_array_object_id)
		{
			glDeleteVertexArrays(1, &m_vertex_array_object_id);
			m_vertex_array_object_id = 0;
		}

		/* Delete buffer */
		if (0 != m_vertex_buffer_id)
		{
			glDeleteBuffers(1, &m_vertex_buffer_id);
			m_vertex_buffer_id = 0;
		}

		/* Done */
		return NO_ERROR;
	}

	virtual long Run()
	{
		bool result = true;

		/* Copy textures data with imageLoad() and imageStore() operations */
		Copy2DRGBA8Textures(m_complete_destination_texture_id, m_incomplete_destination_texture_id,
							m_complete_source_texture_id, m_incomplete_source_texture_id);

		glMemoryBarrier(GL_ALL_BARRIER_BITS);

		/* Verify that store to "incomplete destination" was ignored */
		if (true ==
			CheckIfTextureWasModified(m_incomplete_destination_texture_id, m_incomplete_destination_magic_number))
		{
			m_context.getTestContext().getLog()
				<< tcu::TestLog::Message << "Problem with imageStore, operation modified contents of incomplete texture"
				<< tcu::TestLog::EndMessage;

			result = false;
		}

		/* Verify that load from "incomplete source" returned 0 */
		if (false == CheckIfTextureIsBlack(m_complete_destination_texture_id))
		{
			m_context.getTestContext().getLog()
				<< tcu::TestLog::Message
				<< "Problem with imageLoad, operation returned non 0 result for incomplete texture"
				<< tcu::TestLog::EndMessage;

			result = false;
		}

		if (false == result)
		{
			return ERROR;
		}

		/* Done */
		return NO_ERROR;
	}

private:
	/* Private methods */

	/** Bind texture to image unit and sets image uniform to that unit
	 *
	 * @param program_id   Program object id
	 * @param texture_id   Texture id
	 * @param level        Texture level
	 * @param image_unit   Index of image unit
	 * @param uniform_name Name of image uniform
	 **/
	void BindTextureToImage(GLuint program_id, GLuint texture_id, GLint level, GLuint image_unit, const char* uniform_name)
	{
		/* Uniform location and invalid value */
		static const GLint invalid_uniform_location = -1;
		GLint			   image_uniform_location   = 0;

		/* Get uniform location */
		image_uniform_location = glGetUniformLocation(program_id, uniform_name);
		GLU_EXPECT_NO_ERROR(glGetError(), "GetUniformLocation");
		if (invalid_uniform_location == image_uniform_location)
		{
			throw tcu::InternalError("Uniform location is not available", uniform_name, __FILE__, __LINE__);
		}

		/* Bind texture to image unit */
		glBindImageTexture(image_unit, texture_id, level, GL_FALSE, 0 /* layer */, GL_READ_WRITE, GL_RGBA8);
		GLU_EXPECT_NO_ERROR(glGetError(), "BindImageTexture");

		/* Set uniform to image unit */
		glUniform1i(image_uniform_location, image_unit);
		GLU_EXPECT_NO_ERROR(glGetError(), "Uniform1i");
	}

	/** Check if texture is filled with black color, zeros
	 *
	 * @param texture_id Id of texture object
	 *
	 * @return true when texture is fully black, false otherwise
	 **/
	bool CheckIfTextureIsBlack(GLuint texture_id)
	{
		/* Constants to calculate size of texture */
		static const GLuint n_components	  = 4; /* RGBA */
		const GLuint		texture_data_size = m_texture_edge * m_texture_edge * n_components;

		/* Storage for texture data */
		std::vector<GLubyte> black_texture_data;
		std::vector<GLubyte> texture_data;

		/* Allocate memory */
		black_texture_data.resize(texture_data_size);
		texture_data.resize(texture_data_size);

		/* Set all texels to black */
		for (GLuint i = 0; i < texture_data_size; ++i)
		{
			black_texture_data[i] = 0;
		}

		/* Bind texture */
		glBindTexture(GL_TEXTURE_2D, texture_id);
		GLU_EXPECT_NO_ERROR(glGetError(), "BindTexture");

		glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, &texture_data[0]);
		GLU_EXPECT_NO_ERROR(glGetError(), "GetTexImage");

		/* Compare texels */
		return (0 == memcmp(&texture_data[0], &black_texture_data[0], texture_data_size));
	}

	/** Check if texture was modified
	 *
	 * @param texture_id   Id of texture object
	 * @param nagic_number Magic number that was to create texture
	 *
	 * @return true if texture contents match expected values, false otherwise
	 **/
	bool CheckIfTextureWasModified(GLuint texture_id, GLubyte magic_number)
	{
		/* Constants to calculate size of texture */
		static const GLuint n_components	  = 4; /* RGBA */
		const GLuint		texture_data_size = m_texture_edge * m_texture_edge * n_components;

		/* Storage for texture data */
		std::vector<GLubyte> expected_texture_data;
		std::vector<GLubyte> texture_data;

		/* Allocate memory */
		expected_texture_data.resize(texture_data_size);
		texture_data.resize(texture_data_size);

		/* Prepare expected texels */
		for (GLuint y = 0; y < m_texture_edge; ++y)
		{
			const GLuint line_offset = y * m_texture_edge * n_components;

			for (GLuint x = 0; x < m_texture_edge; ++x)
			{
				const GLuint texel_offset = x * n_components + line_offset;

				SetTexel(&expected_texture_data[texel_offset], static_cast<GLubyte>(x), static_cast<GLubyte>(y),
						 magic_number);
			}
		}

		/* Bind texture */
		glBindTexture(GL_TEXTURE_2D, texture_id);
		GLU_EXPECT_NO_ERROR(glGetError(), "BindTexture");

		glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, &texture_data[0]);
		GLU_EXPECT_NO_ERROR(glGetError(), "GetTexImage");

		/* Compare texels, true when textures are different */
		return (0 != memcmp(&texture_data[0], &expected_texture_data[0], texture_data_size));
	}

	/** Copy contents of "source" textures to "destination" textures with imageLoad() and imageStore() operations
	 *
	 * @param complete_destination_texture_id   Id of "complete destination" texture object
	 * @param incomplete_destination_texture_id Id of "incomplete destination" texture object
	 * @param complete_source_texture_id        Id of "complete source" texture object
	 * @param incomplete_source_texture_id      Id of "incomplete source" texture object
	 **/
	void Copy2DRGBA8Textures(GLuint complete_destination_texture_id, GLuint incomplete_destination_texture_id,
							 GLuint complete_source_texture_id, GLuint incomplete_source_texture_id)
	{
		/* Uniform names */
		static const char* const complete_destination_image_uniform_name   = "u_complete_destination_image";
		static const char* const complete_source_image_uniform_name		   = "u_complete_source_image";
		static const char* const incomplete_destination_image_uniform_name = "u_incomplete_destination_image";
		static const char* const incomplete_source_image_uniform_name	  = "u_incomplete_source_image";

		/* Attribute name */
		static const char* const position_attribute_name = "vs_in_position";

		/* Attribute location and invalid value */
		static const GLint invalid_attribute_location  = -1;
		GLint			   position_attribute_location = 0;

		/* Set current program */
		glUseProgram(m_program_id);
		GLU_EXPECT_NO_ERROR(glGetError(), "UseProgram");

		/* Bind vertex array object */
		glBindVertexArray(m_vertex_array_object_id);
		GLU_EXPECT_NO_ERROR(glGetError(), "BindVertexArray");

		/* Bind buffer with quad vertex positions */
		glBindBuffer(GL_ARRAY_BUFFER, m_vertex_buffer_id);
		GLU_EXPECT_NO_ERROR(glGetError(), "BindBuffer");

		/* Setup position attribute */
		position_attribute_location = glGetAttribLocation(m_program_id, position_attribute_name);
		GLU_EXPECT_NO_ERROR(glGetError(), "GetAttribLocation");
		if (invalid_attribute_location == position_attribute_location)
		{
			throw tcu::InternalError("Attribute location is not available", position_attribute_name, __FILE__,
									 __LINE__);
		}

		glVertexAttribPointer(position_attribute_location, 4 /*size */, GL_FLOAT, GL_FALSE, 0 /* stride */, 0);
		GLU_EXPECT_NO_ERROR(glGetError(), "VertexAttribPointer");

		glEnableVertexAttribArray(position_attribute_location);
		GLU_EXPECT_NO_ERROR(glGetError(), "EnableVertexAttribArray");

		/* Setup textures as source and destination images */
		BindTextureToImage(m_program_id, complete_destination_texture_id,
						   0 /* texture level */, 0 /* image_unit */,
						   complete_destination_image_uniform_name);
		BindTextureToImage(m_program_id, complete_source_texture_id,
						   0 /* texture level */, 1 /* image_unit */,
						   complete_source_image_uniform_name);
		BindTextureToImage(m_program_id, incomplete_destination_texture_id,
						   2 /* texture level */, 2 /* image_unit */,
						   incomplete_destination_image_uniform_name);
		BindTextureToImage(m_program_id, incomplete_source_texture_id,
						   2 /* texture level */, 3 /* image_unit */,
						   incomplete_source_image_uniform_name);

		/* Execute draw */
		glDrawArrays(GL_TRIANGLE_STRIP, 0 /* first vertex */, 4 /* number of vertices */);
		GLU_EXPECT_NO_ERROR(glGetError(), "DrawArrays");
	}

	/** Create complete 2D RGBA8 texture.
	 *
	 * @param magic_number   Magic number of texture
	 * @param out_texture_id Id of created texture, not modified if operation fails
	 *
	 * @return GL_NO_ERROR if operation was successful, GL error code otherwise
	 **/
	GLenum Create2DRGBA8CompleteTexture(GLubyte magic_number, GLuint& out_texture_id)
	{
		/* Constants to calculate size of texture */
		static const GLuint n_components	  = 4; /* RGBA */
		const GLuint		texture_data_size = m_texture_edge * m_texture_edge * n_components;

		/* Error code */
		GLenum err = 0;

		/* Texture id */
		GLuint texture_id = 0;

		/* Prepare storage for texture data */
		std::vector<GLubyte> texture_data;
		texture_data.resize(texture_data_size);

		/* Prepare texture data */
		for (GLuint y = 0; y < m_texture_edge; ++y)
		{
			const GLuint line_offset = y * m_texture_edge * n_components;

			for (GLuint x = 0; x < m_texture_edge; ++x)
			{
				const GLuint texel_offset = x * n_components + line_offset;

				SetTexel(&texture_data[texel_offset], static_cast<GLubyte>(x), static_cast<GLubyte>(y), magic_number);
			}
		}

		/* Generate texture */
		glGenTextures(1, &texture_id);
		err = glGetError();
		if (GL_NO_ERROR != err)
		{
			return err;
		}

		/* Bind texture */
		glBindTexture(GL_TEXTURE_2D, texture_id);
		err = glGetError();
		if (GL_NO_ERROR != err)
		{
			glDeleteTextures(1, &texture_id);
			return err;
		}

		/* Allocate storage and fill texture */
		glTexImage2D(GL_TEXTURE_2D, 0 /* level */, GL_RGBA8, m_texture_edge, m_texture_edge, 0 /* border */, GL_RGBA,
					 GL_UNSIGNED_BYTE, &texture_data[0]);
		err = glGetError();
		if (GL_NO_ERROR != err)
		{
			glDeleteTextures(1, &texture_id);
			return err;
		}

		/* Make texture complete */
		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0);
		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);
		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
		err = glGetError();
		if (GL_NO_ERROR != err)
		{
			glDeleteTextures(1, &texture_id);
			return err;
		}

		/* Set out_texture_id */
		out_texture_id = texture_id;

		/* Done */
		return GL_NO_ERROR;
	}

	/** Create incomplete 2D RGBA8 texture
	 *
	 * @param magic_number   Magic number of texture
	 * @param out_texture_id Id of created texture, not modified if operation fails
	 *
	 * @return GL_NO_ERROR if operation was successful, GL error code otherwise
	 **/
	GLenum Create2DRGBA8IncompleteTexture(GLubyte magic_number, GLuint& out_texture_id)
	{
		/* Constants to calculate size of texture */
		static const GLuint n_components	  = 4; /* RGBA */
		const GLuint		texture_data_size = m_texture_edge * m_texture_edge * n_components;

		/* Error code */
		GLenum err = 0;

		/* Texture id */
		GLuint texture_id = 0;

		/* Prepare storage for texture data */
		std::vector<GLubyte> texture_data;
		texture_data.resize(texture_data_size);

		/* Prepare texture data */
		for (GLuint y = 0; y < m_texture_edge; ++y)
		{
			const GLuint line_offset = y * m_texture_edge * n_components;

			for (GLuint x = 0; x < m_texture_edge; ++x)
			{
				const GLuint texel_offset = x * n_components + line_offset;

				SetTexel(&texture_data[texel_offset], static_cast<GLubyte>(x), static_cast<GLubyte>(y), magic_number);
			}
		}

		/* Generate texture */
		glGenTextures(1, &texture_id);
		err = glGetError();
		if (GL_NO_ERROR != err)
		{
			return err;
		}

		/* Bind texture */
		glBindTexture(GL_TEXTURE_2D, texture_id);
		err = glGetError();
		if (GL_NO_ERROR != err)
		{
			glDeleteTextures(1, &texture_id);
			return err;
		}

		/* Allocate storage and fill texture */
		glTexImage2D(GL_TEXTURE_2D, 0 /* level */, GL_RGBA8, m_texture_edge, m_texture_edge, 0 /* border */, GL_RGBA,
					 GL_UNSIGNED_BYTE, &texture_data[0]);
		err = glGetError();
		if (GL_NO_ERROR != err)
		{
			glDeleteTextures(1, &texture_id);
			return err;
		}

		/* Make texture incomplete */
		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0);
		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 7);
		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_LINEAR);
		err = glGetError();
		if (GL_NO_ERROR != err)
		{
			glDeleteTextures(1, &texture_id);
			return err;
		}

		/* Set out_texture_id */
		out_texture_id = texture_id;

		/* Done */
		return GL_NO_ERROR;
	}

	/** Prepare "unique" texels.
	 *  Texel is assigned with such values: [x_coordinate, y_coordinate, magic_number, 0xcc].
	 *
	 * @param texel        Storage of texel
	 * @param x_coordinate X coordiante of texel
	 * @param y_coordinate Y coordinate of texel
	 * @param magic_number Magic number of texture
	 **/
	void SetTexel(GLubyte texel[4], GLubyte x_coordinate, GLubyte y_coordinate, GLubyte magic_number)
	{
		texel[0] = x_coordinate;
		texel[1] = y_coordinate;
		texel[2] = magic_number;
		texel[3] = 0xcc;
	}
};

/** Test "Refer to the same image unit using multiple uniforms", description follows.
 *
 * Steps:
 * - prepare program object, see details below,
 * - prepare 2D R32I texture, width should be equal to the number of image
 * uniforms used by program object, height should be 2, fill first row with
 * unique values, fill second row with zeros,
 * - bind texture to first image unit,
 * - set all image uniforms to first image unit,
 * - execute program for a single vertex,
 * - verify that:
 *     - values in first row were negated,
 *     - values from first row were copied to second row,
 *
 * Repeat steps to test all shader stages that support at least 2 image
 * uniforms.
 *
 * Program has to contain all necessary shader stages. Use boilerplate shaders
 * for shader stages that are not important for the test.
 *
 * Tested shader stage should:
 * - Use as many different image formats as possible, image formats compatible
 * with R32I:
 *     * rg16f
 *     * r11f_g11f_b10f
 *     * r32f
 *     * rgb10_a2ui
 *     * rgba8ui
 *     * rg16ui
 *     * r32ui
 *     * rgba8i
 *     * rg16i
 *     * r32i
 *     * rgb10_a2
 *     * rgba8
 *     * rg16
 *     * rgba8_snorm
 *     * rg16_snorm.
 * - Declare maximum allowed number of image uniforms,
 *
 *     layout(format) uniform gimage2D u_image;
 *
 * where <format> is selected image format, <gimage2D> is type of 2D image
 * compatible with <format> and <u_image> is unique name of uniform.
 * Note that image uniforms cannot be declared as array, due to different image
 * formats. Therefore separate uniforms have to be used.
 * - Include following code snippet:
 * for (int i = 0; i < gl_Max*ImageUniforms; ++i)
 * {
 *     vec row_1_coord(i,0);
 *     vec row_2_coord(i,1);
 *
 *     row_1_value = imageLoad(u_image[i], row_1_coord);
 *     imageStore(u_image[i], row_1_coord, -row_1_value);
 *     imageStore(u_image[i], row_2_coord, row_1_value);
 * }
 * where gl_Max*ImageUniforms is the constant corresponding to tested shader
 * stage.
 **/
class ImageLoadStoreMultipleUniformsTest : public ShaderImageLoadStoreBase
{
private:
	/* Types */
	/** Details of image format
	 *
	 **/
	struct imageFormatDetails
	{
		typedef bool (*verificationRoutine)(GLint, GLint, GLint);

		const char*			m_image_format;
		const char*			m_image_type;
		const char*			m_color_type;
		GLenum				m_image_unit_format;
		verificationRoutine m_verification_routine;
	};

	template <typename T, GLuint SIZE, GLuint OFFSET, bool = (OFFSET < sizeof(T) * CHAR_BIT)>
	struct Masks
	{
		/** Get mask of bits used to store in bit-field
		 *
		 * @return Mask
		 **/
		static inline T RawMask()
		{
			static const T mask = ValueMask() << OFFSET;

			return mask;
		}

		/** Get mask of bits used to store value.
		 *
		 * @return Mask
		 **/
		static inline T ValueMask()
		{
			static const T mask = (1 << SIZE) - 1;

			return mask;
		}

		/** Get offset.
		 *
		 * @return offset
		 **/
		static inline T Offset()
		{
			return OFFSET;
		}
	};

	template <typename T, GLuint SIZE, GLuint OFFSET>
	struct Masks<T, SIZE, OFFSET, false>
	{
		/** Get mask of bits used to store in bit-field
		 *
		 * @return Mask
		 **/
		static inline T RawMask()
		{
			DE_ASSERT(DE_FALSE && "Shouldn't be called");
			return 0;
		}

		/** Get mask of bits used to store value.
		 *
		 * @return Mask
		 **/
		static inline T ValueMask()
		{
			DE_ASSERT(DE_FALSE && "Shouldn't be called");
			return 0;
		}

		/** Get offset.
		 *
		 * @return offset
		 **/
		static inline T Offset()
		{
			DE_ASSERT(DE_FALSE && "Shouldn't be called");
			return 0;
		}
	};

	/** Template class for accessing integer values stored in bit-fields
	 *
	 **/
	template <typename T, GLuint SIZE, GLuint OFFSET>
	class Integer
	{
	public:
		/** Constructor
		 *
		 **/
		Integer(T raw) : m_raw(raw)
		{
		}

		/** Extract value from bit-field
		 *
		 * @return Value
		 **/
		T Get() const
		{
			const T mask = Masks<T, SIZE, OFFSET>::RawMask();

			const T bits   = m_raw & mask;
			const T result = (unsigned)bits >> Masks<T, SIZE, OFFSET>::Offset();

			return result;
		}

		/** Extract value from bit-field and negate it
		 *
		 * @return Negated value
		 **/
		T GetNegated() const
		{
			const T mask  = Masks<T, SIZE, OFFSET>::ValueMask();
			const T value = Get();

			return Clamp((~value) + 1) & mask;
		}

		T Clamp(T n) const
		{
			const bool isUnsigned = (T(0) < T(-1));
			const T	min		  = T(isUnsigned ? 0.L : -pow(2.L, int(SIZE - 1)));
			const T	max		  = T(isUnsigned ? pow(2.L, int(SIZE)) - 1.L : pow(2.L, int(SIZE - 1)) - 1.L);
			const T	x		  = n > max ? max : n;
			return x < min ? min : x;
		}

	private:
		T m_raw;
	};

	/* Enums */
	/** Shader stage identification
	 *
	 **/
	enum shaderStage
	{
		fragmentShaderStage				 = 2,
		geometryShaderStage				 = 4,
		tesselationControlShaderStage	= 8,
		tesselationEvalutaionShaderStage = 16,
		vertexShaderStage				 = 32,
	};

	/** Test result
	 *
	 **/
	enum testResult
	{
		testFailed		 = -1,
		testNotSupported = 1,
		testPassed		 = 0
	};

	/* Constants */
	static const GLint m_min_required_image_uniforms = 2;

	/* Fields */
	GLuint m_program_to_test_fs_stage_id;
	GLuint m_program_to_test_gs_stage_id;
	GLuint m_program_to_test_tcs_stage_id;
	GLuint m_program_to_test_tes_stage_id;
	GLuint m_program_to_test_vs_stage_id;
	GLuint m_texture_to_test_fs_stage_id;
	GLuint m_texture_to_test_gs_stage_id;
	GLuint m_texture_to_test_tcs_stage_id;
	GLuint m_texture_to_test_tes_stage_id;
	GLuint m_texture_to_test_vs_stage_id;
	GLuint m_vertex_array_object_id;

public:
	/* Constructor */
	ImageLoadStoreMultipleUniformsTest()
		: m_program_to_test_fs_stage_id(0)
		, m_program_to_test_gs_stage_id(0)
		, m_program_to_test_tcs_stage_id(0)
		, m_program_to_test_tes_stage_id(0)
		, m_program_to_test_vs_stage_id(0)
		, m_texture_to_test_fs_stage_id(0)
		, m_texture_to_test_gs_stage_id(0)
		, m_texture_to_test_tcs_stage_id(0)
		, m_texture_to_test_tes_stage_id(0)
		, m_texture_to_test_vs_stage_id(0)
		, m_vertex_array_object_id(0)
	{
		/* Nothing to be done here */
	}

	/* Methods inherited from SubcaseBase */
	virtual long Setup()
	{
		/* Prepare programs */
		m_program_to_test_fs_stage_id  = buildProgramToTestShaderStage(fragmentShaderStage);
		m_program_to_test_gs_stage_id  = buildProgramToTestShaderStage(geometryShaderStage);
		m_program_to_test_tcs_stage_id = buildProgramToTestShaderStage(tesselationControlShaderStage);
		m_program_to_test_tes_stage_id = buildProgramToTestShaderStage(tesselationEvalutaionShaderStage);
		m_program_to_test_vs_stage_id  = buildProgramToTestShaderStage(vertexShaderStage);

		/* Prepare textures */
		m_texture_to_test_fs_stage_id  = createTextureToTestShaderStage(fragmentShaderStage);
		m_texture_to_test_gs_stage_id  = createTextureToTestShaderStage(geometryShaderStage);
		m_texture_to_test_tcs_stage_id = createTextureToTestShaderStage(tesselationControlShaderStage);
		m_texture_to_test_tes_stage_id = createTextureToTestShaderStage(tesselationEvalutaionShaderStage);
		m_texture_to_test_vs_stage_id  = createTextureToTestShaderStage(vertexShaderStage);

		/* Generate vertex array object */
		glGenVertexArrays(1, &m_vertex_array_object_id);
		GLU_EXPECT_NO_ERROR(glGetError(), "GenVertexArrays");

		/* Bind vertex array object */
		glBindVertexArray(m_vertex_array_object_id);
		GLU_EXPECT_NO_ERROR(glGetError(), "BindVertexArray");

		/* Set vertices number for patches */
		glPatchParameteri(GL_PATCH_VERTICES, 1);

		/* Done */
		return NO_ERROR;
	}

	virtual long Cleanup()
	{
		glUseProgram(0);

		/* Delete programs */
		if (0 != m_program_to_test_fs_stage_id)
		{
			glDeleteProgram(m_program_to_test_fs_stage_id);
			m_program_to_test_fs_stage_id = 0;
		}

		if (0 != m_program_to_test_gs_stage_id)
		{
			glDeleteProgram(m_program_to_test_gs_stage_id);
			m_program_to_test_gs_stage_id = 0;
		}

		if (0 != m_program_to_test_tcs_stage_id)
		{
			glDeleteProgram(m_program_to_test_tcs_stage_id);
			m_program_to_test_tcs_stage_id = 0;
		}

		if (0 != m_program_to_test_tes_stage_id)
		{
			glDeleteProgram(m_program_to_test_tes_stage_id);
			m_program_to_test_tes_stage_id = 0;
		}

		if (0 != m_program_to_test_vs_stage_id)
		{
			glDeleteProgram(m_program_to_test_vs_stage_id);
			m_program_to_test_vs_stage_id = 0;
		}

		/* Delete textures */
		if (0 != m_texture_to_test_fs_stage_id)
		{
			glDeleteTextures(1, &m_texture_to_test_fs_stage_id);
			m_texture_to_test_fs_stage_id = 0;
		}

		if (0 != m_texture_to_test_gs_stage_id)
		{
			glDeleteTextures(1, &m_texture_to_test_gs_stage_id);
			m_texture_to_test_gs_stage_id = 0;
		}

		if (0 != m_texture_to_test_tcs_stage_id)
		{
			glDeleteTextures(1, &m_texture_to_test_tcs_stage_id);
			m_texture_to_test_tcs_stage_id = 0;
		}

		if (0 != m_texture_to_test_tes_stage_id)
		{
			glDeleteTextures(1, &m_texture_to_test_tes_stage_id);
			m_texture_to_test_tes_stage_id = 0;
		}

		if (0 != m_texture_to_test_vs_stage_id)
		{
			glDeleteTextures(1, &m_texture_to_test_vs_stage_id);
			m_texture_to_test_vs_stage_id = 0;
		}

		/* Delete vertex array object id */
		if (0 != m_vertex_array_object_id)
		{
			glDeleteVertexArrays(1, &m_vertex_array_object_id);
			m_vertex_array_object_id = 0;
		}

		/* Done */
		return NO_ERROR;
	}

	virtual long Run()
	{
		bool result = true;

		if (testFailed == testShaderStage(fragmentShaderStage))
		{
			m_context.getTestContext().getLog() << tcu::TestLog::Message << "Problems with fragment shader stage!"
												<< tcu::TestLog::EndMessage;

			result = false;
		}

		if (testFailed == testShaderStage(geometryShaderStage))
		{
			m_context.getTestContext().getLog() << tcu::TestLog::Message << "Problems with geometry shader stage!"
												<< tcu::TestLog::EndMessage;

			result = false;
		}

		if (testFailed == testShaderStage(tesselationControlShaderStage))
		{
			m_context.getTestContext().getLog() << tcu::TestLog::Message
												<< "Problems with tesselation control shader stage!"
												<< tcu::TestLog::EndMessage;

			result = false;
		}

		if (testFailed == testShaderStage(tesselationEvalutaionShaderStage))
		{
			m_context.getTestContext().getLog() << tcu::TestLog::Message
												<< "Problems with tesselation evaluation shader stage!"
												<< tcu::TestLog::EndMessage;

			result = false;
		}

		if (testFailed == testShaderStage(vertexShaderStage))
		{
			m_context.getTestContext().getLog() << tcu::TestLog::Message << "Problems with vertex shader stage!"
												<< tcu::TestLog::EndMessage;

			result = false;
		}

		if (false == result)
		{
			return ERROR;
		}

		/* Done */
		return NO_ERROR;
	}

private:
	/* Static routines */
	/** Provide image format details for given index
	 *
	 * @param index       Index
	 * @param out_details Image format detail instance
	 **/
	static void getImageUniformDeclarationDetails(GLuint index, imageFormatDetails& out_details)
	{
		static const ImageLoadStoreMultipleUniformsTest::imageFormatDetails default_format_details = {
			"r32i", "iimage2D", "ivec4", GL_R32I, ImageLoadStoreMultipleUniformsTest::verifyInteger
		};

		static const ImageLoadStoreMultipleUniformsTest::imageFormatDetails format_details[] = {
			{ "rg16f", "image2D", "vec4", GL_RG16F, ImageLoadStoreMultipleUniformsTest::verifyFloat<GLushort> },
			{ "r11f_g11f_b10f", "image2D", "vec4", GL_R11F_G11F_B10F,
			  ImageLoadStoreMultipleUniformsTest::verifyFloatUnsigned<GLuint> },
			{ "r32f", "image2D", "vec4", GL_R32F, ImageLoadStoreMultipleUniformsTest::verifyFloat<GLuint> },
			{ "rgb10_a2", "image2D", "vec4", GL_RGB10_A2,
			  ImageLoadStoreMultipleUniformsTest::verifyFloatUnsigned<GLuint> },
			{ "rgba8", "image2D", "vec4", GL_RGBA8, ImageLoadStoreMultipleUniformsTest::verifyFloatUnsigned<GLuint> },
			{ "rg16", "image2D", "vec4", GL_RG16, ImageLoadStoreMultipleUniformsTest::verifyFloatUnsigned<GLuint> },
			{ "rgba8_snorm", "image2D", "vec4", GL_RGBA8_SNORM,
			  ImageLoadStoreMultipleUniformsTest::verifyFloatSignedNorm<GLbyte> },
			{ "rg16_snorm", "image2D", "vec4", GL_RG16_SNORM,
			  ImageLoadStoreMultipleUniformsTest::verifyFloatSignedNorm<GLshort> },
			{ "rgb10_a2ui", "uimage2D", "uvec4", GL_RGB10_A2UI,
			  ImageLoadStoreMultipleUniformsTest::verifyInteger<10, 10, 10, 2, GLuint> },
			{ "rgba8ui", "uimage2D", "uvec4", GL_RGBA8UI,
			  ImageLoadStoreMultipleUniformsTest::verifyInteger<8, 8, 8, 8, GLuint> },
			{ "rg16ui", "uimage2D", "uvec4", GL_RG16UI,
			  ImageLoadStoreMultipleUniformsTest::verifyInteger<16, 16, 0, 0, GLuint> },
			{ "r32ui", "uimage2D", "uvec4", GL_R32UI, ImageLoadStoreMultipleUniformsTest::verifyInteger },
			{ "rgba8i", "iimage2D", "ivec4", GL_RGBA8I,
			  ImageLoadStoreMultipleUniformsTest::verifyInteger<8, 8, 8, 8, GLint> },
			{ "rg16i", "iimage2D", "ivec4", GL_RG16I,
			  ImageLoadStoreMultipleUniformsTest::verifyInteger<16, 16, 0, 0, GLint> }
		};

		static const GLuint n_imageUniformFormatDetails =
			sizeof(format_details) / sizeof(ImageLoadStoreMultipleUniformsTest::imageFormatDetails);

		if (n_imageUniformFormatDetails <= index)
		{
			out_details = default_format_details;
		}
		else
		{
			out_details = format_details[index];
		}
	}

	/** Write name of image uniform at given index to output stream
	 *
	 * @param stream Output stream
	 * @param index  Index
	 **/
	static void writeImageUniformNameToStream(std::ostream& stream, GLuint index)
	{
		/* u_image_0 */
		stream << "u_image_" << index;
	}

	/** Write name of variable used to store value loaded from image at given index to output stream
	 *
	 * @param stream Output stream
	 * @param index  Index
	 **/
	static void writeLoadedValueVariableNameToStream(std::ostream& stream, GLuint index)
	{
		/* loaded_value_0 */
		stream << "loaded_value_" << index;
	}

	/** Write name of variable used to store coordinate of texel at given row to output stream
	 *
	 * @param stream Output stream
	 * @param index  Index of image uniform
	 * @param row    Row of image
	 **/
	static void writeCoordinatesVariableNameToStream(std::ostream& stream, GLuint index, GLuint row)
	{
		/* row_0_coordinates_0 */
		stream << "row_" << row << "_coordinates_" << index;
	}

	struct imageUniformDeclaration
	{
		imageUniformDeclaration(GLuint index) : m_index(index)
		{
		}

		GLuint m_index;
	};

	/** Write declaration of image uniform at given index to output stream
	 *
	 * @param stream                   Output stream
	 * @param imageUniformDeclaration  Declaration details
	 *
	 * @return stream
	 **/
	friend std::ostream& operator<<(std::ostream& stream, const imageUniformDeclaration& declaration)
	{
		ImageLoadStoreMultipleUniformsTest::imageFormatDetails format_details;
		getImageUniformDeclarationDetails(declaration.m_index, format_details);

		/* layout(r32f) uniform image2D u_image_0; */
		stream << "layout(" << format_details.m_image_format << ") uniform " << format_details.m_image_type << " ";

		ImageLoadStoreMultipleUniformsTest::writeImageUniformNameToStream(stream, declaration.m_index);

		stream << ";";

		return stream;
	}

	struct imageLoadCall
	{
		imageLoadCall(GLuint index) : m_index(index)
		{
		}

		GLuint m_index;
	};

	/* Stream operators */
	/** Write code that execute imageLoad routine for image at given index to output stream
	 *
	 * @param stream Output stream
	 * @param load   imageLoad call details
	 *
	 * @return stream
	 **/
	friend std::ostream& operator<<(std::ostream& stream, const imageLoadCall& load)
	{
		ImageLoadStoreMultipleUniformsTest::imageFormatDetails format_details;
		getImageUniformDeclarationDetails(load.m_index, format_details);

		/* vec4 loaded_value_0 = imageLoad(u_image_0, row_0_coordinates_0); */
		stream << format_details.m_color_type << " ";

		writeLoadedValueVariableNameToStream(stream, load.m_index);

		stream << " = imageLoad(";

		writeImageUniformNameToStream(stream, load.m_index);

		stream << ", ";

		writeCoordinatesVariableNameToStream(stream, load.m_index, 0 /* row */);

		stream << ");";

		return stream;
	}

	struct imageStoreCall
	{
		imageStoreCall(GLuint index, GLuint row) : m_index(index), m_row(row)
		{
		}

		GLuint m_index;
		GLuint m_row;
	};

	/** Write code that execute imageStore to image at given index to output stream
	 *
	 * @param stream Output stream
	 * @param store  imageStore call details
	 *
	 * @return stream
	 **/
	friend std::ostream& operator<<(std::ostream& stream, const imageStoreCall& store)
	{
		/* imageStore(u_image_0, row_0_coordinates_0, -loaded_value_0); */
		stream << "imageStore(";

		writeImageUniformNameToStream(stream, store.m_index);

		stream << ", ";

		writeCoordinatesVariableNameToStream(stream, store.m_index, store.m_row);

		if (0 == store.m_row)
		{
			stream << ", -";
		}
		else
		{
			stream << ", ";
		}

		writeLoadedValueVariableNameToStream(stream, store.m_index);
		stream << ");";

		return stream;
	}

	struct coordinatesVariableDeclaration
	{
		coordinatesVariableDeclaration(GLuint index, GLuint row) : m_index(index), m_row(row)
		{
		}
		GLuint m_index;
		GLuint m_row;
	};

	/** Write declaration of variable for coordinate at given row to output stream
	 *
	 * @param stream      Output stream
	 * @param declaration Declaration details
	 *
	 * @return stream
	 **/
	friend std::ostream& operator<<(std::ostream& stream, const coordinatesVariableDeclaration& declaration)
	{
		stream << "const ivec2 ";

		writeCoordinatesVariableNameToStream(stream, declaration.m_index, declaration.m_row);

		stream << " = ivec2(" << declaration.m_index << ", " << declaration.m_row << ");";

		return stream;
	}

	/* Methods */
	/** Build program to test specified shader stage
	 *
	 * Throws exception in case of any failure
	 *
	 * @param stage Stage id
	 *
	 * @return Program id
	 **/
	GLuint buildProgramToTestShaderStage(shaderStage stage)
	{
		static const char* const boilerplate_fragment_shader_code =
			"#version 400 core\n"
			"#extension GL_ARB_shader_image_load_store : require\n"
			"\n"
			"precision highp float;\n"
			"\n"
			"void main()\n"
			"{\n"
			"    discard;\n"
			"}\n";

		static const char* const boilerplate_tesselation_evaluation_shader_code =
			"#version 400 core\n"
			"#extension GL_ARB_shader_image_load_store : require\n"
			"\n"
			"precision highp float;\n"
			"\n"
			"layout(quads, equal_spacing, ccw) in;\n"
			"\n"
			"void main()\n"
			"{\n"
			"\n"
			"}\n";

		static const char* const boilerplate_vertex_shader_code =
			"#version 400 core\n"
			"#extension GL_ARB_shader_image_load_store : require\n"
			"\n"
			"precision highp float;\n"
			"\n"
			"layout(location = 0) in vec4 i_position;\n"
			"\n"
			"void main()\n"
			"{\n"
			"  gl_Position = i_position;\n"
			"}\n";

		const char* fragment_shader_code			   = boilerplate_fragment_shader_code;
		const char* geometry_shader_code			   = 0;
		bool		is_program_built				   = true;
		GLuint		program_object_id				   = 0;
		const char* tesselation_control_shader_code	= 0;
		const char* tesselation_evaluation_shader_code = 0;
		std::string tested_shader_stage_code;
		const char* vertex_shader_code = boilerplate_vertex_shader_code;

		/* Get source code for tested shader stage */
		prepareShaderForTestedShaderStage(stage, tested_shader_stage_code);

		if (true == tested_shader_stage_code.empty())
		{
			return 0;
		}

		/* Set up source code for all required stages */
		switch (stage)
		{
		case fragmentShaderStage:
			fragment_shader_code = tested_shader_stage_code.c_str();
			break;

		case geometryShaderStage:
			geometry_shader_code = tested_shader_stage_code.c_str();
			break;

		case tesselationControlShaderStage:
			tesselation_control_shader_code	= tested_shader_stage_code.c_str();
			tesselation_evaluation_shader_code = boilerplate_tesselation_evaluation_shader_code;
			break;

		case tesselationEvalutaionShaderStage:
			tesselation_evaluation_shader_code = tested_shader_stage_code.c_str();
			break;

		case vertexShaderStage:
			vertex_shader_code = tested_shader_stage_code.c_str();
			break;

		default:
			TCU_FAIL("Invalid shader stage");
		}

		/* Build program */
		program_object_id =
			BuildProgram(vertex_shader_code, tesselation_control_shader_code, tesselation_evaluation_shader_code,
						 geometry_shader_code, fragment_shader_code, &is_program_built);

		/* Check if program was built */
		if (false == is_program_built)
		{
			throw tcu::InternalError("Failed to build program", "", __FILE__, __LINE__);
		}

		/* Done */
		return program_object_id;
	}

	/** Create texture to test given shader stage
	 *
	 * Throws exception in case of any failure
	 *
	 * @param stage Stage id
	 *
	 * @return Texture id
	 **/
	GLuint createTextureToTestShaderStage(shaderStage stage)
	{
		GLenum			   error			  = glGetError();
		const GLint		   max_image_uniforms = getMaximumImageUniformsForStage(stage);
		GLuint			   texture_id		  = 0;
		std::vector<GLint> texture_data;

		const GLsizei height = 2;
		const GLsizei width  = max_image_uniforms;

		if (m_min_required_image_uniforms > max_image_uniforms)
		{
			return 0;
		}

		/* Generate texture id */
		glGenTextures(1, &texture_id);
		GLU_EXPECT_NO_ERROR(glGetError(), "GenTextures");

		/* Bind texture */
		glBindTexture(GL_TEXTURE_2D, texture_id);
		error = glGetError();
		if (GL_NO_ERROR != error)
		{
			glDeleteTextures(1, &texture_id);
			GLU_EXPECT_NO_ERROR(error, "BindTexture");
		}

		/* Prepare storage for texture data */
		texture_data.resize(width * height);
		for (GLint i = 0; i < max_image_uniforms; ++i)
		{
			texture_data[i]			= getExpectedValue(i);
			texture_data[i + width] = 0;
		}

		/* Create first level of texture */
		glTexImage2D(GL_TEXTURE_2D, 0 /* level */, GL_R32I, width, height, 0 /*border */, GL_RED_INTEGER, GL_INT,
					 &texture_data[0]);
		error = glGetError();
		if (GL_NO_ERROR != error)
		{
			glDeleteTextures(1, &texture_id);
			GLU_EXPECT_NO_ERROR(error, "TexImage2D");
		}

		/* Make texture complete */
		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0);
		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);
		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
		error = glGetError();
		if (GL_NO_ERROR != error)
		{
			glDeleteTextures(1, &texture_id);
			GLU_EXPECT_NO_ERROR(error, "TexParameteri");
		}

		/* Done */
		return texture_id;
	}

	/** Get value of texel for image at given index
	 *
	 * @param index Index of image uniform
	 *
	 * @return Value of texel
	 **/
	GLint getExpectedValue(GLint index)
	{
		// To fix denorm issues with r32f, rg16f and r11f_g11f_b10f
		// we set one bit in the exponent of each component of those pixel format
		return 0x40104200 + index;
	}

	/** Get name of uniform at given index
	 *
	 * @param index    Index of uniform
	 * @param out_name Name of uniform
	 **/
	void getImageUniformName(GLuint index, std::string& out_name)
	{
		std::stringstream stream;

		writeImageUniformNameToStream(stream, index);

		out_name = stream.str();
	}

	/** Get maximum number of image uniforms allowed for given shader stage
	 *
	 * @param stage Stage id
	 *
	 * @return Maximum allowed image uniforms
	 **/
	GLint getMaximumImageUniformsForStage(shaderStage stage)
	{
		GLint  max_image_uniforms = 0;
		GLenum pname			  = 0;

		switch (stage)
		{
		case fragmentShaderStage:
			pname = GL_MAX_FRAGMENT_IMAGE_UNIFORMS;
			break;

		case geometryShaderStage:
			pname = GL_MAX_GEOMETRY_IMAGE_UNIFORMS;
			break;

		case tesselationControlShaderStage:
			pname = GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS;
			break;

		case tesselationEvalutaionShaderStage:
			pname = GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS;
			break;

		case vertexShaderStage:
			pname = GL_MAX_VERTEX_IMAGE_UNIFORMS;
			break;

		default:
			TCU_FAIL("Invalid shader stage");
		}

		glGetIntegerv(pname, &max_image_uniforms);
		GLU_EXPECT_NO_ERROR(glGetError(), "GetIntegerv");

		return max_image_uniforms;
	}

	/** Prepare source for tested shader stage
	 *
	 * @param stage    Stage id
	 * @param out_code Source code
	 **/
	void prepareShaderForTestedShaderStage(shaderStage stage, std::string& out_code)
	{
		GLint			  max_image_uniforms	= getMaximumImageUniformsForStage(stage);
		const char*		  stage_specific_layout = "";
		const char*		  stage_specific_predicate = "true";
		std::stringstream stream;

		if (m_min_required_image_uniforms > max_image_uniforms)
		{
			return;
		}

		/* Expected result follows
		 *
		 * #version 400 core
		 * #extension GL_ARB_shader_image_load_store : require
		 *
		 * precision highp float;
		 *
		 * stage_specific_layout goes here
		 *
		 * Uniform declarations go here
		 *
		 * void main()
		 * {
		 *     const ivec2 row_0_coordinates(0, 0);
		 *     const ivec2 row_1_coordinates(0, 1);
		 *
		 *     For each index <0, GL_MAX_*_IMAGE_UNIFORMS>
		 *
		 *     vec4 loaded_value_0 = imageLoad(u_image_0, row_0_coordinates);
		 *
		 *     imageStore(u_image_0, row_0_coordinates, -loaded_value_0);
		 *     imageStore(u_image_0, row_1_coordinates, loaded_value_0);
		 * }
		 */

		/* Get piece of code specific for stage */
		switch (stage)
		{
		case fragmentShaderStage:
			break;

		case geometryShaderStage:
			stage_specific_layout = "layout(points) in;\n"
									"layout(points, max_vertices = 1) out;\n"
									"\n";
			break;

		case tesselationControlShaderStage:
			stage_specific_layout = "layout(vertices = 4) out;\n"
									"\n";
			stage_specific_predicate = "gl_InvocationID == 0";
			break;

		case tesselationEvalutaionShaderStage:
			stage_specific_layout = "layout(quads, equal_spacing, ccw) in;\n"
									"\n";
			break;

		case vertexShaderStage:
			break;

		default:
			TCU_FAIL("Invalid shader stage");
		}

		/* Preamble */
		stream << "#version 400 core\n"
				  "#extension GL_ARB_shader_image_load_store : require\n"
				  "\n"
				  "precision highp float;\n"
				  "\n"
			   << stage_specific_layout;

		/* Image uniforms declarations */
		for (GLint i = 0; i < max_image_uniforms; ++i)
		{
			stream << imageUniformDeclaration(i) << "\n";
		}

		/* Main opening */
		stream << "\n"
				  "void main()\n"
				  "{\n";

		stream << "    if (" << stage_specific_predicate << ")\n";
		stream << "    {\n";

		/* imageLoad and imageStores for each uniform */
		for (GLint i = 0; i < max_image_uniforms; ++i)
		{
			stream << "        " << coordinatesVariableDeclaration(i, 0) << "\n"
				   << "        " << coordinatesVariableDeclaration(i, 1) << "\n"
				   << "\n"
				   << "        " << imageLoadCall(i) << "\n"
				   << "\n"
				   << "        " << imageStoreCall(i, 0) << "\n"
				   << "        " << imageStoreCall(i, 1) << "\n";

			if (max_image_uniforms > i + 1)
			{
				stream << "\n";
			}
		}

		stream << "    }\n";

		/* Main closing */
		stream << "}\n\n";

		/* Done */
		out_code = stream.str();
	}

	/** Test given shader stage
	 *
	 * @param stage Stage id
	 *
	 * @return m_test_not_supported if shader stage does not support at least m_min_required_image_uniforms image uniforms;
	 *         testFailed when test result is negative;
	 *         m_test_passed when test result is positive;
	 **/
	testResult testShaderStage(shaderStage stage)
	{
		std::string		   image_uniform_name;
		static const GLint invalid_uniform_location = -1;
		const GLint		   max_image_uniforms		= getMaximumImageUniformsForStage(stage);
		GLenum			   primitive_mode			= GL_POINTS;
		GLuint			   program_id				= 0;
		testResult		   result					= testPassed;
		std::vector<GLint> texture_data;
		GLuint			   texture_id = 0;

		static const GLuint height = 2;
		const GLuint		width  = max_image_uniforms;

		const GLuint		positive_value_index = width;
		static const GLuint negated_value_index  = 0;

		if (m_min_required_image_uniforms > max_image_uniforms)
		{
			return testNotSupported;
		}

		/* Select program and texture ids for given stage */
		switch (stage)
		{
		case fragmentShaderStage:
			program_id = m_program_to_test_fs_stage_id;
			texture_id = m_texture_to_test_fs_stage_id;
			break;

		case geometryShaderStage:
			program_id = m_program_to_test_gs_stage_id;
			texture_id = m_texture_to_test_gs_stage_id;
			break;

		case tesselationControlShaderStage:
			primitive_mode = GL_PATCHES;
			program_id	 = m_program_to_test_tcs_stage_id;
			texture_id	 = m_texture_to_test_tcs_stage_id;
			break;

		case tesselationEvalutaionShaderStage:
			primitive_mode = GL_PATCHES;
			program_id	 = m_program_to_test_tes_stage_id;
			texture_id	 = m_texture_to_test_tes_stage_id;
			break;

		case vertexShaderStage:
			program_id = m_program_to_test_vs_stage_id;
			texture_id = m_texture_to_test_vs_stage_id;
			break;

		default:
			TCU_FAIL("Invalid shader stage");
		}

		/* Set program */
		glUseProgram(program_id);
		GLU_EXPECT_NO_ERROR(glGetError(), "UseProgram");

		/* Bind texture to image units */
		for (GLint i = 0; i < max_image_uniforms; ++i)
		{
			imageFormatDetails format_details;
			getImageUniformDeclarationDetails(i, format_details);

			glBindImageTexture(i /* unit */, texture_id, 0 /* level */, GL_FALSE /* layered */, 0 /* layer */,
							   GL_READ_WRITE, format_details.m_image_unit_format);
			GLU_EXPECT_NO_ERROR(glGetError(), "BindImageTexture");
		}

		/* Set all image uniforms to corresponding image units */
		for (GLint i = 0; i < max_image_uniforms; ++i)
		{
			/* Get name */
			getImageUniformName(i, image_uniform_name);

			/* Get location */
			GLint image_uniform_location = glGetUniformLocation(program_id, image_uniform_name.c_str());
			GLU_EXPECT_NO_ERROR(glGetError(), "GetUniformLocation");

			if (invalid_uniform_location == image_uniform_location)
			{
				throw tcu::InternalError("Uniform location is not available", image_uniform_name.c_str(), __FILE__,
										 __LINE__);
			}

			/* Set uniform value */
			glUniform1i(image_uniform_location, i /* image_unit */);
			GLU_EXPECT_NO_ERROR(glGetError(), "Uniform1i");
		}

		/* Execute draw */
		glDrawArrays(primitive_mode, 0 /* first vertex */, 1 /* one vertex */);
		GLU_EXPECT_NO_ERROR(glGetError(), "DrawArrays");

		glMemoryBarrier(GL_ALL_BARRIER_BITS);

		texture_data.resize(width * height);

		/* Get texture data */
		glBindTexture(GL_TEXTURE_2D, texture_id);
		GLU_EXPECT_NO_ERROR(glGetError(), "BindTexture");

		glGetTexImage(GL_TEXTURE_2D, 0, GL_RED_INTEGER, GL_INT, &texture_data[0]);
		GLU_EXPECT_NO_ERROR(glGetError(), "GetTexImage");

		/* Verify each image uniform */
		for (GLint i = 0; i < max_image_uniforms; ++i)
		{
			imageFormatDetails format_details;
			getImageUniformDeclarationDetails(i, format_details);

			if (false ==
				format_details.m_verification_routine(getExpectedValue(i), texture_data[positive_value_index + i],
													  texture_data[negated_value_index + i]))
			{
				m_context.getTestContext().getLog()
					<< tcu::TestLog::Message << "Invalid result!"
					<< " Image format: " << format_details.m_image_format << " Original value: "
					<< "0x" << std::setw(8) << std::setfill('0') << std::setbase(16) << getExpectedValue(i)
					<< " Copied value: "
					<< "0x" << std::setw(8) << std::setfill('0') << std::setbase(16)
					<< texture_data[positive_value_index + i] << " Negated value: "
					<< "0x" << std::setw(8) << std::setfill('0') << std::setbase(16)
					<< texture_data[negated_value_index + i] << tcu::TestLog::EndMessage;

				result = testFailed;
			}
		}

		/* Done */
		return result;
	}

	/** Verifies if original_value, positive_value and negated_value match
	 *
	 * @tparam T Type used during verification process, it should match float values by size
	 *
	 * @param original_value Original value of texel, used when creating a texture
	 * @param positive_value Value stored by shader as read
	 * @param negated_value  Value stored by shader after negation
	 *
	 * @return true if values match, false otherwise
	 **/
	template <typename T>
	static bool verifyFloat(GLint original_value, GLint positive_value, GLint negated_value)
	{
		if (original_value != positive_value)
		{
			return false;
		}

		static const GLuint n_elements		  = sizeof(GLint) / sizeof(T); /* 1, 2, 4 */
		static const GLuint sign_bit_index	= sizeof(T) * 8 - 1;		   /* 7, 15, 31 */
		static const T		sign_bit_mask	 = 1 << sign_bit_index;	   /* 0x80.. */
		static const T		sign_bit_inv_mask = (T)~sign_bit_mask;		   /* 0x7f.. */

		const T* positive_elements = (T*)&positive_value;
		const T* negated_elements  = (T*)&negated_value;

		for (GLuint i = 0; i < n_elements; ++i)
		{
			const T positive_element = positive_elements[i];
			const T negated_element  = negated_elements[i];

			const T positive_sign_bit = positive_element & sign_bit_mask;
			const T negated_sign_bit  = negated_element & sign_bit_mask;

			const T positive_data = positive_element & sign_bit_inv_mask;
			const T negated_data  = negated_element & sign_bit_inv_mask;

			/* Compare data bits */
			if (positive_data != negated_data)
			{
				return false;
			}

			/* Verify that sign bit is inverted */
			if (positive_sign_bit == negated_sign_bit)
			{
				return false;
			}
		}

		return true;
	}

	/** Verifies if original_value, positive_value and negated_value match
	 *
	 * @tparam T Type used during verification process, it should match float values by size
	 *
	 * @param original_value Original value of texel, used when creating a texture
	 * @param positive_value Value stored by shader as read
	 * @param negated_value  Value stored by shader after negation
	 *
	 * @return true if values match, false otherwise
	 **/
	template <typename T>
	static bool verifyFloatSignedNorm(GLint original_value, GLint positive_value, GLint negated_value)
	{
		if (original_value != positive_value)
		{
			return false;
		}

		static const GLuint n_elements = sizeof(GLint) / sizeof(T); /* 1, 2, 4 */

		const T* positive_elements = (T*)&positive_value;
		const T* negated_elements  = (T*)&negated_value;

		for (GLuint i = 0; i < n_elements; ++i)
		{
			const T positive_element = positive_elements[i];
			const T negated_element  = negated_elements[i];

			/* Compare data bits */
			if (positive_element != -negated_element)
			{
				return false;
			}
		}

		return true;
	}

	/** Verifies if original_value, positive_value and negated_value match
	 *
	 * @tparam R Number of bits for red channel
	 * @tparam G Number of bits for green channel
	 * @tparam B Number of bits for blue channel
	 * @tparam A Number of bits for alpha channel
	 *
	 * @param original_value Original value of texel, used when creating a texture
	 * @param positive_value Value stored by shader as read
	 * @param negated_value  Value stored by shader after negation
	 *
	 * @return true if values match, false otherwise
	 **/
	template <GLuint R, GLuint G, GLuint B, GLuint A, typename T>
	static bool verifyInteger(GLint original_value, GLint positive_value, GLint negated_value)
	{
		if (original_value != positive_value)
		{
			return false;
		}

		Integer<T, R, 0> positive_red(positive_value);
		Integer<T, R, 0> negated_red(negated_value);

		Integer<T, G, R> positive_green(positive_value);
		Integer<T, G, R> negated_green(negated_value);

		Integer<T, B, R + G> positive_blue(positive_value);
		Integer<T, B, R + G> negated_blue(negated_value);

		Integer<T, A, R + G + B> positive_alpha(positive_value);
		Integer<T, A, R + G + B> negated_alpha(negated_value);

		if (((0 != R) && (positive_red.GetNegated() != negated_red.Get())) ||
			((0 != B) && (positive_blue.GetNegated() != negated_blue.Get())) ||
			((0 != G) && (positive_green.GetNegated() != negated_green.Get())) ||
			((0 != A) && (positive_alpha.GetNegated() != negated_alpha.Get())))
		{
			return false;
		}

		return true;
	}

	/** Verifies if original_value, positive_value and negated_value match
	 *
	 * @param original_value Original value of texel, used when creating a texture
	 * @param positive_value Value stored by shader as read
	 * @param negated_value  Value stored by shader after negation
	 *
	 * @return true if values match, false otherwise
	 **/
	static bool verifyInteger(GLint original_value, GLint positive_value, GLint negated_value)
	{
		if (original_value != positive_value)
		{
			return false;
		}

		if (positive_value != -negated_value)
		{
			return false;
		}

		return true;
	}

	/** Verifies if original_value, positive_value and negated_value match
	 *
	 * @param original_value Original value of texel, used when creating a texture
	 * @param positive_value Value stored by shader as read
	 * @param negated_value  Value stored by shader after negation
	 *
	 * @return true if values match, false otherwise
	 **/
	template <typename T>
	static bool verifyFloatUnsigned(GLint original_value, GLint positive_value, GLint negated_value)
	{
		if (original_value != positive_value)
		{
			return false;
		}

		if (0 != negated_value)
		{
			return false;
		}

		return true;
	}
};

/** Test "Early fragment tests" description follows.
 *
 *  BasicGLSLEarlyFragTests verifies that:
 *  - early z test is applied when enabled,
 *  - early z test is not applied when disabled.
 *
 *  Proposed modifications:
 *  - verify that early z test does not discard all fragments when enabled,
 *  - verify that early stencil test is applied when enabled,
 *  - verify that early stencil test does not discard all fragments when
 *  enabled,
 *  - verify that early stencil test is not applied when disabled.
 *
 *  Steps:
 *  - prepare 2 programs that store 1.0 at red channel to image in fragment
 *  shader stage:
 *      a) one program should enable early fragment tests
 *      ("layout(early_fragment_tests) in;"),
 *      b) second program should disable early fragment tests,
 *  - prepare frame buffer with 64x64 R32F color and GL_DEPTH_STENCIL
 *  depth-stencil attachments,
 *  - prepare 2D texture 64x64 R32F,
 *  - enable depth test,
 *  - verify that early z test is applied when enabled:
 *      - use program enabling early fragment tests,
 *      - clean frame buffer with color: 0, stencil: 0 and depth 0.5,
 *      - fill texture with zeros,
 *      - bind texture to image uniform,
 *      - draw "full screen" quad (left bottom corner at -1,-1 and right top
 *      corner at 1,1) at z: 0.75
 *      - verify that texture is still filled with zeros,
 *  - verify that early z test does not discard all fragments:
 *      - use program enabling early fragment tests,
 *      - clean frame buffer with color: 0, stencil: 0 and depth 0.5,
 *      - fill texture with zeros,
 *      - bind texture to image uniform,
 *      - draw "full screen" quad at z: 0.25
 *      - verify that texture is now filled with 1.0,
 *  -verify that early z test is not applied when disabled:
 *      - use program disabling early fragment tests,
 *      - clean frame buffer with color: 0, stencil: 0 and depth 0.5,
 *      - fill texture with zeros,
 *      - bind texture to image uniform,
 *      - draw "full screen" quad at z: 0.75
 *      - verify that texture is now filled with 1.0.
 *  - disable depth test
 *  - enable stencil test
 *  - verify that early stencil test is applied when enabled:
 *      - use program enabling early fragment tests,
 *      - clean frame buffer with color: 0, stencil: 0 and depth 1,
 *      - fill texture with zeros,
 *      - set stencil test to:
 *          - <func> to GL_LESS,
 *          - <ref> to 128,
 *          - <mask> 0xffffffff,
 *      - bind texture to image uniform,
 *      - draw "full screen" quad at z: 0,
 *      - verify that texture is still filled with zeros,
 *  - verify that early stencil test does not discard all fragments:
 *      - use program enabling early fragment tests,
 *      - clean frame buffer with color: 0, stencil: 128 and depth 1,
 *      - fill texture with zeros,
 *      - set stencil test to:
 *          - <func> to GL_LESS,
 *          - <ref> to 0,
 *          - <mask> 0xffffffff,
 *      - bind texture to image uniform,
 *      - draw "full screen" quad at z: 0,
 *      - verify that texture is now filled with 1.0,
 *  - verify that early stencil test is not applied when disabled:
 *      - use program disabling early fragment tests,
 *      - clean frame buffer with color: 0, stencil: 0 and depth 1,
 *      - fill texture with zeros,
 *      - set stencil test to:
 *          - <func> to GL_LESS,
 *          - <ref> to 128,
 *          - <mask> 0xffffffff,
 *      - bind texture to image uniform,
 *      - draw "full screen" quad at z: 0,
 *      - verify that texture is now filled with 1.0
 **/
class ImageLoadStoreEarlyFragmentTestsTest : public ShaderImageLoadStoreBase
{
private:
	/* Constants */
	GLuint			   m_image_edge;
	static const GLint m_invalid_uniform_location = -1;

	/* Types */
	/** Store id and uniform locations for a single program object
	 *
	 **/
	struct programDetails
	{
		GLint  m_depth_uniform_location;
		GLint  m_image_uniform_location;
		GLuint m_program_id;

		programDetails()
			: m_depth_uniform_location(ImageLoadStoreEarlyFragmentTestsTest::m_invalid_uniform_location)
			, m_image_uniform_location(ImageLoadStoreEarlyFragmentTestsTest::m_invalid_uniform_location)
			, m_program_id(0)
		{
			/* Nothing to be done here */
		}
	};

	/* Fileds */
	/* Storage for texture data */
	std::vector<GLfloat> m_clean_texture_data;
	std::vector<GLfloat> m_extracted_texture_data;

	/* Program details */
	programDetails m_disabled_early_tests;
	programDetails m_enabled_early_tests;

	/* Ids of GL objects */
	GLuint m_color_renderbuffer_id;
	GLuint m_depth_stencil_renderbuffer_id;
	GLuint m_framebuffer_id;
	GLuint m_texture_id;
	GLuint m_vertex_array_object_id;

public:
	/* Constructor */
	ImageLoadStoreEarlyFragmentTestsTest()
		: m_image_edge(0)
		, m_color_renderbuffer_id(0)
		, m_depth_stencil_renderbuffer_id(0)
		, m_framebuffer_id(0)
		, m_texture_id(0)
		, m_vertex_array_object_id(0)
	{
		/* Nothing to be done here */
	}

	/* Methods inherited from SubcaseBase */
	virtual long Cleanup()
	{
		/* Restore defaults */
		glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
		glBindRenderbuffer(GL_RENDERBUFFER, 0);
		glBindTexture(GL_TEXTURE_2D, 0);
		glBindVertexArray(0);
		glDisable(GL_DEPTH_TEST);
		glDisable(GL_STENCIL_TEST);
		glUseProgram(0);

		/* Delete objects */
		if (0 != m_disabled_early_tests.m_program_id)
		{
			glDeleteProgram(m_disabled_early_tests.m_program_id);
			m_disabled_early_tests.m_program_id = 0;
		}

		if (0 != m_enabled_early_tests.m_program_id)
		{
			glDeleteProgram(m_enabled_early_tests.m_program_id);
			m_enabled_early_tests.m_program_id = 0;
		}

		if (0 != m_color_renderbuffer_id)
		{
			glDeleteRenderbuffers(1, &m_color_renderbuffer_id);
			m_color_renderbuffer_id = 0;
		}

		if (0 != m_depth_stencil_renderbuffer_id)
		{
			glDeleteRenderbuffers(1, &m_depth_stencil_renderbuffer_id);
			m_depth_stencil_renderbuffer_id = 0;
		}

		if (0 != m_framebuffer_id)
		{
			glDeleteFramebuffers(1, &m_framebuffer_id);
			m_framebuffer_id = 0;
		}

		if (0 != m_texture_id)
		{
			glDeleteTextures(1, &m_texture_id);
			m_texture_id = 0;
		}

		if (0 != m_vertex_array_object_id)
		{
			glDeleteVertexArrays(1, &m_vertex_array_object_id);
			m_vertex_array_object_id = 0;
		}

		/* Done */
		return NO_ERROR;
	}

	virtual long Run()
	{
		bool result = true;

		/* Bind texture to first image unit */
		glBindImageTexture(0 /* first image unit */, m_texture_id, 0 /* level */, GL_FALSE /* layered */, 0 /* layer */,
						   GL_READ_WRITE, GL_R32F);
		GLU_EXPECT_NO_ERROR(glGetError(), "BindImageTexture");

		/* Run tests for depth test */
		if (false == testEarlyZ())
		{
			result = false;
		}

		/* Run tests for stencil test */
		if (false == testEarlyStencil())
		{
			result = false;
		}

		/* Return ERROR if any problem was found */
		if (false == result)
		{
			return ERROR;
		}

		/* Done */
		return NO_ERROR;
	}

	virtual long Setup()
	{
		m_image_edge = de::min(64, de::min(getWindowHeight(), getWindowWidth()));

		/* Prepare storage for texture data */
		m_clean_texture_data.resize(m_image_edge * m_image_edge);
		m_extracted_texture_data.resize(m_image_edge * m_image_edge);

		/* Prepare programs, framebuffer and texture */
		buildPrograms();
		createFramebuffer();
		createTexture();

		/* Generate vertex array object */
		glGenVertexArrays(1, &m_vertex_array_object_id);
		GLU_EXPECT_NO_ERROR(glGetError(), "GenVertexArrays");

		/* Bind vertex array object */
		glBindVertexArray(m_vertex_array_object_id);
		GLU_EXPECT_NO_ERROR(glGetError(), "BindVertexArray");

		/* Set clear color */
		glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
		GLU_EXPECT_NO_ERROR(glGetError(), "ClearColor");

		/* Done */
		return NO_ERROR;
	}

private:
	/** Build two programs: with enabled and disabled early fragment tests
	 *
	 **/
	void buildPrograms()
	{
		static const char* const fragment_shader_with_disabled_early_tests =
			"#version 400 core\n"
			"#extension GL_ARB_shader_image_load_store : require\n"
			"\n"
			"precision highp float;\n"
			"\n"
			"layout(r32f) uniform image2D u_image;\n"
			"\n"
			"void main()\n"
			"{\n"
			"    vec4 color = vec4(1.0, 0, 0, 0);\n"
			"\n"
			"    imageStore(u_image, ivec2(gl_FragCoord.xy), color);\n"
			"\n"
			"    discard;\n"
			"}\n\n";

		static const char* const fragment_shader_with_enabled_early_tests =
			"#version 400 core\n"
			"#extension GL_ARB_shader_image_load_store : require\n"
			"\n"
			"precision highp float;\n"
			"\n"
			"layout(early_fragment_tests) in;\n"
			"\n"
			"layout(r32f) uniform image2D u_image;\n"
			"\n"
			"void main()\n"
			"{\n"
			"    vec4 color = vec4(1.0, 0, 0, 0);\n"
			"\n"
			"    imageStore(u_image, ivec2(gl_FragCoord.xy), color);\n"
			"\n"
			"    discard;\n"
			"}\n\n";

		static const char* const geometry_shader_code = "#version 400 core\n"
														"#extension GL_ARB_shader_image_load_store : require\n"
														"\n"
														"precision highp float;\n"
														"\n"
														"layout(points)                           in;\n"
														"layout(triangle_strip, max_vertices = 4) out;\n"
														"\n"
														"uniform float u_depth;\n"
														"\n"
														"void main()\n"
														"{\n"
														"    // Left-bottom\n"
														"    gl_Position = vec4(-1, -1, u_depth, 1);\n"
														"    EmitVertex();\n"
														"\n"
														"    // Left-top\n"
														"    gl_Position = vec4(-1,  1, u_depth, 1);\n"
														"    EmitVertex();\n"
														"\n"
														"    // Right-bottom\n"
														"    gl_Position = vec4( 1, -1, u_depth, 1);\n"
														"    EmitVertex();\n"
														"\n"
														"    // Right-top\n"
														"    gl_Position = vec4( 1,  1, u_depth, 1);\n"
														"    EmitVertex();\n"
														"}\n\n";

		static const char* const vertex_shader_code = "#version 400 core\n"
													  "#extension GL_ARB_shader_image_load_store : require\n"
													  "\n"
													  "precision highp float;\n"
													  "\n"
													  "void main()\n"
													  "{\n"
													  "}\n\n";

		prepareProgramDetails(fragment_shader_with_disabled_early_tests, geometry_shader_code, vertex_shader_code,
							  m_disabled_early_tests);

		prepareProgramDetails(fragment_shader_with_enabled_early_tests, geometry_shader_code, vertex_shader_code,
							  m_enabled_early_tests);
	}

	/** Fill texture with zeros
	 *
	 **/
	void cleanTexture()
	{
		glTexSubImage2D(GL_TEXTURE_2D, 0 /* level */, 0 /* xoffset */, 0 /* yoffset */, m_image_edge, m_image_edge,
						GL_RED, GL_FLOAT, &m_clean_texture_data[0]);
		GLU_EXPECT_NO_ERROR(glGetError(), "TexSubImage2D");
	}

	/** Create and bind (draw) framebuffer with color and depth-stencil attachments
	 *
	 **/
	void createFramebuffer()
	{
		/* Generate render buffers */
		glGenRenderbuffers(1, &m_color_renderbuffer_id);
		GLU_EXPECT_NO_ERROR(glGetError(), "GenRenderbuffers");

		glGenRenderbuffers(1, &m_depth_stencil_renderbuffer_id);
		GLU_EXPECT_NO_ERROR(glGetError(), "GenRenderbuffers");

		/* Generate and bind framebuffer object */
		glGenFramebuffers(1, &m_framebuffer_id);
		GLU_EXPECT_NO_ERROR(glGetError(), "GenFramebuffers");

		glBindFramebuffer(GL_DRAW_FRAMEBUFFER, m_framebuffer_id);
		GLU_EXPECT_NO_ERROR(glGetError(), "BindFramebuffer");

		/* Prepare color render buffer */
		glBindRenderbuffer(GL_RENDERBUFFER, m_color_renderbuffer_id);
		GLU_EXPECT_NO_ERROR(glGetError(), "BindRenderbuffer");

		glRenderbufferStorage(GL_RENDERBUFFER, GL_R32F, m_image_edge, m_image_edge);
		GLU_EXPECT_NO_ERROR(glGetError(), "RenderbufferStorage");

		/* Set up color attachment */
		glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, m_color_renderbuffer_id);
		GLU_EXPECT_NO_ERROR(glGetError(), "FramebufferRenderbuffer");

		/* Prepare depth-stencil render buffer */
		glBindRenderbuffer(GL_RENDERBUFFER, m_depth_stencil_renderbuffer_id);
		GLU_EXPECT_NO_ERROR(glGetError(), "BindRenderbuffer");

		glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, m_image_edge, m_image_edge);
		GLU_EXPECT_NO_ERROR(glGetError(), "RenderbufferStorage");

		/* Set up depth-stencil attachment */
		glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER,
								  m_depth_stencil_renderbuffer_id);
		GLU_EXPECT_NO_ERROR(glGetError(), "FramebufferRenderbuffer");
	}

	/** Create 2D R32F texture
	 *
	 **/
	void createTexture()
	{
		glGenTextures(1, &m_texture_id);
		GLU_EXPECT_NO_ERROR(glGetError(), "GenTextures");

		glBindTexture(GL_TEXTURE_2D, m_texture_id);
		GLU_EXPECT_NO_ERROR(glGetError(), "BindTexture");

		glTexStorage2D(GL_TEXTURE_2D, 1, GL_R32F, m_image_edge, m_image_edge);
		GLU_EXPECT_NO_ERROR(glGetError(), "TexStorage2D");
	}

	/** Extracts red channel from texture and verify if all texels are set to specified value
	 *
	 * @param value Expected value
	 *
	 * @return true if all texel match expected value, false otherwise
	 **/
	bool isTextureFilledWithValue(GLfloat value)
	{
		glGetTexImage(GL_TEXTURE_2D, 0, GL_RED, GL_FLOAT, &m_extracted_texture_data[0]);
		GLU_EXPECT_NO_ERROR(glGetError(), "GetTexImage");

		for (GLuint i = 0; i < m_image_edge * m_image_edge; ++i)
		{
			if (value != m_extracted_texture_data[i])
			{
				m_context.getTestContext().getLog() << tcu::TestLog::Message << "Texel at location " << i
													<< " has invalid value: " << m_extracted_texture_data[i]
													<< " expected: " << value << tcu::TestLog::EndMessage;

				return false;
			}
		}

		return true;
	}

	/** Build program, extract location of uniforms and store results in programDetails instance
	 *
	 * Throws tcu::InternalError if uniforms are inactive
	 *
	 * @param fragment_shader_code Source of fragment shader
	 * @param geometry_shader_code Source of geometry shader
	 * @param vertex_shader_code   Source of vertex shader
	 * @param out_program_details  Instance of programDetails
	 **/
	void prepareProgramDetails(const char* fragment_shader_code, const char* geometry_shader_code,
							   const char* vertex_shader_code, programDetails& out_program_details)
	{
		static const char* const depth_uniform_name = "u_depth";
		static const char* const image_uniform_name = "u_image";
		bool					 is_program_built   = true;

		GLuint program_id = BuildProgram(vertex_shader_code, 0 /* src_tcs */, 0 /* src_tes */, geometry_shader_code,
										 fragment_shader_code, &is_program_built);

		if (false == is_program_built)
		{
			throw tcu::InternalError("Failed to build program", "", __FILE__, __LINE__);
		}

		/* Get depth uniform location */
		GLint depth_uniform_location = glGetUniformLocation(program_id, depth_uniform_name);
		GLU_EXPECT_NO_ERROR(glGetError(), "GetUniformLocation");

		if (m_invalid_uniform_location == depth_uniform_location)
		{
			throw tcu::InternalError("Uniform is not active", image_uniform_name, __FILE__, __LINE__);
		}

		/* Get image uniform location */
		GLint image_uniform_location = glGetUniformLocation(program_id, image_uniform_name);
		GLU_EXPECT_NO_ERROR(glGetError(), "GetUniformLocation");

		if (m_invalid_uniform_location == image_uniform_location)
		{
			throw tcu::InternalError("Uniform is not active", image_uniform_name, __FILE__, __LINE__);
		}

		/* Store results */
		out_program_details.m_depth_uniform_location = depth_uniform_location;
		out_program_details.m_image_uniform_location = image_uniform_location;
		out_program_details.m_program_id			 = program_id;
	}

	/** Test if early fragment stencil test works as expected.
	 *
	 * @return true if successful, false otherwise
	 **/
	bool testEarlyStencil()
	{
		bool result = true;

		glEnable(GL_STENCIL_TEST);
		GLU_EXPECT_NO_ERROR(glGetError(), "glEnable");

		glClearDepthf(1.0f);
		GLU_EXPECT_NO_ERROR(glGetError(), "ClearDepthf");

		/* verify that early stencil test is applied when enabled */
		{
			glUseProgram(m_enabled_early_tests.m_program_id);
			GLU_EXPECT_NO_ERROR(glGetError(), "glUseProgram");

			glClearStencil(0);
			GLU_EXPECT_NO_ERROR(glGetError(), "ClearStencil");

			glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
			GLU_EXPECT_NO_ERROR(glGetError(), "Clear");

			cleanTexture();

			glStencilFunc(GL_LESS, 128, 0xffffffff);
			GLU_EXPECT_NO_ERROR(glGetError(), "StencilFunc");

			glUniform1i(m_enabled_early_tests.m_image_uniform_location, 0 /* first unit */);
			GLU_EXPECT_NO_ERROR(glGetError(), "Uniform1i");

			glUniform1f(m_enabled_early_tests.m_depth_uniform_location, 0.0f /* depth */);
			GLU_EXPECT_NO_ERROR(glGetError(), "Uniform1f");

			glDrawArrays(GL_POINTS, 0 /* first */, 1 /* number of vertices */);
			GLU_EXPECT_NO_ERROR(glGetError(), "DrawArrays");

			glMemoryBarrier(GL_ALL_BARRIER_BITS);
			GLU_EXPECT_NO_ERROR(glGetError(), "MemoryBarrier");

			if (false == isTextureFilledWithValue(0.0f))
			{
				m_context.getTestContext().getLog() << tcu::TestLog::Message
													<< "Problem with early stencil test. It is not applied"
													<< tcu::TestLog::EndMessage;

				result = false;
			}
		}

		/* verify that early stencil test does not discard all fragments */
		{
			glClearStencil(128);
			GLU_EXPECT_NO_ERROR(glGetError(), "ClearStencil");

			glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
			GLU_EXPECT_NO_ERROR(glGetError(), "Clear");

			cleanTexture();

			glStencilFunc(GL_LESS, 0, 0xffffffff);
			GLU_EXPECT_NO_ERROR(glGetError(), "StencilFunc");

			glDrawArrays(GL_POINTS, 0 /* first */, 1 /* number of vertices */);
			GLU_EXPECT_NO_ERROR(glGetError(), "DrawArrays");

			glMemoryBarrier(GL_ALL_BARRIER_BITS);
			GLU_EXPECT_NO_ERROR(glGetError(), "MemoryBarrier");

			if (false == isTextureFilledWithValue(1.0f))
			{
				m_context.getTestContext().getLog()
					<< tcu::TestLog::Message
					<< "Problem with early stencil test. It discards fragments, that shall be drawn"
					<< tcu::TestLog::EndMessage;

				result = false;
			}
		}

		/* verify that early stencil test is not applied when disabled */
		{
			glUseProgram(m_disabled_early_tests.m_program_id);
			GLU_EXPECT_NO_ERROR(glGetError(), "glUseProgram");

			glClearStencil(0);
			GLU_EXPECT_NO_ERROR(glGetError(), "ClearStencil");

			glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
			GLU_EXPECT_NO_ERROR(glGetError(), "Clear");

			cleanTexture();

			glStencilFunc(GL_LESS, 128, 0xffffffff);
			GLU_EXPECT_NO_ERROR(glGetError(), "StencilFunc");

			glUniform1i(m_disabled_early_tests.m_image_uniform_location, 0 /* first unit */);
			GLU_EXPECT_NO_ERROR(glGetError(), "Uniform1i");

			glUniform1f(m_disabled_early_tests.m_depth_uniform_location, 0.0f /* depth */);
			GLU_EXPECT_NO_ERROR(glGetError(), "Uniform1f");

			glDrawArrays(GL_POINTS, 0 /* first */, 1 /* number of vertices */);
			GLU_EXPECT_NO_ERROR(glGetError(), "DrawArrays");

			glMemoryBarrier(GL_ALL_BARRIER_BITS);
			GLU_EXPECT_NO_ERROR(glGetError(), "MemoryBarrier");

			if (false == isTextureFilledWithValue(1.0f))
			{
				m_context.getTestContext().getLog() << tcu::TestLog::Message
													<< "Problem with early stencil test. It is applied when disabled"
													<< tcu::TestLog::EndMessage;

				result = false;
			}
		}

		glDisable(GL_STENCIL_TEST);
		GLU_EXPECT_NO_ERROR(glGetError(), "Disable");

		/* Done */
		return result;
	}

	/** Test if early fragment depth test works as expected.
	 *
	 * @return true if successful, false otherwise
	 **/
	bool testEarlyZ()
	{
		bool result = true;

		glEnable(GL_DEPTH_TEST);
		GLU_EXPECT_NO_ERROR(glGetError(), "glEnable");

		glClearDepthf(0.5f);
		GLU_EXPECT_NO_ERROR(glGetError(), "ClearDepthf");

		glClearStencil(0);
		GLU_EXPECT_NO_ERROR(glGetError(), "ClearStencil");

		/* verify that early z test is applied when enabled */
		{
			glUseProgram(m_enabled_early_tests.m_program_id);
			GLU_EXPECT_NO_ERROR(glGetError(), "glUseProgram");

			glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
			GLU_EXPECT_NO_ERROR(glGetError(), "Clear");

			cleanTexture();

			glUniform1i(m_enabled_early_tests.m_image_uniform_location, 0 /* first unit */);
			GLU_EXPECT_NO_ERROR(glGetError(), "Uniform1i");

			glUniform1f(m_enabled_early_tests.m_depth_uniform_location, 0.5f /* depth */);
			GLU_EXPECT_NO_ERROR(glGetError(), "Uniform1f");

			glDrawArrays(GL_POINTS, 0 /* first */, 1 /* number of vertices */);
			GLU_EXPECT_NO_ERROR(glGetError(), "DrawArrays");

			glMemoryBarrier(GL_ALL_BARRIER_BITS);
			GLU_EXPECT_NO_ERROR(glGetError(), "MemoryBarrier");

			if (false == isTextureFilledWithValue(0.0f))
			{
				m_context.getTestContext().getLog() << tcu::TestLog::Message
													<< "Problem with early z test. It is not applied"
													<< tcu::TestLog::EndMessage;

				result = false;
			}
		}

		/* verify that early z test does not discard all fragments */
		{
			glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
			GLU_EXPECT_NO_ERROR(glGetError(), "Clear");

			cleanTexture();

			glUniform1i(m_enabled_early_tests.m_image_uniform_location, 0 /* first unit */);
			GLU_EXPECT_NO_ERROR(glGetError(), "Uniform1i");

			glUniform1f(m_enabled_early_tests.m_depth_uniform_location, -0.5f /* depth */);
			GLU_EXPECT_NO_ERROR(glGetError(), "Uniform1f");

			glDrawArrays(GL_POINTS, 0 /* first */, 1 /* number of vertices */);
			GLU_EXPECT_NO_ERROR(glGetError(), "DrawArrays");

			glMemoryBarrier(GL_ALL_BARRIER_BITS);
			GLU_EXPECT_NO_ERROR(glGetError(), "MemoryBarrier");

			if (false == isTextureFilledWithValue(1.0f))
			{
				m_context.getTestContext().getLog()
					<< tcu::TestLog::Message << "Problem with early z test. It discards fragments, that shall be drawn"
					<< tcu::TestLog::EndMessage;

				result = false;
			}
		}

		/* verify that early z test is not applied when disabled */
		{
			glUseProgram(m_disabled_early_tests.m_program_id);
			GLU_EXPECT_NO_ERROR(glGetError(), "glUseProgram");

			glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
			GLU_EXPECT_NO_ERROR(glGetError(), "Clear");

			cleanTexture();

			glUniform1i(m_disabled_early_tests.m_image_uniform_location, 0 /* first unit */);
			GLU_EXPECT_NO_ERROR(glGetError(), "Uniform1i");

			glUniform1f(m_disabled_early_tests.m_depth_uniform_location, 0.5f /* depth */);
			GLU_EXPECT_NO_ERROR(glGetError(), "Uniform1f");

			glDrawArrays(GL_POINTS, 0 /* first */, 1 /* number of vertices */);
			GLU_EXPECT_NO_ERROR(glGetError(), "DrawArrays");

			glMemoryBarrier(GL_ALL_BARRIER_BITS);
			GLU_EXPECT_NO_ERROR(glGetError(), "MemoryBarrier");

			if (false == isTextureFilledWithValue(1.0f))
			{
				m_context.getTestContext().getLog() << tcu::TestLog::Message
													<< "Problem with early z test. It is applied when disabled"
													<< tcu::TestLog::EndMessage;

				result = false;
			}
		}

		glDisable(GL_DEPTH_TEST);
		GLU_EXPECT_NO_ERROR(glGetError(), "Disable");

		/* Done */
		return result;
	}
};

//-----------------------------------------------------------------------------
// 4.1 NegativeUniform
//-----------------------------------------------------------------------------
class NegativeUniform : public ShaderImageLoadStoreBase
{
	GLuint m_program;

	virtual long Setup()
	{
		m_program = 0;
		return NO_ERROR;
	}

	virtual long Run()
	{
		const char* glsl_vs = "#version 420 core" NL "layout(location = 0) in vec4 i_position;" NL "void main() {" NL
							  "  gl_Position = i_position;" NL "}";
		const char* glsl_fs = "#version 420 core" NL "writeonly uniform image2D g_image;" NL "void main() {" NL
							  "  ivec2 coord = ivec2(gl_FragCoord.xy);" NL "  imageStore(g_image, coord, vec4(0.0));" NL
							  "  discard;" NL "}";
		m_program = BuildProgram(glsl_vs, NULL, NULL, NULL, glsl_fs);

		GLint max_image_units;
		glGetIntegerv(GL_MAX_IMAGE_UNITS, &max_image_units);
		glUseProgram(m_program);

		glUniform1i(glGetUniformLocation(m_program, "g_image"), -1);
		if (glGetError() != GL_INVALID_VALUE)
		{
			m_context.getTestContext().getLog()
				<< tcu::TestLog::Message << "glUniform1i should generate INVALID_VALUE when <value> is less than zero."
				<< tcu::TestLog::EndMessage;
			return ERROR;
		}
		glUniform1i(glGetUniformLocation(m_program, "g_image"), max_image_units);
		if (glGetError() != GL_INVALID_VALUE)
		{
			m_context.getTestContext().getLog()
				<< tcu::TestLog::Message
				<< "glUniform1i should generate INVALID_VALUE when <value> is greater than or equal to the value of "
				<< "MAX_IMAGE_UNITS." << tcu::TestLog::EndMessage;
			return ERROR;
		}

		GLint i = -3;
		glUniform1iv(glGetUniformLocation(m_program, "g_image"), 1, &i);
		if (glGetError() != GL_INVALID_VALUE)
		{
			m_context.getTestContext().getLog()
				<< tcu::TestLog::Message << "glUniform1iv should generate INVALID_VALUE when <value> is less than zero."
				<< tcu::TestLog::EndMessage;
			return ERROR;
		}
		i = max_image_units + 1;
		glUniform1iv(glGetUniformLocation(m_program, "g_image"), 1, &i);
		if (glGetError() != GL_INVALID_VALUE)
		{
			m_context.getTestContext().getLog()
				<< tcu::TestLog::Message << "glUniform1iv should generate INVALID_VALUE when <value> is greater "
											"than or equal to the value of MAX_IMAGE_UNITS."
				<< tcu::TestLog::EndMessage;
			return ERROR;
		}

		glUniform1ui(glGetUniformLocation(m_program, "g_image"), 0);
		if (glGetError() != GL_INVALID_OPERATION)
		{
			m_context.getTestContext().getLog()
				<< tcu::TestLog::Message
				<< "glUniform1iv should generate INVALID_OPERATION if the location refers to an image variable."
				<< tcu::TestLog::EndMessage;
			return ERROR;
		}
		glUniform2i(glGetUniformLocation(m_program, "g_image"), 0, 0);
		if (glGetError() != GL_INVALID_OPERATION)
		{
			m_context.getTestContext().getLog()
				<< tcu::TestLog::Message
				<< "glUniform2i should generate INVALID_OPERATION if the location refers to an image variable."
				<< tcu::TestLog::EndMessage;
			return ERROR;
		}

		{
			glUseProgram(0);

			glProgramUniform1i(m_program, glGetUniformLocation(m_program, "g_image"), -1);
			if (glGetError() != GL_INVALID_VALUE)
			{
				m_context.getTestContext().getLog()
					<< tcu::TestLog::Message
					<< "glProgramUniform1i should generate INVALID_VALUE when <value> is less than zero."
					<< tcu::TestLog::EndMessage;
				return ERROR;
			}
			glProgramUniform1i(m_program, glGetUniformLocation(m_program, "g_image"), max_image_units);
			if (glGetError() != GL_INVALID_VALUE)
			{
				m_context.getTestContext().getLog()
					<< tcu::TestLog::Message
					<< "glProgramUniform1i should generate INVALID_VALUE when <value> is greater than or equal to the "
					   "value of MAX_IMAGE_UNITS."
					<< tcu::TestLog::EndMessage;
				return ERROR;
			}

			GLint ii = -3;
			glProgramUniform1iv(m_program, glGetUniformLocation(m_program, "g_image"), 1, &ii);
			if (glGetError() != GL_INVALID_VALUE)
			{
				m_context.getTestContext().getLog()
					<< tcu::TestLog::Message
					<< "glProgramUniform1iv should generate INVALID_VALUE when <value> is less than zero."
					<< tcu::TestLog::EndMessage;
				return ERROR;
			}
			ii = max_image_units + 1;
			glProgramUniform1iv(m_program, glGetUniformLocation(m_program, "g_image"), 1, &ii);
			if (glGetError() != GL_INVALID_VALUE)
			{
				m_context.getTestContext().getLog()
					<< tcu::TestLog::Message << "glProgramUniform1iv should generate INVALID_VALUE when <value> "
												"is greater than or equal to the value of MAX_IMAGE_UNITS."
					<< tcu::TestLog::EndMessage;
				return ERROR;
			}

			glProgramUniform1ui(m_program, glGetUniformLocation(m_program, "g_image"), 0);
			if (glGetError() != GL_INVALID_OPERATION)
			{
				m_context.getTestContext().getLog()
					<< tcu::TestLog::Message << "glProgramUniform1ui should generate INVALID_OPERATION if the "
												"location refers to an image variable."
					<< tcu::TestLog::EndMessage;
				return ERROR;
			}
			glProgramUniform2i(m_program, glGetUniformLocation(m_program, "g_image"), 0, 0);
			if (glGetError() != GL_INVALID_OPERATION)
			{
				m_context.getTestContext().getLog()
					<< tcu::TestLog::Message << "glProgramUniform2i should generate INVALID_OPERATION if the "
												"location refers to an image variable."
					<< tcu::TestLog::EndMessage;
				return ERROR;
			}
		}

		return NO_ERROR;
	}

	virtual long Cleanup()
	{
		glUseProgram(0);
		glDeleteProgram(m_program);
		return NO_ERROR;
	}
};
//-----------------------------------------------------------------------------
// 4.2 NegativeBind
//-----------------------------------------------------------------------------
class NegativeBind : public ShaderImageLoadStoreBase
{
	virtual long Setup()
	{
		return NO_ERROR;
	}

	virtual long Run()
	{
		glBindImageTexture(100, 0, 0, GL_FALSE, 0, GL_READ_ONLY, GL_RGBA);
		if (glGetError() != GL_INVALID_VALUE)
		{
			m_context.getTestContext().getLog()
				<< tcu::TestLog::Message << "BindImageTexture should generate INVALID_VALUE if <unit> is "
											"greater than or equal to the value of MAX_IMAGE_UNITS."
				<< tcu::TestLog::EndMessage;
			return ERROR;
		}

		glBindImageTexture(0, 123, 0, GL_FALSE, 0, GL_READ_ONLY, GL_RGBA);
		if (glGetError() != GL_INVALID_VALUE)
		{
			m_context.getTestContext().getLog()
				<< tcu::TestLog::Message << "BindImageTexture should generate INVALID_VALUE if <texture> is not "
											"the name of an existing texture object."
				<< tcu::TestLog::EndMessage;
			return ERROR;
		}

		glBindImageTexture(1, 0, 0, GL_FALSE, 0, GL_READ_ONLY, GL_RGBA + 1234);
		if (glGetError() != GL_INVALID_VALUE)
		{
			m_context.getTestContext().getLog()
				<< tcu::TestLog::Message
				<< "BindImageTexture should generate INVALID_VALUE if <format> is not a legal format."
				<< tcu::TestLog::EndMessage;
			return ERROR;
		}
		return NO_ERROR;
	}

	virtual long Cleanup()
	{
		return NO_ERROR;
	}
};
//-----------------------------------------------------------------------------
// 4.3 NegativeCompileErrors
//-----------------------------------------------------------------------------
class NegativeCompileErrors : public ShaderImageLoadStoreBase
{
	virtual long Run()
	{
		if (!Compile("#version 420 core" NL "layout(location = 0) out vec4 o_color;" NL
					 "layout(rgba32f) writeonly readonly uniform image2D g_image;" NL "void main() {" NL
					 "  o_color = imageLoad(g_image, ivec2(0));" NL "}"))
			return ERROR;

		if (!Compile("#version 420 core" NL "layout(location = 0) out vec4 o_color;" NL
					 "layout(rgba32f) writeonly uniform image2D g_image;" NL "void main() {" NL
					 "  o_color = imageLoad(g_image, ivec2(0));" NL "}"))
			return ERROR;

		if (!Compile("#version 420 core" NL "in vec4 i_color;" NL "layout(location = 0) out vec4 o_color;" NL
					 "layout(rgba32f) readonly uniform image2D g_image;" NL "void main() {" NL
					 "  imageStore(g_image, ivec2(0), i_color);" NL "  o_color = i_color;" NL "}"))
			return ERROR;

		if (!Compile("#version 420 core" NL "layout(location = 0) out vec4 o_color;" NL "uniform image2D g_image;" NL
					 "void main() {" NL "  o_color = imageLoad(g_image, ivec2(0));" NL "}"))
			return ERROR;

		if (!Compile("#version 420 core" NL "layout(location = 0) out vec4 o_color;" NL
					 "readonly uniform image2D g_image;" NL "void main() {" NL
					 "  o_color = imageLoad(g_image, ivec2(0));" NL "}"))
			return ERROR;

		if (!Compile("#version 420 core" NL "layout(location = 0) out vec4 o_color;" NL
					 "layout(rg16i) uniform image1D g_image;" NL "void main() {" NL "  o_color = vec4(1.0);" NL "}"))
			return ERROR;

		if (!Compile("#version 420 core" NL "layout(location = 0) out vec4 o_color;" NL
					 "layout(rg16) uniform iimage2D g_image;" NL "void main() {" NL "  o_color = vec4(1.0);" NL "}"))
			return ERROR;

		if (!Compile("#version 420 core" NL "layout(location = 0) out vec4 o_color;" NL
					 "layout(r32f) coherent uniform image2D g_image;" NL "void main() {" NL
					 "  imageAtomicAdd(g_image, ivec2(1), 10);" NL "  o_color = vec4(1.0);" NL "}"))
			return ERROR;

		if (!Compile("#version 420 core" NL "layout(location = 0) out vec4 o_color;" NL
					 "layout(r16i) coherent uniform iimage2D g_image;" NL "void main() {" NL
					 "  imageAtomicAdd(g_image, ivec2(1), 1u);" NL "  o_color = vec4(1.0);" NL "}"))
			return ERROR;

		if (!Compile("#version 420 core" NL "layout(location = 0) out vec4 o_color;" NL
					 "layout(r32ui) uniform iimage3D g_image;" NL "void main() {" NL
					 "  imageStore(g_image, ivec3(1), ivec4(1));" NL "  o_color = vec4(1.0);" NL "}"))
			return ERROR;

		if (!Compile("#version 420 core" NL "layout(location = 0) out vec4 o_color;" NL
					 "layout(rgba8) uniform uimage2DArray g_image;" NL "void main() {" NL
					 "  imageStore(g_image, ivec3(0), uvec4(1));" NL "  o_color = vec4(1.0);" NL "}"))
			return ERROR;

		if (!Compile("#version 420 core" NL "layout(location = 0) out vec4 o_color;" NL
					 "layout(rgba32f) coherent uniform image2D g_image;" NL "vec4 Load(image2D image) {" NL
					 "  return imageLoad(image, vec2(0));" NL "}" NL "void main() {" NL "  o_color = Load(g_image);" NL
					 "}"))
			return ERROR;

		return NO_ERROR;
	}

	bool Compile(const std::string& source)
	{
		const GLuint sh = glCreateShader(GL_FRAGMENT_SHADER);

		const char* const src = source.c_str();
		glShaderSource(sh, 1, &src, NULL);
		glCompileShader(sh);

		GLchar log[1024];
		glGetShaderInfoLog(sh, sizeof(log), NULL, log);
		m_context.getTestContext().getLog() << tcu::TestLog::Message << "Shader Info Log:\n"
											<< log << tcu::TestLog::EndMessage;

		GLint status;
		glGetShaderiv(sh, GL_COMPILE_STATUS, &status);
		glDeleteShader(sh);

		if (status == GL_TRUE)
		{
			m_context.getTestContext().getLog()
				<< tcu::TestLog::Message << "Compilation should fail." << tcu::TestLog::EndMessage;
			return false;
		}

		return true;
	}
};
//-----------------------------------------------------------------------------
// 4.4 NegativeLinkErrors
//-----------------------------------------------------------------------------
class NegativeLinkErrors : public ShaderImageLoadStoreBase
{
	virtual long Run()
	{
		if (!SupportedInVS(1))
			return NOT_SUPPORTED;

		if (!Link("#version 420 core" NL "layout(location = 0) in vec4 i_position;" NL
				  "layout(rgba32f) uniform image1D g_image;" NL "void main() {" NL
				  "  imageStore(g_image, gl_VertexID, vec4(0));" NL "  gl_Position = i_position;" NL "}",
				  "#version 420 core" NL "layout(location = 0) out vec4 o_color;" NL
				  "layout(rgba32f) uniform image2D g_image;" NL "void main() {" NL
				  "  imageStore(g_image, ivec2(gl_FragCoord), vec4(1.0));" NL "  o_color = vec4(1.0);" NL "}"))
			return ERROR;

		if (!Link("#version 420 core" NL "layout(location = 0) in vec4 i_position;" NL
				  "layout(rgba32f) uniform image1D g_image;" NL "void main() {" NL
				  "  imageStore(g_image, gl_VertexID, vec4(0));" NL "  gl_Position = i_position;" NL "}",
				  "#version 420 core" NL "layout(location = 0) out vec4 o_color;" NL
				  "layout(rg32f) uniform image1D g_image;" NL "void main() {" NL
				  "  imageStore(g_image, int(gl_FragCoord.x), vec4(1.0));" NL "  o_color = vec4(1.0);" NL "}"))
			return ERROR;

		return NO_ERROR;
	}

	bool Link(const std::string& vs, const std::string& fs)
	{
		const GLuint p = glCreateProgram();

		const GLuint vsh = glCreateShader(GL_VERTEX_SHADER);
		glAttachShader(p, vsh);
		glDeleteShader(vsh);
		const char* const vssrc = vs.c_str();
		glShaderSource(vsh, 1, &vssrc, NULL);
		glCompileShader(vsh);

		const GLuint fsh = glCreateShader(GL_FRAGMENT_SHADER);
		glAttachShader(p, fsh);
		glDeleteShader(fsh);
		const char* const fssrc = fs.c_str();
		glShaderSource(fsh, 1, &fssrc, NULL);
		glCompileShader(fsh);

		GLint status;
		glGetShaderiv(vsh, GL_COMPILE_STATUS, &status);
		if (status == GL_FALSE)
		{
			glDeleteProgram(p);
			m_context.getTestContext().getLog()
				<< tcu::TestLog::Message << "VS compilation should be ok." << tcu::TestLog::EndMessage;
			return false;
		}
		glGetShaderiv(fsh, GL_COMPILE_STATUS, &status);
		if (status == GL_FALSE)
		{
			glDeleteProgram(p);
			m_context.getTestContext().getLog()
				<< tcu::TestLog::Message << "FS compilation should be ok." << tcu::TestLog::EndMessage;
			return false;
		}

		glLinkProgram(p);

		GLchar log[1024];
		glGetProgramInfoLog(p, sizeof(log), NULL, log);
		m_context.getTestContext().getLog() << tcu::TestLog::Message << "Program Info Log:\n"
											<< log << tcu::TestLog::EndMessage;

		glGetProgramiv(p, GL_LINK_STATUS, &status);
		glDeleteProgram(p);

		if (status == GL_TRUE)
		{
			m_context.getTestContext().getLog()
				<< tcu::TestLog::Message << "Link operation should fail." << tcu::TestLog::EndMessage;
			return false;
		}

		return true;
	}
};

/** Negative Test "Active image uniform limits", description follows.
 *
 *  Program that exceeds resource limits should not compile and/or link.
 *
 *  Steps:
 *  - try to compile and link a program that uses too many image uniforms in
 *  fragment shader stage,
 *  - try to compile and link a program that uses too many image uniforms in
 *  vertex shader stage,
 *  - try to compile and link a program that uses too many image uniforms in
 *  tessellation control shader stage,
 *  - try to compile and link a program that uses too many image uniforms in
 *  tessellation evaluation shader stage,
 *  - try to compile and link a program that uses too many image uniforms in
 *  geometry shader stage,
 *  - try to compile and link a program that uses too many image uniforms in all
 *  shader stages combined, any single stage should not exceed its limits, this
 *  step might be impossible to fulfill.
 *
 *  Test should use the following declaration of image uniforms:
 *  layout(r32i) uniform iimage2D u_image[N_UNIFORMS];
 *
 *  For cases where limit for single stage is tested, N_UNIFORMS should be
 *  defined as gl_Max*ImageUniforms + 1, where gl_Max*ImageUniforms is constant
 *  corresponding to tested shader stage.
 *
 *  For case where limit for combined stages is tested:
 *  - u_image name should be appended with the name of shader stage, like
 *  u_image_vertex,
 *  - N_UNIFORMS should be defined as gl_Max*ImageUniforms, where
 *  gl_Max*ImageUniforms is constant corresponding to tested shader stage,
 *  - compilation and linking shall succeed, when sum of all
 *  gl_Max*ImageUniforms corresponding to shader stages is equal (or less) to
 *  gl_MaxCombinedImageUniforms.
 *
 *  All defined image uniforms have to be active. Each shader stage that declare
 *  image uniforms should include following code snippet:
 *  value = 1;
 *  for (int i = 0; i < N_UNIFORMS; ++i)
 *  {
 *      value = imageAtomicAdd(u_image[i], coord, value);
 *  }
 **/
class ImageLoadStoreUniformLimitsTest : public ShaderImageLoadStoreBase
{
private:
	/* Fields */
	/* Results */
	bool m_result_for_combined;
	bool m_result_for_fragment_shader;
	bool m_result_for_geometry_shader;
	bool m_result_for_tesselation_control_shader;
	bool m_result_for_tesselatioon_evaluation_shader;
	bool m_result_for_vertex_shader;

public:
	/* Constructor */
	ImageLoadStoreUniformLimitsTest()
		: m_result_for_combined(false)
		, m_result_for_fragment_shader(false)
		, m_result_for_geometry_shader(false)
		, m_result_for_tesselation_control_shader(false)
		, m_result_for_tesselatioon_evaluation_shader(false)
		, m_result_for_vertex_shader(false)
	{
		/* Nothing to be done */
	}

	/* Methods inherited from SubcaseBase */
	virtual long Cleanup()
	{
		/* Done */
		return NO_ERROR;
	}

	virtual long Run()
	{
		m_context.getTestContext().getLog() << tcu::TestLog::Message
											<< "This test tries to build invalid programs, expect error messages about "
											   "exceeded number of active image uniforms"
											<< tcu::TestLog::EndMessage;

		testFragmentShaderStage();
		testGeometryShaderStage();
		testTesselationControlShaderStage();
		testTesselationEvaluationShaderStage();
		testVertexShaderStage();
		testCombinedShaderStages();

		/* Return error if any stage failed */
		if ((false == m_result_for_combined) || (false == m_result_for_fragment_shader) ||
			(false == m_result_for_geometry_shader) || (false == m_result_for_tesselation_control_shader) ||
			(false == m_result_for_tesselatioon_evaluation_shader) || (false == m_result_for_vertex_shader))
		{
			return ERROR;
		}

		/* Done */
		return NO_ERROR;
	}

	virtual long Setup()
	{
		/* Done */
		return NO_ERROR;
	}

private:
	/** Test fragment shader stage
	 *
	 **/
	void testFragmentShaderStage()
	{
		static const char* const fragment_shader_code =
			"#version 400 core\n"
			"#extension GL_ARB_shader_image_load_store : require\n"
			"\n"
			"precision highp float;\n"
			"\n"
			"#define N_UNIFORMS gl_MaxFragmentImageUniforms + 1\n"
			"\n"
			"flat in ivec2 vs_fs_coord;\n"
			"\n"
			"layout(r32i) uniform iimage2D u_image[N_UNIFORMS];\n"
			"\n"
			"void main()\n"
			"{\n"
			"    int value = 1;\n"
			"\n"
			"    for (int i = 0; i < N_UNIFORMS; ++i)\n"
			"    {\n"
			"        value = imageAtomicAdd(u_image[i], vs_fs_coord, value);\n"
			"    }\n"
			"\n"
			"    discard;\n"
			"}\n\n";

		static const char* const vertex_shader_code = "#version 400 core\n"
													  "#extension GL_ARB_shader_image_load_store : require\n"
													  "\n"
													  "precision highp float;\n"
													  "\n"
													  "     in  ivec2 vs_in_coord;\n"
													  "flat out ivec2 vs_fs_coord;\n"
													  "\n"
													  "void main()\n"
													  "{\n"
													  "    vs_fs_coord = vs_in_coord;\n"
													  "}\n\n";

		m_result_for_fragment_shader = !doesProgramLink(fragment_shader_code, 0 /* geometry_shader_code */,
														0 /* tesselation_control_shader_code */,
														0 /* tesselation_evaluation_shader_code */, vertex_shader_code);

		if (false == m_result_for_fragment_shader)
		{
			m_context.getTestContext().getLog()
				<< tcu::TestLog::Message
				<< "Program which exceeds limit of GL_MAX_FRAGMENT_IMAGE_UNIFORMS was linked successfully."
				<< " File: " << __FILE__ << " Line: " << __LINE__ << " Shader code:\n"
				<< fragment_shader_code << tcu::TestLog::EndMessage;
		}
	}

	/** Test geometry shader stage
	 *
	 **/
	void testGeometryShaderStage()
	{
		static const char* const fragment_shader_code = "#version 400 core\n"
														"#extension GL_ARB_shader_image_load_store : require\n"
														"\n"
														"precision highp float;\n"
														"\n"
														"void main()\n"
														"{\n"
														"    discard;\n"
														"}\n\n";

		static const char* const geometry_shader_code =
			"#version 400 core\n"
			"#extension GL_ARB_shader_image_load_store : require\n"
			"\n"
			"precision highp float;\n"
			"\n"
			"layout(points)                   in;\n"
			"layout(points, max_vertices = 1) out;\n"
			"\n"
			"#define N_UNIFORMS gl_MaxGeometryImageUniforms + 1\n"
			"\n"
			"in ivec2 vs_gs_coord[];\n"
			"\n"
			"layout(r32i) uniform iimage2D u_image[N_UNIFORMS];\n"
			"\n"
			"void main()\n"
			"{\n"
			"    int value = 1;\n"
			"\n"
			"    for (int i = 0; i < N_UNIFORMS; ++i)\n"
			"    {\n"
			"        value = imageAtomicAdd(u_image[i], vs_gs_coord[0], value);\n"
			"    }\n"
			"}\n\n";

		static const char* const vertex_shader_code = "#version 400 core\n"
													  "#extension GL_ARB_shader_image_load_store : require\n"
													  "\n"
													  "precision highp float;\n"
													  "\n"
													  "in  ivec2 vs_in_coord;\n"
													  "out ivec2 vs_gs_coord;\n"
													  "\n"
													  "void main()\n"
													  "{\n"
													  "    vs_gs_coord = vs_in_coord;\n"
													  "}\n\n";

		m_result_for_geometry_shader =
			!doesProgramLink(fragment_shader_code, geometry_shader_code, 0 /* tesselation_control_shader_code */,
							 0 /* tesselation_evaluation_shader_code */, vertex_shader_code);

		if (false == m_result_for_geometry_shader)
		{
			m_context.getTestContext().getLog()
				<< tcu::TestLog::Message
				<< "Program which exceeds limit of GL_MAX_GEOMETRY_IMAGE_UNIFORMS was linked successfully."
				<< " File: " << __FILE__ << " Line: " << __LINE__ << " Shader code:\n"
				<< geometry_shader_code << tcu::TestLog::EndMessage;
		}
	}

	/** Test tesselation control shader stage
	 *
	 **/
	void testTesselationControlShaderStage()
	{
		static const char* const fragment_shader_code = "#version 400 core\n"
														"#extension GL_ARB_shader_image_load_store : require\n"
														"\n"
														"precision highp float;\n"
														"\n"
														"void main()\n"
														"{\n"
														"    discard;\n"
														"}\n\n";

		static const char* const tesselation_control_shader_code =
			"#version 400 core\n"
			"#extension GL_ARB_shader_image_load_store : require\n"
			"\n"
			"precision highp float;\n"
			"\n"
			"layout(vertices = 4) out;\n"
			"\n"
			"#define N_UNIFORMS gl_MaxTessControlImageUniforms + 1\n"
			"\n"
			"in ivec2 vs_tcs_coord[];\n"
			"\n"
			"layout(r32i) uniform iimage2D u_image[N_UNIFORMS];\n"
			"\n"
			"void main()\n"
			"{\n"
			"    int value = 1;\n"
			"\n"
			"    for (int i = 0; i < N_UNIFORMS; ++i)\n"
			"    {\n"
			"        value = imageAtomicAdd(u_image[i], vs_tcs_coord[0], value);\n"
			"    }\n"
			"}\n\n";

		static const char* const tesselation_evaluation_shader_code =
			"#version 400 core\n"
			"#extension GL_ARB_shader_image_load_store : require\n"
			"\n"
			"precision highp float;\n"
			"\n"
			"layout(quads, equal_spacing, ccw) in;\n"
			"\n"
			"void main()\n"
			"{\n"
			"}\n";

		static const char* const vertex_shader_code = "#version 400 core\n"
													  "#extension GL_ARB_shader_image_load_store : require\n"
													  "\n"
													  "precision highp float;\n"
													  "\n"
													  "in  ivec2 vs_in_coord;\n"
													  "out ivec2 vs_tcs_coord;\n"
													  "\n"
													  "void main()\n"
													  "{\n"
													  "    vs_tcs_coord = vs_in_coord;\n"
													  "}\n\n";

		m_result_for_tesselation_control_shader =
			!doesProgramLink(fragment_shader_code, 0 /* geometry_shader_code */, tesselation_control_shader_code,
							 tesselation_evaluation_shader_code, vertex_shader_code);

		if (false == m_result_for_tesselation_control_shader)
		{
			m_context.getTestContext().getLog()
				<< tcu::TestLog::Message
				<< "Program which exceeds limit of GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS was linked successfully."
				<< " File: " << __FILE__ << " Line: " << __LINE__ << " Shader code:\n"
				<< tesselation_control_shader_code << tcu::TestLog::EndMessage;
		}
	}

	/** Test teselation evaluation shader stage
	 *
	 **/
	void testTesselationEvaluationShaderStage()
	{
		static const char* const fragment_shader_code = "#version 400 core\n"
														"#extension GL_ARB_shader_image_load_store : require\n"
														"\n"
														"precision highp float;\n"
														"\n"
														"void main()\n"
														"{\n"
														"    discard;\n"
														"}\n\n";

		static const char* const tesselation_evaluation_shader_code =
			"#version 400 core\n"
			"#extension GL_ARB_shader_image_load_store : require\n"
			"\n"
			"precision highp float;\n"
			"\n"
			"layout(quads, equal_spacing, ccw) in;\n"
			"\n"
			"#define N_UNIFORMS gl_MaxTessEvaluationImageUniforms + 1\n"
			"\n"
			"in ivec2 vs_tes_coord[];\n"
			"\n"
			"layout(r32i) uniform iimage2D u_image[N_UNIFORMS];\n"
			"\n"
			"void main()\n"
			"{\n"
			"    int value = 1;\n"
			"\n"
			"    for (int i = 0; i < N_UNIFORMS; ++i)\n"
			"    {\n"
			"        value = imageAtomicAdd(u_image[i], vs_tes_coord[0], value);\n"
			"    }\n"
			"}\n\n";

		static const char* const vertex_shader_code = "#version 400 core\n"
													  "#extension GL_ARB_shader_image_load_store : require\n"
													  "\n"
													  "precision highp float;\n"
													  "\n"
													  "in  ivec2 vs_in_coord;\n"
													  "out ivec2 vs_tes_coord;\n"
													  "\n"
													  "void main()\n"
													  "{\n"
													  "    vs_tes_coord = vs_in_coord;\n"
													  "}\n\n";

		m_result_for_tesselatioon_evaluation_shader = !doesProgramLink(
			fragment_shader_code, 0 /* geometry_shader_code */, 0 /* tesselation_control_shader_code */,
			tesselation_evaluation_shader_code, vertex_shader_code);

		if (false == m_result_for_tesselatioon_evaluation_shader)
		{
			m_context.getTestContext().getLog()
				<< tcu::TestLog::Message
				<< "Program which exceeds limit of GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS was linked successfully."
				<< " File: " << __FILE__ << " Line: " << __LINE__ << " Shader code:\n"
				<< tesselation_evaluation_shader_code << tcu::TestLog::EndMessage;
		}
	}

	/** Test vertex shader stage
	 *
	 **/
	void testVertexShaderStage()
	{
		static const char* const fragment_shader_code = "#version 400 core\n"
														"#extension GL_ARB_shader_image_load_store : require\n"
														"\n"
														"precision highp float;\n"
														"\n"
														"void main()\n"
														"{\n"
														"    discard;\n"
														"}\n\n";

		static const char* const vertex_shader_code =
			"#version 400 core\n"
			"#extension GL_ARB_shader_image_load_store : require\n"
			"\n"
			"precision highp float;\n"
			"\n"
			"in ivec2 vs_in_coord;\n"
			"\n"
			"#define N_UNIFORMS gl_MaxVertexImageUniforms + 1\n"
			"\n"
			"layout(r32i) uniform iimage2D u_image[N_UNIFORMS];\n"
			"\n"
			"void main()\n"
			"{\n"
			"    int value = 1;\n"
			"\n"
			"    for (int i = 0; i < N_UNIFORMS; ++i)\n"
			"    {\n"
			"        value = imageAtomicAdd(u_image[i], vs_in_coord, value);\n"
			"    }\n"
			"}\n\n";

		m_result_for_vertex_shader = !doesProgramLink(fragment_shader_code, 0 /* geometry_shader_code */,
													  0 /* tesselation_control_shader_code */,
													  0 /* tesselation_evaluation_shader_code */, vertex_shader_code);

		if (false == m_result_for_vertex_shader)
		{
			m_context.getTestContext().getLog()
				<< tcu::TestLog::Message
				<< "Program which exceeds limit of GL_MAX_VERTEX_IMAGE_UNIFORMS was linked successfully."
				<< " File: " << __FILE__ << " Line: " << __LINE__ << " Shader code:\n"
				<< vertex_shader_code << tcu::TestLog::EndMessage;
		}
	}

	/** Test combined shader stages
	 *
	 **/
	void testCombinedShaderStages()
	{
		std::string fragment_shader_code =
			"#version 400 core\n"
			"#extension GL_ARB_shader_image_load_store : require\n"
			"\n"
			"precision highp float;\n"
			"\n"
			"#define N_UNIFORMS gl_MaxFragmentImageUniforms\n"
			"\n"
			"flat in ivec2 gs_fs_coord;\n"
			"\n"
			"layout(r32i) uniform iimage2D u_image_fragment[N_UNIFORMS];\n"
			"\n"
			"void main()\n"
			"{\n"
			"    int value = 1;\n"
			"\n"
			"    for (int i = 0; i < N_UNIFORMS; ++i)\n"
			"    {\n"
			"        value = imageAtomicAdd(u_image_fragment[i], gs_fs_coord, value);\n"
			"    }\n"
			"\n"
			"    discard;\n"
			"}\n\n";

		std::string geometry_shader_code =
			"#version 400 core\n"
			"#extension GL_ARB_shader_image_load_store : require\n"
			"\n"
			"precision highp float;\n"
			"\n"
			"layout(points)                   in;\n"
			"layout(points, max_vertices = 1) out;\n"
			"\n"
			"#define N_UNIFORMS gl_MaxGeometryImageUniforms\n"
			"\n"
			"flat in  ivec2 tes_gs_coord[];\n"
			"flat out ivec2 gs_fs_coord;\n"
			"\n"
			"#ifdef IMAGES\n"
			"layout(r32i) uniform iimage2D u_image_geometry[N_UNIFORMS];\n"
			"#endif\n"
			"\n"
			"void main()\n"
			"{\n"
			"#ifdef IMAGES\n"
			"    int value = 1;\n"
			"\n"
			"    for (int i = 0; i < N_UNIFORMS; ++i)\n"
			"    {\n"
			"        value = imageAtomicAdd(u_image_geometry[i], tes_gs_coord[0], value);\n"
			"    }\n"
			"\n"
			"#endif\n"
			"    gs_fs_coord = tes_gs_coord[0];\n"
			"    EmitVertex();\n"
			"}\n\n";

		std::string tesselation_control_shader_code =
			"#version 400 core\n"
			"#extension GL_ARB_shader_image_load_store : require\n"
			"\n"
			"precision highp float;\n"
			"\n"
			"layout(vertices = 4) out;\n"
			"\n"
			"#define N_UNIFORMS gl_MaxTessControlImageUniforms\n"
			"\n"
			"flat in  ivec2 vs_tcs_coord[];\n"
			"flat out ivec2 tcs_tes_coord[];\n"
			"\n"
			"#ifdef IMAGES\n"
			"layout(r32i) uniform iimage2D u_image_tess_control[N_UNIFORMS];\n"
			"#endif\n"
			"\n"
			"void main()\n"
			"{\n"
			"#ifdef IMAGES\n"
			"    int value = 1;\n"
			"\n"
			"    for (int i = 0; i < N_UNIFORMS; ++i)\n"
			"    {\n"
			"        value = imageAtomicAdd(u_image_tess_control[i], vs_tcs_coord[0], value);\n"
			"    }\n"
			"\n"
			"#endif\n"
			"    tcs_tes_coord[gl_InvocationID] = vs_tcs_coord[0];\n"
			"}\n\n";

		std::string tesselation_evaluation_shader_code =
			"#version 400 core\n"
			"#extension GL_ARB_shader_image_load_store : require\n"
			"\n"
			"precision highp float;\n"
			"\n"
			"layout(quads, equal_spacing, ccw) in;\n"
			"\n"
			"#define N_UNIFORMS gl_MaxTessEvaluationImageUniforms\n"
			"\n"
			"flat in  ivec2 tcs_tes_coord[];\n"
			"flat out ivec2 tes_gs_coord;\n"
			"\n"
			"#ifdef IMAGES\n"
			"layout(r32i) uniform iimage2D u_image_tess_evaluation[N_UNIFORMS];\n"
			"#endif\n"
			"\n"
			"void main()\n"
			"{\n"
			"#ifdef IMAGES\n"
			"    int value = 1;\n"
			"\n"
			"    for (int i = 0; i < N_UNIFORMS; ++i)\n"
			"    {\n"
			"        value = imageAtomicAdd(u_image_tess_evaluation[i], tcs_tes_coord[0], value);\n"
			"    }\n"
			"\n"
			"#endif\n"
			"    tes_gs_coord = tcs_tes_coord[0];\n"
			"}\n\n";

		std::string vertex_shader_code =
			"#version 400 core\n"
			"#extension GL_ARB_shader_image_load_store : require\n"
			"\n"
			"precision highp float;\n"
			"\n"
			"     in  ivec2 vs_in_coord;\n"
			"flat out ivec2 vs_tcs_coord;\n"
			"\n"
			"#define N_UNIFORMS gl_MaxVertexImageUniforms\n"
			"\n"
			"#ifdef IMAGES\n"
			"layout(r32i) uniform iimage2D u_image[N_UNIFORMS];\n"
			"#endif\n"
			"\n"
			"void main()\n"
			"{\n"
			"#ifdef IMAGES\n"
			"    int value = 1;\n"
			"\n"
			"    for (int i = 0; i < N_UNIFORMS; ++i)\n"
			"    {\n"
			"        value = imageAtomicAdd(u_image[i], vs_in_coord, value);\n"
			"    }\n"
			"\n"
			"#endif\n"
			"    vs_tcs_coord = vs_tcs_coord;\n"
			"}\n\n";

		/* Active image uniform limits */
		GLint max_combined_image_uniforms				= 0;
		GLint max_fragment_image_uniforms				= 0;
		GLint max_geometry_image_uniforms				= 0;
		GLint max_tesselation_control_image_uniforms	= 0;
		GLint max_tesselation_evaluation_image_uniforms = 0;
		GLint max_vertex_image_uniforms					= 0;

		/* Get limit values */
		glGetIntegerv(GL_MAX_COMBINED_IMAGE_UNIFORMS, &max_combined_image_uniforms);
		glGetIntegerv(GL_MAX_FRAGMENT_IMAGE_UNIFORMS, &max_fragment_image_uniforms);
		glGetIntegerv(GL_MAX_GEOMETRY_IMAGE_UNIFORMS, &max_geometry_image_uniforms);
		glGetIntegerv(GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS, &max_tesselation_control_image_uniforms);
		glGetIntegerv(GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS, &max_tesselation_evaluation_image_uniforms);
		glGetIntegerv(GL_MAX_VERTEX_IMAGE_UNIFORMS, &max_vertex_image_uniforms);
		GLU_EXPECT_NO_ERROR(glGetError(), "GetIntegerv");

		if (max_vertex_image_uniforms)
			vertex_shader_code.insert(18, "#define IMAGES\n");
		if (max_geometry_image_uniforms)
			geometry_shader_code.insert(18, "#define IMAGES\n");
		if (max_tesselation_control_image_uniforms)
			tesselation_control_shader_code.insert(18, "#define IMAGES\n");
		if (max_tesselation_evaluation_image_uniforms)
			tesselation_evaluation_shader_code.insert(18, "#define IMAGES\n");

		/* Check if program builds */
		m_result_for_combined =
			!doesProgramLink(fragment_shader_code.c_str(),
							 geometry_shader_code.c_str(),
							 tesselation_control_shader_code.c_str(),
							 tesselation_evaluation_shader_code.c_str(),
							 vertex_shader_code.c_str());

		/* Result depends on the limit values */
		if (max_combined_image_uniforms >=
			(max_fragment_image_uniforms + max_geometry_image_uniforms + max_tesselation_control_image_uniforms +
			 max_tesselation_evaluation_image_uniforms + max_vertex_image_uniforms))
		{
			/* In this case, combined image uniforms limit cannot be exeeded, therefore successful linking is expected */
			m_result_for_combined = !m_result_for_combined;

			if (false == m_result_for_combined)
			{
				m_context.getTestContext().getLog()
					<< tcu::TestLog::Message << "There was an error while building a program."
					<< " File: " << __FILE__ << " Line: " << __LINE__ << " Vertex shader code:\n"
					<< vertex_shader_code << "\nTesselation control shader code:\n"
					<< tesselation_control_shader_code << "\nTesselation evaluation shader code:\n"
					<< tesselation_evaluation_shader_code << "\nGeometry shader code:\n"
					<< geometry_shader_code << "\nFragment shader code:\n"
					<< fragment_shader_code << tcu::TestLog::EndMessage;
			}
		}
		else
		{
			/* In this case, combined image uniforms can be exceeded, therefore failed linking is expected */
			if (false == m_result_for_combined)
			{
				m_context.getTestContext().getLog()
					<< tcu::TestLog::Message
					<< "Program which exceeds limit of GL_MAX_COMBINED_IMAGE_UNIFORMS was linked successfully."
					<< " File: " << __FILE__ << " Line: " << __LINE__ << " Vertex shader code:\n"
					<< vertex_shader_code << "\nTesselation control shader code:\n"
					<< tesselation_control_shader_code << "\nTesselation evaluation shader code:\n"
					<< tesselation_evaluation_shader_code << "\nGeometry shader code:\n"
					<< geometry_shader_code << "\nFragment shader code:\n"
					<< fragment_shader_code << tcu::TestLog::EndMessage;
			}
		}
	}

	/** Check if program builds successfully
	 *
	 * @param fragment_shader_code               Source code for fragment shader stage
	 * @param geometry_shader_code               Source code for geometry shader stage
	 * @param tesselation_control_shader_code    Source code for tesselation control shader stage
	 * @param tesselation_evaluation_shader_code Source code for tesselation evaluation shader stage
	 * @param vertex_shader_code                 Source code for vertex shader stage
	 *
	 * @return true if program was built without errors, false otherwise
	 **/
	bool doesProgramLink(const char* fragment_shader_code, const char* geometry_shader_code,
						 const char* tesselation_control_shader_code, const char* tesselation_evaluation_shader_code,
						 const char* vertex_shader_code)
	{
		bool   is_program_built = true;
		GLuint program_id		= 0;

		program_id =
			BuildProgram(vertex_shader_code, tesselation_control_shader_code, tesselation_evaluation_shader_code,
						 geometry_shader_code, fragment_shader_code, &is_program_built);

		if (0 != program_id)
		{
			glDeleteProgram(program_id);
		}

		return is_program_built;
	}
};
}

ShaderImageLoadStoreTests::ShaderImageLoadStoreTests(deqp::Context& context)
	: TestCaseGroup(context, "shader_image_load_store", "")
{
}

ShaderImageLoadStoreTests::~ShaderImageLoadStoreTests(void)
{
}

void ShaderImageLoadStoreTests::init()
{
	using namespace deqp;
	addChild(new TestSubcase(m_context, "basic-api-get", TestSubcase::Create<BasicAPIGet>));
	addChild(new TestSubcase(m_context, "basic-api-bind", TestSubcase::Create<BasicAPIBind>));
	addChild(new TestSubcase(m_context, "basic-api-barrier", TestSubcase::Create<BasicAPIBarrier>));
	addChild(new TestSubcase(m_context, "basic-api-texParam", TestSubcase::Create<BasicAPITexParam>));
	addChild(new TestSubcase(m_context, "basic-allFormats-store", TestSubcase::Create<BasicAllFormatsStore>));
	addChild(new TestSubcase(m_context, "basic-allFormats-load", TestSubcase::Create<BasicAllFormatsLoad>));
	addChild(new TestSubcase(m_context, "basic-allFormats-storeGeometryStages",
							 TestSubcase::Create<BasicAllFormatsStoreGeometryStages>));
	addChild(new TestSubcase(m_context, "basic-allFormats-loadGeometryStages",
							 TestSubcase::Create<BasicAllFormatsLoadGeometryStages>));
	addChild(new TestSubcase(m_context, "basic-allFormats-loadStoreComputeStage",
							 TestSubcase::Create<BasicAllFormatsLoadStoreComputeStage>));
	addChild(new TestSubcase(m_context, "basic-allTargets-store", TestSubcase::Create<BasicAllTargetsStore>));
	addChild(new TestSubcase(m_context, "basic-allTargets-load-nonMS", TestSubcase::Create<BasicAllTargetsLoadNonMS>));
	addChild(new TestSubcase(m_context, "basic-allTargets-load-ms", TestSubcase::Create<BasicAllTargetsLoadMS>));
	addChild(new TestSubcase(m_context, "basic-allTargets-atomic", TestSubcase::Create<BasicAllTargetsAtomic>));
	addChild(
		new TestSubcase(m_context, "basic-allTargets-loadStoreVS", TestSubcase::Create<BasicAllTargetsLoadStoreVS>));
	addChild(
		new TestSubcase(m_context, "basic-allTargets-loadStoreTCS", TestSubcase::Create<BasicAllTargetsLoadStoreTCS>));
	addChild(
		new TestSubcase(m_context, "basic-allTargets-loadStoreTES", TestSubcase::Create<BasicAllTargetsLoadStoreTES>));
	addChild(
		new TestSubcase(m_context, "basic-allTargets-loadStoreGS", TestSubcase::Create<BasicAllTargetsLoadStoreGS>));
	addChild(
		new TestSubcase(m_context, "basic-allTargets-loadStoreCS", TestSubcase::Create<BasicAllTargetsLoadStoreCS>));
	addChild(new TestSubcase(m_context, "basic-allTargets-atomicVS", TestSubcase::Create<BasicAllTargetsAtomicVS>));
	addChild(new TestSubcase(m_context, "basic-allTargets-atomicTCS", TestSubcase::Create<BasicAllTargetsAtomicTCS>));
	addChild(new TestSubcase(m_context, "basic-allTargets-atomicGS", TestSubcase::Create<BasicAllTargetsAtomicGS>));
	addChild(new TestSubcase(m_context, "basic-allTargets-atomicCS", TestSubcase::Create<BasicAllTargetsAtomicCS>));
	addChild(new TestSubcase(m_context, "basic-glsl-misc", TestSubcase::Create<BasicGLSLMisc>));
	addChild(new TestSubcase(m_context, "basic-glsl-earlyFragTests", TestSubcase::Create<BasicGLSLEarlyFragTests>));
	addChild(new TestSubcase(m_context, "basic-glsl-const", TestSubcase::Create<BasicGLSLConst>));
	addChild(new TestSubcase(m_context, "advanced-sync-imageAccess", TestSubcase::Create<AdvancedSyncImageAccess>));
	addChild(new TestSubcase(m_context, "advanced-sync-vertexArray", TestSubcase::Create<AdvancedSyncVertexArray>));
	addChild(new TestSubcase(m_context, "advanced-sync-drawIndirect", TestSubcase::Create<AdvancedSyncDrawIndirect>));
	addChild(new TestSubcase(m_context, "advanced-sync-textureUpdate", TestSubcase::Create<AdvancedSyncTextureUpdate>));
	addChild(new TestSubcase(m_context, "advanced-sync-imageAccess2", TestSubcase::Create<AdvancedSyncImageAccess2>));
	addChild(new TestSubcase(m_context, "advanced-sync-bufferUpdate", TestSubcase::Create<AdvancedSyncBufferUpdate>));
	addChild(new TestSubcase(m_context, "advanced-allStages-oneImage", TestSubcase::Create<AdvancedAllStagesOneImage>));
	addChild(new TestSubcase(m_context, "advanced-memory-dependentInvocation",
							 TestSubcase::Create<AdvancedMemoryDependentInvocation>));
	addChild(new TestSubcase(m_context, "advanced-memory-order", TestSubcase::Create<AdvancedMemoryOrder>));
	addChild(new TestSubcase(m_context, "advanced-sso-simple", TestSubcase::Create<AdvancedSSOSimple>));
	addChild(new TestSubcase(m_context, "advanced-sso-atomicCounters", TestSubcase::Create<AdvancedSSOAtomicCounters>));
	addChild(new TestSubcase(m_context, "advanced-sso-subroutine", TestSubcase::Create<AdvancedSSOSubroutine>));
	addChild(new TestSubcase(m_context, "advanced-sso-perSample", TestSubcase::Create<AdvancedSSOPerSample>));
	addChild(new TestSubcase(m_context, "advanced-copyImage", TestSubcase::Create<AdvancedCopyImage>));
	addChild(new TestSubcase(m_context, "advanced-allMips", TestSubcase::Create<AdvancedAllMips>));
	addChild(new TestSubcase(m_context, "advanced-cast", TestSubcase::Create<AdvancedCast>));
	addChild(
		new TestSubcase(m_context, "single-byte_data_alignment", TestSubcase::Create<ImageLoadStoreDataAlignmentTest>));
	addChild(
		new TestSubcase(m_context, "non-layered_binding", TestSubcase::Create<ImageLoadStoreNonLayeredBindingTest>));
	addChild(
		new TestSubcase(m_context, "incomplete_textures", TestSubcase::Create<ImageLoadStoreIncompleteTexturesTest>));
	addChild(new TestSubcase(m_context, "multiple-uniforms", TestSubcase::Create<ImageLoadStoreMultipleUniformsTest>));
	addChild(
		new TestSubcase(m_context, "early-fragment-tests", TestSubcase::Create<ImageLoadStoreEarlyFragmentTestsTest>));
	addChild(new TestSubcase(m_context, "negative-uniform", TestSubcase::Create<NegativeUniform>));
	addChild(new TestSubcase(m_context, "negative-bind", TestSubcase::Create<NegativeBind>));
	addChild(new TestSubcase(m_context, "negative-compileErrors", TestSubcase::Create<NegativeCompileErrors>));
	addChild(new TestSubcase(m_context, "negative-linkErrors", TestSubcase::Create<NegativeLinkErrors>));
	addChild(new TestSubcase(m_context, "uniform-limits", TestSubcase::Create<ImageLoadStoreUniformLimitsTest>));
}
}
