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