blob: 2bf34b8eb8f113d2026c01c89cb5044ee2f02d3b [file] [log] [blame]
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001//
2// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
3// Use of this source code is governed by a BSD-style license that can be
4// found in the LICENSE file.
5//
6
7// libGLESv2.cpp: Implements the exported OpenGL ES 2.0 functions.
8
9#define GL_APICALL
10#include <GLES2/gl2.h>
11#include <GLES2/gl2ext.h>
12
daniel@transgaming.com00c75962010-03-11 20:36:15 +000013#include <exception>
14#include <limits>
15
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000016#include "Context.h"
17#include "main.h"
18#include "Program.h"
19#include "Shader.h"
20#include "Buffer.h"
21#include "Texture.h"
22#include "Renderbuffer.h"
23#include "Framebuffer.h"
24#include "mathutil.h"
alokp@chromium.orgea0e1af2010-03-22 19:33:14 +000025#include "common/debug.h"
daniel@transgaming.com00c75962010-03-11 20:36:15 +000026#include "utilities.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000027
28extern "C"
29{
30
31void __stdcall glActiveTexture(GLenum texture)
32{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +000033 TRACE("(GLenum texture = 0x%X)", texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000034
35 try
36 {
37 if (texture < GL_TEXTURE0 || texture > GL_TEXTURE0 + gl::MAX_TEXTURE_IMAGE_UNITS - 1)
38 {
39 return error(GL_INVALID_ENUM);
40 }
41
42 gl::Context *context = gl::getContext();
43
44 if (context)
45 {
46 context->activeSampler = texture - GL_TEXTURE0;
47 }
48 }
49 catch(std::bad_alloc&)
50 {
51 return error(GL_OUT_OF_MEMORY);
52 }
53}
54
55void __stdcall glAttachShader(GLuint program, GLuint shader)
56{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +000057 TRACE("(GLuint program = %d, GLuint shader = %d)", program, shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000058
59 try
60 {
61 gl::Context *context = gl::getContext();
62
63 if (context)
64 {
65 gl::Program *programObject = context->getProgram(program);
66 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +000067
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +000068 if (!programObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000069 {
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +000070 if (context->getShader(program))
71 {
72 return error(GL_INVALID_OPERATION);
73 }
74 else
75 {
76 return error(GL_INVALID_VALUE);
77 }
78 }
79
80 if (!shaderObject)
81 {
82 if (context->getProgram(shader))
83 {
84 return error(GL_INVALID_OPERATION);
85 }
86 else
87 {
88 return error(GL_INVALID_VALUE);
89 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000090 }
91
92 if (!programObject->attachShader(shaderObject))
93 {
94 return error(GL_INVALID_OPERATION);
95 }
96 }
97 }
98 catch(std::bad_alloc&)
99 {
100 return error(GL_OUT_OF_MEMORY);
101 }
102}
103
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000104void __stdcall glBindAttribLocation(GLuint program, GLuint index, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000105{
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000106 TRACE("(GLuint program = %d, GLuint index = %d, const GLchar* name = 0x%0.8p)", program, index, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000107
108 try
109 {
110 if (index >= gl::MAX_VERTEX_ATTRIBS)
111 {
112 return error(GL_INVALID_VALUE);
113 }
114
115 gl::Context *context = gl::getContext();
116
117 if (context)
118 {
119 gl::Program *programObject = context->getProgram(program);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000120
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000121 if (!programObject)
122 {
daniel@transgaming.com98079832010-04-13 03:26:29 +0000123 if (context->getShader(program))
124 {
125 return error(GL_INVALID_OPERATION);
126 }
127 else
128 {
129 return error(GL_INVALID_VALUE);
130 }
131 }
132
133 if (strncmp(name, "gl_", 3) == 0)
134 {
135 return error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000136 }
137
138 programObject->bindAttributeLocation(index, name);
139 }
140 }
141 catch(std::bad_alloc&)
142 {
143 return error(GL_OUT_OF_MEMORY);
144 }
145}
146
147void __stdcall glBindBuffer(GLenum target, GLuint buffer)
148{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000149 TRACE("(GLenum target = 0x%X, GLuint buffer = %d)", target, buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000150
151 try
152 {
153 gl::Context *context = gl::getContext();
154
155 if (context)
156 {
157 switch (target)
158 {
159 case GL_ARRAY_BUFFER:
160 context->bindArrayBuffer(buffer);
161 return;
162 case GL_ELEMENT_ARRAY_BUFFER:
163 context->bindElementArrayBuffer(buffer);
164 return;
165 default:
166 return error(GL_INVALID_ENUM);
167 }
168 }
169 }
170 catch(std::bad_alloc&)
171 {
172 return error(GL_OUT_OF_MEMORY);
173 }
174}
175
176void __stdcall glBindFramebuffer(GLenum target, GLuint framebuffer)
177{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000178 TRACE("(GLenum target = 0x%X, GLuint framebuffer = %d)", target, framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000179
180 try
181 {
182 if (target != GL_FRAMEBUFFER)
183 {
184 return error(GL_INVALID_ENUM);
185 }
186
187 gl::Context *context = gl::getContext();
188
189 if (context)
190 {
191 context->bindFramebuffer(framebuffer);
192 }
193 }
194 catch(std::bad_alloc&)
195 {
196 return error(GL_OUT_OF_MEMORY);
197 }
198}
199
200void __stdcall glBindRenderbuffer(GLenum target, GLuint renderbuffer)
201{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000202 TRACE("(GLenum target = 0x%X, GLuint renderbuffer = %d)", target, renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000203
204 try
205 {
206 if (target != GL_RENDERBUFFER)
207 {
208 return error(GL_INVALID_ENUM);
209 }
210
211 gl::Context *context = gl::getContext();
212
213 if (context)
214 {
215 context->bindRenderbuffer(renderbuffer);
216 }
217 }
218 catch(std::bad_alloc&)
219 {
220 return error(GL_OUT_OF_MEMORY);
221 }
222}
223
224void __stdcall glBindTexture(GLenum target, GLuint texture)
225{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000226 TRACE("(GLenum target = 0x%X, GLuint texture = %d)", target, texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000227
228 try
229 {
230 gl::Context *context = gl::getContext();
231
232 if (context)
233 {
234 gl::Texture *textureObject = context->getTexture(texture);
235
236 if (textureObject && textureObject->getTarget() != target && texture != 0)
237 {
238 return error(GL_INVALID_OPERATION);
239 }
240
241 switch (target)
242 {
243 case GL_TEXTURE_2D:
244 context->bindTexture2D(texture);
245 return;
246 case GL_TEXTURE_CUBE_MAP:
247 context->bindTextureCubeMap(texture);
248 return;
249 default:
250 return error(GL_INVALID_ENUM);
251 }
252 }
253 }
254 catch(std::bad_alloc&)
255 {
256 return error(GL_OUT_OF_MEMORY);
257 }
258}
259
260void __stdcall glBlendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
261{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000262 TRACE("(GLclampf red = %f, GLclampf green = %f, GLclampf blue = %f, GLclampf alpha = %f)",
263 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000264
265 try
266 {
267 gl::Context* context = gl::getContext();
268
269 if (context)
270 {
271 context->blendColor.red = gl::clamp01(red);
272 context->blendColor.blue = gl::clamp01(blue);
273 context->blendColor.green = gl::clamp01(green);
274 context->blendColor.alpha = gl::clamp01(alpha);
275 }
276 }
277 catch(std::bad_alloc&)
278 {
279 return error(GL_OUT_OF_MEMORY);
280 }
281}
282
283void __stdcall glBlendEquation(GLenum mode)
284{
285 glBlendEquationSeparate(mode, mode);
286}
287
288void __stdcall glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
289{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000290 TRACE("(GLenum modeRGB = 0x%X, GLenum modeAlpha = 0x%X)", modeRGB, modeAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000291
292 try
293 {
294 switch (modeRGB)
295 {
296 case GL_FUNC_ADD:
297 case GL_FUNC_SUBTRACT:
298 case GL_FUNC_REVERSE_SUBTRACT:
299 break;
300 default:
301 return error(GL_INVALID_ENUM);
302 }
303
304 switch (modeAlpha)
305 {
306 case GL_FUNC_ADD:
307 case GL_FUNC_SUBTRACT:
308 case GL_FUNC_REVERSE_SUBTRACT:
309 break;
310 default:
311 return error(GL_INVALID_ENUM);
312 }
313
314 gl::Context *context = gl::getContext();
315
316 if (context)
317 {
318 context->blendEquationRGB = modeRGB;
319 context->blendEquationAlpha = modeAlpha;
320 }
321 }
322 catch(std::bad_alloc&)
323 {
324 return error(GL_OUT_OF_MEMORY);
325 }
326}
327
328void __stdcall glBlendFunc(GLenum sfactor, GLenum dfactor)
329{
330 glBlendFuncSeparate(sfactor, dfactor, sfactor, dfactor);
331}
332
333void __stdcall glBlendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
334{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000335 TRACE("(GLenum srcRGB = 0x%X, GLenum dstRGB = 0x%X, GLenum srcAlpha = 0x%X, GLenum dstAlpha = 0x%X)",
336 srcRGB, dstRGB, srcAlpha, dstAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000337
338 try
339 {
340 switch (srcRGB)
341 {
342 case GL_ZERO:
343 case GL_ONE:
344 case GL_SRC_COLOR:
345 case GL_ONE_MINUS_SRC_COLOR:
346 case GL_DST_COLOR:
347 case GL_ONE_MINUS_DST_COLOR:
348 case GL_SRC_ALPHA:
349 case GL_ONE_MINUS_SRC_ALPHA:
350 case GL_DST_ALPHA:
351 case GL_ONE_MINUS_DST_ALPHA:
352 case GL_CONSTANT_COLOR:
353 case GL_ONE_MINUS_CONSTANT_COLOR:
354 case GL_CONSTANT_ALPHA:
355 case GL_ONE_MINUS_CONSTANT_ALPHA:
356 case GL_SRC_ALPHA_SATURATE:
357 break;
358 default:
359 return error(GL_INVALID_ENUM);
360 }
361
362 switch (dstRGB)
363 {
364 case GL_ZERO:
365 case GL_ONE:
366 case GL_SRC_COLOR:
367 case GL_ONE_MINUS_SRC_COLOR:
368 case GL_DST_COLOR:
369 case GL_ONE_MINUS_DST_COLOR:
370 case GL_SRC_ALPHA:
371 case GL_ONE_MINUS_SRC_ALPHA:
372 case GL_DST_ALPHA:
373 case GL_ONE_MINUS_DST_ALPHA:
374 case GL_CONSTANT_COLOR:
375 case GL_ONE_MINUS_CONSTANT_COLOR:
376 case GL_CONSTANT_ALPHA:
377 case GL_ONE_MINUS_CONSTANT_ALPHA:
378 break;
379 default:
380 return error(GL_INVALID_ENUM);
381 }
382
383 switch (srcAlpha)
384 {
385 case GL_ZERO:
386 case GL_ONE:
387 case GL_SRC_COLOR:
388 case GL_ONE_MINUS_SRC_COLOR:
389 case GL_DST_COLOR:
390 case GL_ONE_MINUS_DST_COLOR:
391 case GL_SRC_ALPHA:
392 case GL_ONE_MINUS_SRC_ALPHA:
393 case GL_DST_ALPHA:
394 case GL_ONE_MINUS_DST_ALPHA:
395 case GL_CONSTANT_COLOR:
396 case GL_ONE_MINUS_CONSTANT_COLOR:
397 case GL_CONSTANT_ALPHA:
398 case GL_ONE_MINUS_CONSTANT_ALPHA:
399 case GL_SRC_ALPHA_SATURATE:
400 break;
401 default:
402 return error(GL_INVALID_ENUM);
403 }
404
405 switch (dstAlpha)
406 {
407 case GL_ZERO:
408 case GL_ONE:
409 case GL_SRC_COLOR:
410 case GL_ONE_MINUS_SRC_COLOR:
411 case GL_DST_COLOR:
412 case GL_ONE_MINUS_DST_COLOR:
413 case GL_SRC_ALPHA:
414 case GL_ONE_MINUS_SRC_ALPHA:
415 case GL_DST_ALPHA:
416 case GL_ONE_MINUS_DST_ALPHA:
417 case GL_CONSTANT_COLOR:
418 case GL_ONE_MINUS_CONSTANT_COLOR:
419 case GL_CONSTANT_ALPHA:
420 case GL_ONE_MINUS_CONSTANT_ALPHA:
421 break;
422 default:
423 return error(GL_INVALID_ENUM);
424 }
425
daniel@transgaming.comfe453652010-03-16 06:23:28 +0000426 bool constantColorUsed = (srcRGB == GL_CONSTANT_COLOR || srcRGB == GL_ONE_MINUS_CONSTANT_COLOR ||
427 dstRGB == GL_CONSTANT_COLOR || dstRGB == GL_ONE_MINUS_CONSTANT_COLOR);
428
429 bool constantAlphaUsed = (srcRGB == GL_CONSTANT_ALPHA || srcRGB == GL_ONE_MINUS_CONSTANT_ALPHA ||
430 dstRGB == GL_CONSTANT_ALPHA || dstRGB == GL_ONE_MINUS_CONSTANT_ALPHA);
431
432 if (constantColorUsed && constantAlphaUsed)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000433 {
daniel@transgaming.comfe453652010-03-16 06:23:28 +0000434 ERR("Simultaneous use of GL_CONSTANT_ALPHA/GL_ONE_MINUS_CONSTANT_ALPHA and GL_CONSTANT_COLOR/GL_ONE_MINUS_CONSTANT_COLOR invalid under WebGL");
435 return error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000436 }
437
438 gl::Context *context = gl::getContext();
439
440 if (context)
441 {
442 context->sourceBlendRGB = srcRGB;
443 context->sourceBlendAlpha = srcAlpha;
444 context->destBlendRGB = dstRGB;
445 context->destBlendAlpha = dstAlpha;
446 }
447 }
448 catch(std::bad_alloc&)
449 {
450 return error(GL_OUT_OF_MEMORY);
451 }
452}
453
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000454void __stdcall glBufferData(GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000455{
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000456 TRACE("(GLenum target = 0x%X, GLsizeiptr size = %d, const GLvoid* data = 0x%0.8p, GLenum usage = %d)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000457 target, size, data, usage);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000458
459 try
460 {
461 if (size < 0)
462 {
463 return error(GL_INVALID_VALUE);
464 }
465
466 switch (usage)
467 {
468 case GL_STREAM_DRAW:
469 case GL_STATIC_DRAW:
470 case GL_DYNAMIC_DRAW:
471 break;
472 default:
473 return error(GL_INVALID_ENUM);
474 }
475
476 gl::Context *context = gl::getContext();
477
478 if (context)
479 {
480 gl::Buffer *buffer;
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000481
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000482 switch (target)
483 {
484 case GL_ARRAY_BUFFER:
485 buffer = context->getArrayBuffer();
486 break;
487 case GL_ELEMENT_ARRAY_BUFFER:
488 buffer = context->getElementArrayBuffer();
489 break;
490 default:
491 return error(GL_INVALID_ENUM);
492 }
493
494 if (!buffer)
495 {
496 return error(GL_INVALID_OPERATION);
497 }
498
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000499 buffer->bufferData(data, size, usage);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000500 }
501 }
502 catch(std::bad_alloc&)
503 {
504 return error(GL_OUT_OF_MEMORY);
505 }
506}
507
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000508void __stdcall glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000509{
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000510 TRACE("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr size = %d, const GLvoid* data = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000511 target, offset, size, data);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000512
513 try
514 {
515 if (size < 0)
516 {
517 return error(GL_INVALID_VALUE);
518 }
519
daniel@transgaming.comd4620a32010-03-21 04:31:28 +0000520 if (data == NULL)
521 {
522 return;
523 }
524
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000525 gl::Context *context = gl::getContext();
526
527 if (context)
528 {
529 gl::Buffer *buffer;
530
531 switch (target)
532 {
533 case GL_ARRAY_BUFFER:
534 buffer = context->getArrayBuffer();
535 break;
536 case GL_ELEMENT_ARRAY_BUFFER:
537 buffer = context->getElementArrayBuffer();
538 break;
539 default:
540 return error(GL_INVALID_ENUM);
541 }
542
543 if (!buffer)
544 {
545 return error(GL_INVALID_OPERATION);
546 }
547
548 GLenum err = buffer->bufferSubData(data, size, offset);
549
550 if (err != GL_NO_ERROR)
551 {
552 return error(err);
553 }
554 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000555 }
556 catch(std::bad_alloc&)
557 {
558 return error(GL_OUT_OF_MEMORY);
559 }
560}
561
562GLenum __stdcall glCheckFramebufferStatus(GLenum target)
563{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000564 TRACE("(GLenum target = 0x%X)", target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000565
566 try
567 {
568 if (target != GL_FRAMEBUFFER)
569 {
570 return error(GL_INVALID_ENUM, 0);
571 }
572
573 gl::Context *context = gl::getContext();
574
575 if (context)
576 {
577 gl::Framebuffer *framebuffer = context->getFramebuffer();
578
579 return framebuffer->completeness();
580 }
581 }
582 catch(std::bad_alloc&)
583 {
584 return error(GL_OUT_OF_MEMORY, 0);
585 }
586
587 return 0;
588}
589
590void __stdcall glClear(GLbitfield mask)
591{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000592 TRACE("(GLbitfield mask = %X)", mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000593
594 try
595 {
596 gl::Context *context = gl::getContext();
597
598 if (context)
599 {
600 context->clear(mask);
601 }
602 }
603 catch(std::bad_alloc&)
604 {
605 return error(GL_OUT_OF_MEMORY);
606 }
607}
608
609void __stdcall glClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
610{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000611 TRACE("(GLclampf red = %f, GLclampf green = %f, GLclampf blue = %f, GLclampf alpha = %f)",
612 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000613
614 try
615 {
616 gl::Context *context = gl::getContext();
617
618 if (context)
619 {
620 context->setClearColor(red, green, blue, alpha);
621 }
622 }
623 catch(std::bad_alloc&)
624 {
625 return error(GL_OUT_OF_MEMORY);
626 }
627}
628
629void __stdcall glClearDepthf(GLclampf depth)
630{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000631 TRACE("(GLclampf depth = %f)", depth);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000632
633 try
634 {
635 gl::Context *context = gl::getContext();
636
637 if (context)
638 {
639 context->setClearDepth(depth);
640 }
641 }
642 catch(std::bad_alloc&)
643 {
644 return error(GL_OUT_OF_MEMORY);
645 }
646}
647
648void __stdcall glClearStencil(GLint s)
649{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000650 TRACE("(GLint s = %d)", s);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000651
652 try
653 {
654 gl::Context *context = gl::getContext();
655
656 if (context)
657 {
658 context->setClearStencil(s);
659 }
660 }
661 catch(std::bad_alloc&)
662 {
663 return error(GL_OUT_OF_MEMORY);
664 }
665}
666
667void __stdcall glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
668{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000669 TRACE("(GLboolean red = %d, GLboolean green = %d, GLboolean blue = %d, GLboolean alpha = %d)",
670 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000671
672 try
673 {
674 gl::Context *context = gl::getContext();
675
676 if (context)
677 {
678 context->colorMaskRed = red != GL_FALSE;
679 context->colorMaskGreen = green != GL_FALSE;
680 context->colorMaskBlue = blue != GL_FALSE;
681 context->colorMaskAlpha = alpha != GL_FALSE;
682 }
683 }
684 catch(std::bad_alloc&)
685 {
686 return error(GL_OUT_OF_MEMORY);
687 }
688}
689
690void __stdcall glCompileShader(GLuint shader)
691{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000692 TRACE("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000693
694 try
695 {
696 gl::Context *context = gl::getContext();
697
698 if (context)
699 {
700 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000701
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000702 if (!shaderObject)
703 {
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +0000704 if (context->getProgram(shader))
705 {
706 return error(GL_INVALID_OPERATION);
707 }
708 else
709 {
710 return error(GL_INVALID_VALUE);
711 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000712 }
713
714 shaderObject->compile();
715 }
716 }
717 catch(std::bad_alloc&)
718 {
719 return error(GL_OUT_OF_MEMORY);
720 }
721}
722
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000723void __stdcall glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height,
724 GLint border, GLsizei imageSize, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000725{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000726 TRACE("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000727 "GLsizei height = %d, GLint border = %d, GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000728 target, level, internalformat, width, height, border, imageSize, data);
729
730 try
731 {
daniel@transgaming.com41430492010-03-11 20:36:18 +0000732 if (target != GL_TEXTURE_2D && !es2dx::IsCubemapTextureTarget(target))
733 {
734 return error(GL_INVALID_ENUM);
735 }
736
737 if (level < 0 || level > gl::MAX_TEXTURE_LEVELS)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000738 {
739 return error(GL_INVALID_VALUE);
740 }
741
daniel@transgaming.com41430492010-03-11 20:36:18 +0000742 if (width < 0 || height < 0 || (level > 0 && !gl::isPow2(width)) || (level > 0 && !gl::isPow2(height)) || border != 0 || imageSize < 0)
743 {
744 return error(GL_INVALID_VALUE);
745 }
746
747 return error(GL_INVALID_ENUM); // ultimately we don't support compressed textures
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000748 }
749 catch(std::bad_alloc&)
750 {
751 return error(GL_OUT_OF_MEMORY);
752 }
753}
754
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000755void __stdcall glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
756 GLenum format, GLsizei imageSize, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000757{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000758 TRACE("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
759 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000760 "GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000761 target, level, xoffset, yoffset, width, height, format, imageSize, data);
762
763 try
764 {
daniel@transgaming.com41430492010-03-11 20:36:18 +0000765 if (target != GL_TEXTURE_2D && !es2dx::IsCubemapTextureTarget(target))
766 {
767 return error(GL_INVALID_ENUM);
768 }
769
770 if (level < 0 || level > gl::MAX_TEXTURE_LEVELS)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000771 {
772 return error(GL_INVALID_VALUE);
773 }
774
daniel@transgaming.com41430492010-03-11 20:36:18 +0000775 if (xoffset < 0 || yoffset < 0 || width < 0 || height < 0 || (level > 0 && !gl::isPow2(width)) || (level > 0 && !gl::isPow2(height)) || imageSize < 0)
776 {
777 return error(GL_INVALID_VALUE);
778 }
779
780 if (xoffset != 0 || yoffset != 0)
781 {
782 return error(GL_INVALID_OPERATION);
783 }
784
785 return error(GL_INVALID_OPERATION); // The texture being operated on is not a compressed texture.
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000786 }
787 catch(std::bad_alloc&)
788 {
789 return error(GL_OUT_OF_MEMORY);
790 }
791}
792
793void __stdcall glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
794{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000795 TRACE("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
796 "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, GLint border = %d)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000797 target, level, internalformat, x, y, width, height, border);
798
799 try
800 {
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +0000801 if (level < 0 || width < 0 || height < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000802 {
803 return error(GL_INVALID_VALUE);
804 }
805
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +0000806 if (level > 0 && (!gl::isPow2(width) || !gl::isPow2(height)))
807 {
808 return error(GL_INVALID_VALUE);
809 }
810
811 switch (target)
812 {
813 case GL_TEXTURE_2D:
814 if (width > (gl::MAX_TEXTURE_SIZE >> level) || height > (gl::MAX_TEXTURE_SIZE >> level))
815 {
816 return error(GL_INVALID_VALUE);
817 }
818 break;
819 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
820 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
821 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
822 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
823 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
824 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com34dc3e82010-04-15 20:45:02 +0000825 if (width != height)
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +0000826 {
827 return error(GL_INVALID_VALUE);
828 }
829
830 if (width > (gl::MAX_CUBE_MAP_TEXTURE_SIZE >> level) || height > (gl::MAX_CUBE_MAP_TEXTURE_SIZE >> level))
831 {
832 return error(GL_INVALID_VALUE);
833 }
834 break;
835 default:
836 return error(GL_INVALID_ENUM);
837 }
838
839 switch (internalformat)
840 {
841 case GL_ALPHA:
842 case GL_LUMINANCE:
843 case GL_LUMINANCE_ALPHA:
844 case GL_RGB:
845 case GL_RGBA:
846 break;
847 default:
848 return error(GL_INVALID_VALUE);
849 }
850
851 if (border != 0)
852 {
853 return error(GL_INVALID_VALUE);
854 }
855
856 gl::Context *context = gl::getContext();
857
858 if (context)
859 {
860 gl::Renderbuffer *source = context->getFramebuffer()->getColorbuffer();
861
862 if (target == GL_TEXTURE_2D)
863 {
864 gl::Texture2D *texture = context->getTexture2D();
865
866 if (!texture)
867 {
868 return error(GL_INVALID_OPERATION);
869 }
870
871 texture->copyImage(level, internalformat, x, y, width, height, source);
872 }
873 else if (es2dx::IsCubemapTextureTarget(target))
874 {
875 gl::TextureCubeMap *texture = context->getTextureCubeMap();
876
877 if (!texture)
878 {
879 return error(GL_INVALID_OPERATION);
880 }
881
882 texture->copyImage(target, level, internalformat, x, y, width, height, source);
883 }
884 else
885 {
886 UNREACHABLE();
887 }
888 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000889 }
890 catch(std::bad_alloc&)
891 {
892 return error(GL_OUT_OF_MEMORY);
893 }
894}
895
896void __stdcall glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
897{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000898 TRACE("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
899 "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000900 target, level, xoffset, yoffset, x, y, width, height);
901
902 try
903 {
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +0000904 if (target != GL_TEXTURE_2D && !es2dx::IsCubemapTextureTarget(target))
905 {
906 return error(GL_INVALID_ENUM);
907 }
908
909 if (level < 0 || level > gl::MAX_TEXTURE_LEVELS || xoffset < 0 || yoffset < 0 || width < 0 || height < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000910 {
911 return error(GL_INVALID_VALUE);
912 }
913
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +0000914 if (std::numeric_limits<GLsizei>::max() - xoffset < width || std::numeric_limits<GLsizei>::max() - yoffset < height)
915 {
916 return error(GL_INVALID_VALUE);
917 }
918
919 if (width == 0 || height == 0)
920 {
921 return;
922 }
923
924 gl::Context *context = gl::getContext();
925
926 if (context)
927 {
928 gl::Renderbuffer *source = context->getFramebuffer()->getColorbuffer();
929
930 if (target == GL_TEXTURE_2D)
931 {
932 gl::Texture2D *texture = context->getTexture2D();
933
934 if (!texture)
935 {
936 return error(GL_INVALID_OPERATION);
937 }
938
939 texture->copySubImage(level, xoffset, yoffset, x, y, width, height, source);
940 }
941 else if (es2dx::IsCubemapTextureTarget(target))
942 {
943 gl::TextureCubeMap *texture = context->getTextureCubeMap();
944
945 if (!texture)
946 {
947 return error(GL_INVALID_OPERATION);
948 }
949
950 texture->copySubImage(target, level, xoffset, yoffset, x, y, width, height, source);
951 }
952 else
953 {
954 UNREACHABLE();
955 }
956 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000957 }
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +0000958
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000959 catch(std::bad_alloc&)
960 {
961 return error(GL_OUT_OF_MEMORY);
962 }
963}
964
965GLuint __stdcall glCreateProgram(void)
966{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000967 TRACE("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000968
969 try
970 {
971 gl::Context *context = gl::getContext();
972
973 if (context)
974 {
975 return context->createProgram();
976 }
977 }
978 catch(std::bad_alloc&)
979 {
980 return error(GL_OUT_OF_MEMORY, 0);
981 }
982
983 return 0;
984}
985
986GLuint __stdcall glCreateShader(GLenum type)
987{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000988 TRACE("(GLenum type = 0x%X)", type);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000989
990 try
991 {
992 gl::Context *context = gl::getContext();
993
994 if (context)
995 {
996 switch (type)
997 {
998 case GL_FRAGMENT_SHADER:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000999 case GL_VERTEX_SHADER:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001000 return context->createShader(type);
1001 default:
1002 return error(GL_INVALID_ENUM, 0);
1003 }
1004 }
1005 }
1006 catch(std::bad_alloc&)
1007 {
1008 return error(GL_OUT_OF_MEMORY, 0);
1009 }
1010
1011 return 0;
1012}
1013
1014void __stdcall glCullFace(GLenum mode)
1015{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001016 TRACE("(GLenum mode = 0x%X)", mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001017
1018 try
1019 {
1020 switch (mode)
1021 {
1022 case GL_FRONT:
1023 case GL_BACK:
1024 case GL_FRONT_AND_BACK:
1025 {
1026 gl::Context *context = gl::getContext();
1027
1028 if (context)
1029 {
1030 context->cullMode = mode;
1031 }
1032 }
1033 break;
1034 default:
1035 return error(GL_INVALID_ENUM);
1036 }
1037 }
1038 catch(std::bad_alloc&)
1039 {
1040 return error(GL_OUT_OF_MEMORY);
1041 }
1042}
1043
1044void __stdcall glDeleteBuffers(GLsizei n, const GLuint* buffers)
1045{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001046 TRACE("(GLsizei n = %d, const GLuint* buffers = 0x%0.8p)", n, buffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001047
1048 try
1049 {
1050 if (n < 0)
1051 {
1052 return error(GL_INVALID_VALUE);
1053 }
1054
1055 gl::Context *context = gl::getContext();
1056
1057 if (context)
1058 {
1059 for (int i = 0; i < n; i++)
1060 {
1061 context->deleteBuffer(buffers[i]);
1062 }
1063 }
1064 }
1065 catch(std::bad_alloc&)
1066 {
1067 return error(GL_OUT_OF_MEMORY);
1068 }
1069}
1070
1071void __stdcall glDeleteFramebuffers(GLsizei n, const GLuint* framebuffers)
1072{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001073 TRACE("(GLsizei n = %d, const GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001074
1075 try
1076 {
1077 if (n < 0)
1078 {
1079 return error(GL_INVALID_VALUE);
1080 }
1081
1082 gl::Context *context = gl::getContext();
1083
1084 if (context)
1085 {
1086 for (int i = 0; i < n; i++)
1087 {
1088 if (framebuffers[i] != 0)
1089 {
1090 context->deleteFramebuffer(framebuffers[i]);
1091 }
1092 }
1093 }
1094 }
1095 catch(std::bad_alloc&)
1096 {
1097 return error(GL_OUT_OF_MEMORY);
1098 }
1099}
1100
1101void __stdcall glDeleteProgram(GLuint program)
1102{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001103 TRACE("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001104
1105 try
1106 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001107 if (program == 0)
1108 {
1109 return;
1110 }
1111
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001112 gl::Context *context = gl::getContext();
1113
1114 if (context)
1115 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001116 if (!context->getProgram(program))
1117 {
1118 if(context->getShader(program))
1119 {
1120 return error(GL_INVALID_OPERATION);
1121 }
1122 else
1123 {
1124 return error(GL_INVALID_VALUE);
1125 }
1126 }
1127
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001128 context->deleteProgram(program);
1129 }
1130 }
1131 catch(std::bad_alloc&)
1132 {
1133 return error(GL_OUT_OF_MEMORY);
1134 }
1135}
1136
1137void __stdcall glDeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers)
1138{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001139 TRACE("(GLsizei n = %d, const GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001140
1141 try
1142 {
1143 if (n < 0)
1144 {
1145 return error(GL_INVALID_VALUE);
1146 }
1147
1148 gl::Context *context = gl::getContext();
1149
1150 if (context)
1151 {
daniel@transgaming.come2b22122010-03-11 19:22:14 +00001152 for (int i = 0; i < n; i++)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001153 {
1154 context->deleteRenderbuffer(renderbuffers[i]);
1155 }
1156 }
1157 }
1158 catch(std::bad_alloc&)
1159 {
1160 return error(GL_OUT_OF_MEMORY);
1161 }
1162}
1163
1164void __stdcall glDeleteShader(GLuint shader)
1165{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001166 TRACE("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001167
1168 try
1169 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001170 if (shader == 0)
1171 {
1172 return;
1173 }
1174
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001175 gl::Context *context = gl::getContext();
1176
1177 if (context)
1178 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001179 if (!context->getShader(shader))
1180 {
1181 if(context->getProgram(shader))
1182 {
1183 return error(GL_INVALID_OPERATION);
1184 }
1185 else
1186 {
1187 return error(GL_INVALID_VALUE);
1188 }
1189 }
1190
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001191 context->deleteShader(shader);
1192 }
1193 }
1194 catch(std::bad_alloc&)
1195 {
1196 return error(GL_OUT_OF_MEMORY);
1197 }
1198}
1199
1200void __stdcall glDeleteTextures(GLsizei n, const GLuint* textures)
1201{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001202 TRACE("(GLsizei n = %d, const GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001203
1204 try
1205 {
1206 if (n < 0)
1207 {
1208 return error(GL_INVALID_VALUE);
1209 }
1210
1211 gl::Context *context = gl::getContext();
1212
1213 if (context)
1214 {
1215 for (int i = 0; i < n; i++)
1216 {
1217 if (textures[i] != 0)
1218 {
1219 context->deleteTexture(textures[i]);
1220 }
1221 }
1222 }
1223 }
1224 catch(std::bad_alloc&)
1225 {
1226 return error(GL_OUT_OF_MEMORY);
1227 }
1228}
1229
1230void __stdcall glDepthFunc(GLenum func)
1231{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001232 TRACE("(GLenum func = 0x%X)", func);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001233
1234 try
1235 {
1236 switch (func)
1237 {
1238 case GL_NEVER:
1239 case GL_ALWAYS:
1240 case GL_LESS:
1241 case GL_LEQUAL:
1242 case GL_EQUAL:
1243 case GL_GREATER:
1244 case GL_GEQUAL:
1245 case GL_NOTEQUAL:
1246 break;
1247 default:
1248 return error(GL_INVALID_ENUM);
1249 }
1250
1251 gl::Context *context = gl::getContext();
1252
1253 if (context)
1254 {
1255 context->depthFunc = func;
1256 }
1257 }
1258 catch(std::bad_alloc&)
1259 {
1260 return error(GL_OUT_OF_MEMORY);
1261 }
1262}
1263
1264void __stdcall glDepthMask(GLboolean flag)
1265{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001266 TRACE("(GLboolean flag = %d)", flag);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001267
1268 try
1269 {
1270 gl::Context *context = gl::getContext();
1271
1272 if (context)
1273 {
1274 context->depthMask = flag != GL_FALSE;
1275 }
1276 }
1277 catch(std::bad_alloc&)
1278 {
1279 return error(GL_OUT_OF_MEMORY);
1280 }
1281}
1282
1283void __stdcall glDepthRangef(GLclampf zNear, GLclampf zFar)
1284{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001285 TRACE("(GLclampf zNear = %f, GLclampf zFar = %f)", zNear, zFar);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001286
1287 try
1288 {
1289 gl::Context *context = gl::getContext();
1290
1291 if (context)
1292 {
1293 context->zNear = zNear;
1294 context->zFar = zFar;
1295 }
1296 }
1297 catch(std::bad_alloc&)
1298 {
1299 return error(GL_OUT_OF_MEMORY);
1300 }
1301}
1302
1303void __stdcall glDetachShader(GLuint program, GLuint shader)
1304{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001305 TRACE("(GLuint program = %d, GLuint shader = %d)", program, shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001306
1307 try
1308 {
1309 gl::Context *context = gl::getContext();
1310
1311 if (context)
1312 {
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001313
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001314 gl::Program *programObject = context->getProgram(program);
1315 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001316
1317 if (!programObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001318 {
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001319 gl::Shader *shaderByProgramHandle;
1320 shaderByProgramHandle = context->getShader(program);
1321 if (!shaderByProgramHandle)
1322 {
1323 return error(GL_INVALID_VALUE);
1324 }
1325 else
1326 {
1327 return error(GL_INVALID_OPERATION);
1328 }
1329 }
1330
1331 if (!shaderObject)
1332 {
1333 gl::Program *programByShaderHandle = context->getProgram(shader);
1334 if (!programByShaderHandle)
1335 {
1336 return error(GL_INVALID_VALUE);
1337 }
1338 else
1339 {
1340 return error(GL_INVALID_OPERATION);
1341 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001342 }
1343
1344 if (!programObject->detachShader(shaderObject))
1345 {
1346 return error(GL_INVALID_OPERATION);
1347 }
1348
1349 if (shaderObject->isDeletable())
1350 {
1351 context->deleteShader(shader);
1352 }
1353 }
1354 }
1355 catch(std::bad_alloc&)
1356 {
1357 return error(GL_OUT_OF_MEMORY);
1358 }
1359}
1360
1361void __stdcall glDisable(GLenum cap)
1362{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001363 TRACE("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001364
1365 try
1366 {
1367 gl::Context *context = gl::getContext();
1368
1369 if (context)
1370 {
1371 switch (cap)
1372 {
1373 case GL_CULL_FACE: context->cullFace = false; break;
1374 case GL_POLYGON_OFFSET_FILL: context->polygonOffsetFill = false; break;
1375 case GL_SAMPLE_ALPHA_TO_COVERAGE: context->sampleAlphaToCoverage = false; break;
1376 case GL_SAMPLE_COVERAGE: context->sampleCoverage = false; break;
1377 case GL_SCISSOR_TEST: context->scissorTest = false; break;
1378 case GL_STENCIL_TEST: context->stencilTest = false; break;
1379 case GL_DEPTH_TEST: context->depthTest = false; break;
1380 case GL_BLEND: context->blend = false; break;
1381 case GL_DITHER: context->dither = false; break;
1382 default:
1383 return error(GL_INVALID_ENUM);
1384 }
1385 }
1386 }
1387 catch(std::bad_alloc&)
1388 {
1389 return error(GL_OUT_OF_MEMORY);
1390 }
1391}
1392
1393void __stdcall glDisableVertexAttribArray(GLuint index)
1394{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001395 TRACE("(GLuint index = %d)", index);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001396
1397 try
1398 {
1399 if (index >= gl::MAX_VERTEX_ATTRIBS)
1400 {
1401 return error(GL_INVALID_VALUE);
1402 }
1403
1404 gl::Context *context = gl::getContext();
1405
1406 if (context)
1407 {
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +00001408 context->vertexAttribute[index].mEnabled = false;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001409 }
1410 }
1411 catch(std::bad_alloc&)
1412 {
1413 return error(GL_OUT_OF_MEMORY);
1414 }
1415}
1416
1417void __stdcall glDrawArrays(GLenum mode, GLint first, GLsizei count)
1418{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001419 TRACE("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d)", mode, first, count);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001420
1421 try
1422 {
1423 if (count < 0 || first < 0)
1424 {
1425 return error(GL_INVALID_VALUE);
1426 }
1427
1428 gl::Context *context = gl::getContext();
1429
1430 if (context)
1431 {
1432 context->drawArrays(mode, first, count);
1433 }
1434 }
1435 catch(std::bad_alloc&)
1436 {
1437 return error(GL_OUT_OF_MEMORY);
1438 }
1439}
1440
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001441void __stdcall glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001442{
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001443 TRACE("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001444 mode, count, type, indices);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001445
1446 try
1447 {
1448 if (count < 0)
1449 {
1450 return error(GL_INVALID_VALUE);
1451 }
1452
1453 switch (type)
1454 {
1455 case GL_UNSIGNED_BYTE:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001456 case GL_UNSIGNED_SHORT:
1457 break;
1458 default:
1459 return error(GL_INVALID_ENUM);
1460 }
1461
1462 gl::Context *context = gl::getContext();
1463
1464 if (context)
1465 {
1466 context->drawElements(mode, count, type, indices);
1467 }
1468 }
1469 catch(std::bad_alloc&)
1470 {
1471 return error(GL_OUT_OF_MEMORY);
1472 }
1473}
1474
1475void __stdcall glEnable(GLenum cap)
1476{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001477 TRACE("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001478
1479 try
1480 {
1481 gl::Context *context = gl::getContext();
1482
1483 if (context)
1484 {
1485 switch (cap)
1486 {
1487 case GL_CULL_FACE: context->cullFace = true; break;
1488 case GL_POLYGON_OFFSET_FILL: context->polygonOffsetFill = true; break;
1489 case GL_SAMPLE_ALPHA_TO_COVERAGE: context->sampleAlphaToCoverage = true; break;
1490 case GL_SAMPLE_COVERAGE: context->sampleCoverage = true; break;
1491 case GL_SCISSOR_TEST: context->scissorTest = true; break;
1492 case GL_STENCIL_TEST: context->stencilTest = true; break;
1493 case GL_DEPTH_TEST: context->depthTest = true; break;
1494 case GL_BLEND: context->blend = true; break;
1495 case GL_DITHER: context->dither = true; break;
1496 default:
1497 return error(GL_INVALID_ENUM);
1498 }
1499 }
1500 }
1501 catch(std::bad_alloc&)
1502 {
1503 return error(GL_OUT_OF_MEMORY);
1504 }
1505}
1506
1507void __stdcall glEnableVertexAttribArray(GLuint index)
1508{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001509 TRACE("(GLuint index = %d)", index);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001510
1511 try
1512 {
1513 if (index >= gl::MAX_VERTEX_ATTRIBS)
1514 {
1515 return error(GL_INVALID_VALUE);
1516 }
1517
1518 gl::Context *context = gl::getContext();
1519
1520 if (context)
1521 {
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +00001522 context->vertexAttribute[index].mEnabled = true;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001523 }
1524 }
1525 catch(std::bad_alloc&)
1526 {
1527 return error(GL_OUT_OF_MEMORY);
1528 }
1529}
1530
1531void __stdcall glFinish(void)
1532{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001533 TRACE("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001534
1535 try
1536 {
1537 gl::Context *context = gl::getContext();
1538
1539 if (context)
1540 {
1541 context->finish();
1542 }
1543 }
1544 catch(std::bad_alloc&)
1545 {
1546 return error(GL_OUT_OF_MEMORY);
1547 }
1548}
1549
1550void __stdcall glFlush(void)
1551{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001552 TRACE("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001553
1554 try
1555 {
1556 gl::Context *context = gl::getContext();
1557
1558 if (context)
1559 {
1560 context->flush();
1561 }
1562 }
1563 catch(std::bad_alloc&)
1564 {
1565 return error(GL_OUT_OF_MEMORY);
1566 }
1567}
1568
1569void __stdcall glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
1570{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001571 TRACE("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum renderbuffertarget = 0x%X, "
1572 "GLuint renderbuffer = %d)", target, attachment, renderbuffertarget, renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001573
1574 try
1575 {
1576 if (target != GL_FRAMEBUFFER || renderbuffertarget != GL_RENDERBUFFER)
1577 {
1578 return error(GL_INVALID_ENUM);
1579 }
1580
1581 gl::Context *context = gl::getContext();
1582
1583 if (context)
1584 {
1585 gl::Framebuffer *framebuffer = context->getFramebuffer();
1586
1587 if (context->framebuffer == 0 || !framebuffer)
1588 {
1589 return error(GL_INVALID_OPERATION);
1590 }
1591
1592 switch (attachment)
1593 {
1594 case GL_COLOR_ATTACHMENT0:
1595 framebuffer->setColorbuffer(GL_RENDERBUFFER, renderbuffer);
1596 break;
1597 case GL_DEPTH_ATTACHMENT:
1598 framebuffer->setDepthbuffer(GL_RENDERBUFFER, renderbuffer);
1599 break;
1600 case GL_STENCIL_ATTACHMENT:
1601 framebuffer->setStencilbuffer(GL_RENDERBUFFER, renderbuffer);
1602 break;
1603 default:
1604 return error(GL_INVALID_ENUM);
1605 }
1606 }
1607 }
1608 catch(std::bad_alloc&)
1609 {
1610 return error(GL_OUT_OF_MEMORY);
1611 }
1612}
1613
1614void __stdcall glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
1615{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001616 TRACE("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum textarget = 0x%X, "
1617 "GLuint texture = %d, GLint level = %d)", target, attachment, textarget, texture, level);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001618
1619 try
1620 {
1621 if (target != GL_FRAMEBUFFER)
1622 {
1623 return error(GL_INVALID_ENUM);
1624 }
1625
1626 switch (attachment)
1627 {
1628 case GL_COLOR_ATTACHMENT0:
1629 break;
1630 default:
1631 return error(GL_INVALID_ENUM);
1632 }
1633
1634 gl::Context *context = gl::getContext();
1635
1636 if (context)
1637 {
1638 if (texture)
1639 {
1640 switch (textarget)
1641 {
1642 case GL_TEXTURE_2D:
1643 if (!context->getTexture2D())
1644 {
1645 return error(GL_INVALID_OPERATION);
1646 }
1647 break;
1648 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1649 UNIMPLEMENTED(); // FIXME
1650 break;
1651 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1652 UNIMPLEMENTED(); // FIXME
1653 break;
1654 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1655 UNIMPLEMENTED(); // FIXME
1656 break;
1657 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1658 UNIMPLEMENTED(); // FIXME
1659 break;
1660 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1661 UNIMPLEMENTED(); // FIXME
1662 break;
1663 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
1664 UNIMPLEMENTED(); // FIXME
1665 break;
1666 default:
1667 return error(GL_INVALID_ENUM);
1668 }
1669
1670 if (level != 0)
1671 {
1672 return error(GL_INVALID_VALUE);
1673 }
1674 }
1675
1676 gl::Framebuffer *framebuffer = context->getFramebuffer();
1677
1678 if (context->framebuffer == 0 || !framebuffer)
1679 {
1680 return error(GL_INVALID_OPERATION);
1681 }
1682
1683 framebuffer->setColorbuffer(GL_TEXTURE, texture);
1684 }
1685 }
1686 catch(std::bad_alloc&)
1687 {
1688 return error(GL_OUT_OF_MEMORY);
1689 }
1690}
1691
1692void __stdcall glFrontFace(GLenum mode)
1693{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001694 TRACE("(GLenum mode = 0x%X)", mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001695
1696 try
1697 {
1698 switch (mode)
1699 {
1700 case GL_CW:
1701 case GL_CCW:
1702 {
1703 gl::Context *context = gl::getContext();
1704
1705 if (context)
1706 {
1707 context->frontFace = mode;
1708 }
1709 }
1710 break;
1711 default:
1712 return error(GL_INVALID_ENUM);
1713 }
1714 }
1715 catch(std::bad_alloc&)
1716 {
1717 return error(GL_OUT_OF_MEMORY);
1718 }
1719}
1720
1721void __stdcall glGenBuffers(GLsizei n, GLuint* buffers)
1722{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001723 TRACE("(GLsizei n = %d, GLuint* buffers = 0x%0.8p)", n, buffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001724
1725 try
1726 {
1727 if (n < 0)
1728 {
1729 return error(GL_INVALID_VALUE);
1730 }
1731
1732 gl::Context *context = gl::getContext();
1733
1734 if (context)
1735 {
1736 for (int i = 0; i < n; i++)
1737 {
1738 buffers[i] = context->createBuffer();
1739 }
1740 }
1741 }
1742 catch(std::bad_alloc&)
1743 {
1744 return error(GL_OUT_OF_MEMORY);
1745 }
1746}
1747
1748void __stdcall glGenerateMipmap(GLenum target)
1749{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001750 TRACE("(GLenum target = 0x%X)", target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001751
1752 try
1753 {
1754 UNIMPLEMENTED(); // FIXME
1755 }
1756 catch(std::bad_alloc&)
1757 {
1758 return error(GL_OUT_OF_MEMORY);
1759 }
1760}
1761
1762void __stdcall glGenFramebuffers(GLsizei n, GLuint* framebuffers)
1763{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001764 TRACE("(GLsizei n = %d, GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001765
1766 try
1767 {
1768 if (n < 0)
1769 {
1770 return error(GL_INVALID_VALUE);
1771 }
1772
1773 gl::Context *context = gl::getContext();
1774
1775 if (context)
1776 {
1777 for (int i = 0; i < n; i++)
1778 {
1779 framebuffers[i] = context->createFramebuffer();
1780 }
1781 }
1782 }
1783 catch(std::bad_alloc&)
1784 {
1785 return error(GL_OUT_OF_MEMORY);
1786 }
1787}
1788
1789void __stdcall glGenRenderbuffers(GLsizei n, GLuint* renderbuffers)
1790{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001791 TRACE("(GLsizei n = %d, GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001792
1793 try
1794 {
1795 if (n < 0)
1796 {
1797 return error(GL_INVALID_VALUE);
1798 }
1799
1800 gl::Context *context = gl::getContext();
1801
1802 if (context)
1803 {
1804 for (int i = 0; i < n; i++)
1805 {
1806 renderbuffers[i] = context->createRenderbuffer();
1807 }
1808 }
1809 }
1810 catch(std::bad_alloc&)
1811 {
1812 return error(GL_OUT_OF_MEMORY);
1813 }
1814}
1815
1816void __stdcall glGenTextures(GLsizei n, GLuint* textures)
1817{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001818 TRACE("(GLsizei n = %d, GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001819
1820 try
1821 {
1822 if (n < 0)
1823 {
1824 return error(GL_INVALID_VALUE);
1825 }
1826
1827 gl::Context *context = gl::getContext();
1828
1829 if (context)
1830 {
1831 for (int i = 0; i < n; i++)
1832 {
1833 textures[i] = context->createTexture();
1834 }
1835 }
1836 }
1837 catch(std::bad_alloc&)
1838 {
1839 return error(GL_OUT_OF_MEMORY);
1840 }
1841}
1842
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001843void __stdcall glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001844{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001845 TRACE("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001846 "GLint* size = 0x%0.8p, GLenum* type = %0.8p, GLchar* name = %0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001847 program, index, bufsize, length, size, type, name);
1848
1849 try
1850 {
1851 if (bufsize < 0)
1852 {
1853 return error(GL_INVALID_VALUE);
1854 }
1855
1856 UNIMPLEMENTED(); // FIXME
1857 }
1858 catch(std::bad_alloc&)
1859 {
1860 return error(GL_OUT_OF_MEMORY);
1861 }
1862}
1863
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001864void __stdcall glGetActiveUniform(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001865{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001866 TRACE("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001867 "GLsizei* length = 0x%0.8p, GLint* size = 0x%0.8p, GLenum* type = 0x%0.8p, GLchar* name = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001868 program, index, bufsize, length, size, type, name);
1869
1870 try
1871 {
1872 if (bufsize < 0)
1873 {
1874 return error(GL_INVALID_VALUE);
1875 }
1876
1877 UNIMPLEMENTED(); // FIXME
1878 }
1879 catch(std::bad_alloc&)
1880 {
1881 return error(GL_OUT_OF_MEMORY);
1882 }
1883}
1884
1885void __stdcall glGetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders)
1886{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001887 TRACE("(GLuint program = %d, GLsizei maxcount = %d, GLsizei* count = 0x%0.8p, GLuint* shaders = 0x%0.8p)",
1888 program, maxcount, count, shaders);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001889
1890 try
1891 {
1892 if (maxcount < 0)
1893 {
1894 return error(GL_INVALID_VALUE);
1895 }
1896
daniel@transgaming.com6c785212010-03-30 03:36:17 +00001897 gl::Context *context = gl::getContext();
1898
1899 if (context)
1900 {
1901 gl::Program *programObject = context->getProgram(program);
1902
1903 if (!programObject)
1904 {
daniel@transgaming.com23953e32010-04-13 19:53:31 +00001905 if (context->getShader(program))
1906 {
1907 return error(GL_INVALID_OPERATION);
1908 }
1909 else
1910 {
1911 return error(GL_INVALID_VALUE);
1912 }
daniel@transgaming.com6c785212010-03-30 03:36:17 +00001913 }
1914
1915 return programObject->getAttachedShaders(maxcount, count, shaders);
1916 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001917 }
1918 catch(std::bad_alloc&)
1919 {
1920 return error(GL_OUT_OF_MEMORY);
1921 }
1922}
1923
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001924int __stdcall glGetAttribLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001925{
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001926 TRACE("(GLuint program = %d, const GLchar* name = %s)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001927
1928 try
1929 {
1930 gl::Context *context = gl::getContext();
1931
1932 if (context)
1933 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00001934
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001935 gl::Program *programObject = context->getProgram(program);
1936
1937 if (!programObject)
1938 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00001939 if (context->getShader(program))
1940 {
1941 return error(GL_INVALID_OPERATION, -1);
1942 }
1943 else
1944 {
1945 return error(GL_INVALID_VALUE, -1);
1946 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001947 }
1948
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00001949 if (!programObject->isLinked())
1950 {
1951 return error(GL_INVALID_OPERATION, -1);
1952 }
1953
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001954 return programObject->getAttributeLocation(name);
1955 }
1956 }
1957 catch(std::bad_alloc&)
1958 {
1959 return error(GL_OUT_OF_MEMORY, -1);
1960 }
1961
1962 return -1;
1963}
1964
1965void __stdcall glGetBooleanv(GLenum pname, GLboolean* params)
1966{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001967 TRACE("(GLenum pname = 0x%X, GLboolean* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001968
1969 try
1970 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00001971 gl::Context *context = gl::getContext();
1972
1973 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001974 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00001975 if (!(context->getBooleanv(pname, params)))
1976 {
1977 GLenum nativeType;
1978 unsigned int numParams = 0;
1979 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
1980 return error(GL_INVALID_ENUM);
1981
1982 if (numParams == 0)
1983 return; // it is known that the pname is valid, but there are no parameters to return
1984
1985 if (nativeType == GL_FLOAT)
1986 {
1987 GLfloat *floatParams = NULL;
1988 floatParams = new GLfloat[numParams];
1989
1990 context->getFloatv(pname, floatParams);
1991
1992 for (unsigned int i = 0; i < numParams; ++i)
1993 {
1994 if (floatParams[i] == 0.0f)
1995 params[i] = GL_FALSE;
1996 else
1997 params[i] = GL_TRUE;
1998 }
1999
2000 delete [] floatParams;
2001 }
2002 else if (nativeType == GL_INT)
2003 {
2004 GLint *intParams = NULL;
2005 intParams = new GLint[numParams];
2006
2007 context->getIntegerv(pname, intParams);
2008
2009 for (unsigned int i = 0; i < numParams; ++i)
2010 {
2011 if (intParams[i] == 0)
2012 params[i] = GL_FALSE;
2013 else
2014 params[i] = GL_TRUE;
2015 }
2016
2017 delete [] intParams;
2018 }
2019 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002020 }
2021 }
2022 catch(std::bad_alloc&)
2023 {
2024 return error(GL_OUT_OF_MEMORY);
2025 }
2026}
2027
2028void __stdcall glGetBufferParameteriv(GLenum target, GLenum pname, GLint* params)
2029{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002030 TRACE("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", target, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002031
2032 try
2033 {
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002034 gl::Context *context = gl::getContext();
2035
2036 if (context)
2037 {
2038 gl::Buffer *buffer;
2039
2040 switch (target)
2041 {
2042 case GL_ARRAY_BUFFER:
2043 buffer = context->getArrayBuffer();
2044 break;
2045 case GL_ELEMENT_ARRAY_BUFFER:
2046 buffer = context->getElementArrayBuffer();
2047 break;
2048 default: return error(GL_INVALID_ENUM);
2049 }
2050
2051 if (!buffer)
2052 {
2053 // A null buffer means that "0" is bound to the requested buffer target
2054 return error(GL_INVALID_OPERATION);
2055 }
2056
2057 switch (pname)
2058 {
2059 case GL_BUFFER_USAGE:
2060 *params = buffer->usage();
2061 break;
2062 case GL_BUFFER_SIZE:
2063 *params = buffer->size();
2064 break;
2065 default: return error(GL_INVALID_ENUM);
2066 }
2067 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002068 }
2069 catch(std::bad_alloc&)
2070 {
2071 return error(GL_OUT_OF_MEMORY);
2072 }
2073}
2074
2075GLenum __stdcall glGetError(void)
2076{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002077 TRACE("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002078
2079 gl::Context *context = gl::getContext();
2080
2081 if (context)
2082 {
2083 return context->getError();
2084 }
2085
2086 return GL_NO_ERROR;
2087}
2088
2089void __stdcall glGetFloatv(GLenum pname, GLfloat* params)
2090{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002091 TRACE("(GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002092
2093 try
2094 {
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00002095 gl::Context *context = gl::getContext();
2096
2097 if (context)
2098 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002099 if (!(context->getFloatv(pname, params)))
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00002100 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002101 GLenum nativeType;
2102 unsigned int numParams = 0;
2103 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
2104 return error(GL_INVALID_ENUM);
2105
2106 if (numParams == 0)
2107 return; // it is known that the pname is valid, but that there are no parameters to return.
2108
2109 if (nativeType == GL_BOOL)
2110 {
2111 GLboolean *boolParams = NULL;
2112 boolParams = new GLboolean[numParams];
2113
2114 context->getBooleanv(pname, boolParams);
2115
2116 for (unsigned int i = 0; i < numParams; ++i)
2117 {
2118 if (boolParams[i] == GL_FALSE)
2119 params[i] = 0.0f;
2120 else
2121 params[i] = 1.0f;
2122 }
2123
2124 delete [] boolParams;
2125 }
2126 else if (nativeType == GL_INT)
2127 {
2128 GLint *intParams = NULL;
2129 intParams = new GLint[numParams];
2130
2131 context->getIntegerv(pname, intParams);
2132
2133 for (unsigned int i = 0; i < numParams; ++i)
2134 {
2135 params[i] = (GLfloat)intParams[i];
2136 }
2137
2138 delete [] intParams;
2139 }
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00002140 }
2141 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002142 }
2143 catch(std::bad_alloc&)
2144 {
2145 return error(GL_OUT_OF_MEMORY);
2146 }
2147}
2148
2149void __stdcall glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params)
2150{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002151 TRACE("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
2152 target, attachment, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002153
2154 try
2155 {
2156 gl::Context *context = gl::getContext();
2157
2158 if (context)
2159 {
2160 if (context->framebuffer == 0)
2161 {
2162 return error(GL_INVALID_OPERATION);
2163 }
2164
2165 UNIMPLEMENTED(); // FIXME
2166 }
2167 }
2168 catch(std::bad_alloc&)
2169 {
2170 return error(GL_OUT_OF_MEMORY);
2171 }
2172}
2173
2174void __stdcall glGetIntegerv(GLenum pname, GLint* params)
2175{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002176 TRACE("(GLenum pname = 0x%X, GLint* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002177
2178 try
2179 {
2180 gl::Context *context = gl::getContext();
2181
2182 if (context)
2183 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002184 if (!(context->getIntegerv(pname, params)))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002185 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002186 GLenum nativeType;
2187 unsigned int numParams = 0;
2188 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
2189 return error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002190
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002191 if (numParams == 0)
2192 return; // it is known that pname is valid, but there are no parameters to return
2193
2194 if (nativeType == GL_BOOL)
2195 {
2196 GLboolean *boolParams = NULL;
2197 boolParams = new GLboolean[numParams];
2198
2199 context->getBooleanv(pname, boolParams);
2200
2201 for (unsigned int i = 0; i < numParams; ++i)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002202 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002203 if (boolParams[i] == GL_FALSE)
2204 params[i] = 0;
2205 else
2206 params[i] = 1;
2207 }
2208
2209 delete [] boolParams;
2210 }
2211 else if (nativeType == GL_FLOAT)
2212 {
2213 GLfloat *floatParams = NULL;
2214 floatParams = new GLfloat[numParams];
2215
2216 context->getFloatv(pname, floatParams);
2217
2218 for (unsigned int i = 0; i < numParams; ++i)
2219 {
2220 if (pname == GL_DEPTH_RANGE || pname == GL_COLOR_CLEAR_VALUE || pname == GL_DEPTH_CLEAR_VALUE)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002221 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002222 params[i] = (GLint)(((GLfloat)(0xFFFFFFFF) * floatParams[i] - 1.0f) / 2.0f);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002223 }
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002224 else
2225 params[i] = (GLint)(floatParams[i] > 0.0f ? floor(floatParams[i] + 0.5) : ceil(floatParams[i] - 0.5));
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002226 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002227
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002228 delete [] floatParams;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002229 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002230 }
2231 }
2232 }
2233 catch(std::bad_alloc&)
2234 {
2235 return error(GL_OUT_OF_MEMORY);
2236 }
2237}
2238
2239void __stdcall glGetProgramiv(GLuint program, GLenum pname, GLint* params)
2240{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002241 TRACE("(GLuint program = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", program, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002242
2243 try
2244 {
2245 gl::Context *context = gl::getContext();
2246
2247 if (context)
2248 {
2249 gl::Program *programObject = context->getProgram(program);
2250
2251 if (!programObject)
2252 {
2253 return error(GL_INVALID_VALUE);
2254 }
2255
2256 switch (pname)
2257 {
2258 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00002259 *params = programObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002260 return;
2261 case GL_LINK_STATUS:
2262 *params = programObject->isLinked();
2263 return;
2264 case GL_VALIDATE_STATUS:
2265 UNIMPLEMENTED(); // FIXME
2266 *params = GL_TRUE;
2267 return;
2268 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00002269 *params = programObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002270 return;
2271 case GL_ATTACHED_SHADERS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00002272 *params = programObject->getAttachedShadersCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002273 return;
2274 case GL_ACTIVE_ATTRIBUTES:
2275 UNIMPLEMENTED(); // FIXME
2276 *params = 0;
2277 return;
2278 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
2279 UNIMPLEMENTED(); // FIXME
2280 *params = 0;
2281 return;
2282 case GL_ACTIVE_UNIFORMS:
2283 UNIMPLEMENTED(); // FIXME
2284 *params = 0;
2285 return;
2286 case GL_ACTIVE_UNIFORM_MAX_LENGTH:
2287 UNIMPLEMENTED(); // FIXME
2288 *params = 0;
2289 return;
2290 default:
2291 return error(GL_INVALID_ENUM);
2292 }
2293 }
2294 }
2295 catch(std::bad_alloc&)
2296 {
2297 return error(GL_OUT_OF_MEMORY);
2298 }
2299}
2300
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002301void __stdcall glGetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002302{
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002303 TRACE("(GLuint program = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, GLchar* infolog = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002304 program, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002305
2306 try
2307 {
2308 if (bufsize < 0)
2309 {
2310 return error(GL_INVALID_VALUE);
2311 }
2312
daniel@transgaming.comcba50572010-03-28 19:36:09 +00002313 gl::Context *context = gl::getContext();
2314
2315 if (context)
2316 {
2317 gl::Program *programObject = context->getProgram(program);
2318
2319 if (!programObject)
2320 {
2321 return error(GL_INVALID_VALUE);
2322 }
2323
2324 programObject->getInfoLog(bufsize, length, infolog);
2325 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002326 }
2327 catch(std::bad_alloc&)
2328 {
2329 return error(GL_OUT_OF_MEMORY);
2330 }
2331}
2332
2333void __stdcall glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params)
2334{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002335 TRACE("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", target, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002336
2337 try
2338 {
2339 UNIMPLEMENTED(); // FIXME
2340 }
2341 catch(std::bad_alloc&)
2342 {
2343 return error(GL_OUT_OF_MEMORY);
2344 }
2345}
2346
2347void __stdcall glGetShaderiv(GLuint shader, GLenum pname, GLint* params)
2348{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002349 TRACE("(GLuint shader = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", shader, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002350
2351 try
2352 {
2353 gl::Context *context = gl::getContext();
2354
2355 if (context)
2356 {
2357 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00002358
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002359 if (!shaderObject)
2360 {
2361 return error(GL_INVALID_VALUE);
2362 }
2363
2364 switch (pname)
2365 {
2366 case GL_SHADER_TYPE:
2367 *params = shaderObject->getType();
2368 return;
2369 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00002370 *params = shaderObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002371 return;
2372 case GL_COMPILE_STATUS:
2373 *params = shaderObject->isCompiled() ? GL_TRUE : GL_FALSE;
2374 return;
2375 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00002376 *params = shaderObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002377 return;
2378 case GL_SHADER_SOURCE_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00002379 *params = shaderObject->getSourceLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002380 return;
2381 default:
2382 return error(GL_INVALID_ENUM);
2383 }
2384 }
2385 }
2386 catch(std::bad_alloc&)
2387 {
2388 return error(GL_OUT_OF_MEMORY);
2389 }
2390}
2391
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002392void __stdcall glGetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002393{
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002394 TRACE("(GLuint shader = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, GLchar* infolog = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002395 shader, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002396
2397 try
2398 {
2399 if (bufsize < 0)
2400 {
2401 return error(GL_INVALID_VALUE);
2402 }
2403
daniel@transgaming.comcba50572010-03-28 19:36:09 +00002404 gl::Context *context = gl::getContext();
2405
2406 if (context)
2407 {
2408 gl::Shader *shaderObject = context->getShader(shader);
2409
2410 if (!shaderObject)
2411 {
2412 return error(GL_INVALID_VALUE);
2413 }
2414
2415 shaderObject->getInfoLog(bufsize, length, infolog);
2416 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002417 }
2418 catch(std::bad_alloc&)
2419 {
2420 return error(GL_OUT_OF_MEMORY);
2421 }
2422}
2423
2424void __stdcall glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision)
2425{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002426 TRACE("(GLenum shadertype = 0x%X, GLenum precisiontype = 0x%X, GLint* range = 0x%0.8p, GLint* precision = 0x%0.8p)",
2427 shadertype, precisiontype, range, precision);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002428
2429 try
2430 {
daniel@transgaming.com6c785212010-03-30 03:36:17 +00002431 switch (shadertype)
2432 {
2433 case GL_VERTEX_SHADER:
2434 case GL_FRAGMENT_SHADER:
2435 break;
2436 default:
2437 return error(GL_INVALID_ENUM);
2438 }
2439
2440 switch (precisiontype)
2441 {
2442 case GL_LOW_FLOAT:
2443 case GL_MEDIUM_FLOAT:
2444 case GL_HIGH_FLOAT:
2445 // Assume IEEE 754 precision
2446 range[0] = 127;
2447 range[1] = 127;
2448 precision[0] = 23;
2449 precision[1] = 23;
2450 break;
2451 case GL_LOW_INT:
2452 case GL_MEDIUM_INT:
2453 case GL_HIGH_INT:
2454 // Some (most) hardware only supports single-precision floating-point numbers,
2455 // which can accurately represent integers up to +/-16777216
2456 range[0] = 24;
2457 range[1] = 24;
2458 precision[0] = 0;
2459 precision[1] = 0;
2460 break;
2461 default:
2462 return error(GL_INVALID_ENUM);
2463 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002464 }
2465 catch(std::bad_alloc&)
2466 {
2467 return error(GL_OUT_OF_MEMORY);
2468 }
2469}
2470
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002471void __stdcall glGetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002472{
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002473 TRACE("(GLuint shader = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, GLchar* source = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002474 shader, bufsize, length, source);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002475
2476 try
2477 {
2478 if (bufsize < 0)
2479 {
2480 return error(GL_INVALID_VALUE);
2481 }
2482
daniel@transgaming.comcba50572010-03-28 19:36:09 +00002483 gl::Context *context = gl::getContext();
2484
2485 if (context)
2486 {
2487 gl::Shader *shaderObject = context->getShader(shader);
2488
2489 if (!shaderObject)
2490 {
daniel@transgaming.com41187f12010-04-01 13:39:29 +00002491 return error(GL_INVALID_OPERATION);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00002492 }
2493
2494 shaderObject->getSource(bufsize, length, source);
2495 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002496 }
2497 catch(std::bad_alloc&)
2498 {
2499 return error(GL_OUT_OF_MEMORY);
2500 }
2501}
2502
2503const GLubyte* __stdcall glGetString(GLenum name)
2504{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002505 TRACE("(GLenum name = 0x%X)", name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002506
2507 try
2508 {
2509 switch (name)
2510 {
2511 case GL_VENDOR:
2512 return (GLubyte*)"TransGaming Inc.";
2513 case GL_RENDERER:
2514 return (GLubyte*)"ANGLE";
2515 case GL_VERSION:
2516 return (GLubyte*)"OpenGL ES 2.0 (git-devel "__DATE__ " " __TIME__")";
2517 case GL_SHADING_LANGUAGE_VERSION:
2518 return (GLubyte*)"OpenGL ES GLSL ES 1.00 (git-devel "__DATE__ " " __TIME__")";
2519 case GL_EXTENSIONS:
2520 return (GLubyte*)"";
2521 default:
2522 return error(GL_INVALID_ENUM, (GLubyte*)NULL);
2523 }
2524 }
2525 catch(std::bad_alloc&)
2526 {
2527 return error(GL_OUT_OF_MEMORY, (GLubyte*)NULL);
2528 }
2529
2530 return NULL;
2531}
2532
2533void __stdcall glGetTexParameterfv(GLenum target, GLenum pname, GLfloat* params)
2534{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002535 TRACE("(GLenum target = 0x%X, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", target, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002536
2537 try
2538 {
2539 UNIMPLEMENTED(); // FIXME
2540 }
2541 catch(std::bad_alloc&)
2542 {
2543 return error(GL_OUT_OF_MEMORY);
2544 }
2545}
2546
2547void __stdcall glGetTexParameteriv(GLenum target, GLenum pname, GLint* params)
2548{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002549 TRACE("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", target, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002550
2551 try
2552 {
2553 UNIMPLEMENTED(); // FIXME
2554 }
2555 catch(std::bad_alloc&)
2556 {
2557 return error(GL_OUT_OF_MEMORY);
2558 }
2559}
2560
2561void __stdcall glGetUniformfv(GLuint program, GLint location, GLfloat* params)
2562{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002563 TRACE("(GLuint program = %d, GLint location = %d, GLfloat* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002564
2565 try
2566 {
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00002567 gl::Context *context = gl::getContext();
2568
2569 if (context)
2570 {
2571 if (program == 0)
2572 {
2573 return error(GL_INVALID_VALUE);
2574 }
2575
2576 gl::Program *programObject = context->getProgram(program);
2577
2578 if (!programObject || !programObject->isLinked())
2579 {
2580 return error(GL_INVALID_OPERATION);
2581 }
2582
2583 if (!programObject->getUniformfv(location, params))
2584 {
2585 return error(GL_INVALID_OPERATION);
2586 }
2587 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002588 }
2589 catch(std::bad_alloc&)
2590 {
2591 return error(GL_OUT_OF_MEMORY);
2592 }
2593}
2594
2595void __stdcall glGetUniformiv(GLuint program, GLint location, GLint* params)
2596{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002597 TRACE("(GLuint program = %d, GLint location = %d, GLint* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002598
2599 try
2600 {
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00002601 gl::Context *context = gl::getContext();
2602
2603 if (context)
2604 {
2605 if (program == 0)
2606 {
2607 return error(GL_INVALID_VALUE);
2608 }
2609
2610 gl::Program *programObject = context->getProgram(program);
2611
2612 if (!programObject || !programObject->isLinked())
2613 {
2614 return error(GL_INVALID_OPERATION);
2615 }
2616
2617 if (!programObject)
2618 {
2619 return error(GL_INVALID_OPERATION);
2620 }
2621
2622 if (!programObject->getUniformiv(location, params))
2623 {
2624 return error(GL_INVALID_OPERATION);
2625 }
2626 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002627 }
2628 catch(std::bad_alloc&)
2629 {
2630 return error(GL_OUT_OF_MEMORY);
2631 }
2632}
2633
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002634int __stdcall glGetUniformLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002635{
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002636 TRACE("(GLuint program = %d, const GLchar* name = 0x%0.8p)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002637
2638 try
2639 {
2640 gl::Context *context = gl::getContext();
2641
2642 if (strstr(name, "gl_") == name)
2643 {
2644 return -1;
2645 }
2646
2647 if (context)
2648 {
2649 gl::Program *programObject = context->getProgram(program);
2650
2651 if (!programObject)
2652 {
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00002653 if (context->getShader(program))
2654 {
2655 return error(GL_INVALID_OPERATION, -1);
2656 }
2657 else
2658 {
2659 return error(GL_INVALID_VALUE, -1);
2660 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002661 }
2662
2663 if (!programObject->isLinked())
2664 {
2665 return error(GL_INVALID_OPERATION, -1);
2666 }
2667
2668 return programObject->getUniformLocation(name);
2669 }
2670 }
2671 catch(std::bad_alloc&)
2672 {
2673 return error(GL_OUT_OF_MEMORY, -1);
2674 }
2675
2676 return -1;
2677}
2678
2679void __stdcall glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params)
2680{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002681 TRACE("(GLuint index = %d, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002682
2683 try
2684 {
2685 if (index >= gl::MAX_VERTEX_ATTRIBS)
2686 {
2687 return error(GL_INVALID_VALUE);
2688 }
2689
2690 UNIMPLEMENTED(); // FIXME
2691 }
2692 catch(std::bad_alloc&)
2693 {
2694 return error(GL_OUT_OF_MEMORY);
2695 }
2696}
2697
2698void __stdcall glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params)
2699{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002700 TRACE("(GLuint index = %d, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002701
2702 try
2703 {
2704 if (index >= gl::MAX_VERTEX_ATTRIBS)
2705 {
2706 return error(GL_INVALID_VALUE);
2707 }
2708
2709 UNIMPLEMENTED(); // FIXME
2710 }
2711 catch(std::bad_alloc&)
2712 {
2713 return error(GL_OUT_OF_MEMORY);
2714 }
2715}
2716
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002717void __stdcall glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid** pointer)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002718{
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002719 TRACE("(GLuint index = %d, GLenum pname = 0x%X, GLvoid** pointer = 0x%0.8p)", index, pname, pointer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002720
2721 try
2722 {
2723 if (index >= gl::MAX_VERTEX_ATTRIBS)
2724 {
2725 return error(GL_INVALID_VALUE);
2726 }
2727
2728 UNIMPLEMENTED(); // FIXME
2729 }
2730 catch(std::bad_alloc&)
2731 {
2732 return error(GL_OUT_OF_MEMORY);
2733 }
2734}
2735
2736void __stdcall glHint(GLenum target, GLenum mode)
2737{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002738 TRACE("(GLenum target = 0x%X, GLenum mode = 0x%X)", target, mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002739
2740 try
2741 {
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00002742 switch (target)
2743 {
2744 case GL_GENERATE_MIPMAP_HINT:
2745 switch (mode)
2746 {
2747 case GL_FASTEST:
2748 case GL_NICEST:
2749 case GL_DONT_CARE:
2750 break;
2751 default:
2752 return error(GL_INVALID_ENUM);
2753 }
2754 break;
2755 default:
2756 return error(GL_INVALID_ENUM);
2757 }
2758
2759 gl::Context *context = gl::getContext();
2760 if (context)
2761 {
2762 if (target == GL_GENERATE_MIPMAP_HINT)
2763 context->generateMipmapHint = mode;
2764 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002765 }
2766 catch(std::bad_alloc&)
2767 {
2768 return error(GL_OUT_OF_MEMORY);
2769 }
2770}
2771
2772GLboolean __stdcall glIsBuffer(GLuint buffer)
2773{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002774 TRACE("(GLuint buffer = %d)", buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002775
2776 try
2777 {
2778 gl::Context *context = gl::getContext();
2779
2780 if (context && buffer)
2781 {
2782 gl::Buffer *bufferObject = context->getBuffer(buffer);
2783
2784 if (bufferObject)
2785 {
2786 return GL_TRUE;
2787 }
2788 }
2789 }
2790 catch(std::bad_alloc&)
2791 {
2792 return error(GL_OUT_OF_MEMORY, GL_FALSE);
2793 }
2794
2795 return GL_FALSE;
2796}
2797
2798GLboolean __stdcall glIsEnabled(GLenum cap)
2799{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002800 TRACE("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002801
2802 try
2803 {
2804 gl::Context *context = gl::getContext();
2805
2806 if (context)
2807 {
2808 switch (cap)
2809 {
2810 case GL_CULL_FACE: return context->cullFace;
2811 case GL_POLYGON_OFFSET_FILL: return context->polygonOffsetFill;
2812 case GL_SAMPLE_ALPHA_TO_COVERAGE: return context->sampleAlphaToCoverage;
2813 case GL_SAMPLE_COVERAGE: return context->sampleCoverage;
2814 case GL_SCISSOR_TEST: return context->scissorTest;
2815 case GL_STENCIL_TEST: return context->stencilTest;
2816 case GL_DEPTH_TEST: return context->depthTest;
2817 case GL_BLEND: return context->blend;
2818 case GL_DITHER: return context->dither;
2819 default:
2820 return error(GL_INVALID_ENUM, false);
2821 }
2822 }
2823 }
2824 catch(std::bad_alloc&)
2825 {
2826 return error(GL_OUT_OF_MEMORY, false);
2827 }
2828
2829 return false;
2830}
2831
2832GLboolean __stdcall glIsFramebuffer(GLuint framebuffer)
2833{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002834 TRACE("(GLuint framebuffer = %d)", framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002835
2836 try
2837 {
2838 gl::Context *context = gl::getContext();
2839
2840 if (context && framebuffer)
2841 {
2842 gl::Framebuffer *framebufferObject = context->getFramebuffer(framebuffer);
2843
2844 if (framebufferObject)
2845 {
2846 return GL_TRUE;
2847 }
2848 }
2849 }
2850 catch(std::bad_alloc&)
2851 {
2852 return error(GL_OUT_OF_MEMORY, GL_FALSE);
2853 }
2854
2855 return GL_FALSE;
2856}
2857
2858GLboolean __stdcall glIsProgram(GLuint program)
2859{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002860 TRACE("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002861
2862 try
2863 {
2864 gl::Context *context = gl::getContext();
2865
2866 if (context && program)
2867 {
2868 gl::Program *programObject = context->getProgram(program);
2869
2870 if (programObject)
2871 {
2872 return GL_TRUE;
2873 }
2874 }
2875 }
2876 catch(std::bad_alloc&)
2877 {
2878 return error(GL_OUT_OF_MEMORY, GL_FALSE);
2879 }
2880
2881 return GL_FALSE;
2882}
2883
2884GLboolean __stdcall glIsRenderbuffer(GLuint renderbuffer)
2885{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002886 TRACE("(GLuint renderbuffer = %d)", renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002887
2888 try
2889 {
2890 gl::Context *context = gl::getContext();
2891
2892 if (context && renderbuffer)
2893 {
2894 gl::Renderbuffer *renderbufferObject = context->getRenderbuffer(renderbuffer);
2895
2896 if (renderbufferObject)
2897 {
2898 return GL_TRUE;
2899 }
2900 }
2901 }
2902 catch(std::bad_alloc&)
2903 {
2904 return error(GL_OUT_OF_MEMORY, GL_FALSE);
2905 }
2906
2907 return GL_FALSE;
2908}
2909
2910GLboolean __stdcall glIsShader(GLuint shader)
2911{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002912 TRACE("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002913
2914 try
2915 {
2916 gl::Context *context = gl::getContext();
2917
2918 if (context && shader)
2919 {
2920 gl::Shader *shaderObject = context->getShader(shader);
2921
2922 if (shaderObject)
2923 {
2924 return GL_TRUE;
2925 }
2926 }
2927 }
2928 catch(std::bad_alloc&)
2929 {
2930 return error(GL_OUT_OF_MEMORY, GL_FALSE);
2931 }
2932
2933 return GL_FALSE;
2934}
2935
2936GLboolean __stdcall glIsTexture(GLuint texture)
2937{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002938 TRACE("(GLuint texture = %d)", texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002939
2940 try
2941 {
2942 gl::Context *context = gl::getContext();
2943
2944 if (context && texture)
2945 {
2946 gl::Texture *textureObject = context->getTexture(texture);
2947
2948 if (textureObject)
2949 {
2950 return GL_TRUE;
2951 }
2952 }
2953 }
2954 catch(std::bad_alloc&)
2955 {
2956 return error(GL_OUT_OF_MEMORY, GL_FALSE);
2957 }
2958
2959 return GL_FALSE;
2960}
2961
2962void __stdcall glLineWidth(GLfloat width)
2963{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002964 TRACE("(GLfloat width = %f)", width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002965
2966 try
2967 {
2968 if (width <= 0.0f)
2969 {
2970 return error(GL_INVALID_VALUE);
2971 }
2972
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00002973 gl::Context *context = gl::getContext();
2974
2975 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002976 {
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00002977 context->lineWidth = width;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002978 }
2979 }
2980 catch(std::bad_alloc&)
2981 {
2982 return error(GL_OUT_OF_MEMORY);
2983 }
2984}
2985
2986void __stdcall glLinkProgram(GLuint program)
2987{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002988 TRACE("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002989
2990 try
2991 {
2992 gl::Context *context = gl::getContext();
2993
2994 if (context)
2995 {
2996 gl::Program *programObject = context->getProgram(program);
2997
2998 if (!programObject)
2999 {
daniel@transgaming.com277b7142010-04-13 03:26:44 +00003000 if (context->getShader(program))
3001 {
3002 return error(GL_INVALID_OPERATION);
3003 }
3004 else
3005 {
3006 return error(GL_INVALID_VALUE);
3007 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003008 }
3009
3010 programObject->link();
3011 }
3012 }
3013 catch(std::bad_alloc&)
3014 {
3015 return error(GL_OUT_OF_MEMORY);
3016 }
3017}
3018
3019void __stdcall glPixelStorei(GLenum pname, GLint param)
3020{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003021 TRACE("(GLenum pname = 0x%X, GLint param = %d)", pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003022
3023 try
3024 {
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00003025 gl::Context *context = gl::getContext();
3026
3027 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003028 {
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00003029 switch (pname)
3030 {
3031 case GL_UNPACK_ALIGNMENT:
3032 if (param != 1 && param != 2 && param != 4 && param != 8)
3033 {
3034 return error(GL_INVALID_VALUE);
3035 }
3036
3037 context->unpackAlignment = param;
3038 break;
3039
3040 case GL_PACK_ALIGNMENT:
3041 if (param != 1 && param != 2 && param != 4 && param != 8)
3042 {
3043 return error(GL_INVALID_VALUE);
3044 }
3045
3046 context->packAlignment = param;
3047 break;
3048
3049 default:
3050 return error(GL_INVALID_ENUM);
3051 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003052 }
3053 }
3054 catch(std::bad_alloc&)
3055 {
3056 return error(GL_OUT_OF_MEMORY);
3057 }
3058}
3059
3060void __stdcall glPolygonOffset(GLfloat factor, GLfloat units)
3061{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003062 TRACE("(GLfloat factor = %f, GLfloat units = %f)", factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003063
3064 try
3065 {
3066 if (factor != 0.0f || units != 0.0f)
3067 {
3068 UNIMPLEMENTED(); // FIXME
3069 }
3070 }
3071 catch(std::bad_alloc&)
3072 {
3073 return error(GL_OUT_OF_MEMORY);
3074 }
3075}
3076
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003077void __stdcall glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003078{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003079 TRACE("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003080 "GLenum format = 0x%X, GLenum type = 0x%X, GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003081 x, y, width, height, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003082
3083 try
3084 {
3085 if (width < 0 || height < 0)
3086 {
3087 return error(GL_INVALID_VALUE);
3088 }
3089
3090 switch (format)
3091 {
3092 case GL_RGBA:
3093 switch (type)
3094 {
3095 case GL_UNSIGNED_BYTE:
3096 break;
3097 default:
3098 return error(GL_INVALID_OPERATION);
3099 }
3100 break;
3101 case gl::IMPLEMENTATION_COLOR_READ_FORMAT:
3102 switch (type)
3103 {
3104 case gl::IMPLEMENTATION_COLOR_READ_TYPE:
3105 break;
3106 default:
3107 return error(GL_INVALID_OPERATION);
3108 }
3109 break;
3110 default:
3111 return error(GL_INVALID_OPERATION);
3112 }
3113
3114 gl::Context *context = gl::getContext();
3115
3116 if (context)
3117 {
3118 context->readPixels(x, y, width, height, format, type, pixels);
3119 }
3120 }
3121 catch(std::bad_alloc&)
3122 {
3123 return error(GL_OUT_OF_MEMORY);
3124 }
3125}
3126
3127void __stdcall glReleaseShaderCompiler(void)
3128{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003129 TRACE("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003130
3131 try
3132 {
3133 gl::Shader::releaseCompiler();
3134 }
3135 catch(std::bad_alloc&)
3136 {
3137 return error(GL_OUT_OF_MEMORY);
3138 }
3139}
3140
3141void __stdcall glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
3142{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003143 TRACE("(GLenum target = 0x%X, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
3144 target, internalformat, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003145
3146 try
3147 {
3148 switch (target)
3149 {
3150 case GL_RENDERBUFFER:
3151 break;
3152 default:
3153 return error(GL_INVALID_ENUM);
3154 }
3155
3156 switch (internalformat)
3157 {
3158 case GL_DEPTH_COMPONENT16:
3159 case GL_RGBA4:
3160 case GL_RGB5_A1:
3161 case GL_RGB565:
3162 case GL_STENCIL_INDEX8:
3163 break;
3164 default:
3165 return error(GL_INVALID_ENUM);
3166 }
3167
3168 if (width < 0 || height < 0 || width > gl::MAX_RENDERBUFFER_SIZE || height > gl::MAX_RENDERBUFFER_SIZE)
3169 {
3170 return error(GL_INVALID_VALUE);
3171 }
3172
3173 gl::Context *context = gl::getContext();
3174
3175 if (context)
3176 {
3177 if (context->framebuffer == 0 || context->renderbuffer == 0)
3178 {
3179 return error(GL_INVALID_OPERATION);
3180 }
3181
3182 switch (internalformat)
3183 {
3184 case GL_DEPTH_COMPONENT16:
3185 context->setRenderbuffer(new gl::Depthbuffer(width, height));
3186 break;
3187 case GL_RGBA4:
3188 case GL_RGB5_A1:
3189 case GL_RGB565:
3190 UNIMPLEMENTED(); // FIXME
daniel@transgaming.com4a9d65c2010-03-08 21:30:56 +00003191 // context->setRenderbuffer(new Colorbuffer(renderTarget));
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003192 break;
3193 case GL_STENCIL_INDEX8:
daniel@transgaming.com4a9d65c2010-03-08 21:30:56 +00003194 context->setRenderbuffer(new gl::Stencilbuffer(width, height));
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003195 break;
3196 default:
3197 return error(GL_INVALID_ENUM);
3198 }
3199 }
3200 }
3201 catch(std::bad_alloc&)
3202 {
3203 return error(GL_OUT_OF_MEMORY);
3204 }
3205}
3206
3207void __stdcall glSampleCoverage(GLclampf value, GLboolean invert)
3208{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003209 TRACE("(GLclampf value = %f, GLboolean invert = %d)", value, invert);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003210
3211 try
3212 {
3213 gl::Context* context = gl::getContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00003214
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003215 if (context)
3216 {
3217 context->sampleCoverageValue = gl::clamp01(value);
3218 context->sampleCoverageInvert = invert;
3219 }
3220 }
3221 catch(std::bad_alloc&)
3222 {
3223 return error(GL_OUT_OF_MEMORY);
3224 }
3225}
3226
3227void __stdcall glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
3228{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003229 TRACE("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)", x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003230
3231 try
3232 {
3233 if (width < 0 || height < 0)
3234 {
3235 return error(GL_INVALID_VALUE);
3236 }
3237
3238 gl::Context* context = gl::getContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00003239
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003240 if (context)
3241 {
3242 context->scissorX = x;
3243 context->scissorY = y;
3244 context->scissorWidth = width;
3245 context->scissorHeight = height;
3246 }
3247 }
3248 catch(std::bad_alloc&)
3249 {
3250 return error(GL_OUT_OF_MEMORY);
3251 }
3252}
3253
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003254void __stdcall glShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryformat, const GLvoid* binary, GLsizei length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003255{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003256 TRACE("(GLsizei n = %d, const GLuint* shaders = 0x%0.8p, GLenum binaryformat = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003257 "const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003258 n, shaders, binaryformat, binary, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003259
3260 try
3261 {
3262 if (n < 0 || length < 0)
3263 {
3264 return error(GL_INVALID_VALUE);
3265 }
3266
3267 UNIMPLEMENTED(); // FIXME
3268 }
3269 catch(std::bad_alloc&)
3270 {
3271 return error(GL_OUT_OF_MEMORY);
3272 }
3273}
3274
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003275void __stdcall glShaderSource(GLuint shader, GLsizei count, const GLchar** string, const GLint* length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003276{
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003277 TRACE("(GLuint shader = %d, GLsizei count = %d, const GLchar** string = 0x%0.8p, const GLint* length = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003278 shader, count, string, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003279
3280 try
3281 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00003282 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003283 {
3284 return error(GL_INVALID_VALUE);
3285 }
3286
3287 gl::Context *context = gl::getContext();
3288
3289 if (context)
3290 {
3291 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00003292
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003293 if (!shaderObject)
3294 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00003295 if (context->getProgram(shader))
3296 {
3297 return error(GL_INVALID_OPERATION);
3298 }
3299 else
3300 {
3301 return error(GL_INVALID_VALUE);
3302 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003303 }
3304
3305 shaderObject->setSource(count, string, length);
3306 }
3307 }
3308 catch(std::bad_alloc&)
3309 {
3310 return error(GL_OUT_OF_MEMORY);
3311 }
3312}
3313
3314void __stdcall glStencilFunc(GLenum func, GLint ref, GLuint mask)
3315{
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00003316 glStencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003317}
3318
3319void __stdcall glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
3320{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003321 TRACE("(GLenum face = 0x%X, GLenum func = 0x%X, GLint ref = %d, GLuint mask = %d)", face, func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003322
3323 try
3324 {
3325 switch (face)
3326 {
3327 case GL_FRONT:
3328 case GL_BACK:
3329 case GL_FRONT_AND_BACK:
3330 break;
3331 default:
3332 return error(GL_INVALID_ENUM);
3333 }
3334
3335 switch (func)
3336 {
3337 case GL_NEVER:
3338 case GL_ALWAYS:
3339 case GL_LESS:
3340 case GL_LEQUAL:
3341 case GL_EQUAL:
3342 case GL_GEQUAL:
3343 case GL_GREATER:
3344 case GL_NOTEQUAL:
3345 break;
3346 default:
3347 return error(GL_INVALID_ENUM);
3348 }
3349
3350 gl::Context *context = gl::getContext();
3351
3352 if (context)
3353 {
3354 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
3355 {
3356 context->stencilFunc = func;
3357 context->stencilRef = ref;
3358 context->stencilMask = mask;
3359 }
3360
3361 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
3362 {
3363 context->stencilBackFunc = func;
3364 context->stencilBackRef = ref;
3365 context->stencilBackMask = mask;
3366 }
3367 }
3368 }
3369 catch(std::bad_alloc&)
3370 {
3371 return error(GL_OUT_OF_MEMORY);
3372 }
3373}
3374
3375void __stdcall glStencilMask(GLuint mask)
3376{
3377 glStencilMaskSeparate(GL_FRONT_AND_BACK, mask);
3378}
3379
3380void __stdcall glStencilMaskSeparate(GLenum face, GLuint mask)
3381{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003382 TRACE("(GLenum face = 0x%X, GLuint mask = %d)", face, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003383
3384 try
3385 {
3386 switch (face)
3387 {
3388 case GL_FRONT:
3389 case GL_BACK:
3390 case GL_FRONT_AND_BACK:
3391 break;
3392 default:
3393 return error(GL_INVALID_ENUM);
3394 }
3395
3396 gl::Context *context = gl::getContext();
3397
3398 if (context)
3399 {
3400 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
3401 {
3402 context->stencilWritemask = mask;
3403 }
3404
3405 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
3406 {
3407 context->stencilBackWritemask = mask;
3408 }
3409 }
3410 }
3411 catch(std::bad_alloc&)
3412 {
3413 return error(GL_OUT_OF_MEMORY);
3414 }
3415}
3416
3417void __stdcall glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
3418{
3419 glStencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
3420}
3421
3422void __stdcall glStencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
3423{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003424 TRACE("(GLenum face = 0x%X, GLenum fail = 0x%X, GLenum zfail = 0x%X, GLenum zpas = 0x%Xs)",
3425 face, fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003426
3427 try
3428 {
3429 switch (face)
3430 {
3431 case GL_FRONT:
3432 case GL_BACK:
3433 case GL_FRONT_AND_BACK:
3434 break;
3435 default:
3436 return error(GL_INVALID_ENUM);
3437 }
3438
3439 switch (fail)
3440 {
3441 case GL_ZERO:
3442 case GL_KEEP:
3443 case GL_REPLACE:
3444 case GL_INCR:
3445 case GL_DECR:
3446 case GL_INVERT:
3447 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00003448 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003449 break;
3450 default:
3451 return error(GL_INVALID_ENUM);
3452 }
3453
3454 switch (zfail)
3455 {
3456 case GL_ZERO:
3457 case GL_KEEP:
3458 case GL_REPLACE:
3459 case GL_INCR:
3460 case GL_DECR:
3461 case GL_INVERT:
3462 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00003463 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003464 break;
3465 default:
3466 return error(GL_INVALID_ENUM);
3467 }
3468
3469 switch (zpass)
3470 {
3471 case GL_ZERO:
3472 case GL_KEEP:
3473 case GL_REPLACE:
3474 case GL_INCR:
3475 case GL_DECR:
3476 case GL_INVERT:
3477 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00003478 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003479 break;
3480 default:
3481 return error(GL_INVALID_ENUM);
3482 }
3483
3484 gl::Context *context = gl::getContext();
3485
3486 if (context)
3487 {
3488 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
3489 {
3490 context->stencilFail = fail;
3491 context->stencilPassDepthFail = zfail;
3492 context->stencilPassDepthPass = zpass;
3493 }
3494
3495 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
3496 {
3497 context->stencilBackFail = fail;
3498 context->stencilBackPassDepthFail = zfail;
3499 context->stencilBackPassDepthPass = zpass;
3500 }
3501 }
3502 }
3503 catch(std::bad_alloc&)
3504 {
3505 return error(GL_OUT_OF_MEMORY);
3506 }
3507}
3508
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003509void __stdcall glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height,
3510 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003511{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003512 TRACE("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, GLsizei height = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003513 "GLint border = %d, GLenum format = 0x%X, GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003514 target, level, internalformat, width, height, border, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003515
3516 try
3517 {
3518 if (level < 0 || width < 0 || height < 0)
3519 {
3520 return error(GL_INVALID_VALUE);
3521 }
3522
3523 if (level > 0 && (!gl::isPow2(width) || !gl::isPow2(height)))
3524 {
3525 return error(GL_INVALID_VALUE);
3526 }
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00003527
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003528 switch (target)
3529 {
3530 case GL_TEXTURE_2D:
3531 if (width > (gl::MAX_TEXTURE_SIZE >> level) || height > (gl::MAX_TEXTURE_SIZE >> level))
3532 {
3533 return error(GL_INVALID_VALUE);
3534 }
3535 break;
3536 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
3537 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
3538 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
3539 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
3540 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
3541 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com34dc3e82010-04-15 20:45:02 +00003542 if (width != height)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003543 {
3544 return error(GL_INVALID_VALUE);
3545 }
3546
3547 if (width > (gl::MAX_CUBE_MAP_TEXTURE_SIZE >> level) || height > (gl::MAX_CUBE_MAP_TEXTURE_SIZE >> level))
3548 {
3549 return error(GL_INVALID_VALUE);
3550 }
3551 break;
3552 default:
3553 return error(GL_INVALID_ENUM);
3554 }
3555
3556 if (internalformat != format)
3557 {
3558 return error(GL_INVALID_OPERATION);
3559 }
3560
3561 switch (internalformat)
3562 {
3563 case GL_ALPHA:
3564 case GL_LUMINANCE:
3565 case GL_LUMINANCE_ALPHA:
3566 switch (type)
3567 {
3568 case GL_UNSIGNED_BYTE:
3569 break;
3570 default:
3571 return error(GL_INVALID_ENUM);
3572 }
3573 break;
3574 case GL_RGB:
3575 switch (type)
3576 {
3577 case GL_UNSIGNED_BYTE:
3578 case GL_UNSIGNED_SHORT_5_6_5:
3579 break;
3580 default:
3581 return error(GL_INVALID_ENUM);
3582 }
3583 break;
3584 case GL_RGBA:
3585 switch (type)
3586 {
3587 case GL_UNSIGNED_BYTE:
3588 case GL_UNSIGNED_SHORT_4_4_4_4:
3589 case GL_UNSIGNED_SHORT_5_5_5_1:
3590 break;
3591 default:
3592 return error(GL_INVALID_ENUM);
3593 }
3594 break;
3595 default:
3596 return error(GL_INVALID_VALUE);
3597 }
3598
3599 if (border != 0)
3600 {
3601 return error(GL_INVALID_VALUE);
3602 }
3603
3604 gl::Context *context = gl::getContext();
3605
3606 if (context)
3607 {
3608 if (target == GL_TEXTURE_2D)
3609 {
3610 gl::Texture2D *texture = context->getTexture2D();
3611
3612 if (!texture)
3613 {
3614 return error(GL_INVALID_OPERATION);
3615 }
3616
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00003617 texture->setImage(level, internalformat, width, height, format, type, context->unpackAlignment, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003618 }
3619 else
3620 {
3621 gl::TextureCubeMap *texture = context->getTextureCubeMap();
3622
3623 if (!texture)
3624 {
3625 return error(GL_INVALID_OPERATION);
3626 }
3627
3628 switch (target)
3629 {
3630 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00003631 texture->setImagePosX(level, internalformat, width, height, format, type, context->unpackAlignment, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003632 break;
3633 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00003634 texture->setImageNegX(level, internalformat, width, height, format, type, context->unpackAlignment, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003635 break;
3636 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00003637 texture->setImagePosY(level, internalformat, width, height, format, type, context->unpackAlignment, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003638 break;
3639 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00003640 texture->setImageNegY(level, internalformat, width, height, format, type, context->unpackAlignment, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003641 break;
3642 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00003643 texture->setImagePosZ(level, internalformat, width, height, format, type, context->unpackAlignment, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003644 break;
3645 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00003646 texture->setImageNegZ(level, internalformat, width, height, format, type, context->unpackAlignment, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003647 break;
3648 default: UNREACHABLE();
3649 }
3650 }
3651 }
3652 }
3653 catch(std::bad_alloc&)
3654 {
3655 return error(GL_OUT_OF_MEMORY);
3656 }
3657}
3658
3659void __stdcall glTexParameterf(GLenum target, GLenum pname, GLfloat param)
3660{
3661 glTexParameteri(target, pname, (GLint)param);
3662}
3663
3664void __stdcall glTexParameterfv(GLenum target, GLenum pname, const GLfloat* params)
3665{
3666 glTexParameteri(target, pname, (GLint)*params);
3667}
3668
3669void __stdcall glTexParameteri(GLenum target, GLenum pname, GLint param)
3670{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003671 TRACE("(GLenum target = 0x%X, GLenum pname = 0x%X, GLfloat param = %f)", target, pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003672
3673 try
3674 {
3675 gl::Context *context = gl::getContext();
3676
3677 if (context)
3678 {
3679 gl::Texture *texture;
3680
3681 switch (target)
3682 {
3683 case GL_TEXTURE_2D:
3684 texture = context->getTexture2D();
3685 break;
3686 case GL_TEXTURE_CUBE_MAP:
3687 texture = context->getTextureCubeMap();
3688 break;
3689 default:
3690 return error(GL_INVALID_ENUM);
3691 }
3692
3693 switch (pname)
3694 {
3695 case GL_TEXTURE_WRAP_S:
3696 if (!texture->setWrapS((GLenum)param))
3697 {
3698 return error(GL_INVALID_ENUM);
3699 }
3700 break;
3701 case GL_TEXTURE_WRAP_T:
3702 if (!texture->setWrapT((GLenum)param))
3703 {
3704 return error(GL_INVALID_ENUM);
3705 }
3706 break;
3707 case GL_TEXTURE_MIN_FILTER:
3708 if (!texture->setMinFilter((GLenum)param))
3709 {
3710 return error(GL_INVALID_ENUM);
3711 }
3712 break;
3713 case GL_TEXTURE_MAG_FILTER:
3714 if (!texture->setMagFilter((GLenum)param))
3715 {
3716 return error(GL_INVALID_ENUM);
3717 }
3718 break;
3719 default:
3720 return error(GL_INVALID_ENUM);
3721 }
3722 }
3723 }
3724 catch(std::bad_alloc&)
3725 {
3726 return error(GL_OUT_OF_MEMORY);
3727 }
3728}
3729
3730void __stdcall glTexParameteriv(GLenum target, GLenum pname, const GLint* params)
3731{
3732 glTexParameteri(target, pname, *params);
3733}
3734
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003735void __stdcall glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
3736 GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003737{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003738 TRACE("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
3739 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, GLenum type = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003740 "const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003741 target, level, xoffset, yoffset, width, height, format, type, pixels);
3742
3743 try
3744 {
daniel@transgaming.com00c75962010-03-11 20:36:15 +00003745 if (target != GL_TEXTURE_2D && !es2dx::IsCubemapTextureTarget(target))
3746 {
3747 return error(GL_INVALID_ENUM);
3748 }
3749
3750 if (level < 0 || level > gl::MAX_TEXTURE_LEVELS || xoffset < 0 || yoffset < 0 || width < 0 || height < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003751 {
3752 return error(GL_INVALID_VALUE);
3753 }
3754
daniel@transgaming.com00c75962010-03-11 20:36:15 +00003755 if (std::numeric_limits<GLsizei>::max() - xoffset < width || std::numeric_limits<GLsizei>::max() - yoffset < height)
3756 {
3757 return error(GL_INVALID_VALUE);
3758 }
3759
3760 if (!es2dx::CheckTextureFormatType(format, type))
3761 {
3762 return error(GL_INVALID_ENUM);
3763 }
3764
3765 if (width == 0 || height == 0 || pixels == NULL)
3766 {
3767 return;
3768 }
3769
3770 gl::Context *context = gl::getContext();
3771
3772 if (context)
3773 {
3774 if (target == GL_TEXTURE_2D)
3775 {
3776 gl::Texture2D *texture = context->getTexture2D();
3777
3778 if (!texture)
3779 {
3780 return error(GL_INVALID_OPERATION);
3781 }
3782
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00003783 texture->subImage(level, xoffset, yoffset, width, height, format, type, context->unpackAlignment, pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00003784 }
3785 else if (es2dx::IsCubemapTextureTarget(target))
3786 {
3787 gl::TextureCubeMap *texture = context->getTextureCubeMap();
3788
3789 if (!texture)
3790 {
3791 return error(GL_INVALID_OPERATION);
3792 }
3793
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00003794 texture->subImage(target, level, xoffset, yoffset, width, height, format, type, context->unpackAlignment, pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00003795 }
3796 else
3797 {
3798 UNREACHABLE();
3799 }
3800 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003801 }
3802 catch(std::bad_alloc&)
3803 {
3804 return error(GL_OUT_OF_MEMORY);
3805 }
3806}
3807
3808void __stdcall glUniform1f(GLint location, GLfloat x)
3809{
3810 glUniform1fv(location, 1, &x);
3811}
3812
3813void __stdcall glUniform1fv(GLint location, GLsizei count, const GLfloat* v)
3814{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003815 TRACE("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003816
3817 try
3818 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003819 if (count < 0)
3820 {
3821 return error(GL_INVALID_VALUE);
3822 }
3823
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00003824 if (location == -1)
3825 {
3826 return;
3827 }
3828
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003829 gl::Context *context = gl::getContext();
3830
3831 if (context)
3832 {
3833 gl::Program *program = context->getCurrentProgram();
3834
3835 if (!program)
3836 {
3837 return error(GL_INVALID_OPERATION);
3838 }
3839
3840 if (!program->setUniform1fv(location, count, v))
3841 {
3842 return error(GL_INVALID_OPERATION);
3843 }
3844 }
3845 }
3846 catch(std::bad_alloc&)
3847 {
3848 return error(GL_OUT_OF_MEMORY);
3849 }
3850}
3851
3852void __stdcall glUniform1i(GLint location, GLint x)
3853{
3854 glUniform1iv(location, 1, &x);
3855}
3856
3857void __stdcall glUniform1iv(GLint location, GLsizei count, const GLint* v)
3858{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003859 TRACE("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003860
3861 try
3862 {
3863 if (count < 0)
3864 {
3865 return error(GL_INVALID_VALUE);
3866 }
3867
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00003868 if (location == -1)
3869 {
3870 return;
3871 }
3872
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003873 gl::Context *context = gl::getContext();
3874
3875 if (context)
3876 {
3877 gl::Program *program = context->getCurrentProgram();
3878
3879 if (!program)
3880 {
3881 return error(GL_INVALID_OPERATION);
3882 }
3883
3884 if (!program->setUniform1iv(location, count, v))
3885 {
3886 return error(GL_INVALID_OPERATION);
3887 }
3888 }
3889 }
3890 catch(std::bad_alloc&)
3891 {
3892 return error(GL_OUT_OF_MEMORY);
3893 }
3894}
3895
3896void __stdcall glUniform2f(GLint location, GLfloat x, GLfloat y)
3897{
3898 GLfloat xy[2] = {x, y};
3899
3900 glUniform2fv(location, 1, (GLfloat*)&xy);
3901}
3902
3903void __stdcall glUniform2fv(GLint location, GLsizei count, const GLfloat* v)
3904{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003905 TRACE("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003906
3907 try
3908 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003909 if (count < 0)
3910 {
3911 return error(GL_INVALID_VALUE);
3912 }
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00003913
3914 if (location == -1)
3915 {
3916 return;
3917 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003918
3919 gl::Context *context = gl::getContext();
3920
3921 if (context)
3922 {
3923 gl::Program *program = context->getCurrentProgram();
3924
3925 if (!program)
3926 {
3927 return error(GL_INVALID_OPERATION);
3928 }
3929
3930 if (!program->setUniform2fv(location, count, v))
3931 {
3932 return error(GL_INVALID_OPERATION);
3933 }
3934 }
3935 }
3936 catch(std::bad_alloc&)
3937 {
3938 return error(GL_OUT_OF_MEMORY);
3939 }
3940}
3941
3942void __stdcall glUniform2i(GLint location, GLint x, GLint y)
3943{
3944 GLint xy[4] = {x, y};
3945
3946 glUniform2iv(location, 1, (GLint*)&xy);
3947}
3948
3949void __stdcall glUniform2iv(GLint location, GLsizei count, const GLint* v)
3950{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003951 TRACE("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003952
3953 try
3954 {
3955 if (count < 0)
3956 {
3957 return error(GL_INVALID_VALUE);
3958 }
3959
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00003960 if (location == -1)
3961 {
3962 return;
3963 }
3964
3965 gl::Context *context = gl::getContext();
3966
3967 if (context)
3968 {
3969 gl::Program *program = context->getCurrentProgram();
3970
3971 if (!program)
3972 {
3973 return error(GL_INVALID_OPERATION);
3974 }
3975
3976 if (!program->setUniform2iv(location, count, v))
3977 {
3978 return error(GL_INVALID_OPERATION);
3979 }
3980 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003981 }
3982 catch(std::bad_alloc&)
3983 {
3984 return error(GL_OUT_OF_MEMORY);
3985 }
3986}
3987
3988void __stdcall glUniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
3989{
3990 GLfloat xyz[3] = {x, y, z};
3991
3992 glUniform3fv(location, 1, (GLfloat*)&xyz);
3993}
3994
3995void __stdcall glUniform3fv(GLint location, GLsizei count, const GLfloat* v)
3996{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003997 TRACE("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003998
3999 try
4000 {
4001 if (count < 0)
4002 {
4003 return error(GL_INVALID_VALUE);
4004 }
4005
4006 if (location == -1)
4007 {
4008 return;
4009 }
4010
4011 gl::Context *context = gl::getContext();
4012
4013 if (context)
4014 {
4015 gl::Program *program = context->getCurrentProgram();
4016
4017 if (!program)
4018 {
4019 return error(GL_INVALID_OPERATION);
4020 }
4021
4022 if (!program->setUniform3fv(location, count, v))
4023 {
4024 return error(GL_INVALID_OPERATION);
4025 }
4026 }
4027 }
4028 catch(std::bad_alloc&)
4029 {
4030 return error(GL_OUT_OF_MEMORY);
4031 }
4032}
4033
4034void __stdcall glUniform3i(GLint location, GLint x, GLint y, GLint z)
4035{
4036 GLint xyz[3] = {x, y, z};
4037
4038 glUniform3iv(location, 1, (GLint*)&xyz);
4039}
4040
4041void __stdcall glUniform3iv(GLint location, GLsizei count, const GLint* v)
4042{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004043 TRACE("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004044
4045 try
4046 {
4047 if (count < 0)
4048 {
4049 return error(GL_INVALID_VALUE);
4050 }
4051
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00004052 if (location == -1)
4053 {
4054 return;
4055 }
4056
4057 gl::Context *context = gl::getContext();
4058
4059 if (context)
4060 {
4061 gl::Program *program = context->getCurrentProgram();
4062
4063 if (!program)
4064 {
4065 return error(GL_INVALID_OPERATION);
4066 }
4067
4068 if (!program->setUniform3iv(location, count, v))
4069 {
4070 return error(GL_INVALID_OPERATION);
4071 }
4072 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004073 }
4074 catch(std::bad_alloc&)
4075 {
4076 return error(GL_OUT_OF_MEMORY);
4077 }
4078}
4079
4080void __stdcall glUniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
4081{
4082 GLfloat xyzw[4] = {x, y, z, w};
4083
4084 glUniform4fv(location, 1, (GLfloat*)&xyzw);
4085}
4086
4087void __stdcall glUniform4fv(GLint location, GLsizei count, const GLfloat* v)
4088{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004089 TRACE("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004090
4091 try
4092 {
4093 if (count < 0)
4094 {
4095 return error(GL_INVALID_VALUE);
4096 }
4097
4098 if (location == -1)
4099 {
4100 return;
4101 }
4102
4103 gl::Context *context = gl::getContext();
4104
4105 if (context)
4106 {
4107 gl::Program *program = context->getCurrentProgram();
4108
4109 if (!program)
4110 {
4111 return error(GL_INVALID_OPERATION);
4112 }
4113
4114 if (!program->setUniform4fv(location, count, v))
4115 {
4116 return error(GL_INVALID_OPERATION);
4117 }
4118 }
4119 }
4120 catch(std::bad_alloc&)
4121 {
4122 return error(GL_OUT_OF_MEMORY);
4123 }
4124}
4125
4126void __stdcall glUniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
4127{
4128 GLint xyzw[4] = {x, y, z, w};
4129
4130 glUniform4iv(location, 1, (GLint*)&xyzw);
4131}
4132
4133void __stdcall glUniform4iv(GLint location, GLsizei count, const GLint* v)
4134{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004135 TRACE("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004136
4137 try
4138 {
4139 if (count < 0)
4140 {
4141 return error(GL_INVALID_VALUE);
4142 }
4143
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00004144 if (location == -1)
4145 {
4146 return;
4147 }
4148
4149 gl::Context *context = gl::getContext();
4150
4151 if (context)
4152 {
4153 gl::Program *program = context->getCurrentProgram();
4154
4155 if (!program)
4156 {
4157 return error(GL_INVALID_OPERATION);
4158 }
4159
4160 if (!program->setUniform4iv(location, count, v))
4161 {
4162 return error(GL_INVALID_OPERATION);
4163 }
4164 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004165 }
4166 catch(std::bad_alloc&)
4167 {
4168 return error(GL_OUT_OF_MEMORY);
4169 }
4170}
4171
4172void __stdcall glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
4173{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004174 TRACE("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %d, const GLfloat* value = 0x%0.8p)",
4175 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004176
4177 try
4178 {
4179 if (count < 0 || transpose != GL_FALSE)
4180 {
4181 return error(GL_INVALID_VALUE);
4182 }
4183
4184 if (location == -1)
4185 {
4186 return;
4187 }
4188
4189 gl::Context *context = gl::getContext();
4190
4191 if (context)
4192 {
4193 gl::Program *program = context->getCurrentProgram();
4194
4195 if (!program)
4196 {
4197 return error(GL_INVALID_OPERATION);
4198 }
4199
4200 if (!program->setUniformMatrix2fv(location, count, value))
4201 {
4202 return error(GL_INVALID_OPERATION);
4203 }
4204 }
4205 }
4206 catch(std::bad_alloc&)
4207 {
4208 return error(GL_OUT_OF_MEMORY);
4209 }
4210}
4211
4212void __stdcall glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
4213{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004214 TRACE("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %d, const GLfloat* value = 0x%0.8p)",
4215 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004216
4217 try
4218 {
4219 if (count < 0 || transpose != GL_FALSE)
4220 {
4221 return error(GL_INVALID_VALUE);
4222 }
4223
4224 if (location == -1)
4225 {
4226 return;
4227 }
4228
4229 gl::Context *context = gl::getContext();
4230
4231 if (context)
4232 {
4233 gl::Program *program = context->getCurrentProgram();
4234
4235 if (!program)
4236 {
4237 return error(GL_INVALID_OPERATION);
4238 }
4239
4240 if (!program->setUniformMatrix3fv(location, count, value))
4241 {
4242 return error(GL_INVALID_OPERATION);
4243 }
4244 }
4245 }
4246 catch(std::bad_alloc&)
4247 {
4248 return error(GL_OUT_OF_MEMORY);
4249 }
4250}
4251
4252void __stdcall glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
4253{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004254 TRACE("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %d, const GLfloat* value = 0x%0.8p)",
4255 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004256
4257 try
4258 {
4259 if (count < 0 || transpose != GL_FALSE)
4260 {
4261 return error(GL_INVALID_VALUE);
4262 }
4263
4264 if (location == -1)
4265 {
4266 return;
4267 }
4268
4269 gl::Context *context = gl::getContext();
4270
4271 if (context)
4272 {
4273 gl::Program *program = context->getCurrentProgram();
4274
4275 if (!program)
4276 {
4277 return error(GL_INVALID_OPERATION);
4278 }
4279
4280 if (!program->setUniformMatrix4fv(location, count, value))
4281 {
4282 return error(GL_INVALID_OPERATION);
4283 }
4284 }
4285 }
4286 catch(std::bad_alloc&)
4287 {
4288 return error(GL_OUT_OF_MEMORY);
4289 }
4290}
4291
4292void __stdcall glUseProgram(GLuint program)
4293{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004294 TRACE("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004295
4296 try
4297 {
4298 gl::Context *context = gl::getContext();
4299
4300 if (context)
4301 {
4302 gl::Program *programObject = context->getProgram(program);
4303
daniel@transgaming.comc8478202010-04-13 19:53:35 +00004304 if (!programObject && program != 0)
4305 {
4306 if (context->getShader(program))
4307 {
4308 return error(GL_INVALID_OPERATION);
4309 }
4310 else
4311 {
4312 return error(GL_INVALID_VALUE);
4313 }
4314 }
4315
4316 if (program != 0 && !programObject->isLinked())
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004317 {
4318 return error(GL_INVALID_OPERATION);
4319 }
4320
4321 context->useProgram(program);
4322 }
4323 }
4324 catch(std::bad_alloc&)
4325 {
4326 return error(GL_OUT_OF_MEMORY);
4327 }
4328}
4329
4330void __stdcall glValidateProgram(GLuint program)
4331{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004332 TRACE("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004333
4334 try
4335 {
4336 UNIMPLEMENTED(); // FIXME
4337 }
4338 catch(std::bad_alloc&)
4339 {
4340 return error(GL_OUT_OF_MEMORY);
4341 }
4342}
4343
4344void __stdcall glVertexAttrib1f(GLuint index, GLfloat x)
4345{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004346 TRACE("(GLuint index = %d, GLfloat x = %f)", index, x);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004347
4348 try
4349 {
4350 if (index >= gl::MAX_VERTEX_ATTRIBS)
4351 {
4352 return error(GL_INVALID_VALUE);
4353 }
4354
4355 UNIMPLEMENTED(); // FIXME
4356 }
4357 catch(std::bad_alloc&)
4358 {
4359 return error(GL_OUT_OF_MEMORY);
4360 }
4361}
4362
4363void __stdcall glVertexAttrib1fv(GLuint index, const GLfloat* values)
4364{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004365 TRACE("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004366
4367 try
4368 {
4369 if (index >= gl::MAX_VERTEX_ATTRIBS)
4370 {
4371 return error(GL_INVALID_VALUE);
4372 }
4373
4374 UNIMPLEMENTED(); // FIXME
4375 }
4376 catch(std::bad_alloc&)
4377 {
4378 return error(GL_OUT_OF_MEMORY);
4379 }
4380}
4381
4382void __stdcall glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
4383{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004384 TRACE("(GLuint index = %d, GLfloat x = %f, GLfloat y = %f)", index, x, y);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004385
4386 try
4387 {
4388 if (index >= gl::MAX_VERTEX_ATTRIBS)
4389 {
4390 return error(GL_INVALID_VALUE);
4391 }
4392
4393 UNIMPLEMENTED(); // FIXME
4394 }
4395 catch(std::bad_alloc&)
4396 {
4397 return error(GL_OUT_OF_MEMORY);
4398 }
4399}
4400
4401void __stdcall glVertexAttrib2fv(GLuint index, const GLfloat* values)
4402{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004403 TRACE("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004404
4405 try
4406 {
4407 if (index >= gl::MAX_VERTEX_ATTRIBS)
4408 {
4409 return error(GL_INVALID_VALUE);
4410 }
4411
4412 UNIMPLEMENTED(); // FIXME
4413 }
4414 catch(std::bad_alloc&)
4415 {
4416 return error(GL_OUT_OF_MEMORY);
4417 }
4418}
4419
4420void __stdcall glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
4421{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004422 TRACE("(GLuint index = %d, GLfloat x = %f, GLfloat y = %f, GLfloat z = %f)", index, x, y, z);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004423
4424 try
4425 {
4426 if (index >= gl::MAX_VERTEX_ATTRIBS)
4427 {
4428 return error(GL_INVALID_VALUE);
4429 }
4430
4431 UNIMPLEMENTED(); // FIXME
4432 }
4433 catch(std::bad_alloc&)
4434 {
4435 return error(GL_OUT_OF_MEMORY);
4436 }
4437}
4438
4439void __stdcall glVertexAttrib3fv(GLuint index, const GLfloat* values)
4440{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004441 TRACE("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004442
4443 try
4444 {
4445 if (index >= gl::MAX_VERTEX_ATTRIBS)
4446 {
4447 return error(GL_INVALID_VALUE);
4448 }
4449
4450 UNIMPLEMENTED(); // FIXME
4451 }
4452 catch(std::bad_alloc&)
4453 {
4454 return error(GL_OUT_OF_MEMORY);
4455 }
4456}
4457
4458void __stdcall glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
4459{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004460 TRACE("(GLuint index = %d, GLfloat x = %f, GLfloat y = %f, GLfloat z = %f, GLfloat w = %f)", index, x, y, z, w);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004461
4462 try
4463 {
4464 if (index >= gl::MAX_VERTEX_ATTRIBS)
4465 {
4466 return error(GL_INVALID_VALUE);
4467 }
4468
4469 UNIMPLEMENTED(); // FIXME
4470 }
4471 catch(std::bad_alloc&)
4472 {
4473 return error(GL_OUT_OF_MEMORY);
4474 }
4475}
4476
4477void __stdcall glVertexAttrib4fv(GLuint index, const GLfloat* values)
4478{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004479 TRACE("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004480
4481 try
4482 {
4483 if (index >= gl::MAX_VERTEX_ATTRIBS)
4484 {
4485 return error(GL_INVALID_VALUE);
4486 }
4487
4488 UNIMPLEMENTED(); // FIXME
4489 }
4490 catch(std::bad_alloc&)
4491 {
4492 return error(GL_OUT_OF_MEMORY);
4493 }
4494}
4495
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004496void __stdcall glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004497{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004498 TRACE("(GLuint index = %d, GLint size = %d, GLenum type = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004499 "GLboolean normalized = %d, GLsizei stride = %d, const GLvoid* ptr = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004500 index, size, type, normalized, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004501
4502 try
4503 {
4504 if (index >= gl::MAX_VERTEX_ATTRIBS)
4505 {
4506 return error(GL_INVALID_VALUE);
4507 }
4508
4509 if (size < 1 || size > 4)
4510 {
4511 return error(GL_INVALID_VALUE);
4512 }
4513
4514 switch (type)
4515 {
4516 case GL_BYTE:
4517 case GL_UNSIGNED_BYTE:
4518 case GL_SHORT:
4519 case GL_UNSIGNED_SHORT:
4520 case GL_FIXED:
4521 case GL_FLOAT:
4522 break;
4523 default:
4524 return error(GL_INVALID_ENUM);
4525 }
4526
4527 if (stride < 0)
4528 {
4529 return error(GL_INVALID_VALUE);
4530 }
4531
4532 gl::Context *context = gl::getContext();
4533
4534 if (context)
4535 {
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +00004536 context->vertexAttribute[index].mBoundBuffer = context->arrayBuffer;
4537 context->vertexAttribute[index].mSize = size;
4538 context->vertexAttribute[index].mType = type;
daniel@transgaming.comb994e3b2010-03-26 04:08:50 +00004539 context->vertexAttribute[index].mNormalized = (normalized == GL_TRUE);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +00004540 context->vertexAttribute[index].mStride = stride;
4541 context->vertexAttribute[index].mPointer = ptr;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004542 }
4543 }
4544 catch(std::bad_alloc&)
4545 {
4546 return error(GL_OUT_OF_MEMORY);
4547 }
4548}
4549
4550void __stdcall glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
4551{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004552 TRACE("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)", x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004553
4554 try
4555 {
4556 if (width < 0 || height < 0)
4557 {
4558 return error(GL_INVALID_VALUE);
4559 }
4560
4561 gl::Context *context = gl::getContext();
4562
4563 if (context)
4564 {
4565 context->viewportX = x;
4566 context->viewportY = y;
4567 context->viewportWidth = width;
4568 context->viewportHeight = height;
4569 }
4570 }
4571 catch(std::bad_alloc&)
4572 {
4573 return error(GL_OUT_OF_MEMORY);
4574 }
4575}
4576
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004577void __stdcall glTexImage3DOES(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth,
4578 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004579{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004580 TRACE("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
4581 "GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, GLint border = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004582 "GLenum format = 0x%X, GLenum type = 0x%x, const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004583 target, level, internalformat, width, height, depth, border, format, type, pixels);
4584
4585 try
4586 {
4587 UNIMPLEMENTED(); // FIXME
4588 }
4589 catch(std::bad_alloc&)
4590 {
4591 return error(GL_OUT_OF_MEMORY);
4592 }
4593}
4594}