1a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block//
2a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
3a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block// Use of this source code is governed by a BSD-style license that can be
4a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block// found in the LICENSE file.
5a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block//
6a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
7a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block// libGLESv2.cpp: Implements the exported OpenGL ES 2.0 functions.
8a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
9a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block#define GL_APICALL
10a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block#include <GLES2/gl2.h>
11a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block#include <GLES2/gl2ext.h>
12a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
13a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block#include <exception>
14a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block#include <limits>
15a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
16a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block#include "common/debug.h"
17a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
18a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block#include "libGLESv2/main.h"
19a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block#include "libGLESv2/mathutil.h"
20a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block#include "libGLESv2/utilities.h"
21a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block#include "libGLESv2/Buffer.h"
22a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block#include "libGLESv2/Context.h"
23ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch#include "libGLESv2/Fence.h"
24a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block#include "libGLESv2/Framebuffer.h"
25a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block#include "libGLESv2/Program.h"
26a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block#include "libGLESv2/Renderbuffer.h"
27a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block#include "libGLESv2/Shader.h"
28a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block#include "libGLESv2/Texture.h"
29a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
30a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockextern "C"
31a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
32a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
33a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glActiveTexture(GLenum texture)
34a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
35a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLenum texture = 0x%X)", texture);
36a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
37a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
38a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
39a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (texture < GL_TEXTURE0 || texture > GL_TEXTURE0 + gl::MAX_TEXTURE_IMAGE_UNITS - 1)
40a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
41a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return error(GL_INVALID_ENUM);
42a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
43a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
44a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
45a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
46a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
47a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
48a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            context->setActiveSampler(texture - GL_TEXTURE0);
49a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
50a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
51a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
52a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
53a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
54a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
55a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
56a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
57a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glAttachShader(GLuint program, GLuint shader)
58a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
59a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLuint program = %d, GLuint shader = %d)", program, shader);
60a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
61a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
62a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
63a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
64a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
65a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
66a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
67a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            gl::Program *programObject = context->getProgram(program);
68a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            gl::Shader *shaderObject = context->getShader(shader);
69a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
70a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            if (!programObject)
71a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
72a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                if (context->getShader(program))
73a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                {
74a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    return error(GL_INVALID_OPERATION);
75a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                }
76a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                else
77a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                {
78a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    return error(GL_INVALID_VALUE);
79a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                }
80a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
81a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
82a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            if (!shaderObject)
83a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
84a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                if (context->getProgram(shader))
85a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                {
86a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    return error(GL_INVALID_OPERATION);
87a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                }
88a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                else
89a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                {
90a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    return error(GL_INVALID_VALUE);
91a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                }
92a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
93a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
94a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            if (!programObject->attachShader(shaderObject))
95a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
96a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                return error(GL_INVALID_OPERATION);
97a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
98a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
99a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
100a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
101a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
102a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
103a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
104a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
105a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
106a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glBindAttribLocation(GLuint program, GLuint index, const GLchar* name)
107a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
108a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLuint program = %d, GLuint index = %d, const GLchar* name = 0x%0.8p)", program, index, name);
109a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
110a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
111a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
112a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (index >= gl::MAX_VERTEX_ATTRIBS)
113a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
114a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return error(GL_INVALID_VALUE);
115a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
116a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
117a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
118a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
119a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
120a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
121a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            gl::Program *programObject = context->getProgram(program);
122a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
123a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            if (!programObject)
124a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
125a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                if (context->getShader(program))
126a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                {
127a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    return error(GL_INVALID_OPERATION);
128a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                }
129a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                else
130a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                {
131a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    return error(GL_INVALID_VALUE);
132a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                }
133a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
134a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
135a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            if (strncmp(name, "gl_", 3) == 0)
136a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
137a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                return error(GL_INVALID_OPERATION);
138a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
139a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
140a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            programObject->bindAttributeLocation(index, name);
141a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
142a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
143a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
144a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
145a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
146a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
147a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
148a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
149a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glBindBuffer(GLenum target, GLuint buffer)
150a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
151a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLenum target = 0x%X, GLuint buffer = %d)", target, buffer);
152a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
153a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
154a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
155a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
156a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
157a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
158a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
159a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            switch (target)
160a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
161a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_ARRAY_BUFFER:
162a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                context->bindArrayBuffer(buffer);
163a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                return;
164a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_ELEMENT_ARRAY_BUFFER:
165a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                context->bindElementArrayBuffer(buffer);
166a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                return;
167a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              default:
168a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                return error(GL_INVALID_ENUM);
169a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
170a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
171a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
172a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
173a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
174a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
175a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
176a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
177a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
178a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glBindFramebuffer(GLenum target, GLuint framebuffer)
179a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
180a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLenum target = 0x%X, GLuint framebuffer = %d)", target, framebuffer);
181a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
182a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
183a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
1845abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
185a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
186a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return error(GL_INVALID_ENUM);
187a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
188a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
189a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
190a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
191a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
192a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
1935abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            if (target == GL_READ_FRAMEBUFFER_ANGLE || target == GL_FRAMEBUFFER)
1945abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            {
1955abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                context->bindReadFramebuffer(framebuffer);
1965abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            }
1975abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
1985abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            if (target == GL_DRAW_FRAMEBUFFER_ANGLE || target == GL_FRAMEBUFFER)
1995abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            {
2005abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                context->bindDrawFramebuffer(framebuffer);
2015abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            }
202a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
203a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
204a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
205a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
206a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
207a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
208a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
209a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
210a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glBindRenderbuffer(GLenum target, GLuint renderbuffer)
211a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
212a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLenum target = 0x%X, GLuint renderbuffer = %d)", target, renderbuffer);
213a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
214a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
215a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
216a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (target != GL_RENDERBUFFER)
217a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
218a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return error(GL_INVALID_ENUM);
219a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
220a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
221a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
222a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
223a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
224a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
225a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            context->bindRenderbuffer(renderbuffer);
226a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
227a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
228a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
229a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
230a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
231a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
232a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
233a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
234a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glBindTexture(GLenum target, GLuint texture)
235a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
236a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLenum target = 0x%X, GLuint texture = %d)", target, texture);
237a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
238a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
239a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
240a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
241a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
242a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
243a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
244a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            gl::Texture *textureObject = context->getTexture(texture);
245a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
246a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            if (textureObject && textureObject->getTarget() != target && texture != 0)
247a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
248a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                return error(GL_INVALID_OPERATION);
249a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
250a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
251a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            switch (target)
252a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
253a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_TEXTURE_2D:
254a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                context->bindTexture2D(texture);
255a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                return;
256a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_TEXTURE_CUBE_MAP:
257a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                context->bindTextureCubeMap(texture);
258a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                return;
259a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              default:
260a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                return error(GL_INVALID_ENUM);
261a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
262a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
263a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
264a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
265a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
266a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
267a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
268a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
269a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
270a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glBlendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
271a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
272a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLclampf red = %f, GLclampf green = %f, GLclampf blue = %f, GLclampf alpha = %f)",
273a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          red, green, blue, alpha);
274a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
275a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
276a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
277a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context* context = gl::getContext();
278a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
279a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
280a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
281a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            context->setBlendColor(gl::clamp01(red), gl::clamp01(green), gl::clamp01(blue), gl::clamp01(alpha));
282a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
283a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
284a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
285a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
286a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
287a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
288a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
289a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
290a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glBlendEquation(GLenum mode)
291a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
292a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    glBlendEquationSeparate(mode, mode);
293a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
294a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
295a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
296a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
297a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLenum modeRGB = 0x%X, GLenum modeAlpha = 0x%X)", modeRGB, modeAlpha);
298a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
299a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
300a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
301a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        switch (modeRGB)
302a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
303a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_FUNC_ADD:
304a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_FUNC_SUBTRACT:
305a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_FUNC_REVERSE_SUBTRACT:
306a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            break;
307a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          default:
308a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return error(GL_INVALID_ENUM);
309a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
310a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
311a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        switch (modeAlpha)
312a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
313a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_FUNC_ADD:
314a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_FUNC_SUBTRACT:
315a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_FUNC_REVERSE_SUBTRACT:
316a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            break;
317a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          default:
318a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return error(GL_INVALID_ENUM);
319a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
320a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
321a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
322a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
323a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
324a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
325a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            context->setBlendEquation(modeRGB, modeAlpha);
326a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
327a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
328a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
329a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
330a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
331a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
332a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
333a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
334a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glBlendFunc(GLenum sfactor, GLenum dfactor)
335a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
336a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    glBlendFuncSeparate(sfactor, dfactor, sfactor, dfactor);
337a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
338a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
339a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glBlendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
340a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
341a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLenum srcRGB = 0x%X, GLenum dstRGB = 0x%X, GLenum srcAlpha = 0x%X, GLenum dstAlpha = 0x%X)",
342a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          srcRGB, dstRGB, srcAlpha, dstAlpha);
343a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
344a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
345a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
346a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        switch (srcRGB)
347a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
348a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_ZERO:
349a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_ONE:
350a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_SRC_COLOR:
351a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_ONE_MINUS_SRC_COLOR:
352a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_DST_COLOR:
353a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_ONE_MINUS_DST_COLOR:
354a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_SRC_ALPHA:
355a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_ONE_MINUS_SRC_ALPHA:
356a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_DST_ALPHA:
357a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_ONE_MINUS_DST_ALPHA:
358a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_CONSTANT_COLOR:
359a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_ONE_MINUS_CONSTANT_COLOR:
360a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_CONSTANT_ALPHA:
361a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_ONE_MINUS_CONSTANT_ALPHA:
362a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_SRC_ALPHA_SATURATE:
363a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            break;
364a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          default:
365a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return error(GL_INVALID_ENUM);
366a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
367a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
368a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        switch (dstRGB)
369a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
370a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_ZERO:
371a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_ONE:
372a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_SRC_COLOR:
373a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_ONE_MINUS_SRC_COLOR:
374a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_DST_COLOR:
375a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_ONE_MINUS_DST_COLOR:
376a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_SRC_ALPHA:
377a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_ONE_MINUS_SRC_ALPHA:
378a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_DST_ALPHA:
379a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_ONE_MINUS_DST_ALPHA:
380a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_CONSTANT_COLOR:
381a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_ONE_MINUS_CONSTANT_COLOR:
382a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_CONSTANT_ALPHA:
383a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_ONE_MINUS_CONSTANT_ALPHA:
384a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            break;
385a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          default:
386a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return error(GL_INVALID_ENUM);
387a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
388a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
389a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        switch (srcAlpha)
390a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
391a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_ZERO:
392a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_ONE:
393a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_SRC_COLOR:
394a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_ONE_MINUS_SRC_COLOR:
395a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_DST_COLOR:
396a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_ONE_MINUS_DST_COLOR:
397a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_SRC_ALPHA:
398a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_ONE_MINUS_SRC_ALPHA:
399a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_DST_ALPHA:
400a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_ONE_MINUS_DST_ALPHA:
401a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_CONSTANT_COLOR:
402a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_ONE_MINUS_CONSTANT_COLOR:
403a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_CONSTANT_ALPHA:
404a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_ONE_MINUS_CONSTANT_ALPHA:
405a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_SRC_ALPHA_SATURATE:
406a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            break;
407a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          default:
408a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return error(GL_INVALID_ENUM);
409a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
410a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
411a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        switch (dstAlpha)
412a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
413a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_ZERO:
414a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_ONE:
415a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_SRC_COLOR:
416a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_ONE_MINUS_SRC_COLOR:
417a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_DST_COLOR:
418a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_ONE_MINUS_DST_COLOR:
419a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_SRC_ALPHA:
420a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_ONE_MINUS_SRC_ALPHA:
421a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_DST_ALPHA:
422a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_ONE_MINUS_DST_ALPHA:
423a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_CONSTANT_COLOR:
424a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_ONE_MINUS_CONSTANT_COLOR:
425a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_CONSTANT_ALPHA:
426a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_ONE_MINUS_CONSTANT_ALPHA:
427a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            break;
428a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          default:
429a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return error(GL_INVALID_ENUM);
430a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
431a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
432a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        bool constantColorUsed = (srcRGB == GL_CONSTANT_COLOR || srcRGB == GL_ONE_MINUS_CONSTANT_COLOR ||
433a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                                  dstRGB == GL_CONSTANT_COLOR || dstRGB == GL_ONE_MINUS_CONSTANT_COLOR);
434a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
435a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        bool constantAlphaUsed = (srcRGB == GL_CONSTANT_ALPHA || srcRGB == GL_ONE_MINUS_CONSTANT_ALPHA ||
436a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                                  dstRGB == GL_CONSTANT_ALPHA || dstRGB == GL_ONE_MINUS_CONSTANT_ALPHA);
437a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
438a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (constantColorUsed && constantAlphaUsed)
439a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
440a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            ERR("Simultaneous use of GL_CONSTANT_ALPHA/GL_ONE_MINUS_CONSTANT_ALPHA and GL_CONSTANT_COLOR/GL_ONE_MINUS_CONSTANT_COLOR invalid under WebGL");
441a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return error(GL_INVALID_OPERATION);
442a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
443a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
444a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
445a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
446a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
447a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
448a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            context->setBlendFactors(srcRGB, dstRGB, srcAlpha, dstAlpha);
449a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
450a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
451a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
452a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
453a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
454a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
455a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
456a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
457a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glBufferData(GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage)
458a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
459a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLenum target = 0x%X, GLsizeiptr size = %d, const GLvoid* data = 0x%0.8p, GLenum usage = %d)",
460a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          target, size, data, usage);
461a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
462a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
463a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
464a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (size < 0)
465a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
466a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return error(GL_INVALID_VALUE);
467a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
468a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
469a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        switch (usage)
470a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
471a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_STREAM_DRAW:
472a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_STATIC_DRAW:
473a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_DYNAMIC_DRAW:
474a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            break;
475a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          default:
476a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return error(GL_INVALID_ENUM);
477a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
478a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
479a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
480a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
481a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
482a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
483a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            gl::Buffer *buffer;
484a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
485a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            switch (target)
486a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
487a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_ARRAY_BUFFER:
488a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                buffer = context->getArrayBuffer();
489a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                break;
490a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_ELEMENT_ARRAY_BUFFER:
491a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                buffer = context->getElementArrayBuffer();
492a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                break;
493a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              default:
494a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                return error(GL_INVALID_ENUM);
495a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
496a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
497a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            if (!buffer)
498a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
499a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                return error(GL_INVALID_OPERATION);
500a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
501a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
502a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            buffer->bufferData(data, size, usage);
503a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
504a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
505a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
506a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
507a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
508a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
509a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
510a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
511a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* data)
512a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
513a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr size = %d, const GLvoid* data = 0x%0.8p)",
514a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          target, offset, size, data);
515a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
516a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
517a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
518a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (size < 0 || offset < 0)
519a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
520a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return error(GL_INVALID_VALUE);
521a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
522a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
523a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (data == NULL)
524a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
525a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return;
526a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
527a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
528a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
529a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
530a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
531a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
532a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            gl::Buffer *buffer;
533a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
534a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            switch (target)
535a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
536a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_ARRAY_BUFFER:
537a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                buffer = context->getArrayBuffer();
538a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                break;
539a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_ELEMENT_ARRAY_BUFFER:
540a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                buffer = context->getElementArrayBuffer();
541a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                break;
542a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              default:
543a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                return error(GL_INVALID_ENUM);
544a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
545a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
546a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            if (!buffer)
547a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
548a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                return error(GL_INVALID_OPERATION);
549a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
550a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
551a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            if ((size_t)size + offset > buffer->size())
552a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
553a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                return error(GL_INVALID_VALUE);
554a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
555a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
556a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            buffer->bufferSubData(data, size, offset);
557a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
558a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
559a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
560a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
561a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
562a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
563a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
564a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
565a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve BlockGLenum __stdcall glCheckFramebufferStatus(GLenum target)
566a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
567a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLenum target = 0x%X)", target);
568a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
569a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
570a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
5715abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
572a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
573a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return error(GL_INVALID_ENUM, 0);
574a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
575a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
576a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
577a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
578a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
579a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
5805abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            gl::Framebuffer *framebuffer = NULL;
5815abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            if (target == GL_READ_FRAMEBUFFER_ANGLE)
5825abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            {
5835abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                framebuffer = context->getReadFramebuffer();
5845abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            }
5855abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            else
5865abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            {
5875abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                framebuffer = context->getDrawFramebuffer();
5885abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            }
589a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
590a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return framebuffer->completeness();
591a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
592a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
593a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
594a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
595a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY, 0);
596a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
597a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
598a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    return 0;
599a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
600a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
601a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glClear(GLbitfield mask)
602a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
603a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLbitfield mask = %X)", mask);
604a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
605a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
606a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
607a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
608a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
609a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
610a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
611a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            context->clear(mask);
612a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
613a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
614a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
615a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
616a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
617a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
618a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
619a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
620a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
621a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
622a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLclampf red = %f, GLclampf green = %f, GLclampf blue = %f, GLclampf alpha = %f)",
623a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          red, green, blue, alpha);
624a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
625a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
626a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
627a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
628a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
629a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
630a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
631a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            context->setClearColor(red, green, blue, alpha);
632a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
633a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
634a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
635a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
636a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
637a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
638a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
639a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
640a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glClearDepthf(GLclampf depth)
641a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
642a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLclampf depth = %f)", depth);
643a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
644a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
645a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
646a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
647a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
648a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
649a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
650a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            context->setClearDepth(depth);
651a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
652a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
653a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
654a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
655a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
656a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
657a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
658a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
659a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glClearStencil(GLint s)
660a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
661a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLint s = %d)", s);
662a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
663a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
664a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
665a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
666a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
667a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
668a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
669a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            context->setClearStencil(s);
670a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
671a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
672a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
673a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
674a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
675a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
676a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
677a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
678a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
679a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
680a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLboolean red = %d, GLboolean green = %d, GLboolean blue = %d, GLboolean alpha = %d)",
681a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          red, green, blue, alpha);
682a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
683a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
684a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
685a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
686a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
687a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
688a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
689a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            context->setColorMask(red == GL_TRUE, green == GL_TRUE, blue == GL_TRUE, alpha == GL_TRUE);
690a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
691a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
692a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
693a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
694a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
695a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
696a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
697a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
698a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glCompileShader(GLuint shader)
699a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
700a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLuint shader = %d)", shader);
701a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
702a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
703a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
704a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
705a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
706a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
707a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
708a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            gl::Shader *shaderObject = context->getShader(shader);
709a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
710a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            if (!shaderObject)
711a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
712a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                if (context->getProgram(shader))
713a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                {
714a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    return error(GL_INVALID_OPERATION);
715a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                }
716a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                else
717a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                {
718a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    return error(GL_INVALID_VALUE);
719a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                }
720a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
721a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
722a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            shaderObject->compile();
723a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
724a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
725a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
726a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
727a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
728a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
729a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
730a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
731a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height,
732a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                                      GLint border, GLsizei imageSize, const GLvoid* data)
733a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
734a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
735a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          "GLsizei height = %d, GLint border = %d, GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
736a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          target, level, internalformat, width, height, border, imageSize, data);
737a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
738a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
739a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
740ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        if (level < 0)
741a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
7425abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            return error(GL_INVALID_VALUE);
743a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
744a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
7455abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        if (width < 0 || height < 0 || (level > 0 && !gl::isPow2(width)) || (level > 0 && !gl::isPow2(height)) || border != 0 || imageSize < 0)
746a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
747a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return error(GL_INVALID_VALUE);
748a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
749a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
7505abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        switch (internalformat)
7515abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        {
7525abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick          case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
7535abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick          case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
7545abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            break;
7555abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick          default:
7565abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            return error(GL_INVALID_ENUM);
7575abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        }
7585abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
7595abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        if (border != 0)
760a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
761a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return error(GL_INVALID_VALUE);
762a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
763a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
7645abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        gl::Context *context = gl::getContext();
7655abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
7665abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        if (context)
7675abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        {
768ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            if (level > context->getMaximumTextureLevel())
769ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            {
770ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                return error(GL_INVALID_VALUE);
771ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            }
772ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
773ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            switch (target)
774ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            {
775ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch              case GL_TEXTURE_2D:
776ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                if (width > (context->getMaximumTextureDimension() >> level) ||
777ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                    height > (context->getMaximumTextureDimension() >> level))
778ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                {
779ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                    return error(GL_INVALID_VALUE);
780ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                }
781ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                break;
782ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch              case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
783ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch              case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
784ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch              case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
785ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch              case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
786ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch              case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
787ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch              case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
788ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                if (width != height)
789ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                {
790ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                    return error(GL_INVALID_VALUE);
791ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                }
792ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
793ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                if (width > (context->getMaximumCubeTextureDimension() >> level) ||
794ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                    height > (context->getMaximumCubeTextureDimension() >> level))
795ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                {
796ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                    return error(GL_INVALID_VALUE);
797ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                }
798ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                break;
799ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch              default:
800ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                return error(GL_INVALID_ENUM);
801ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            }
802ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
8035abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            if (!context->supportsCompressedTextures())
8045abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            {
8055abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                return error(GL_INVALID_ENUM); // in this case, it's as though the internal format switch failed
8065abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            }
8075abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
8085abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            if (imageSize != gl::ComputeCompressedSize(width, height, internalformat))
8095abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            {
8105abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                return error(GL_INVALID_VALUE);
8115abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            }
8125abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
8135abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            if (target == GL_TEXTURE_2D)
8145abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            {
8155abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                gl::Texture2D *texture = context->getTexture2D();
8165abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
8175abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                if (!texture)
8185abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                {
8195abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                    return error(GL_INVALID_OPERATION);
8205abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                }
8215abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
8225abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                texture->setCompressedImage(level, internalformat, width, height, imageSize, data);
8235abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            }
8245abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            else
8255abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            {
8265abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                gl::TextureCubeMap *texture = context->getTextureCubeMap();
8275abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
8285abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                if (!texture)
8295abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                {
8305abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                    return error(GL_INVALID_OPERATION);
8315abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                }
8325abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
8335abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                switch (target)
8345abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                {
8355abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                  case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
8365abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                  case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
8375abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                  case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
8385abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                  case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
8395abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                  case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
8405abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                  case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
8415abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                    texture->setCompressedImage(target, level, internalformat, width, height, imageSize, data);
8425abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                    break;
8435abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                  default: UNREACHABLE();
8445abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                }
8455abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            }
8465abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        }
8475abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
848a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
849a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
850a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
851a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
852a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
853a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
854a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
855a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
856a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                                         GLenum format, GLsizei imageSize, const GLvoid* data)
857a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
858a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
859a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, "
860a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          "GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
861a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          target, level, xoffset, yoffset, width, height, format, imageSize, data);
862a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
863a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
864a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
865a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (!gl::IsTextureTarget(target))
866a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
867a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return error(GL_INVALID_ENUM);
868a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
869a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
870ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        if (level < 0)
871a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
872a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return error(GL_INVALID_VALUE);
873a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
874a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
8755abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        if (xoffset < 0 || yoffset < 0 || width < 0 || height < 0 ||
8765abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            (level > 0 && !gl::isPow2(width)) || (level > 0 && !gl::isPow2(height)) || imageSize < 0)
877a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
878a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return error(GL_INVALID_VALUE);
879a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
880a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
8815abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        switch (format)
882a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
8835abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick          case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
8845abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick          case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
8855abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            break;
8865abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick          default:
8875abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            return error(GL_INVALID_ENUM);
8885abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        }
8895abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
8905abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        if (width == 0 || height == 0 || data == NULL)
8915abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        {
8925abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            return;
893a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
894a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
8955abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        gl::Context *context = gl::getContext();
8965abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
8975abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        if (context)
8985abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        {
899ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            if (level > context->getMaximumTextureLevel())
900ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            {
901ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                return error(GL_INVALID_VALUE);
902ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            }
903ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
9045abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            if (!context->supportsCompressedTextures())
9055abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            {
9065abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                return error(GL_INVALID_ENUM); // in this case, it's as though the format switch has failed.
9075abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            }
9085abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
9095abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            if (imageSize != gl::ComputeCompressedSize(width, height, format))
9105abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            {
9115abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                return error(GL_INVALID_VALUE);
9125abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            }
9135abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
9145abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            if (xoffset % 4 != 0 || yoffset % 4 != 0)
9155abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            {
9165abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                return error(GL_INVALID_OPERATION); // we wait to check the offsets until this point, because the multiple-of-four restriction
9175abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                                                    // does not exist unless DXT1 textures are supported.
9185abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            }
9195abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
9205abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            if (target == GL_TEXTURE_2D)
9215abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            {
9225abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                gl::Texture2D *texture = context->getTexture2D();
9235abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
9245abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                if (!texture)
9255abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                {
9265abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                    return error(GL_INVALID_OPERATION);
9275abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                }
9285abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
9295abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                if (!texture->isCompressed())
9305abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                {
9315abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                    return error(GL_INVALID_OPERATION);
9325abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                }
9335abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
9345abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                if ((width % 4 != 0 && width != texture->getWidth()) ||
9355abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                    (height % 4 != 0 && height != texture->getHeight()))
9365abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                {
9375abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                    return error(GL_INVALID_OPERATION);
9385abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                }
9395abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
9405abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                texture->subImageCompressed(level, xoffset, yoffset, width, height, format, imageSize, data);
9415abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            }
9425abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            else if (gl::IsCubemapTextureTarget(target))
9435abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            {
9445abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                gl::TextureCubeMap *texture = context->getTextureCubeMap();
9455abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
9465abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                if (!texture)
9475abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                {
9485abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                    return error(GL_INVALID_OPERATION);
9495abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                }
9505abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
9515abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                if (!texture->isCompressed())
9525abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                {
9535abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                    return error(GL_INVALID_OPERATION);
9545abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                }
9555abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
9565abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                if ((width % 4 != 0 && width != texture->getWidth()) ||
9575abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                    (height % 4 != 0 && height != texture->getHeight()))
9585abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                {
9595abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                    return error(GL_INVALID_OPERATION);
9605abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                }
9615abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
9625abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                texture->subImageCompressed(target, level, xoffset, yoffset, width, height, format, imageSize, data);
9635abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            }
9645abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            else
9655abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            {
9665abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                UNREACHABLE();
9675abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            }
9685abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        }
969a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
970a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
971a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
972a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
973a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
974a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
975a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
976a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
977a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
978a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
979a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, GLint border = %d)",
980a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          target, level, internalformat, x, y, width, height, border);
981a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
982a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
983a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
984a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (level < 0 || width < 0 || height < 0)
985a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
986a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return error(GL_INVALID_VALUE);
987a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
988a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
989a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (level > 0 && (!gl::isPow2(width) || !gl::isPow2(height)))
990a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
991a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return error(GL_INVALID_VALUE);
992a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
993a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
994a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (border != 0)
995a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
996a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return error(GL_INVALID_VALUE);
997a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
998a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
999a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
1000a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
1001a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
1002a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
1003ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            switch (target)
10045abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            {
1005ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch              case GL_TEXTURE_2D:
1006ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                if (width > (context->getMaximumTextureDimension() >> level) ||
1007ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                    height > (context->getMaximumTextureDimension() >> level))
10085abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                {
1009ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                    return error(GL_INVALID_VALUE);
10105abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                }
1011ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                break;
1012ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch              case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1013ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch              case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1014ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch              case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1015ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch              case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1016ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch              case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1017ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch              case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
1018ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                if (width != height)
10195abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                {
1020ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                    return error(GL_INVALID_VALUE);
10215abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                }
1022ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
1023ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                if (width > (context->getMaximumCubeTextureDimension() >> level) ||
1024ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                    height > (context->getMaximumCubeTextureDimension() >> level))
1025ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                {
1026ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                    return error(GL_INVALID_VALUE);
1027ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                }
1028ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                break;
1029ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch              default:
1030ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                return error(GL_INVALID_ENUM);
10315abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            }
10325abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
10335abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            gl::Framebuffer *framebuffer = context->getReadFramebuffer();
1034ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
10355abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            if (framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE)
10365abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            {
10375abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                return error(GL_INVALID_FRAMEBUFFER_OPERATION);
10385abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            }
1039a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
10405abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            if (context->getReadFramebufferHandle() != 0 && framebuffer->getColorbuffer()->getSamples() != 0)
10415abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            {
10425abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                return error(GL_INVALID_OPERATION);
10435abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            }
10445abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
10455abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            gl::Colorbuffer *source = framebuffer->getColorbuffer();
1046ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            GLenum colorbufferFormat = source->getFormat();
1047ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
1048ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            // [OpenGL ES 2.0.24] table 3.9
1049ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            switch (internalformat)
1050ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            {
1051ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch              case GL_ALPHA:
1052ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                if (colorbufferFormat != GL_ALPHA &&
1053ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                    colorbufferFormat != GL_RGBA &&
1054ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                    colorbufferFormat != GL_RGBA4 &&
1055ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                    colorbufferFormat != GL_RGB5_A1 &&
1056ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                    colorbufferFormat != GL_RGBA8_OES)
1057ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                {
1058ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                    return error(GL_INVALID_OPERATION);
1059ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                }
1060ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                break;
1061ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch              case GL_LUMINANCE:
1062ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch              case GL_RGB:
1063ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                if (colorbufferFormat != GL_RGB &&
1064ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                    colorbufferFormat != GL_RGB565 &&
1065ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                    colorbufferFormat != GL_RGB8_OES &&
1066ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                    colorbufferFormat != GL_RGBA &&
1067ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                    colorbufferFormat != GL_RGBA4 &&
1068ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                    colorbufferFormat != GL_RGB5_A1 &&
1069ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                    colorbufferFormat != GL_RGBA8_OES)
1070ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                {
1071ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                    return error(GL_INVALID_OPERATION);
1072ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                }
1073ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                break;
1074ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch              case GL_LUMINANCE_ALPHA:
1075ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch              case GL_RGBA:
1076ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                if (colorbufferFormat != GL_RGBA &&
1077ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                    colorbufferFormat != GL_RGBA4 &&
1078ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                    colorbufferFormat != GL_RGB5_A1 &&
1079ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                    colorbufferFormat != GL_RGBA8_OES)
1080ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                 {
1081ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                     return error(GL_INVALID_OPERATION);
1082ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                 }
1083ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                 break;
1084ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch              case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1085ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch              case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
1086ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                if (context->supportsCompressedTextures())
1087ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                {
1088ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                    return error(GL_INVALID_OPERATION);
1089ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                }
1090ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                else
1091ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                {
1092ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                    return error(GL_INVALID_ENUM);
1093ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                }
1094ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                break;
1095ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch              default:
1096ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                return error(GL_INVALID_ENUM);
1097ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            }
1098ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
1099a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            if (target == GL_TEXTURE_2D)
1100a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
1101a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                gl::Texture2D *texture = context->getTexture2D();
1102a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
1103a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                if (!texture)
1104a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                {
1105a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    return error(GL_INVALID_OPERATION);
1106a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                }
1107a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
1108a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                texture->copyImage(level, internalformat, x, y, width, height, source);
1109a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
1110a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            else if (gl::IsCubemapTextureTarget(target))
1111a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
1112a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                gl::TextureCubeMap *texture = context->getTextureCubeMap();
1113a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
1114a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                if (!texture)
1115a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                {
1116a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    return error(GL_INVALID_OPERATION);
1117a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                }
1118a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
1119a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                texture->copyImage(target, level, internalformat, x, y, width, height, source);
1120a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
1121ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            else UNREACHABLE();
1122a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
1123a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
1124a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
1125a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
1126a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
1127a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
1128a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
1129a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
1130a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
1131a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
1132a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
1133a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
1134a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          target, level, xoffset, yoffset, x, y, width, height);
1135a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
1136a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
1137a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
1138a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (!gl::IsTextureTarget(target))
1139a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
1140a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return error(GL_INVALID_ENUM);
1141a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
1142a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
1143ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        if (level < 0 || xoffset < 0 || yoffset < 0 || width < 0 || height < 0)
1144a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
1145a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return error(GL_INVALID_VALUE);
1146a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
1147a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
1148a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (std::numeric_limits<GLsizei>::max() - xoffset < width || std::numeric_limits<GLsizei>::max() - yoffset < height)
1149a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
1150a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return error(GL_INVALID_VALUE);
1151a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
1152a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
1153a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (width == 0 || height == 0)
1154a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
1155a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return;
1156a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
1157a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
1158a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
1159a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
1160a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
1161a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
1162ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            if (level > context->getMaximumTextureLevel())
1163ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            {
1164ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                return error(GL_INVALID_VALUE);
1165ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            }
1166ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
11675abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            gl::Framebuffer *framebuffer = context->getReadFramebuffer();
1168ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
11695abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            if (framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE)
11705abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            {
11715abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                return error(GL_INVALID_FRAMEBUFFER_OPERATION);
11725abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            }
11735abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
11745abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            if (context->getReadFramebufferHandle() != 0 && framebuffer->getColorbuffer()->getSamples() != 0)
11755abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            {
11765abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                return error(GL_INVALID_OPERATION);
11775abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            }
1178a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
11795abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            gl::Colorbuffer *source = framebuffer->getColorbuffer();
1180ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            GLenum colorbufferFormat = source->getFormat();
1181ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            gl::Texture *texture = NULL;
1182ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
1183a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            if (target == GL_TEXTURE_2D)
1184a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
1185ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                texture = context->getTexture2D();
1186ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            }
1187ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            else if (gl::IsCubemapTextureTarget(target))
1188ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            {
1189ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                texture = context->getTextureCubeMap();
1190ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            }
1191ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            else UNREACHABLE();
1192a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
1193ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            if (!texture)
1194ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            {
1195ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                return error(GL_INVALID_OPERATION);
1196ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            }
1197a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
1198ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            GLenum textureFormat = texture->getFormat();
1199ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
1200ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            // [OpenGL ES 2.0.24] table 3.9
1201ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            switch (textureFormat)
1202ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            {
1203ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch              case GL_ALPHA:
1204ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                if (colorbufferFormat != GL_ALPHA &&
1205ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                    colorbufferFormat != GL_RGBA &&
1206ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                    colorbufferFormat != GL_RGBA4 &&
1207ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                    colorbufferFormat != GL_RGB5_A1 &&
1208ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                    colorbufferFormat != GL_RGBA8_OES)
12095abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                {
12105abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                    return error(GL_INVALID_OPERATION);
12115abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                }
1212ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                break;
1213ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch              case GL_LUMINANCE:
1214ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch              case GL_RGB:
1215ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                if (colorbufferFormat != GL_RGB &&
1216ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                    colorbufferFormat != GL_RGB565 &&
1217ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                    colorbufferFormat != GL_RGB8_OES &&
1218ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                    colorbufferFormat != GL_RGBA &&
1219ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                    colorbufferFormat != GL_RGBA4 &&
1220ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                    colorbufferFormat != GL_RGB5_A1 &&
1221ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                    colorbufferFormat != GL_RGBA8_OES)
1222a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                {
1223a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    return error(GL_INVALID_OPERATION);
1224a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                }
1225ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                break;
1226ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch              case GL_LUMINANCE_ALPHA:
1227ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch              case GL_RGBA:
1228ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                if (colorbufferFormat != GL_RGBA &&
1229ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                    colorbufferFormat != GL_RGBA4 &&
1230ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                    colorbufferFormat != GL_RGB5_A1 &&
1231ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                    colorbufferFormat != GL_RGBA8_OES)
12325abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                {
12335abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                    return error(GL_INVALID_OPERATION);
12345abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                }
1235ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                break;
1236ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch              case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1237ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch              case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
1238ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                return error(GL_INVALID_OPERATION);
1239ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch              default:
1240ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                return error(GL_INVALID_OPERATION);
1241a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
1242ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
1243ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            texture->copySubImage(target, level, xoffset, yoffset, x, y, width, height, source);
1244a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
1245a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
1246a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
1247a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
1248a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
1249a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
1250a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
1251a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
1252a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
1253a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve BlockGLuint __stdcall glCreateProgram(void)
1254a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
1255a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("()");
1256a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
1257a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
1258a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
1259a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
1260a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
1261a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
1262a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
1263a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return context->createProgram();
1264a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
1265a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
1266a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
1267a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
1268a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY, 0);
1269a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
1270a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
1271a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    return 0;
1272a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
1273a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
1274a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve BlockGLuint __stdcall glCreateShader(GLenum type)
1275a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
1276a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLenum type = 0x%X)", type);
1277a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
1278a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
1279a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
1280a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
1281a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
1282a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
1283a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
1284a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            switch (type)
1285a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
1286a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_FRAGMENT_SHADER:
1287a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_VERTEX_SHADER:
1288a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                return context->createShader(type);
1289a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              default:
1290a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                return error(GL_INVALID_ENUM, 0);
1291a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
1292a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
1293a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
1294a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
1295a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
1296a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY, 0);
1297a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
1298a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
1299a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    return 0;
1300a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
1301a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
1302a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glCullFace(GLenum mode)
1303a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
1304a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLenum mode = 0x%X)", mode);
1305a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
1306a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
1307a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
1308a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        switch (mode)
1309a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
1310a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_FRONT:
1311a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_BACK:
1312a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_FRONT_AND_BACK:
1313a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
1314a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                gl::Context *context = gl::getContext();
1315a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
1316a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                if (context)
1317a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                {
1318a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    context->setCullMode(mode);
1319a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                }
1320a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
1321a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            break;
1322a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          default:
1323a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return error(GL_INVALID_ENUM);
1324a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
1325a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
1326a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
1327a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
1328a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
1329a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
1330a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
1331a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
1332a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glDeleteBuffers(GLsizei n, const GLuint* buffers)
1333a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
1334a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLsizei n = %d, const GLuint* buffers = 0x%0.8p)", n, buffers);
1335a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
1336a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
1337a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
1338a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (n < 0)
1339a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
1340a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return error(GL_INVALID_VALUE);
1341a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
1342a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
1343a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
1344a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
1345a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
1346a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
1347a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            for (int i = 0; i < n; i++)
1348a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
1349a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                context->deleteBuffer(buffers[i]);
1350a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
1351a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
1352a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
1353a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
1354a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
1355a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
1356a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
1357a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
1358a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
1359ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdochvoid __stdcall glDeleteFencesNV(GLsizei n, const GLuint* fences)
1360ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch{
1361ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    TRACE("(GLsizei n = %d, const GLuint* fences = 0x%0.8p)", n, fences);
1362ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
1363ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    try
1364ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    {
1365ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        if (n < 0)
1366ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        {
1367ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            return error(GL_INVALID_VALUE);
1368ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        }
1369ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
1370ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        gl::Context *context = gl::getContext();
1371ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
1372ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        if (context)
1373ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        {
1374ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            for (int i = 0; i < n; i++)
1375ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            {
1376ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                context->deleteFence(fences[i]);
1377ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            }
1378ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        }
1379ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    }
1380ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    catch(std::bad_alloc&)
1381ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    {
1382ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        return error(GL_OUT_OF_MEMORY);
1383ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    }
1384ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch}
1385ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
1386a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glDeleteFramebuffers(GLsizei n, const GLuint* framebuffers)
1387a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
1388a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLsizei n = %d, const GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
1389a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
1390a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
1391a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
1392a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (n < 0)
1393a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
1394a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return error(GL_INVALID_VALUE);
1395a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
1396a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
1397a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
1398a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
1399a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
1400a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
1401a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            for (int i = 0; i < n; i++)
1402a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
1403a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                if (framebuffers[i] != 0)
1404a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                {
1405a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    context->deleteFramebuffer(framebuffers[i]);
1406a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                }
1407a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
1408a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
1409a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
1410a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
1411a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
1412a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
1413a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
1414a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
1415a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
1416a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glDeleteProgram(GLuint program)
1417a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
1418a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLuint program = %d)", program);
1419a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
1420a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
1421a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
1422a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (program == 0)
1423a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
1424a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return;
1425a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
1426a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
1427a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
1428a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
1429a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
1430a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
1431a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            if (!context->getProgram(program))
1432a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
1433a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                if(context->getShader(program))
1434a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                {
1435a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    return error(GL_INVALID_OPERATION);
1436a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                }
1437a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                else
1438a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                {
1439a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    return error(GL_INVALID_VALUE);
1440a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                }
1441a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
1442a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
1443a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            context->deleteProgram(program);
1444a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
1445a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
1446a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
1447a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
1448a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
1449a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
1450a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
1451a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
1452a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glDeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers)
1453a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
1454a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLsizei n = %d, const GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
1455a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
1456a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
1457a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
1458a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (n < 0)
1459a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
1460a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return error(GL_INVALID_VALUE);
1461a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
1462a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
1463a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
1464a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
1465a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
1466a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
1467a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            for (int i = 0; i < n; i++)
1468a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
1469a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                context->deleteRenderbuffer(renderbuffers[i]);
1470a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
1471a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
1472a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
1473a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
1474a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
1475a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
1476a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
1477a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
1478a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
1479a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glDeleteShader(GLuint shader)
1480a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
1481a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLuint shader = %d)", shader);
1482a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
1483a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
1484a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
1485a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (shader == 0)
1486a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
1487a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return;
1488a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
1489a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
1490a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
1491a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
1492a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
1493a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
1494a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            if (!context->getShader(shader))
1495a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
1496a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                if(context->getProgram(shader))
1497a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                {
1498a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    return error(GL_INVALID_OPERATION);
1499a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                }
1500a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                else
1501a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                {
1502a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    return error(GL_INVALID_VALUE);
1503a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                }
1504a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
1505a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
1506a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            context->deleteShader(shader);
1507a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
1508a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
1509a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
1510a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
1511a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
1512a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
1513a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
1514a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
1515a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glDeleteTextures(GLsizei n, const GLuint* textures)
1516a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
1517a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLsizei n = %d, const GLuint* textures = 0x%0.8p)", n, textures);
1518a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
1519a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
1520a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
1521a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (n < 0)
1522a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
1523a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return error(GL_INVALID_VALUE);
1524a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
1525a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
1526a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
1527a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
1528a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
1529a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
1530a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            for (int i = 0; i < n; i++)
1531a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
1532a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                if (textures[i] != 0)
1533a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                {
1534a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    context->deleteTexture(textures[i]);
1535a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                }
1536a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
1537a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
1538a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
1539a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
1540a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
1541a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
1542a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
1543a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
1544a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
1545a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glDepthFunc(GLenum func)
1546a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
1547a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLenum func = 0x%X)", func);
1548a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
1549a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
1550a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
1551a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        switch (func)
1552a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
1553a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_NEVER:
1554a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_ALWAYS:
1555a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_LESS:
1556a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_LEQUAL:
1557a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_EQUAL:
1558a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_GREATER:
1559a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_GEQUAL:
1560a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_NOTEQUAL:
1561a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            break;
1562a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          default:
1563a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return error(GL_INVALID_ENUM);
1564a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
1565a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
1566a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
1567a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
1568a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
1569a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
1570a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            context->setDepthFunc(func);
1571a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
1572a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
1573a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
1574a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
1575a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
1576a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
1577a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
1578a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
1579a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glDepthMask(GLboolean flag)
1580a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
1581a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLboolean flag = %d)", flag);
1582a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
1583a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
1584a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
1585a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
1586a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
1587a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
1588a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
1589a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            context->setDepthMask(flag != GL_FALSE);
1590a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
1591a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
1592a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
1593a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
1594a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
1595a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
1596a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
1597a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
1598a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glDepthRangef(GLclampf zNear, GLclampf zFar)
1599a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
1600a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLclampf zNear = %f, GLclampf zFar = %f)", zNear, zFar);
1601a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
1602a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
1603a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
1604a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
1605a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
1606a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
1607a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
1608a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            context->setDepthRange(zNear, zFar);
1609a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
1610a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
1611a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
1612a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
1613a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
1614a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
1615a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
1616a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
1617a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glDetachShader(GLuint program, GLuint shader)
1618a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
1619a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLuint program = %d, GLuint shader = %d)", program, shader);
1620a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
1621a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
1622a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
1623a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
1624a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
1625a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
1626a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
1627a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
1628a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            gl::Program *programObject = context->getProgram(program);
1629a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            gl::Shader *shaderObject = context->getShader(shader);
1630a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
1631a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            if (!programObject)
1632a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
1633a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                gl::Shader *shaderByProgramHandle;
1634a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                shaderByProgramHandle = context->getShader(program);
1635a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                if (!shaderByProgramHandle)
1636a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                {
1637a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    return error(GL_INVALID_VALUE);
1638a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                }
1639a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                else
1640a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                {
1641a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    return error(GL_INVALID_OPERATION);
1642a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                }
1643a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
1644a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
1645a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            if (!shaderObject)
1646a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
1647a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                gl::Program *programByShaderHandle = context->getProgram(shader);
1648a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                if (!programByShaderHandle)
1649a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                {
1650a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    return error(GL_INVALID_VALUE);
1651a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                }
1652a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                else
1653a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                {
1654a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    return error(GL_INVALID_OPERATION);
1655a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                }
1656a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
1657a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
1658a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            if (!programObject->detachShader(shaderObject))
1659a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
1660a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                return error(GL_INVALID_OPERATION);
1661a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
1662a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
1663a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
1664a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
1665a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
1666a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
1667a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
1668a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
1669a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
1670a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glDisable(GLenum cap)
1671a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
1672a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLenum cap = 0x%X)", cap);
1673a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
1674a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
1675a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
1676a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
1677a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
1678a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
1679a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
1680a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            switch (cap)
1681a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
1682a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_CULL_FACE:                context->setCullFace(false);              break;
1683a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_POLYGON_OFFSET_FILL:      context->setPolygonOffsetFill(false);     break;
1684a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_SAMPLE_ALPHA_TO_COVERAGE: context->setSampleAlphaToCoverage(false); break;
1685a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_SAMPLE_COVERAGE:          context->setSampleCoverage(false);        break;
1686a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_SCISSOR_TEST:             context->setScissorTest(false);           break;
1687a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_STENCIL_TEST:             context->setStencilTest(false);           break;
1688a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_DEPTH_TEST:               context->setDepthTest(false);             break;
1689a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_BLEND:                    context->setBlend(false);                 break;
1690a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_DITHER:                   context->setDither(false);                break;
1691a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              default:
1692a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                return error(GL_INVALID_ENUM);
1693a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
1694a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
1695a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
1696a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
1697a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
1698a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
1699a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
1700a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
1701a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
1702a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glDisableVertexAttribArray(GLuint index)
1703a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
1704a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLuint index = %d)", index);
1705a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
1706a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
1707a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
1708a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (index >= gl::MAX_VERTEX_ATTRIBS)
1709a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
1710a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return error(GL_INVALID_VALUE);
1711a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
1712a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
1713a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
1714a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
1715a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
1716a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
1717ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            context->setEnableVertexAttribArray(index, false);
1718a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
1719a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
1720a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
1721a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
1722a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
1723a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
1724a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
1725a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
1726a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glDrawArrays(GLenum mode, GLint first, GLsizei count)
1727a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
1728a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d)", mode, first, count);
1729a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
1730a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
1731a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
1732a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (count < 0 || first < 0)
1733a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
1734a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return error(GL_INVALID_VALUE);
1735a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
1736a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
1737a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
1738a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
1739a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
1740a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
1741a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            context->drawArrays(mode, first, count);
1742a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
1743a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
1744a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
1745a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
1746a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
1747a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
1748a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
1749a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
1750a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices)
1751a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
1752a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p)",
1753a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          mode, count, type, indices);
1754a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
1755a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
1756a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
1757a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (count < 0)
1758a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
1759a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return error(GL_INVALID_VALUE);
1760a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
1761a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
1762a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
1763a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
1764a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
1765a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
1766ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            switch (type)
1767ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            {
1768ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch              case GL_UNSIGNED_BYTE:
1769ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch              case GL_UNSIGNED_SHORT:
1770ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                break;
1771ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch              case GL_UNSIGNED_INT:
1772ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                if (!context->supports32bitIndices())
1773ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                {
1774ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                    return error(GL_INVALID_ENUM);
1775ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                }
1776ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                break;
1777ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch              default:
1778ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                return error(GL_INVALID_ENUM);
1779ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            }
1780ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
1781a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            context->drawElements(mode, count, type, indices);
1782a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
1783a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
1784a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
1785a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
1786a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
1787a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
1788a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
1789a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
1790a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glEnable(GLenum cap)
1791a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
1792a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLenum cap = 0x%X)", cap);
1793a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
1794a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
1795a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
1796a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
1797a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
1798a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
1799a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
1800a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            switch (cap)
1801a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
1802a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_CULL_FACE:                context->setCullFace(true);              break;
1803a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_POLYGON_OFFSET_FILL:      context->setPolygonOffsetFill(true);     break;
1804a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_SAMPLE_ALPHA_TO_COVERAGE: context->setSampleAlphaToCoverage(true); break;
1805a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_SAMPLE_COVERAGE:          context->setSampleCoverage(true);        break;
1806a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_SCISSOR_TEST:             context->setScissorTest(true);           break;
1807a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_STENCIL_TEST:             context->setStencilTest(true);           break;
1808a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_DEPTH_TEST:               context->setDepthTest(true);             break;
1809a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_BLEND:                    context->setBlend(true);                 break;
1810a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_DITHER:                   context->setDither(true);                break;
1811a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              default:
1812a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                return error(GL_INVALID_ENUM);
1813a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
1814a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
1815a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
1816a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
1817a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
1818a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
1819a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
1820a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
1821a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
1822a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glEnableVertexAttribArray(GLuint index)
1823a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
1824a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLuint index = %d)", index);
1825a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
1826a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
1827a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
1828a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (index >= gl::MAX_VERTEX_ATTRIBS)
1829a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
1830a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return error(GL_INVALID_VALUE);
1831a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
1832a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
1833a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
1834a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
1835a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
1836a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
1837ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            context->setEnableVertexAttribArray(index, true);
1838ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        }
1839ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    }
1840ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    catch(std::bad_alloc&)
1841ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    {
1842ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        return error(GL_OUT_OF_MEMORY);
1843ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    }
1844ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch}
1845ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
1846ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdochvoid __stdcall glFinishFenceNV(GLuint fence)
1847ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch{
1848ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    TRACE("(GLuint fence = %d)", fence);
1849ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
1850ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    try
1851ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    {
1852ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        gl::Context *context = gl::getContext();
1853ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
1854ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        if (context)
1855ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        {
1856ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            gl::Fence* fenceObject = context->getFence(fence);
1857ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
1858ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            if (fenceObject == NULL)
1859ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            {
1860ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                return error(GL_INVALID_OPERATION);
1861ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            }
1862ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
1863ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            fenceObject->finishFence();
1864a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
1865a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
1866a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
1867a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
1868a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
1869a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
1870a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
1871a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
1872a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glFinish(void)
1873a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
1874a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("()");
1875a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
1876a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
1877a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
1878a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
1879a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
1880a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
1881a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
1882a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            context->finish();
1883a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
1884a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
1885a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
1886a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
1887a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
1888a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
1889a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
1890a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
1891a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glFlush(void)
1892a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
1893a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("()");
1894a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
1895a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
1896a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
1897a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
1898a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
1899a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
1900a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
1901a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            context->flush();
1902a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
1903a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
1904a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
1905a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
1906a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
1907a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
1908a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
1909a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
1910a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
1911a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
1912a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum renderbuffertarget = 0x%X, "
1913a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          "GLuint renderbuffer = %d)", target, attachment, renderbuffertarget, renderbuffer);
1914a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
1915a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
1916a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
19175abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        if ((target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
19185abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            || renderbuffertarget != GL_RENDERBUFFER)
1919a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
1920a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return error(GL_INVALID_ENUM);
1921a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
1922a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
1923a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
1924a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
1925a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
1926a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
19275abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            gl::Framebuffer *framebuffer = NULL;
19285abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            GLuint framebufferHandle = 0;
19295abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            if (target == GL_READ_FRAMEBUFFER_ANGLE)
19305abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            {
19315abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                framebuffer = context->getReadFramebuffer();
19325abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                framebufferHandle = context->getReadFramebufferHandle();
19335abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            }
19345abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            else
19355abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            {
19365abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                framebuffer = context->getDrawFramebuffer();
19375abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                framebufferHandle = context->getDrawFramebufferHandle();
19385abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            }
1939a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
19405abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            if (framebufferHandle == 0 || !framebuffer)
1941a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
1942a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                return error(GL_INVALID_OPERATION);
1943a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
1944a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
1945a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            switch (attachment)
1946a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
1947a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_COLOR_ATTACHMENT0:
1948a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                framebuffer->setColorbuffer(GL_RENDERBUFFER, renderbuffer);
1949a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                break;
1950a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_DEPTH_ATTACHMENT:
1951a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                framebuffer->setDepthbuffer(GL_RENDERBUFFER, renderbuffer);
1952a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                break;
1953a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_STENCIL_ATTACHMENT:
1954a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                framebuffer->setStencilbuffer(GL_RENDERBUFFER, renderbuffer);
1955a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                break;
1956a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              default:
1957a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                return error(GL_INVALID_ENUM);
1958a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
1959a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
1960a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
1961a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
1962a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
1963a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
1964a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
1965a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
1966a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
1967a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
1968a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
1969a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum textarget = 0x%X, "
1970a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          "GLuint texture = %d, GLint level = %d)", target, attachment, textarget, texture, level);
1971a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
1972a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
1973a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
19745abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
1975a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
1976a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return error(GL_INVALID_ENUM);
1977a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
1978a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
1979a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        switch (attachment)
1980a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
1981a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_COLOR_ATTACHMENT0:
1982a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_DEPTH_ATTACHMENT:
1983a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_STENCIL_ATTACHMENT:
1984a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            break;
1985a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          default:
1986a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return error(GL_INVALID_ENUM);
1987a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
1988a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
1989a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
1990a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
1991a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
1992a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
1993a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            if (texture == 0)
1994a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
1995a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                textarget = GL_NONE;
1996a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
1997a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            else
1998a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
1999a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                gl::Texture *tex = context->getTexture(texture);
2000a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2001a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                if (tex == NULL)
2002a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                {
2003a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    return error(GL_INVALID_OPERATION);
2004a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                }
2005a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
20065abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                if (tex->isCompressed())
20075abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                {
20085abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                    return error(GL_INVALID_OPERATION);
20095abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                }
20105abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
2011a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                switch (textarget)
2012a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                {
2013a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                  case GL_TEXTURE_2D:
2014a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    if (tex->getTarget() != GL_TEXTURE_2D)
2015a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    {
2016a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                        return error(GL_INVALID_OPERATION);
2017a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    }
2018a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    break;
2019a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2020a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                  case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
2021a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                  case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
2022a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                  case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
2023a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                  case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
2024a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                  case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
2025a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                  case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
2026a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    if (tex->getTarget() != GL_TEXTURE_CUBE_MAP)
2027a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    {
2028a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                        return error(GL_INVALID_OPERATION);
2029a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    }
2030a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    break;
2031a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2032a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                  default:
2033a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    return error(GL_INVALID_ENUM);
2034a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                }
2035a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2036a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                if (level != 0)
2037a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                {
2038a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    return error(GL_INVALID_VALUE);
2039a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                }
2040a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
2041a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
20425abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            gl::Framebuffer *framebuffer = NULL;
20435abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            GLuint framebufferHandle = 0;
20445abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            if (target == GL_READ_FRAMEBUFFER_ANGLE)
20455abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            {
20465abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                framebuffer = context->getReadFramebuffer();
20475abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                framebufferHandle = context->getReadFramebufferHandle();
20485abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            }
20495abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            else
20505abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            {
20515abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                framebuffer = context->getDrawFramebuffer();
20525abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                framebufferHandle = context->getDrawFramebufferHandle();
20535abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            }
2054a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
20555abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            if (framebufferHandle == 0 || !framebuffer)
2056a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
2057a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                return error(GL_INVALID_OPERATION);
2058a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
2059a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2060a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            switch (attachment)
2061a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
2062a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_COLOR_ATTACHMENT0:  framebuffer->setColorbuffer(textarget, texture);   break;
2063a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_DEPTH_ATTACHMENT:   framebuffer->setDepthbuffer(textarget, texture);   break;
2064a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_STENCIL_ATTACHMENT: framebuffer->setStencilbuffer(textarget, texture); break;
2065a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
2066a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
2067a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
2068a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
2069a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
2070a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
2071a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
2072a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
2073a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2074a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glFrontFace(GLenum mode)
2075a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
2076a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLenum mode = 0x%X)", mode);
2077a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2078a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
2079a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
2080a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        switch (mode)
2081a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
2082a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_CW:
2083a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_CCW:
2084a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
2085a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                gl::Context *context = gl::getContext();
2086a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2087a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                if (context)
2088a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                {
2089a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    context->setFrontFace(mode);
2090a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                }
2091a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
2092a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            break;
2093a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          default:
2094a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return error(GL_INVALID_ENUM);
2095a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
2096a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
2097a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
2098a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
2099a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
2100a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
2101a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
2102a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2103a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glGenBuffers(GLsizei n, GLuint* buffers)
2104a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
2105a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLsizei n = %d, GLuint* buffers = 0x%0.8p)", n, buffers);
2106a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2107a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
2108a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
2109a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (n < 0)
2110a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
2111a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return error(GL_INVALID_VALUE);
2112a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
2113a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2114a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
2115a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2116a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
2117a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
2118a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            for (int i = 0; i < n; i++)
2119a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
2120a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                buffers[i] = context->createBuffer();
2121a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
2122a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
2123a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
2124a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
2125a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
2126a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
2127a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
2128a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
2129a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2130a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glGenerateMipmap(GLenum target)
2131a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
2132a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLenum target = 0x%X)", target);
2133a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2134a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
2135a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
2136a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
2137a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2138a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
2139a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
2140a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            gl::Texture *texture;
2141a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2142a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            switch (target)
2143a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
2144a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_TEXTURE_2D:
2145a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                texture = context->getTexture2D();
2146a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                break;
2147a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2148a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_TEXTURE_CUBE_MAP:
2149a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                texture = context->getTextureCubeMap();
2150a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                break;
2151a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2152a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              default:
2153a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                return error(GL_INVALID_ENUM);
2154a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
2155a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
21565abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            if (texture->isCompressed())
21575abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            {
21585abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                return error(GL_INVALID_OPERATION);
21595abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            }
21605abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
2161a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            texture->generateMipmaps();
2162a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
2163a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
2164a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
2165a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
2166a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
2167a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
2168a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
2169a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2170ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdochvoid __stdcall glGenFencesNV(GLsizei n, GLuint* fences)
2171ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch{
2172ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    TRACE("(GLsizei n = %d, GLuint* fences = 0x%0.8p)", n, fences);
2173ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
2174ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    try
2175ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    {
2176ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        if (n < 0)
2177ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        {
2178ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            return error(GL_INVALID_VALUE);
2179ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        }
2180ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
2181ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        gl::Context *context = gl::getContext();
2182ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
2183ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        if (context)
2184ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        {
2185ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            for (int i = 0; i < n; i++)
2186ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            {
2187ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                fences[i] = context->createFence();
2188ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            }
2189ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        }
2190ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    }
2191ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    catch(std::bad_alloc&)
2192ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    {
2193ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        return error(GL_OUT_OF_MEMORY);
2194ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    }
2195ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch}
2196ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
2197a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glGenFramebuffers(GLsizei n, GLuint* framebuffers)
2198a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
2199a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLsizei n = %d, GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
2200a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2201a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
2202a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
2203a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (n < 0)
2204a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
2205a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return error(GL_INVALID_VALUE);
2206a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
2207a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2208a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
2209a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2210a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
2211a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
2212a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            for (int i = 0; i < n; i++)
2213a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
2214a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                framebuffers[i] = context->createFramebuffer();
2215a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
2216a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
2217a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
2218a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
2219a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
2220a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
2221a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
2222a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
2223a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2224a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glGenRenderbuffers(GLsizei n, GLuint* renderbuffers)
2225a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
2226a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLsizei n = %d, GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
2227a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2228a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
2229a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
2230a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (n < 0)
2231a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
2232a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return error(GL_INVALID_VALUE);
2233a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
2234a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2235a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
2236a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2237a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
2238a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
2239a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            for (int i = 0; i < n; i++)
2240a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
2241a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                renderbuffers[i] = context->createRenderbuffer();
2242a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
2243a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
2244a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
2245a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
2246a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
2247a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
2248a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
2249a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
2250a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2251a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glGenTextures(GLsizei n, GLuint* textures)
2252a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
2253a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLsizei n = %d, GLuint* textures =  0x%0.8p)", n, textures);
2254a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2255a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
2256a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
2257a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (n < 0)
2258a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
2259a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return error(GL_INVALID_VALUE);
2260a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
2261a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2262a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
2263a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2264a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
2265a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
2266a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            for (int i = 0; i < n; i++)
2267a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
2268a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                textures[i] = context->createTexture();
2269a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
2270a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
2271a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
2272a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
2273a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
2274a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
2275a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
2276a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
2277a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2278a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
2279a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
2280a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, GLsizei *length = 0x%0.8p, "
2281a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          "GLint *size = 0x%0.8p, GLenum *type = %0.8p, GLchar *name = %0.8p)",
2282a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          program, index, bufsize, length, size, type, name);
2283a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2284a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
2285a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
2286a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (bufsize < 0)
2287a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
2288a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return error(GL_INVALID_VALUE);
2289a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
2290a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2291a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
2292a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2293a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
2294a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
2295a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            gl::Program *programObject = context->getProgram(program);
2296a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2297a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            if (!programObject)
2298a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
2299a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                if (context->getShader(program))
2300a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                {
2301a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    return error(GL_INVALID_OPERATION);
2302a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                }
2303a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                else
2304a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                {
2305a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    return error(GL_INVALID_VALUE);
2306a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                }
2307a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
2308a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2309a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            if (index >= (GLuint)programObject->getActiveAttributeCount())
2310a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
2311a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                return error(GL_INVALID_VALUE);
2312a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
2313a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2314a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            programObject->getActiveAttribute(index, bufsize, length, size, type, name);
2315a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
2316a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
2317a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
2318a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
2319a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
2320a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
2321a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
2322a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2323a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glGetActiveUniform(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name)
2324a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
2325a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, "
2326a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          "GLsizei* length = 0x%0.8p, GLint* size = 0x%0.8p, GLenum* type = 0x%0.8p, GLchar* name = 0x%0.8p)",
2327a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          program, index, bufsize, length, size, type, name);
2328a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2329a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
2330a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
2331a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (bufsize < 0)
2332a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
2333a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return error(GL_INVALID_VALUE);
2334a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
2335a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2336a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
2337a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2338a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
2339a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
2340a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            gl::Program *programObject = context->getProgram(program);
2341a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2342a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            if (!programObject)
2343a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
2344a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                if (context->getShader(program))
2345a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                {
2346a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    return error(GL_INVALID_OPERATION);
2347a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                }
2348a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                else
2349a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                {
2350a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    return error(GL_INVALID_VALUE);
2351a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                }
2352a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
2353a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2354a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            if (index >= (GLuint)programObject->getActiveUniformCount())
2355a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
2356a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                return error(GL_INVALID_VALUE);
2357a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
2358a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2359a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            programObject->getActiveUniform(index, bufsize, length, size, type, name);
2360a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
2361a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
2362a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
2363a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
2364a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
2365a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
2366a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
2367a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2368a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glGetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders)
2369a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
2370a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLuint program = %d, GLsizei maxcount = %d, GLsizei* count = 0x%0.8p, GLuint* shaders = 0x%0.8p)",
2371a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          program, maxcount, count, shaders);
2372a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2373a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
2374a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
2375a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (maxcount < 0)
2376a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
2377a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return error(GL_INVALID_VALUE);
2378a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
2379a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2380a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
2381a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2382a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
2383a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
2384a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            gl::Program *programObject = context->getProgram(program);
2385a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2386a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            if (!programObject)
2387a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
2388a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                if (context->getShader(program))
2389a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                {
2390a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    return error(GL_INVALID_OPERATION);
2391a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                }
2392a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                else
2393a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                {
2394a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    return error(GL_INVALID_VALUE);
2395a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                }
2396a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
2397a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2398a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return programObject->getAttachedShaders(maxcount, count, shaders);
2399a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
2400a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
2401a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
2402a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
2403a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
2404a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
2405a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
2406a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2407a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockint __stdcall glGetAttribLocation(GLuint program, const GLchar* name)
2408a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
2409a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLuint program = %d, const GLchar* name = %s)", program, name);
2410a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2411a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
2412a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
2413a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
2414a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2415a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
2416a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
2417a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2418a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            gl::Program *programObject = context->getProgram(program);
2419a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2420a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            if (!programObject)
2421a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
2422a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                if (context->getShader(program))
2423a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                {
2424a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    return error(GL_INVALID_OPERATION, -1);
2425a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                }
2426a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                else
2427a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                {
2428a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    return error(GL_INVALID_VALUE, -1);
2429a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                }
2430a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
2431a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2432a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            if (!programObject->isLinked())
2433a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
2434a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                return error(GL_INVALID_OPERATION, -1);
2435a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
2436a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2437a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return programObject->getAttributeLocation(name);
2438a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
2439a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
2440a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
2441a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
2442a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY, -1);
2443a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
2444a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2445a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    return -1;
2446a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
2447a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2448a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glGetBooleanv(GLenum pname, GLboolean* params)
2449a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
2450a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLenum pname = 0x%X, GLboolean* params = 0x%0.8p)",  pname, params);
2451a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2452a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
2453a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
2454a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
2455a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2456a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
2457a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
2458a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            if (!(context->getBooleanv(pname, params)))
2459a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
2460a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                GLenum nativeType;
2461a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                unsigned int numParams = 0;
2462a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
2463a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    return error(GL_INVALID_ENUM);
2464a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2465a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                if (numParams == 0)
2466a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    return; // it is known that the pname is valid, but there are no parameters to return
2467a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2468a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                if (nativeType == GL_FLOAT)
2469a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                {
2470a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    GLfloat *floatParams = NULL;
2471a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    floatParams = new GLfloat[numParams];
2472a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2473a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    context->getFloatv(pname, floatParams);
2474a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2475a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    for (unsigned int i = 0; i < numParams; ++i)
2476a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    {
2477a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                        if (floatParams[i] == 0.0f)
2478a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                            params[i] = GL_FALSE;
2479a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                        else
2480a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                            params[i] = GL_TRUE;
2481a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    }
2482a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2483a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    delete [] floatParams;
2484a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                }
2485a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                else if (nativeType == GL_INT)
2486a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                {
2487a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    GLint *intParams = NULL;
2488a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    intParams = new GLint[numParams];
2489a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2490a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    context->getIntegerv(pname, intParams);
2491a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2492a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    for (unsigned int i = 0; i < numParams; ++i)
2493a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    {
2494a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                        if (intParams[i] == 0)
2495a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                            params[i] = GL_FALSE;
2496a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                        else
2497a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                            params[i] = GL_TRUE;
2498a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    }
2499a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2500a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    delete [] intParams;
2501a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                }
2502a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
2503a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
2504a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
2505a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
2506a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
2507a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
2508a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
2509a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
2510a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2511a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glGetBufferParameteriv(GLenum target, GLenum pname, GLint* params)
2512a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
2513a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", target, pname, params);
2514a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2515a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
2516a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
2517a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
2518a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2519a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
2520a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
2521a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            gl::Buffer *buffer;
2522a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2523a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            switch (target)
2524a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
2525a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_ARRAY_BUFFER:
2526a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                buffer = context->getArrayBuffer();
2527a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                break;
2528a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_ELEMENT_ARRAY_BUFFER:
2529a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                buffer = context->getElementArrayBuffer();
2530a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                break;
2531a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              default: return error(GL_INVALID_ENUM);
2532a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
2533a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2534a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            if (!buffer)
2535a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
2536a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                // A null buffer means that "0" is bound to the requested buffer target
2537a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                return error(GL_INVALID_OPERATION);
2538a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
2539a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2540a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            switch (pname)
2541a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
2542a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_BUFFER_USAGE:
2543a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                *params = buffer->usage();
2544a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                break;
2545a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_BUFFER_SIZE:
2546a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                *params = buffer->size();
2547a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                break;
2548a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              default: return error(GL_INVALID_ENUM);
2549a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
2550a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
2551a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
2552a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
2553a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
2554a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
2555a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
2556a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
2557a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2558a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve BlockGLenum __stdcall glGetError(void)
2559a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
2560a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("()");
2561a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2562a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    gl::Context *context = gl::getContext();
2563a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2564a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    if (context)
2565a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
2566a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return context->getError();
2567a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
2568a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2569a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    return GL_NO_ERROR;
2570a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
2571a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2572ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdochvoid __stdcall glGetFenceivNV(GLuint fence, GLenum pname, GLint *params)
2573ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch{
2574ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    TRACE("(GLuint fence = %d, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", fence, pname, params);
2575ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
2576ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    try
2577ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    {
2578ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
2579ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        gl::Context *context = gl::getContext();
2580ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
2581ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        if (context)
2582ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        {
2583ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            gl::Fence *fenceObject = context->getFence(fence);
2584ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
2585ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            if (fenceObject == NULL)
2586ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            {
2587ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                return error(GL_INVALID_OPERATION);
2588ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            }
2589ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
2590ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            fenceObject->getFenceiv(pname, params);
2591ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        }
2592ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    }
2593ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    catch(std::bad_alloc&)
2594ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    {
2595ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        return error(GL_OUT_OF_MEMORY);
2596ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    }
2597ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch}
2598ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
2599a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glGetFloatv(GLenum pname, GLfloat* params)
2600a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
2601a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", pname, params);
2602a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2603a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
2604a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
2605a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
2606a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2607a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
2608a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
2609a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            if (!(context->getFloatv(pname, params)))
2610a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
2611a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                GLenum nativeType;
2612a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                unsigned int numParams = 0;
2613a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
2614a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    return error(GL_INVALID_ENUM);
2615a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2616a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                if (numParams == 0)
2617a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    return; // it is known that the pname is valid, but that there are no parameters to return.
2618a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2619a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                if (nativeType == GL_BOOL)
2620a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                {
2621a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    GLboolean *boolParams = NULL;
2622a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    boolParams = new GLboolean[numParams];
2623a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2624a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    context->getBooleanv(pname, boolParams);
2625a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2626a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    for (unsigned int i = 0; i < numParams; ++i)
2627a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    {
2628a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                        if (boolParams[i] == GL_FALSE)
2629a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                            params[i] = 0.0f;
2630a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                        else
2631a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                            params[i] = 1.0f;
2632a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    }
2633a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2634a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    delete [] boolParams;
2635a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                }
2636a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                else if (nativeType == GL_INT)
2637a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                {
2638a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    GLint *intParams = NULL;
2639a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    intParams = new GLint[numParams];
2640a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2641a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    context->getIntegerv(pname, intParams);
2642a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2643a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    for (unsigned int i = 0; i < numParams; ++i)
2644a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    {
2645a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                        params[i] = (GLfloat)intParams[i];
2646a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    }
2647a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2648a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    delete [] intParams;
2649a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                }
2650a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
2651a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
2652a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
2653a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
2654a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
2655a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
2656a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
2657a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
2658a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2659a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params)
2660a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
2661a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
2662a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          target, attachment, pname, params);
2663a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2664a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
2665a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
2666a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
2667a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2668a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
2669a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
26705abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
2671a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
26725abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                return error(GL_INVALID_ENUM);
2673a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
2674a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
26755abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            gl::Framebuffer *framebuffer = NULL;
26765abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            if (target == GL_READ_FRAMEBUFFER_ANGLE)
2677a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
26785abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                if(context->getReadFramebufferHandle() == 0)
26795abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                {
26805abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                    return error(GL_INVALID_OPERATION);
26815abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                }
26825abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
26835abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                framebuffer = context->getReadFramebuffer();
26845abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            }
26855abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            else
26865abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            {
26875abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                if (context->getDrawFramebufferHandle() == 0)
26885abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                {
26895abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                    return error(GL_INVALID_OPERATION);
26905abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                }
26915abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
26925abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                framebuffer = context->getDrawFramebuffer();
2693a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
2694a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2695a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            GLenum attachmentType;
2696a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            GLuint attachmentHandle;
2697a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            switch (attachment)
2698a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
2699a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_COLOR_ATTACHMENT0:
27005abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                attachmentType = framebuffer->getColorbufferType();
27015abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                attachmentHandle = framebuffer->getColorbufferHandle();
2702a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                break;
2703a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_DEPTH_ATTACHMENT:
27045abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                attachmentType = framebuffer->getDepthbufferType();
27055abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                attachmentHandle = framebuffer->getDepthbufferHandle();
2706a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                break;
2707a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_STENCIL_ATTACHMENT:
27085abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                attachmentType = framebuffer->getStencilbufferType();
27095abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                attachmentHandle = framebuffer->getStencilbufferHandle();
2710a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                break;
2711a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              default: return error(GL_INVALID_ENUM);
2712a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
2713a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2714a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            GLenum attachmentObjectType;   // Type category
2715a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            if (attachmentType == GL_NONE || attachmentType == GL_RENDERBUFFER)
2716a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
2717a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                attachmentObjectType = attachmentType;
2718a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
2719a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            else if (gl::IsTextureTarget(attachmentType))
2720a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
2721a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                attachmentObjectType = GL_TEXTURE;
2722a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
2723a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            else UNREACHABLE();
2724a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2725a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            switch (pname)
2726a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
2727a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
2728a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                *params = attachmentObjectType;
2729a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                break;
2730a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
2731a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                if (attachmentObjectType == GL_RENDERBUFFER || attachmentObjectType == GL_TEXTURE)
2732a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                {
2733a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    *params = attachmentHandle;
2734a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                }
2735a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                else
2736a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                {
2737a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    return error(GL_INVALID_ENUM);
2738a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                }
2739a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                break;
2740a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
2741a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                if (attachmentObjectType == GL_TEXTURE)
2742a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                {
2743a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    *params = 0; // FramebufferTexture2D will not allow level to be set to anything else in GL ES 2.0
2744a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                }
2745a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                else
2746a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                {
2747a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    return error(GL_INVALID_ENUM);
2748a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                }
2749a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                break;
2750a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
2751a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                if (attachmentObjectType == GL_TEXTURE)
2752a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                {
2753a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    if (gl::IsCubemapTextureTarget(attachmentType))
2754a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    {
2755a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                        *params = attachmentType;
2756a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    }
2757a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    else
2758a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    {
2759a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                        *params = 0;
2760a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    }
2761a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                }
2762a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                else
2763a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                {
2764a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    return error(GL_INVALID_ENUM);
2765a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                }
2766a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                break;
2767a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              default:
2768a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                return error(GL_INVALID_ENUM);
2769a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
2770a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
2771a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
2772a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
2773a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
2774a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
2775a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
2776a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
2777a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2778a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glGetIntegerv(GLenum pname, GLint* params)
2779a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
2780a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLenum pname = 0x%X, GLint* params = 0x%0.8p)", pname, params);
2781a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2782a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
2783a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
2784a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
2785a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2786a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
2787a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
2788a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            if (!(context->getIntegerv(pname, params)))
2789a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
2790a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                GLenum nativeType;
2791a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                unsigned int numParams = 0;
2792a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
2793a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    return error(GL_INVALID_ENUM);
2794a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2795a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                if (numParams == 0)
2796a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    return; // it is known that pname is valid, but there are no parameters to return
2797a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2798a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                if (nativeType == GL_BOOL)
2799a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                {
2800a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    GLboolean *boolParams = NULL;
2801a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    boolParams = new GLboolean[numParams];
2802a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2803a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    context->getBooleanv(pname, boolParams);
2804a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2805a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    for (unsigned int i = 0; i < numParams; ++i)
2806a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    {
2807a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                        if (boolParams[i] == GL_FALSE)
2808a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                            params[i] = 0;
2809a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                        else
2810a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                            params[i] = 1;
2811a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    }
2812a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2813a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    delete [] boolParams;
2814a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                }
2815a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                else if (nativeType == GL_FLOAT)
2816a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                {
2817a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    GLfloat *floatParams = NULL;
2818a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    floatParams = new GLfloat[numParams];
2819a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2820a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    context->getFloatv(pname, floatParams);
2821a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2822a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    for (unsigned int i = 0; i < numParams; ++i)
2823a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    {
2824a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                        if (pname == GL_DEPTH_RANGE || pname == GL_COLOR_CLEAR_VALUE || pname == GL_DEPTH_CLEAR_VALUE || pname == GL_BLEND_COLOR)
2825a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                        {
2826a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                            params[i] = (GLint)(((GLfloat)(0xFFFFFFFF) * floatParams[i] - 1.0f) / 2.0f);
2827a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                        }
2828a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                        else
2829a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                            params[i] = (GLint)(floatParams[i] > 0.0f ? floor(floatParams[i] + 0.5) : ceil(floatParams[i] - 0.5));
2830a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    }
2831a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2832a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    delete [] floatParams;
2833a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                }
2834a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
2835a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
2836a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
2837a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
2838a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
2839a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
2840a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
2841a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
2842a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2843a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glGetProgramiv(GLuint program, GLenum pname, GLint* params)
2844a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
2845a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLuint program = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", program, pname, params);
2846a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2847a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
2848a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
2849a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
2850a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2851a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
2852a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
2853a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            gl::Program *programObject = context->getProgram(program);
2854a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2855a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            if (!programObject)
2856a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
2857a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                return error(GL_INVALID_VALUE);
2858a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
2859a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2860a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            switch (pname)
2861a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
2862a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_DELETE_STATUS:
2863a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                *params = programObject->isFlaggedForDeletion();
2864a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                return;
2865a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_LINK_STATUS:
2866a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                *params = programObject->isLinked();
2867a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                return;
2868a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_VALIDATE_STATUS:
2869a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                *params = programObject->isValidated();
2870a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                return;
2871a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_INFO_LOG_LENGTH:
2872a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                *params = programObject->getInfoLogLength();
2873a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                return;
2874a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_ATTACHED_SHADERS:
2875a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                *params = programObject->getAttachedShadersCount();
2876a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                return;
2877a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_ACTIVE_ATTRIBUTES:
2878a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                *params = programObject->getActiveAttributeCount();
2879a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                return;
2880a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
2881a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                *params = programObject->getActiveAttributeMaxLength();
2882a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                return;
2883a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_ACTIVE_UNIFORMS:
2884a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                *params = programObject->getActiveUniformCount();
2885a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                return;
2886a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_ACTIVE_UNIFORM_MAX_LENGTH:
2887a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                *params = programObject->getActiveUniformMaxLength();
2888a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                return;
2889a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              default:
2890a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                return error(GL_INVALID_ENUM);
2891a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
2892a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
2893a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
2894a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
2895a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
2896a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
2897a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
2898a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
2899a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2900a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glGetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, GLchar* infolog)
2901a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
2902a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLuint program = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, GLchar* infolog = 0x%0.8p)",
2903a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          program, bufsize, length, infolog);
2904a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2905a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
2906a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
2907a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (bufsize < 0)
2908a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
2909a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return error(GL_INVALID_VALUE);
2910a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
2911a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2912a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
2913a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2914a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
2915a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
2916a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            gl::Program *programObject = context->getProgram(program);
2917a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2918a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            if (!programObject)
2919a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
2920a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                return error(GL_INVALID_VALUE);
2921a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
2922a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2923a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            programObject->getInfoLog(bufsize, length, infolog);
2924a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
2925a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
2926a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
2927a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
2928a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
2929a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
2930a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
2931a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2932a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params)
2933a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
2934a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", target, pname, params);
2935a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2936a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
2937a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
2938a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
2939a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2940a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
2941a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
2942a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            if (target != GL_RENDERBUFFER)
2943a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
2944a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                return error(GL_INVALID_ENUM);
2945a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
2946a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2947a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            if (context->getRenderbufferHandle() == 0)
2948a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
2949a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                return error(GL_INVALID_OPERATION);
2950a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
2951a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2952a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            gl::Renderbuffer *renderbuffer = context->getRenderbuffer(context->getRenderbufferHandle());
2953a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
2954a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            switch (pname)
2955a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
2956a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_RENDERBUFFER_WIDTH:
2957a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                *params = renderbuffer->getWidth();
2958a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                break;
2959a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_RENDERBUFFER_HEIGHT:
2960a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                *params = renderbuffer->getHeight();
2961a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                break;
2962a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_RENDERBUFFER_INTERNAL_FORMAT:
2963a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                *params = renderbuffer->getFormat();
2964a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                break;
2965a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_RENDERBUFFER_RED_SIZE:
2966a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                if (renderbuffer->isColorbuffer())
2967a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                {
29685abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                    *params = static_cast<gl::Colorbuffer*>(renderbuffer->getStorage())->getRedSize();
2969a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                }
2970a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                else
2971a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                {
2972a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    *params = 0;
2973a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                }
2974a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                break;
2975a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_RENDERBUFFER_GREEN_SIZE:
2976a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                if (renderbuffer->isColorbuffer())
2977a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                {
29785abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                    *params = static_cast<gl::Colorbuffer*>(renderbuffer->getStorage())->getGreenSize();
2979a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                }
2980a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                else
2981a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                {
2982a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    *params = 0;
2983a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                }
2984a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                break;
2985a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_RENDERBUFFER_BLUE_SIZE:
2986a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                if (renderbuffer->isColorbuffer())
2987a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                {
29885abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                    *params = static_cast<gl::Colorbuffer*>(renderbuffer->getStorage())->getBlueSize();
2989a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                }
2990a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                else
2991a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                {
2992a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    *params = 0;
2993a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                }
2994a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                break;
2995a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_RENDERBUFFER_ALPHA_SIZE:
2996a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                if (renderbuffer->isColorbuffer())
2997a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                {
29985abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                    *params = static_cast<gl::Colorbuffer*>(renderbuffer->getStorage())->getAlphaSize();
2999a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                }
3000a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                else
3001a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                {
3002a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    *params = 0;
3003a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                }
3004a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                break;
3005a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_RENDERBUFFER_DEPTH_SIZE:
3006a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                if (renderbuffer->isDepthbuffer())
3007a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                {
30085abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                    *params = static_cast<gl::Depthbuffer*>(renderbuffer->getStorage())->getDepthSize();
3009a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                }
3010a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                else
3011a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                {
3012a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    *params = 0;
3013a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                }
3014a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                break;
3015a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_RENDERBUFFER_STENCIL_SIZE:
3016a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                if (renderbuffer->isStencilbuffer())
3017a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                {
30185abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                    *params = static_cast<gl::Stencilbuffer*>(renderbuffer->getStorage())->getStencilSize();
3019a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                }
3020a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                else
3021a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                {
3022a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    *params = 0;
3023a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                }
3024a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                break;
30255abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick              case GL_RENDERBUFFER_SAMPLES_ANGLE:
30265abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                {
30275abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                    if (context->getMaxSupportedSamples() != 0)
30285abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                    {
30295abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                        *params = renderbuffer->getStorage()->getSamples();
30305abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                    }
30315abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                    else
30325abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                    {
30335abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                        return error(GL_INVALID_ENUM);
30345abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                    }
30355abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                }
30365abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                break;
3037a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              default:
3038a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                return error(GL_INVALID_ENUM);
3039a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
3040a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
3041a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
3042a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
3043a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
3044a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
3045a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
3046a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
3047a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3048a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glGetShaderiv(GLuint shader, GLenum pname, GLint* params)
3049a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
3050a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLuint shader = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", shader, pname, params);
3051a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3052a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
3053a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
3054a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
3055a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3056a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
3057a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
3058a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            gl::Shader *shaderObject = context->getShader(shader);
3059a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3060a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            if (!shaderObject)
3061a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
3062a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                return error(GL_INVALID_VALUE);
3063a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
3064a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3065a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            switch (pname)
3066a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
3067a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_SHADER_TYPE:
3068a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                *params = shaderObject->getType();
3069a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                return;
3070a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_DELETE_STATUS:
3071a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                *params = shaderObject->isFlaggedForDeletion();
3072a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                return;
3073a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_COMPILE_STATUS:
3074a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                *params = shaderObject->isCompiled() ? GL_TRUE : GL_FALSE;
3075a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                return;
3076a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_INFO_LOG_LENGTH:
3077a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                *params = shaderObject->getInfoLogLength();
3078a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                return;
3079a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_SHADER_SOURCE_LENGTH:
3080a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                *params = shaderObject->getSourceLength();
3081a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                return;
3082a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              default:
3083a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                return error(GL_INVALID_ENUM);
3084a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
3085a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
3086a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
3087a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
3088a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
3089a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
3090a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
3091a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
3092a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3093a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glGetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* infolog)
3094a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
3095a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLuint shader = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, GLchar* infolog = 0x%0.8p)",
3096a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          shader, bufsize, length, infolog);
3097a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3098a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
3099a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
3100a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (bufsize < 0)
3101a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
3102a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return error(GL_INVALID_VALUE);
3103a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
3104a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3105a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
3106a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3107a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
3108a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
3109a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            gl::Shader *shaderObject = context->getShader(shader);
3110a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3111a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            if (!shaderObject)
3112a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
3113a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                return error(GL_INVALID_VALUE);
3114a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
3115a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3116a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            shaderObject->getInfoLog(bufsize, length, infolog);
3117a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
3118a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
3119a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
3120a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
3121a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
3122a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
3123a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
3124a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3125a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision)
3126a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
3127a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLenum shadertype = 0x%X, GLenum precisiontype = 0x%X, GLint* range = 0x%0.8p, GLint* precision = 0x%0.8p)",
3128a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          shadertype, precisiontype, range, precision);
3129a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3130a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
3131a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
3132a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        switch (shadertype)
3133a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
3134a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_VERTEX_SHADER:
3135a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_FRAGMENT_SHADER:
3136a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            break;
3137a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          default:
3138a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return error(GL_INVALID_ENUM);
3139a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
3140a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3141a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        switch (precisiontype)
3142a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
3143a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_LOW_FLOAT:
3144a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_MEDIUM_FLOAT:
3145a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_HIGH_FLOAT:
3146a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            // Assume IEEE 754 precision
3147a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            range[0] = 127;
3148a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            range[1] = 127;
3149a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            *precision = 23;
3150a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            break;
3151a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_LOW_INT:
3152a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_MEDIUM_INT:
3153a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_HIGH_INT:
3154a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            // Some (most) hardware only supports single-precision floating-point numbers,
3155a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            // which can accurately represent integers up to +/-16777216
3156a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            range[0] = 24;
3157a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            range[1] = 24;
3158a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            *precision = 0;
3159a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            break;
3160a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          default:
3161a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return error(GL_INVALID_ENUM);
3162a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
3163a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
3164a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
3165a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
3166a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
3167a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
3168a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
3169a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3170a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glGetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
3171a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
3172a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLuint shader = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, GLchar* source = 0x%0.8p)",
3173a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          shader, bufsize, length, source);
3174a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3175a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
3176a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
3177a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (bufsize < 0)
3178a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
3179a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return error(GL_INVALID_VALUE);
3180a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
3181a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3182a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
3183a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3184a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
3185a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
3186a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            gl::Shader *shaderObject = context->getShader(shader);
3187a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3188a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            if (!shaderObject)
3189a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
3190a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                return error(GL_INVALID_OPERATION);
3191a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
3192a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3193a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            shaderObject->getSource(bufsize, length, source);
3194a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
3195a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
3196a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
3197a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
3198a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
3199a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
3200a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
3201a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3202a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockconst GLubyte* __stdcall glGetString(GLenum name)
3203a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
3204a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLenum name = 0x%X)", name);
3205a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3206a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
3207a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
3208a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
3209a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3210a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        switch (name)
3211a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
3212a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_VENDOR:
3213a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return (GLubyte*)"TransGaming Inc.";
3214a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_RENDERER:
3215a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return (GLubyte*)"ANGLE";
3216a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_VERSION:
3217a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return (GLubyte*)"OpenGL ES 2.0 (git-devel "__DATE__ " " __TIME__")";
3218a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_SHADING_LANGUAGE_VERSION:
3219a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return (GLubyte*)"OpenGL ES GLSL ES 1.00 (git-devel "__DATE__ " " __TIME__")";
3220a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_EXTENSIONS:
3221a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return (GLubyte*)((context != NULL) ? context->getExtensionString() : "");
3222a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          default:
3223a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return error(GL_INVALID_ENUM, (GLubyte*)NULL);
3224a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
3225a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
3226a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
3227a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
3228a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY, (GLubyte*)NULL);
3229a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
3230a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3231a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    return NULL;
3232a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
3233a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3234a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glGetTexParameterfv(GLenum target, GLenum pname, GLfloat* params)
3235a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
3236a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLenum target = 0x%X, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", target, pname, params);
3237a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3238a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
3239a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
3240a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
3241a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3242a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
3243a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
3244a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            gl::Texture *texture;
3245a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3246a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            switch (target)
3247a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
3248a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_TEXTURE_2D:
3249a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                texture = context->getTexture2D();
3250a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                break;
3251a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_TEXTURE_CUBE_MAP:
3252a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                texture = context->getTextureCubeMap();
3253a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                break;
3254a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              default:
3255a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                return error(GL_INVALID_ENUM);
3256a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
3257a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3258a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            switch (pname)
3259a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
3260a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_TEXTURE_MAG_FILTER:
3261a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                *params = (GLfloat)texture->getMagFilter();
3262a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                break;
3263a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_TEXTURE_MIN_FILTER:
3264a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                *params = (GLfloat)texture->getMinFilter();
3265a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                break;
3266a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_TEXTURE_WRAP_S:
3267a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                *params = (GLfloat)texture->getWrapS();
3268a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                break;
3269a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_TEXTURE_WRAP_T:
3270a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                *params = (GLfloat)texture->getWrapT();
3271a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                break;
3272a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              default:
3273a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                return error(GL_INVALID_ENUM);
3274a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
3275a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
3276a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
3277a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
3278a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
3279a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
3280a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
3281a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
3282a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3283a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glGetTexParameteriv(GLenum target, GLenum pname, GLint* params)
3284a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
3285a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", target, pname, params);
3286a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3287a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
3288a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
3289a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
3290a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3291a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
3292a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
3293a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            gl::Texture *texture;
3294a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3295a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            switch (target)
3296a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
3297a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_TEXTURE_2D:
3298a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                texture = context->getTexture2D();
3299a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                break;
3300a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_TEXTURE_CUBE_MAP:
3301a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                texture = context->getTextureCubeMap();
3302a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                break;
3303a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              default:
3304a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                return error(GL_INVALID_ENUM);
3305a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
3306a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3307a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            switch (pname)
3308a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
3309a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_TEXTURE_MAG_FILTER:
3310a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                *params = texture->getMagFilter();
3311a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                break;
3312a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_TEXTURE_MIN_FILTER:
3313a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                *params = texture->getMinFilter();
3314a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                break;
3315a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_TEXTURE_WRAP_S:
3316a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                *params = texture->getWrapS();
3317a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                break;
3318a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_TEXTURE_WRAP_T:
3319a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                *params = texture->getWrapT();
3320a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                break;
3321a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              default:
3322a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                return error(GL_INVALID_ENUM);
3323a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
3324a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
3325a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
3326a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
3327a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
3328a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
3329a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
3330a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
3331a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3332a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glGetUniformfv(GLuint program, GLint location, GLfloat* params)
3333a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
3334a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLuint program = %d, GLint location = %d, GLfloat* params = 0x%0.8p)", program, location, params);
3335a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3336a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
3337a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
3338a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
3339a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3340a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
3341a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
3342a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            if (program == 0)
3343a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
3344a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                return error(GL_INVALID_VALUE);
3345a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
3346a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3347a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            gl::Program *programObject = context->getProgram(program);
3348a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3349a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            if (!programObject || !programObject->isLinked())
3350a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
3351a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                return error(GL_INVALID_OPERATION);
3352a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
3353a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3354a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            if (!programObject->getUniformfv(location, params))
3355a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
3356a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                return error(GL_INVALID_OPERATION);
3357a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
3358a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
3359a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
3360a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
3361a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
3362a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
3363a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
3364a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
3365a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3366a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glGetUniformiv(GLuint program, GLint location, GLint* params)
3367a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
3368a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLuint program = %d, GLint location = %d, GLint* params = 0x%0.8p)", program, location, params);
3369a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3370a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
3371a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
3372a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
3373a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3374a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
3375a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
3376a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            if (program == 0)
3377a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
3378a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                return error(GL_INVALID_VALUE);
3379a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
3380a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3381a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            gl::Program *programObject = context->getProgram(program);
3382a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3383a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            if (!programObject || !programObject->isLinked())
3384a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
3385a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                return error(GL_INVALID_OPERATION);
3386a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
3387a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3388a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            if (!programObject)
3389a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
3390a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                return error(GL_INVALID_OPERATION);
3391a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
3392a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3393a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            if (!programObject->getUniformiv(location, params))
3394a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
3395a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                return error(GL_INVALID_OPERATION);
3396a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
3397a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
3398a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
3399a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
3400a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
3401a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
3402a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
3403a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
3404a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3405a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockint __stdcall glGetUniformLocation(GLuint program, const GLchar* name)
3406a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
3407a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLuint program = %d, const GLchar* name = 0x%0.8p)", program, name);
3408a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3409a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
3410a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
3411a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
3412a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3413a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (strstr(name, "gl_") == name)
3414a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
3415a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return -1;
3416a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
3417a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3418a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
3419a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
3420a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            gl::Program *programObject = context->getProgram(program);
3421a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3422a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            if (!programObject)
3423a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
3424a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                if (context->getShader(program))
3425a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                {
3426a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    return error(GL_INVALID_OPERATION, -1);
3427a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                }
3428a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                else
3429a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                {
3430a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    return error(GL_INVALID_VALUE, -1);
3431a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                }
3432a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
3433a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3434a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            if (!programObject->isLinked())
3435a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
3436a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                return error(GL_INVALID_OPERATION, -1);
3437a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
3438a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3439a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return programObject->getUniformLocation(name, false);
3440a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
3441a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
3442a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
3443a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
3444a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY, -1);
3445a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
3446a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3447a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    return -1;
3448a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
3449a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3450a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params)
3451a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
3452a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLuint index = %d, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", index, pname, params);
3453a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3454a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
3455a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
3456a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
3457a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3458a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
3459a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
3460a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            if (index >= gl::MAX_VERTEX_ATTRIBS)
3461a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
3462a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                return error(GL_INVALID_VALUE);
3463a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
3464a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3465ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
3466a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3467a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            switch (pname)
3468a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
3469a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
3470ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                *params = (GLfloat)(attribState.mArrayEnabled ? GL_TRUE : GL_FALSE);
3471a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                break;
3472a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_VERTEX_ATTRIB_ARRAY_SIZE:
3473a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                *params = (GLfloat)attribState.mSize;
3474a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                break;
3475a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
3476a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                *params = (GLfloat)attribState.mStride;
3477a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                break;
3478a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_VERTEX_ATTRIB_ARRAY_TYPE:
3479a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                *params = (GLfloat)attribState.mType;
3480a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                break;
3481a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
3482a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                *params = (GLfloat)(attribState.mNormalized ? GL_TRUE : GL_FALSE);
3483a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                break;
3484a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
34855abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                *params = (GLfloat)attribState.mBoundBuffer.id();
3486a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                break;
3487a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_CURRENT_VERTEX_ATTRIB:
3488a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                for (int i = 0; i < 4; ++i)
3489a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                {
3490a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    params[i] = attribState.mCurrentValue[i];
3491a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                }
3492a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                break;
3493a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              default: return error(GL_INVALID_ENUM);
3494a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
3495a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
3496a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
3497a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
3498a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
3499a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
3500a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
3501a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
3502a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3503a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params)
3504a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
3505a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLuint index = %d, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", index, pname, params);
3506a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3507a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
3508a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
3509a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
3510a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3511a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
3512a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
3513a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            if (index >= gl::MAX_VERTEX_ATTRIBS)
3514a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
3515a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                return error(GL_INVALID_VALUE);
3516a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
3517a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3518ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
3519a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3520a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            switch (pname)
3521a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
3522a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
3523ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                *params = (attribState.mArrayEnabled ? GL_TRUE : GL_FALSE);
3524a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                break;
3525a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_VERTEX_ATTRIB_ARRAY_SIZE:
3526a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                *params = attribState.mSize;
3527a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                break;
3528a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
3529a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                *params = attribState.mStride;
3530a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                break;
3531a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_VERTEX_ATTRIB_ARRAY_TYPE:
3532a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                *params = attribState.mType;
3533a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                break;
3534a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
3535a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                *params = (attribState.mNormalized ? GL_TRUE : GL_FALSE);
3536a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                break;
3537a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
35385abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                *params = attribState.mBoundBuffer.id();
3539a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                break;
3540a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_CURRENT_VERTEX_ATTRIB:
3541a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                for (int i = 0; i < 4; ++i)
3542a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                {
3543a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    float currentValue = attribState.mCurrentValue[i];
3544a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    params[i] = (GLint)(currentValue > 0.0f ? floor(currentValue + 0.5f) : ceil(currentValue - 0.5f));
3545a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                }
3546a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                break;
3547a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              default: return error(GL_INVALID_ENUM);
3548a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
3549a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
3550a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
3551a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
3552a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
3553a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
3554a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
3555a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
3556a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3557a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid** pointer)
3558a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
3559a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLuint index = %d, GLenum pname = 0x%X, GLvoid** pointer = 0x%0.8p)", index, pname, pointer);
3560a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3561a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
3562a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
3563a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
3564a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3565a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
3566a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
3567a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            if (index >= gl::MAX_VERTEX_ATTRIBS)
3568a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
3569a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                return error(GL_INVALID_VALUE);
3570a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
3571a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3572a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            if (pname != GL_VERTEX_ATTRIB_ARRAY_POINTER)
3573a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
3574a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                return error(GL_INVALID_ENUM);
3575a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
3576a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3577a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            *pointer = const_cast<GLvoid*>(context->getVertexAttribPointer(index));
3578a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
3579a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
3580a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
3581a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
3582a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
3583a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
3584a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
3585a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3586a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glHint(GLenum target, GLenum mode)
3587a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
3588a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLenum target = 0x%X, GLenum mode = 0x%X)", target, mode);
3589a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3590a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
3591a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
3592ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        switch (mode)
3593a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
3594ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch          case GL_FASTEST:
3595ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch          case GL_NICEST:
3596ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch          case GL_DONT_CARE:
3597a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            break;
3598a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          default:
3599ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            return error(GL_INVALID_ENUM);
3600a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
3601a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3602a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
3603ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        switch (target)
3604a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
3605ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch          case GL_GENERATE_MIPMAP_HINT:
3606ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            if (context) context->setGenerateMipmapHint(mode);
3607ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            break;
3608ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch          case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
3609ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            if (context) context->setFragmentShaderDerivativeHint(mode);
3610ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            break;
3611ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch          default:
3612ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            return error(GL_INVALID_ENUM);
3613a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
3614a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
3615a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
3616a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
3617a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
3618a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
3619a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
3620a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3621a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve BlockGLboolean __stdcall glIsBuffer(GLuint buffer)
3622a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
3623a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLuint buffer = %d)", buffer);
3624a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3625a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
3626a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
3627a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
3628a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3629a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context && buffer)
3630a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
3631a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            gl::Buffer *bufferObject = context->getBuffer(buffer);
3632a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3633a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            if (bufferObject)
3634a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
3635a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                return GL_TRUE;
3636a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
3637a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
3638a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
3639a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
3640a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
3641a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY, GL_FALSE);
3642a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
3643a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3644a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    return GL_FALSE;
3645a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
3646a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3647a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve BlockGLboolean __stdcall glIsEnabled(GLenum cap)
3648a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
3649a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLenum cap = 0x%X)", cap);
3650a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3651a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
3652a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
3653a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
3654a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3655a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
3656a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
3657a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            switch (cap)
3658a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
3659a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_CULL_FACE:                return context->isCullFaceEnabled();
3660a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_POLYGON_OFFSET_FILL:      return context->isPolygonOffsetFillEnabled();
3661a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_SAMPLE_ALPHA_TO_COVERAGE: return context->isSampleAlphaToCoverageEnabled();
3662a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_SAMPLE_COVERAGE:          return context->isSampleCoverageEnabled();
3663a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_SCISSOR_TEST:             return context->isScissorTestEnabled();
3664a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_STENCIL_TEST:             return context->isStencilTestEnabled();
3665a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_DEPTH_TEST:               return context->isDepthTestEnabled();
3666a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_BLEND:                    return context->isBlendEnabled();
3667a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_DITHER:                   return context->isDitherEnabled();
3668a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              default:
3669a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                return error(GL_INVALID_ENUM, false);
3670a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
3671a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
3672a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
3673a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
3674a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
3675a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY, false);
3676a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
3677a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3678a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    return false;
3679a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
3680a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3681ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen MurdochGLboolean __stdcall glIsFenceNV(GLuint fence)
3682ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch{
3683ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    TRACE("(GLuint fence = %d)", fence);
3684ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
3685ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    try
3686ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    {
3687ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        gl::Context *context = gl::getContext();
3688ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
3689ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        if (context)
3690ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        {
3691ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            gl::Fence *fenceObject = context->getFence(fence);
3692ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
3693ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            if (fenceObject == NULL)
3694ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            {
3695ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                return GL_FALSE;
3696ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            }
3697ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
3698ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            return fenceObject->isFence();
3699ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        }
3700ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    }
3701ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    catch(std::bad_alloc&)
3702ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    {
3703ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        return error(GL_OUT_OF_MEMORY, GL_FALSE);
3704ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    }
3705ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
3706ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    return GL_FALSE;
3707ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch}
3708ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
3709a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve BlockGLboolean __stdcall glIsFramebuffer(GLuint framebuffer)
3710a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
3711a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLuint framebuffer = %d)", framebuffer);
3712a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3713a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
3714a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
3715a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
3716a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3717a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context && framebuffer)
3718a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
3719a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            gl::Framebuffer *framebufferObject = context->getFramebuffer(framebuffer);
3720a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3721a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            if (framebufferObject)
3722a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
3723a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                return GL_TRUE;
3724a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
3725a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
3726a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
3727a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
3728a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
3729a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY, GL_FALSE);
3730a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
3731a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3732a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    return GL_FALSE;
3733a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
3734a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3735a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve BlockGLboolean __stdcall glIsProgram(GLuint program)
3736a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
3737a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLuint program = %d)", program);
3738a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3739a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
3740a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
3741a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
3742a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3743a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context && program)
3744a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
3745a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            gl::Program *programObject = context->getProgram(program);
3746a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3747a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            if (programObject)
3748a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
3749a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                return GL_TRUE;
3750a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
3751a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
3752a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
3753a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
3754a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
3755a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY, GL_FALSE);
3756a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
3757a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3758a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    return GL_FALSE;
3759a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
3760a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3761a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve BlockGLboolean __stdcall glIsRenderbuffer(GLuint renderbuffer)
3762a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
3763a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLuint renderbuffer = %d)", renderbuffer);
3764a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3765a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
3766a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
3767a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
3768a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3769a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context && renderbuffer)
3770a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
3771a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            gl::Renderbuffer *renderbufferObject = context->getRenderbuffer(renderbuffer);
3772a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3773a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            if (renderbufferObject)
3774a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
3775a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                return GL_TRUE;
3776a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
3777a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
3778a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
3779a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
3780a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
3781a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY, GL_FALSE);
3782a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
3783a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3784a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    return GL_FALSE;
3785a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
3786a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3787a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve BlockGLboolean __stdcall glIsShader(GLuint shader)
3788a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
3789a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLuint shader = %d)", shader);
3790a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3791a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
3792a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
3793a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
3794a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3795a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context && shader)
3796a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
3797a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            gl::Shader *shaderObject = context->getShader(shader);
3798a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3799a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            if (shaderObject)
3800a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
3801a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                return GL_TRUE;
3802a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
3803a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
3804a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
3805a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
3806a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
3807a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY, GL_FALSE);
3808a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
3809a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3810a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    return GL_FALSE;
3811a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
3812a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3813a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve BlockGLboolean __stdcall glIsTexture(GLuint texture)
3814a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
3815a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLuint texture = %d)", texture);
3816a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3817a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
3818a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
3819a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
3820a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3821a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context && texture)
3822a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
3823a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            gl::Texture *textureObject = context->getTexture(texture);
3824a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3825a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            if (textureObject)
3826a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
3827a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                return GL_TRUE;
3828a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
3829a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
3830a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
3831a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
3832a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
3833a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY, GL_FALSE);
3834a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
3835a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3836a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    return GL_FALSE;
3837a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
3838a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3839a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glLineWidth(GLfloat width)
3840a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
3841a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLfloat width = %f)", width);
3842a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3843a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
3844a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
3845a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (width <= 0.0f)
3846a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
3847a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return error(GL_INVALID_VALUE);
3848a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
3849a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3850a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
3851a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3852a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
3853a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
3854a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            context->setLineWidth(width);
3855a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
3856a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
3857a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
3858a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
3859a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
3860a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
3861a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
3862a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3863a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glLinkProgram(GLuint program)
3864a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
3865a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLuint program = %d)", program);
3866a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3867a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
3868a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
3869a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
3870a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3871a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
3872a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
3873a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            gl::Program *programObject = context->getProgram(program);
3874a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3875a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            if (!programObject)
3876a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
3877a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                if (context->getShader(program))
3878a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                {
3879a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    return error(GL_INVALID_OPERATION);
3880a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                }
3881a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                else
3882a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                {
3883a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    return error(GL_INVALID_VALUE);
3884a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                }
3885a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
3886a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3887a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            programObject->link();
3888a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
3889a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
3890a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
3891a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
3892a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
3893a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
3894a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
3895a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3896a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glPixelStorei(GLenum pname, GLint param)
3897a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
3898a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLenum pname = 0x%X, GLint param = %d)", pname, param);
3899a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3900a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
3901a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
3902a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
3903a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3904a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
3905a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
3906a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            switch (pname)
3907a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
3908a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_UNPACK_ALIGNMENT:
3909a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                if (param != 1 && param != 2 && param != 4 && param != 8)
3910a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                {
3911a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    return error(GL_INVALID_VALUE);
3912a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                }
3913a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3914a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                context->setUnpackAlignment(param);
3915a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                break;
3916a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3917a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_PACK_ALIGNMENT:
3918a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                if (param != 1 && param != 2 && param != 4 && param != 8)
3919a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                {
3920a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    return error(GL_INVALID_VALUE);
3921a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                }
3922a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3923a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                context->setPackAlignment(param);
3924a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                break;
3925a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3926a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              default:
3927a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                return error(GL_INVALID_ENUM);
3928a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
3929a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
3930a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
3931a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
3932a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
3933a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
3934a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
3935a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
3936a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3937a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glPolygonOffset(GLfloat factor, GLfloat units)
3938a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
3939a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLfloat factor = %f, GLfloat units = %f)", factor, units);
3940a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3941a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
3942a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
3943a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
3944a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3945a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
3946a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
3947a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            context->setPolygonOffsetParams(factor, units);
3948a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
3949a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
3950a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
3951a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
3952a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
3953a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
3954a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
3955a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3956a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid* pixels)
3957a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
3958a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
3959a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          "GLenum format = 0x%X, GLenum type = 0x%X, GLvoid* pixels = 0x%0.8p)",
3960a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          x, y, width, height, format, type,  pixels);
3961a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3962a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
3963a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
3964a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (width < 0 || height < 0)
3965a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
3966a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return error(GL_INVALID_VALUE);
3967a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
3968a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
3969a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        switch (format)
3970a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
3971a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_RGBA:
3972a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            switch (type)
3973a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
3974a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_UNSIGNED_BYTE:
3975a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                break;
3976a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              default:
3977a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                return error(GL_INVALID_OPERATION);
3978a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
3979a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            break;
39805abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick          case GL_BGRA_EXT:
39815abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            switch (type)
39825abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            {
39835abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick              case GL_UNSIGNED_BYTE:
39845abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick              case GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT:
39855abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick              case GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT:
39865abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                break;
39875abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick              default:
39885abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                return error(GL_INVALID_OPERATION);
39895abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            }
39905abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            break;
3991a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case gl::IMPLEMENTATION_COLOR_READ_FORMAT:
3992a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            switch (type)
3993a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
3994a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case gl::IMPLEMENTATION_COLOR_READ_TYPE:
3995a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                break;
3996a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              default:
3997a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                return error(GL_INVALID_OPERATION);
3998a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
3999a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            break;
4000a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          default:
4001a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return error(GL_INVALID_OPERATION);
4002a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
4003a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4004a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
4005a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4006a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
4007a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
4008a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            context->readPixels(x, y, width, height, format, type, pixels);
4009a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
4010a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
4011a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
4012a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
4013a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
4014a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
4015a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
4016a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4017a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glReleaseShaderCompiler(void)
4018a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
4019a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("()");
4020a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4021a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
4022a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
4023a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Shader::releaseCompiler();
4024a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
4025a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
4026a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
4027a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
4028a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
4029a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
4030a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
40315abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrickvoid __stdcall glRenderbufferStorageMultisampleANGLE(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
4032a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
40335abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    TRACE("(GLenum target = 0x%X, GLsizei samples = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
40345abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick          target, samples, internalformat, width, height);
4035a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4036a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
4037a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
4038a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        switch (target)
4039a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
4040a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_RENDERBUFFER:
4041a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            break;
4042a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          default:
4043a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return error(GL_INVALID_ENUM);
4044a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
4045a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4046ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        if (!gl::IsColorRenderable(internalformat) && !gl::IsDepthRenderable(internalformat) && !gl::IsStencilRenderable(internalformat))
4047a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
4048a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return error(GL_INVALID_ENUM);
4049a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
4050a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4051ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        if (width < 0 || height < 0 || samples < 0)
4052a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
4053a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return error(GL_INVALID_VALUE);
4054a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
4055a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4056a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
4057a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4058a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
4059a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
4060ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            if (width > context->getMaximumRenderbufferDimension() ||
4061ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                height > context->getMaximumRenderbufferDimension() ||
4062ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                samples > context->getMaxSupportedSamples())
40635abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            {
40645abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                return error(GL_INVALID_VALUE);
40655abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            }
40665abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
40675abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            GLuint handle = context->getRenderbufferHandle();
40685abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            if (handle == 0)
4069a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
4070a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                return error(GL_INVALID_OPERATION);
4071a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
4072a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4073a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            switch (internalformat)
4074a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
4075a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_DEPTH_COMPONENT16:
40765abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                context->setRenderbufferStorage(new gl::Depthbuffer(width, height, samples));
4077a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                break;
4078a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_RGBA4:
4079a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_RGB5_A1:
4080a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_RGB565:
40815abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick              case GL_RGB8_OES:
40825abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick              case GL_RGBA8_OES:
40835abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                context->setRenderbufferStorage(new gl::Colorbuffer(width, height, internalformat, samples));
4084a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                break;
4085a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_STENCIL_INDEX8:
40865abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                context->setRenderbufferStorage(new gl::Stencilbuffer(width, height, samples));
40875abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                break;
40885abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick              case GL_DEPTH24_STENCIL8_OES:
40895abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                context->setRenderbufferStorage(new gl::DepthStencilbuffer(width, height, samples));
4090a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                break;
4091a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              default:
4092a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                return error(GL_INVALID_ENUM);
4093a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
4094a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
4095a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
4096a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
4097a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
4098a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
4099a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
4100a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
4101a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
41025abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrickvoid __stdcall glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
41035abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{
41045abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    glRenderbufferStorageMultisampleANGLE(target, 0, internalformat, width, height);
41055abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick}
41065abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
4107a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glSampleCoverage(GLclampf value, GLboolean invert)
4108a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
4109a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLclampf value = %f, GLboolean invert = %d)", value, invert);
4110a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4111a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
4112a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
4113a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context* context = gl::getContext();
4114a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4115a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
4116a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
4117a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            context->setSampleCoverageParams(gl::clamp01(value), invert == GL_TRUE);
4118a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
4119a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
4120a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
4121a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
4122a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
4123a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
4124a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
4125a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4126ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdochvoid __stdcall glSetFenceNV(GLuint fence, GLenum condition)
4127ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch{
4128ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    TRACE("(GLuint fence = %d, GLenum condition = 0x%X)", fence, condition);
4129ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
4130ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    try
4131ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    {
4132ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        if (condition != GL_ALL_COMPLETED_NV)
4133ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        {
4134ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            return error(GL_INVALID_ENUM);
4135ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        }
4136ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
4137ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        gl::Context *context = gl::getContext();
4138ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
4139ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        if (context)
4140ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        {
4141ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            gl::Fence *fenceObject = context->getFence(fence);
4142ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
4143ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            if (fenceObject == NULL)
4144ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            {
4145ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                return error(GL_INVALID_OPERATION);
4146ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            }
4147ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
4148ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            fenceObject->setFence(condition);
4149ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        }
4150ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    }
4151ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    catch(std::bad_alloc&)
4152ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    {
4153ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        return error(GL_OUT_OF_MEMORY);
4154ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    }
4155ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch}
4156ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
4157a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
4158a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
4159a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)", x, y, width, height);
4160a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4161a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
4162a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
4163a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (width < 0 || height < 0)
4164a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
4165a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return error(GL_INVALID_VALUE);
4166a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
4167a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4168a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context* context = gl::getContext();
4169a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4170a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
4171a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
4172a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            context->setScissorParams(x, y, width, height);
4173a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
4174a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
4175a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
4176a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
4177a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
4178a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
4179a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
4180a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4181a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryformat, const GLvoid* binary, GLsizei length)
4182a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
4183a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLsizei n = %d, const GLuint* shaders = 0x%0.8p, GLenum binaryformat = 0x%X, "
4184a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          "const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
4185a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          n, shaders, binaryformat, binary, length);
4186a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4187a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
4188a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
4189a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        // No binary shader formats are supported.
4190a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_INVALID_ENUM);
4191a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
4192a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
4193a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
4194a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
4195a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
4196a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
4197a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4198a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glShaderSource(GLuint shader, GLsizei count, const GLchar** string, const GLint* length)
4199a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
4200a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLuint shader = %d, GLsizei count = %d, const GLchar** string = 0x%0.8p, const GLint* length = 0x%0.8p)",
4201a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          shader, count, string, length);
4202a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4203a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
4204a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
4205a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (count < 0)
4206a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
4207a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return error(GL_INVALID_VALUE);
4208a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
4209a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4210a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
4211a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4212a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
4213a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
4214a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            gl::Shader *shaderObject = context->getShader(shader);
4215a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4216a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            if (!shaderObject)
4217a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
4218a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                if (context->getProgram(shader))
4219a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                {
4220a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    return error(GL_INVALID_OPERATION);
4221a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                }
4222a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                else
4223a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                {
4224a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    return error(GL_INVALID_VALUE);
4225a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                }
4226a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
4227a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4228a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            shaderObject->setSource(count, string, length);
4229a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
4230a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
4231a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
4232a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
4233a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
4234a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
4235a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
4236a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4237a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glStencilFunc(GLenum func, GLint ref, GLuint mask)
4238a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
4239a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    glStencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
4240a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
4241a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4242a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
4243a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
4244a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLenum face = 0x%X, GLenum func = 0x%X, GLint ref = %d, GLuint mask = %d)", face, func, ref, mask);
4245a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4246a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
4247a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
4248a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        switch (face)
4249a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
4250a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_FRONT:
4251a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_BACK:
4252a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_FRONT_AND_BACK:
4253a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            break;
4254a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          default:
4255a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return error(GL_INVALID_ENUM);
4256a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
4257a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4258a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        switch (func)
4259a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
4260a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_NEVER:
4261a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_ALWAYS:
4262a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_LESS:
4263a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_LEQUAL:
4264a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_EQUAL:
4265a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_GEQUAL:
4266a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_GREATER:
4267a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_NOTEQUAL:
4268a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            break;
4269a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          default:
4270a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return error(GL_INVALID_ENUM);
4271a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
4272a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4273a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
4274a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4275a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
4276a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
4277a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4278a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
4279a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                context->setStencilParams(func, ref, mask);
4280a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
4281a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4282a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4283a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
4284a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                context->setStencilBackParams(func, ref, mask);
4285a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
4286a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
4287a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
4288a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
4289a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
4290a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
4291a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
4292a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
4293a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4294a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glStencilMask(GLuint mask)
4295a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
4296a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    glStencilMaskSeparate(GL_FRONT_AND_BACK, mask);
4297a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
4298a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4299a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glStencilMaskSeparate(GLenum face, GLuint mask)
4300a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
4301a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLenum face = 0x%X, GLuint mask = %d)", face, mask);
4302a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4303a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
4304a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
4305a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        switch (face)
4306a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
4307a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_FRONT:
4308a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_BACK:
4309a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_FRONT_AND_BACK:
4310a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            break;
4311a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          default:
4312a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return error(GL_INVALID_ENUM);
4313a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
4314a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4315a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
4316a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4317a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
4318a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
4319a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4320a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
4321a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                context->setStencilWritemask(mask);
4322a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
4323a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4324a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4325a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
4326a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                context->setStencilBackWritemask(mask);
4327a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
4328a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
4329a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
4330a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
4331a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
4332a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
4333a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
4334a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
4335a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4336a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
4337a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
4338a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    glStencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
4339a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
4340a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4341a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glStencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
4342a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
4343a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLenum face = 0x%X, GLenum fail = 0x%X, GLenum zfail = 0x%X, GLenum zpas = 0x%Xs)",
4344a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          face, fail, zfail, zpass);
4345a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4346a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
4347a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
4348a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        switch (face)
4349a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
4350a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_FRONT:
4351a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_BACK:
4352a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_FRONT_AND_BACK:
4353a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            break;
4354a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          default:
4355a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return error(GL_INVALID_ENUM);
4356a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
4357a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4358a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        switch (fail)
4359a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
4360a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_ZERO:
4361a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_KEEP:
4362a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_REPLACE:
4363a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_INCR:
4364a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_DECR:
4365a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_INVERT:
4366a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_INCR_WRAP:
4367a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_DECR_WRAP:
4368a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            break;
4369a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          default:
4370a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return error(GL_INVALID_ENUM);
4371a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
4372a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4373a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        switch (zfail)
4374a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
4375a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_ZERO:
4376a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_KEEP:
4377a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_REPLACE:
4378a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_INCR:
4379a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_DECR:
4380a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_INVERT:
4381a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_INCR_WRAP:
4382a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_DECR_WRAP:
4383a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            break;
4384a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          default:
4385a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return error(GL_INVALID_ENUM);
4386a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
4387a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4388a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        switch (zpass)
4389a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
4390a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_ZERO:
4391a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_KEEP:
4392a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_REPLACE:
4393a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_INCR:
4394a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_DECR:
4395a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_INVERT:
4396a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_INCR_WRAP:
4397a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_DECR_WRAP:
4398a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            break;
4399a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          default:
4400a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return error(GL_INVALID_ENUM);
4401a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
4402a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4403a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
4404a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4405a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
4406a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
4407a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4408a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
4409a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                context->setStencilOperations(fail, zfail, zpass);
4410a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
4411a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4412a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4413a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
4414a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                context->setStencilBackOperations(fail, zfail, zpass);
4415a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
4416a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
4417a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
4418a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
4419a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
4420a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
4421a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
4422a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
4423a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4424ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen MurdochGLboolean __stdcall glTestFenceNV(GLuint fence)
4425ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch{
4426ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    TRACE("(GLuint fence = %d)", fence);
4427ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
4428ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    try
4429ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    {
4430ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        gl::Context *context = gl::getContext();
4431ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
4432ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        if (context)
4433ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        {
4434ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            gl::Fence *fenceObject = context->getFence(fence);
4435ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
4436ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            if (fenceObject == NULL)
4437ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            {
4438ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                return error(GL_INVALID_OPERATION, GL_TRUE);
4439ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            }
4440ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
4441ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            return fenceObject->testFence();
4442ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        }
4443ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    }
4444ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    catch(std::bad_alloc&)
4445ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    {
4446ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        error(GL_OUT_OF_MEMORY);
4447ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    }
4448ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
4449ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    return GL_TRUE;
4450ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch}
4451ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
4452a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height,
4453a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                            GLint border, GLenum format, GLenum type, const GLvoid* pixels)
4454a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
4455a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, GLsizei height = %d, "
4456a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          "GLint border = %d, GLenum format = 0x%X, GLenum type = 0x%X, const GLvoid* pixels =  0x%0.8p)",
4457a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          target, level, internalformat, width, height, border, format, type, pixels);
4458a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4459a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
4460a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
4461a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (level < 0 || width < 0 || height < 0)
4462a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
4463a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return error(GL_INVALID_VALUE);
4464a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
4465a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4466a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (level > 0 && (!gl::isPow2(width) || !gl::isPow2(height)))
4467a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
4468a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return error(GL_INVALID_VALUE);
4469a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
4470a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4471a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (internalformat != format)
4472a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
4473a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return error(GL_INVALID_OPERATION);
4474a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
4475a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4476a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        switch (internalformat)
4477a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
4478a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_ALPHA:
4479a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_LUMINANCE:
4480a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_LUMINANCE_ALPHA:
4481a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            switch (type)
4482a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
4483a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_UNSIGNED_BYTE:
4484ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch              case GL_FLOAT:
4485ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch              case GL_HALF_FLOAT_OES:
4486a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                break;
4487a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              default:
4488a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                return error(GL_INVALID_ENUM);
4489a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
4490a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            break;
4491a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_RGB:
4492a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            switch (type)
4493a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
4494a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_UNSIGNED_BYTE:
4495a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_UNSIGNED_SHORT_5_6_5:
4496ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch              case GL_FLOAT:
4497ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch              case GL_HALF_FLOAT_OES:
4498a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                break;
4499a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              default:
4500a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                return error(GL_INVALID_ENUM);
4501a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
4502a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            break;
4503a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_RGBA:
4504a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            switch (type)
4505a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
4506a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_UNSIGNED_BYTE:
4507a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_UNSIGNED_SHORT_4_4_4_4:
4508a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_UNSIGNED_SHORT_5_5_5_1:
4509ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch              case GL_FLOAT:
4510ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch              case GL_HALF_FLOAT_OES:
4511a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                break;
4512a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              default:
4513a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                return error(GL_INVALID_ENUM);
4514a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
4515a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            break;
45165abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick          case GL_BGRA_EXT:
45175abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            switch (type)
45185abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            {
45195abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick              case GL_UNSIGNED_BYTE:
45205abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                break;
45215abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick              default:
45225abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                return error(GL_INVALID_ENUM);
45235abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            }
45245abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            break;
45255abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick          case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:  // error cases for compressed textures are handled below
45265abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick          case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
45275abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            break;
4528a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          default:
4529a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return error(GL_INVALID_VALUE);
4530a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
4531a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4532a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (border != 0)
4533a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
4534a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return error(GL_INVALID_VALUE);
4535a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
4536a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4537a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
4538a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4539a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
4540a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
4541ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            switch (target)
4542ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            {
4543ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch              case GL_TEXTURE_2D:
4544ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                if (width > (context->getMaximumTextureDimension() >> level) ||
4545ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                    height > (context->getMaximumTextureDimension() >> level))
4546ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                {
4547ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                    return error(GL_INVALID_VALUE);
4548ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                }
4549ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                break;
4550ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch              case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
4551ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch              case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
4552ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch              case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
4553ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch              case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
4554ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch              case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
4555ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch              case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
4556ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                if (width != height)
4557ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                {
4558ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                    return error(GL_INVALID_VALUE);
4559ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                }
4560ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
4561ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                if (width > (context->getMaximumCubeTextureDimension() >> level) ||
4562ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                    height > (context->getMaximumCubeTextureDimension() >> level))
4563ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                {
4564ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                    return error(GL_INVALID_VALUE);
4565ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                }
4566ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                break;
4567ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch              default:
4568ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                return error(GL_INVALID_ENUM);
4569ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            }
4570ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
45715abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            if (internalformat == GL_COMPRESSED_RGB_S3TC_DXT1_EXT ||
45725abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                internalformat == GL_COMPRESSED_RGBA_S3TC_DXT1_EXT)
45735abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            {
45745abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                if (context->supportsCompressedTextures())
45755abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                {
45765abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                    return error(GL_INVALID_OPERATION);
45775abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                }
45785abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                else
45795abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                {
45805abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                    return error(GL_INVALID_ENUM);
45815abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                }
45825abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            }
45835abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
4584ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            if (type == GL_FLOAT)
4585ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            {
4586ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                if (!context->supportsFloatTextures())
4587ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                {
4588ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                    return error(GL_INVALID_ENUM);
4589ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                }
4590ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            }
4591ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            else if (type == GL_HALF_FLOAT_OES)
4592ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            {
4593ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                if (!context->supportsHalfFloatTextures())
4594ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                {
4595ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                    return error(GL_INVALID_ENUM);
4596ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                }
4597ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            }
4598ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
4599a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            if (target == GL_TEXTURE_2D)
4600a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
4601a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                gl::Texture2D *texture = context->getTexture2D();
4602a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4603a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                if (!texture)
4604a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                {
4605a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    return error(GL_INVALID_OPERATION);
4606a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                }
4607a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4608a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                texture->setImage(level, internalformat, width, height, format, type, context->getUnpackAlignment(), pixels);
4609a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
4610a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            else
4611a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
4612a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                gl::TextureCubeMap *texture = context->getTextureCubeMap();
4613a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4614a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                if (!texture)
4615a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                {
4616a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    return error(GL_INVALID_OPERATION);
4617a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                }
4618a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4619a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                switch (target)
4620a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                {
4621a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                  case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
4622a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    texture->setImagePosX(level, internalformat, width, height, format, type, context->getUnpackAlignment(), pixels);
4623a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    break;
4624a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                  case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
4625a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    texture->setImageNegX(level, internalformat, width, height, format, type, context->getUnpackAlignment(), pixels);
4626a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    break;
4627a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                  case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
4628a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    texture->setImagePosY(level, internalformat, width, height, format, type, context->getUnpackAlignment(), pixels);
4629a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    break;
4630a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                  case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
4631a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    texture->setImageNegY(level, internalformat, width, height, format, type, context->getUnpackAlignment(), pixels);
4632a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    break;
4633a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                  case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
4634a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    texture->setImagePosZ(level, internalformat, width, height, format, type, context->getUnpackAlignment(), pixels);
4635a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    break;
4636a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                  case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
4637a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    texture->setImageNegZ(level, internalformat, width, height, format, type, context->getUnpackAlignment(), pixels);
4638a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    break;
4639a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                  default: UNREACHABLE();
4640a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                }
4641a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
4642a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
4643a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
4644a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
4645a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
4646a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
4647a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
4648a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
4649a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4650a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glTexParameterf(GLenum target, GLenum pname, GLfloat param)
4651a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
4652a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    glTexParameteri(target, pname, (GLint)param);
4653a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
4654a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4655a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glTexParameterfv(GLenum target, GLenum pname, const GLfloat* params)
4656a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
4657a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    glTexParameteri(target, pname, (GLint)*params);
4658a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
4659a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4660a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glTexParameteri(GLenum target, GLenum pname, GLint param)
4661a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
4662a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %d)", target, pname, param);
4663a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4664a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
4665a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
4666a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
4667a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4668a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
4669a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
4670a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            gl::Texture *texture;
4671a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4672a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            switch (target)
4673a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
4674a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_TEXTURE_2D:
4675a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                texture = context->getTexture2D();
4676a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                break;
4677a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_TEXTURE_CUBE_MAP:
4678a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                texture = context->getTextureCubeMap();
4679a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                break;
4680a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              default:
4681a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                return error(GL_INVALID_ENUM);
4682a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
4683a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4684a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            switch (pname)
4685a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
4686a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_TEXTURE_WRAP_S:
4687a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                if (!texture->setWrapS((GLenum)param))
4688a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                {
4689a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    return error(GL_INVALID_ENUM);
4690a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                }
4691a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                break;
4692a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_TEXTURE_WRAP_T:
4693a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                if (!texture->setWrapT((GLenum)param))
4694a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                {
4695a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    return error(GL_INVALID_ENUM);
4696a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                }
4697a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                break;
4698a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_TEXTURE_MIN_FILTER:
4699a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                if (!texture->setMinFilter((GLenum)param))
4700a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                {
4701a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    return error(GL_INVALID_ENUM);
4702a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                }
4703a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                break;
4704a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              case GL_TEXTURE_MAG_FILTER:
4705a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                if (!texture->setMagFilter((GLenum)param))
4706a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                {
4707a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    return error(GL_INVALID_ENUM);
4708a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                }
4709a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                break;
4710a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block              default:
4711a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                return error(GL_INVALID_ENUM);
4712a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
4713a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
4714a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
4715a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
4716a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
4717a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
4718a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
4719a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
4720a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4721a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glTexParameteriv(GLenum target, GLenum pname, const GLint* params)
4722a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
4723a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    glTexParameteri(target, pname, *params);
4724a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
4725a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4726a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
4727a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                               GLenum format, GLenum type, const GLvoid* pixels)
4728a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
4729a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
4730a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, GLenum type = 0x%X, "
4731a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          "const GLvoid* pixels = 0x%0.8p)",
4732a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block           target, level, xoffset, yoffset, width, height, format, type, pixels);
4733a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4734a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
4735a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
4736a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (!gl::IsTextureTarget(target))
4737a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
4738a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return error(GL_INVALID_ENUM);
4739a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
4740a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4741ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        if (level < 0 || xoffset < 0 || yoffset < 0 || width < 0 || height < 0)
4742a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
4743a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return error(GL_INVALID_VALUE);
4744a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
4745a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4746a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (std::numeric_limits<GLsizei>::max() - xoffset < width || std::numeric_limits<GLsizei>::max() - yoffset < height)
4747a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
4748a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return error(GL_INVALID_VALUE);
4749a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
4750a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4751a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (!gl::CheckTextureFormatType(format, type))
4752a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
4753a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return error(GL_INVALID_ENUM);
4754a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
4755a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4756a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (width == 0 || height == 0 || pixels == NULL)
4757a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
4758a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return;
4759a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
4760a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4761a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
4762a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4763a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
4764a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
4765ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            if (level > context->getMaximumTextureLevel())
4766ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            {
4767ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                return error(GL_INVALID_VALUE);
4768ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            }
4769ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
4770ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            if (format == GL_FLOAT)
4771ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            {
4772ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                if (!context->supportsFloatTextures())
4773ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                {
4774ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                    return error(GL_INVALID_ENUM);
4775ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                }
4776ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            }
4777ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            else if (format == GL_HALF_FLOAT_OES)
4778ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            {
4779ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                if (!context->supportsHalfFloatTextures())
4780ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                {
4781ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                    return error(GL_INVALID_ENUM);
4782ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                }
4783ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            }
4784ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
4785a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            if (target == GL_TEXTURE_2D)
4786a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
4787a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                gl::Texture2D *texture = context->getTexture2D();
4788a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4789a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                if (!texture)
4790a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                {
4791a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    return error(GL_INVALID_OPERATION);
4792a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                }
4793a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
47945abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                if (texture->isCompressed())
47955abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                {
47965abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                    return error(GL_INVALID_OPERATION);
47975abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                }
47985abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
4799ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                if (format != texture->getFormat())
4800ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                {
4801ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                    return error(GL_INVALID_OPERATION);
4802ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                }
4803ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
4804a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                texture->subImage(level, xoffset, yoffset, width, height, format, type, context->getUnpackAlignment(), pixels);
4805a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
4806a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            else if (gl::IsCubemapTextureTarget(target))
4807a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
4808a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                gl::TextureCubeMap *texture = context->getTextureCubeMap();
4809a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4810a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                if (!texture)
4811a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                {
4812a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    return error(GL_INVALID_OPERATION);
4813a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                }
4814a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
48155abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                if (texture->isCompressed())
48165abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                {
48175abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                    return error(GL_INVALID_OPERATION);
48185abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                }
48195abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
4820ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                if (format != texture->getFormat())
4821ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                {
4822ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                    return error(GL_INVALID_OPERATION);
4823ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                }
4824ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
4825a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                texture->subImage(target, level, xoffset, yoffset, width, height, format, type, context->getUnpackAlignment(), pixels);
4826a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
4827a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            else
4828a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
4829a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                UNREACHABLE();
4830a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
4831a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
4832a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
4833a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
4834a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
4835a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
4836a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
4837a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
4838a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4839a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glUniform1f(GLint location, GLfloat x)
4840a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
4841a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    glUniform1fv(location, 1, &x);
4842a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
4843a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4844a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glUniform1fv(GLint location, GLsizei count, const GLfloat* v)
4845a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
4846a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
4847a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4848a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
4849a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
4850a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (count < 0)
4851a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
4852a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return error(GL_INVALID_VALUE);
4853a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
4854a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4855a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (location == -1)
4856a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
4857a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return;
4858a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
4859a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4860a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
4861a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4862a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
4863a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
4864a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            gl::Program *program = context->getCurrentProgram();
4865a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4866a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            if (!program)
4867a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
4868a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                return error(GL_INVALID_OPERATION);
4869a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
4870a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4871a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            if (!program->setUniform1fv(location, count, v))
4872a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
4873a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                return error(GL_INVALID_OPERATION);
4874a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
4875a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
4876a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
4877a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
4878a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
4879a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
4880a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
4881a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
4882a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4883a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glUniform1i(GLint location, GLint x)
4884a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
4885a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    glUniform1iv(location, 1, &x);
4886a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
4887a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4888a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glUniform1iv(GLint location, GLsizei count, const GLint* v)
4889a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
4890a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
4891a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4892a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
4893a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
4894a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (count < 0)
4895a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
4896a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return error(GL_INVALID_VALUE);
4897a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
4898a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4899a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (location == -1)
4900a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
4901a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return;
4902a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
4903a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4904a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
4905a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4906a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
4907a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
4908a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            gl::Program *program = context->getCurrentProgram();
4909a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4910a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            if (!program)
4911a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
4912a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                return error(GL_INVALID_OPERATION);
4913a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
4914a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4915a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            if (!program->setUniform1iv(location, count, v))
4916a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
4917a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                return error(GL_INVALID_OPERATION);
4918a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
4919a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
4920a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
4921a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
4922a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
4923a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
4924a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
4925a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
4926a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4927a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glUniform2f(GLint location, GLfloat x, GLfloat y)
4928a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
4929a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    GLfloat xy[2] = {x, y};
4930a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4931a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    glUniform2fv(location, 1, (GLfloat*)&xy);
4932a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
4933a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4934a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glUniform2fv(GLint location, GLsizei count, const GLfloat* v)
4935a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
4936a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
4937a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4938a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
4939a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
4940a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (count < 0)
4941a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
4942a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return error(GL_INVALID_VALUE);
4943a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
4944a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4945a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (location == -1)
4946a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
4947a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return;
4948a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
4949a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4950a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
4951a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4952a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
4953a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
4954a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            gl::Program *program = context->getCurrentProgram();
4955a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4956a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            if (!program)
4957a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
4958a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                return error(GL_INVALID_OPERATION);
4959a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
4960a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4961a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            if (!program->setUniform2fv(location, count, v))
4962a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
4963a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                return error(GL_INVALID_OPERATION);
4964a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
4965a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
4966a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
4967a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
4968a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
4969a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
4970a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
4971a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
4972a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4973a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glUniform2i(GLint location, GLint x, GLint y)
4974a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
4975a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    GLint xy[4] = {x, y};
4976a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4977a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    glUniform2iv(location, 1, (GLint*)&xy);
4978a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
4979a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4980a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glUniform2iv(GLint location, GLsizei count, const GLint* v)
4981a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
4982a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
4983a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4984a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
4985a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
4986a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (count < 0)
4987a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
4988a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return error(GL_INVALID_VALUE);
4989a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
4990a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4991a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (location == -1)
4992a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
4993a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return;
4994a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
4995a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4996a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
4997a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
4998a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
4999a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
5000a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            gl::Program *program = context->getCurrentProgram();
5001a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5002a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            if (!program)
5003a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
5004a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                return error(GL_INVALID_OPERATION);
5005a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
5006a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5007a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            if (!program->setUniform2iv(location, count, v))
5008a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
5009a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                return error(GL_INVALID_OPERATION);
5010a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
5011a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
5012a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
5013a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
5014a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
5015a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
5016a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
5017a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
5018a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5019a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glUniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
5020a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
5021a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    GLfloat xyz[3] = {x, y, z};
5022a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5023a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    glUniform3fv(location, 1, (GLfloat*)&xyz);
5024a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
5025a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5026a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glUniform3fv(GLint location, GLsizei count, const GLfloat* v)
5027a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
5028a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
5029a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5030a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
5031a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
5032a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (count < 0)
5033a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
5034a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return error(GL_INVALID_VALUE);
5035a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
5036a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5037a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (location == -1)
5038a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
5039a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return;
5040a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
5041a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5042a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
5043a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5044a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
5045a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
5046a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            gl::Program *program = context->getCurrentProgram();
5047a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5048a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            if (!program)
5049a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
5050a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                return error(GL_INVALID_OPERATION);
5051a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
5052a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5053a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            if (!program->setUniform3fv(location, count, v))
5054a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
5055a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                return error(GL_INVALID_OPERATION);
5056a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
5057a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
5058a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
5059a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
5060a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
5061a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
5062a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
5063a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
5064a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5065a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glUniform3i(GLint location, GLint x, GLint y, GLint z)
5066a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
5067a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    GLint xyz[3] = {x, y, z};
5068a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5069a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    glUniform3iv(location, 1, (GLint*)&xyz);
5070a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
5071a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5072a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glUniform3iv(GLint location, GLsizei count, const GLint* v)
5073a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
5074a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
5075a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5076a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
5077a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
5078a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (count < 0)
5079a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
5080a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return error(GL_INVALID_VALUE);
5081a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
5082a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5083a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (location == -1)
5084a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
5085a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return;
5086a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
5087a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5088a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
5089a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5090a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
5091a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
5092a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            gl::Program *program = context->getCurrentProgram();
5093a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5094a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            if (!program)
5095a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
5096a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                return error(GL_INVALID_OPERATION);
5097a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
5098a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5099a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            if (!program->setUniform3iv(location, count, v))
5100a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
5101a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                return error(GL_INVALID_OPERATION);
5102a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
5103a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
5104a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
5105a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
5106a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
5107a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
5108a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
5109a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
5110a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5111a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glUniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
5112a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
5113a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    GLfloat xyzw[4] = {x, y, z, w};
5114a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5115a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    glUniform4fv(location, 1, (GLfloat*)&xyzw);
5116a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
5117a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5118a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glUniform4fv(GLint location, GLsizei count, const GLfloat* v)
5119a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
5120a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
5121a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5122a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
5123a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
5124a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (count < 0)
5125a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
5126a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return error(GL_INVALID_VALUE);
5127a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
5128a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5129a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (location == -1)
5130a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
5131a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return;
5132a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
5133a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5134a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
5135a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5136a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
5137a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
5138a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            gl::Program *program = context->getCurrentProgram();
5139a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5140a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            if (!program)
5141a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
5142a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                return error(GL_INVALID_OPERATION);
5143a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
5144a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5145a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            if (!program->setUniform4fv(location, count, v))
5146a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
5147a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                return error(GL_INVALID_OPERATION);
5148a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
5149a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
5150a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
5151a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
5152a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
5153a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
5154a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
5155a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
5156a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5157a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glUniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
5158a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
5159a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    GLint xyzw[4] = {x, y, z, w};
5160a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5161a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    glUniform4iv(location, 1, (GLint*)&xyzw);
5162a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
5163a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5164a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glUniform4iv(GLint location, GLsizei count, const GLint* v)
5165a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
5166a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
5167a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5168a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
5169a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
5170a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (count < 0)
5171a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
5172a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return error(GL_INVALID_VALUE);
5173a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
5174a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5175a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (location == -1)
5176a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
5177a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return;
5178a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
5179a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5180a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
5181a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5182a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
5183a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
5184a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            gl::Program *program = context->getCurrentProgram();
5185a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5186a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            if (!program)
5187a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
5188a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                return error(GL_INVALID_OPERATION);
5189a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
5190a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5191a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            if (!program->setUniform4iv(location, count, v))
5192a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
5193a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                return error(GL_INVALID_OPERATION);
5194a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
5195a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
5196a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
5197a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
5198a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
5199a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
5200a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
5201a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
5202a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5203a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
5204a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
5205a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %d, const GLfloat* value = 0x%0.8p)",
5206a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          location, count, transpose, value);
5207a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5208a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
5209a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
5210a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (count < 0 || transpose != GL_FALSE)
5211a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
5212a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return error(GL_INVALID_VALUE);
5213a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
5214a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5215a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (location == -1)
5216a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
5217a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return;
5218a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
5219a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5220a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
5221a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5222a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
5223a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
5224a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            gl::Program *program = context->getCurrentProgram();
5225a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5226a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            if (!program)
5227a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
5228a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                return error(GL_INVALID_OPERATION);
5229a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
5230a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5231a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            if (!program->setUniformMatrix2fv(location, count, value))
5232a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
5233a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                return error(GL_INVALID_OPERATION);
5234a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
5235a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
5236a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
5237a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
5238a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
5239a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
5240a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
5241a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
5242a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5243a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
5244a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
5245a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %d, const GLfloat* value = 0x%0.8p)",
5246a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          location, count, transpose, value);
5247a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5248a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
5249a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
5250a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (count < 0 || transpose != GL_FALSE)
5251a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
5252a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return error(GL_INVALID_VALUE);
5253a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
5254a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5255a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (location == -1)
5256a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
5257a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return;
5258a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
5259a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5260a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
5261a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5262a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
5263a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
5264a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            gl::Program *program = context->getCurrentProgram();
5265a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5266a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            if (!program)
5267a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
5268a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                return error(GL_INVALID_OPERATION);
5269a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
5270a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5271a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            if (!program->setUniformMatrix3fv(location, count, value))
5272a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
5273a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                return error(GL_INVALID_OPERATION);
5274a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
5275a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
5276a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
5277a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
5278a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
5279a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
5280a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
5281a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
5282a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5283a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
5284a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
5285a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %d, const GLfloat* value = 0x%0.8p)",
5286a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          location, count, transpose, value);
5287a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5288a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
5289a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
5290a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (count < 0 || transpose != GL_FALSE)
5291a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
5292a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return error(GL_INVALID_VALUE);
5293a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
5294a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5295a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (location == -1)
5296a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
5297a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return;
5298a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
5299a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5300a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
5301a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5302a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
5303a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
5304a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            gl::Program *program = context->getCurrentProgram();
5305a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5306a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            if (!program)
5307a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
5308a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                return error(GL_INVALID_OPERATION);
5309a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
5310a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5311a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            if (!program->setUniformMatrix4fv(location, count, value))
5312a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
5313a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                return error(GL_INVALID_OPERATION);
5314a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
5315a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
5316a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
5317a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
5318a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
5319a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
5320a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
5321a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
5322a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5323a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glUseProgram(GLuint program)
5324a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
5325a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLuint program = %d)", program);
5326a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5327a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
5328a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
5329a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
5330a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5331a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
5332a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
5333a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            gl::Program *programObject = context->getProgram(program);
5334a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5335a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            if (!programObject && program != 0)
5336a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
5337a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                if (context->getShader(program))
5338a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                {
5339a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    return error(GL_INVALID_OPERATION);
5340a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                }
5341a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                else
5342a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                {
5343a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    return error(GL_INVALID_VALUE);
5344a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                }
5345a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
5346a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5347a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            if (program != 0 && !programObject->isLinked())
5348a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
5349a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                return error(GL_INVALID_OPERATION);
5350a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
5351a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5352a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            context->useProgram(program);
5353a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
5354a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
5355a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
5356a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
5357a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
5358a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
5359a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
5360a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5361a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glValidateProgram(GLuint program)
5362a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
5363a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLuint program = %d)", program);
5364a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5365a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
5366a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
5367a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
5368a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5369a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
5370a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
5371a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            gl::Program *programObject = context->getProgram(program);
5372a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5373a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            if (!programObject)
5374a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            {
5375a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                if (context->getShader(program))
5376a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                {
5377a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    return error(GL_INVALID_OPERATION);
5378a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                }
5379a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                else
5380a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                {
5381a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                    return error(GL_INVALID_VALUE);
5382a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                }
5383a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            }
5384a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5385a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            programObject->validate();
5386a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
5387a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
5388a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
5389a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
5390a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
5391a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
5392a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
5393a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5394a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glVertexAttrib1f(GLuint index, GLfloat x)
5395a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
5396a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLuint index = %d, GLfloat x = %f)", index, x);
5397a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5398a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
5399a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
5400a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (index >= gl::MAX_VERTEX_ATTRIBS)
5401a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
5402a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return error(GL_INVALID_VALUE);
5403a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
5404a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5405a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
5406a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5407a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
5408a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
5409a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            GLfloat vals[4] = { x, 0, 0, 1 };
5410a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            context->setVertexAttrib(index, vals);
5411a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
5412a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
5413a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
5414a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
5415a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
5416a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
5417a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
5418a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5419a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glVertexAttrib1fv(GLuint index, const GLfloat* values)
5420a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
5421a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
5422a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5423a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
5424a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
5425a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (index >= gl::MAX_VERTEX_ATTRIBS)
5426a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
5427a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return error(GL_INVALID_VALUE);
5428a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
5429a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5430a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
5431a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5432a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
5433a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
5434a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            GLfloat vals[4] = { values[0], 0, 0, 1 };
5435a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            context->setVertexAttrib(index, vals);
5436a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
5437a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
5438a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
5439a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
5440a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
5441a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
5442a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
5443a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5444a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
5445a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
5446a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLuint index = %d, GLfloat x = %f, GLfloat y = %f)", index, x, y);
5447a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5448a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
5449a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
5450a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (index >= gl::MAX_VERTEX_ATTRIBS)
5451a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
5452a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return error(GL_INVALID_VALUE);
5453a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
5454a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5455a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
5456a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5457a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
5458a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
5459a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            GLfloat vals[4] = { x, y, 0, 1 };
5460a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            context->setVertexAttrib(index, vals);
5461a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
5462a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
5463a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
5464a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
5465a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
5466a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
5467a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
5468a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5469a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glVertexAttrib2fv(GLuint index, const GLfloat* values)
5470a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
5471a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
5472a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5473a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
5474a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
5475a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (index >= gl::MAX_VERTEX_ATTRIBS)
5476a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
5477a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return error(GL_INVALID_VALUE);
5478a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
5479a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5480a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
5481a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5482a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
5483a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
5484a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            GLfloat vals[4] = { values[0], values[1], 0, 1 };
5485a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            context->setVertexAttrib(index, vals);
5486a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
5487a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
5488a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
5489a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
5490a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
5491a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
5492a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
5493a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5494a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
5495a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
5496a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLuint index = %d, GLfloat x = %f, GLfloat y = %f, GLfloat z = %f)", index, x, y, z);
5497a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5498a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
5499a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
5500a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (index >= gl::MAX_VERTEX_ATTRIBS)
5501a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
5502a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return error(GL_INVALID_VALUE);
5503a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
5504a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5505a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
5506a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5507a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
5508a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
5509a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            GLfloat vals[4] = { x, y, z, 1 };
5510a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            context->setVertexAttrib(index, vals);
5511a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
5512a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
5513a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
5514a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
5515a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
5516a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
5517a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
5518a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5519a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glVertexAttrib3fv(GLuint index, const GLfloat* values)
5520a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
5521a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
5522a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5523a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
5524a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
5525a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (index >= gl::MAX_VERTEX_ATTRIBS)
5526a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
5527a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return error(GL_INVALID_VALUE);
5528a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
5529a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5530a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
5531a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5532a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
5533a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
5534a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            GLfloat vals[4] = { values[0], values[1], values[2], 1 };
5535a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            context->setVertexAttrib(index, vals);
5536a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
5537a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
5538a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
5539a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
5540a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
5541a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
5542a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
5543a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5544a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
5545a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
5546a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLuint index = %d, GLfloat x = %f, GLfloat y = %f, GLfloat z = %f, GLfloat w = %f)", index, x, y, z, w);
5547a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5548a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
5549a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
5550a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (index >= gl::MAX_VERTEX_ATTRIBS)
5551a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
5552a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return error(GL_INVALID_VALUE);
5553a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
5554a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5555a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
5556a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5557a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
5558a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
5559a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            GLfloat vals[4] = { x, y, z, w };
5560a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            context->setVertexAttrib(index, vals);
5561a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
5562a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
5563a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
5564a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
5565a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
5566a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
5567a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
5568a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5569a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glVertexAttrib4fv(GLuint index, const GLfloat* values)
5570a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
5571a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
5572a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5573a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
5574a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
5575a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (index >= gl::MAX_VERTEX_ATTRIBS)
5576a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
5577a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return error(GL_INVALID_VALUE);
5578a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
5579a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5580a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
5581a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5582a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
5583a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
5584a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            context->setVertexAttrib(index, values);
5585a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
5586a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
5587a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
5588a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
5589a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
5590a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
5591a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
5592a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5593a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr)
5594a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
5595a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLuint index = %d, GLint size = %d, GLenum type = 0x%X, "
5596a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          "GLboolean normalized = %d, GLsizei stride = %d, const GLvoid* ptr = 0x%0.8p)",
5597a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          index, size, type, normalized, stride, ptr);
5598a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5599a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
5600a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
5601a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (index >= gl::MAX_VERTEX_ATTRIBS)
5602a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
5603a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return error(GL_INVALID_VALUE);
5604a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
5605a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5606a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (size < 1 || size > 4)
5607a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
5608a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return error(GL_INVALID_VALUE);
5609a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
5610a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5611a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        switch (type)
5612a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
5613a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_BYTE:
5614a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_UNSIGNED_BYTE:
5615a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_SHORT:
5616a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_UNSIGNED_SHORT:
5617a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_FIXED:
5618a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          case GL_FLOAT:
5619a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            break;
5620a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          default:
5621a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return error(GL_INVALID_ENUM);
5622a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
5623a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5624a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (stride < 0)
5625a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
5626a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return error(GL_INVALID_VALUE);
5627a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
5628a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5629a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
5630a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5631a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
5632a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
56335abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            context->setVertexAttribState(index, context->getArrayBuffer(), size, type, (normalized == GL_TRUE), stride, ptr);
5634a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
5635a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
5636a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
5637a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
5638a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
5639a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
5640a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
5641a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5642a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
5643a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
5644a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)", x, y, width, height);
5645a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5646a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
5647a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
5648a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (width < 0 || height < 0)
5649a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
5650a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return error(GL_INVALID_VALUE);
5651a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
5652a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5653a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        gl::Context *context = gl::getContext();
5654a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5655a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (context)
5656a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
5657a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            context->setViewportParams(x, y, width, height);
5658a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
5659a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
5660a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
5661a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
5662a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
5663a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
5664a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
5665a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
56665abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrickvoid __stdcall glBlitFramebufferANGLE(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
56675abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                                      GLbitfield mask, GLenum filter)
56685abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{
56695abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    TRACE("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, "
56705abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick          "GLint dstX0 = %d, GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, "
56715abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick          "GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
56725abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick          srcX0, srcY0, srcX1, srcX1, dstX0, dstY0, dstX1, dstY1, mask, filter);
56735abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
56745abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    try
56755abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    {
56765abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        switch (filter)
56775abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        {
56785abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick          case GL_NEAREST:
56795abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            break;
56805abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick          default:
56815abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            return error(GL_INVALID_ENUM);
56825abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        }
56835abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
56845abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        if ((mask & ~(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)) != 0)
56855abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        {
56865abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            return error(GL_INVALID_VALUE);
56875abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        }
56885abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
56895abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        if (srcX1 - srcX0 != dstX1 - dstX0 || srcY1 - srcY0 != dstY1 - dstY0)
56905abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        {
56915abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            ERR("Scaling and flipping in BlitFramebufferANGLE not supported by this implementation");
56925abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            return error(GL_INVALID_OPERATION);
56935abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        }
56945abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
56955abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        gl::Context *context = gl::getContext();
56965abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
56975abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        if (context)
56985abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        {
56995abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            if (context->getReadFramebufferHandle() == context->getDrawFramebufferHandle())
57005abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            {
57015abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                ERR("Blits with the same source and destination framebuffer are not supported by this implementation.");
57025abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                return error(GL_INVALID_OPERATION);
57035abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            }
57045abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
57055abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            context->blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask);
57065abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        }
57075abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    }
57085abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    catch(std::bad_alloc&)
57095abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    {
57105abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        return error(GL_OUT_OF_MEMORY);
57115abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    }
57125abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick}
57135abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
5714a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid __stdcall glTexImage3DOES(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth,
5715a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block                               GLint border, GLenum format, GLenum type, const GLvoid* pixels)
5716a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
5717a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    TRACE("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
5718a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          "GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, GLint border = %d, "
5719a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          "GLenum format = 0x%X, GLenum type = 0x%x, const GLvoid* pixels = 0x%0.8p)",
5720a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block          target, level, internalformat, width, height, depth, border, format, type, pixels);
5721a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5722a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    try
5723a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
5724a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        UNIMPLEMENTED();   // FIXME
5725a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
5726a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    catch(std::bad_alloc&)
5727a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
5728a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return error(GL_OUT_OF_MEMORY);
5729a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
5730a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
5731a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5732a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block__eglMustCastToProperFunctionPointerType __stdcall glGetProcAddress(const char *procname)
5733a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
5734a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    struct Extension
5735a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
5736a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        const char *name;
5737a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        __eglMustCastToProperFunctionPointerType address;
5738a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    };
5739a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5740a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    static const Extension glExtensions[] =
5741a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
5742a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {"glTexImage3DOES", (__eglMustCastToProperFunctionPointerType)glTexImage3DOES},
57435abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        {"glBlitFramebufferANGLE", (__eglMustCastToProperFunctionPointerType)glBlitFramebufferANGLE},
5744ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        {"glRenderbufferStorageMultisampleANGLE", (__eglMustCastToProperFunctionPointerType)glRenderbufferStorageMultisampleANGLE},
5745ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        {"glDeleteFencesNV", (__eglMustCastToProperFunctionPointerType)glDeleteFencesNV},
5746ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        {"glGenFencesNV", (__eglMustCastToProperFunctionPointerType)glGenFencesNV},
5747ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        {"glIsFenceNV", (__eglMustCastToProperFunctionPointerType)glIsFenceNV},
5748ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        {"glTestFenceNV", (__eglMustCastToProperFunctionPointerType)glTestFenceNV},
5749ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        {"glGetFenceivNV", (__eglMustCastToProperFunctionPointerType)glGetFenceivNV},
5750ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        {"glFinishFenceNV", (__eglMustCastToProperFunctionPointerType)glFinishFenceNV},
5751ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        {"glSetFenceNV", (__eglMustCastToProperFunctionPointerType)glSetFenceNV},
5752a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    };
5753a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5754a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    for (int ext = 0; ext < sizeof(glExtensions) / sizeof(Extension); ext++)
5755a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
5756a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        if (strcmp(procname, glExtensions[ext].name) == 0)
5757a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        {
5758a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block            return (__eglMustCastToProperFunctionPointerType)glExtensions[ext].address;
5759a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        }
5760a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
5761a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5762a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    return NULL;
5763a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
5764a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
5765a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
5766