blob: ec127bd247296155732f2133bd8ff471cb459af3 [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
alokp@chromium.orgea0e1af2010-03-22 19:33:14 +000016#include "common/debug.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000017
18#include "libGLESv2/main.h"
19#include "libGLESv2/mathutil.h"
20#include "libGLESv2/utilities.h"
21#include "libGLESv2/Buffer.h"
22#include "libGLESv2/Context.h"
23#include "libGLESv2/Framebuffer.h"
24#include "libGLESv2/Program.h"
25#include "libGLESv2/Renderbuffer.h"
26#include "libGLESv2/Shader.h"
27#include "libGLESv2/Texture.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000028
29extern "C"
30{
31
32void __stdcall glActiveTexture(GLenum texture)
33{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +000034 TRACE("(GLenum texture = 0x%X)", texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000035
36 try
37 {
38 if (texture < GL_TEXTURE0 || texture > GL_TEXTURE0 + gl::MAX_TEXTURE_IMAGE_UNITS - 1)
39 {
40 return error(GL_INVALID_ENUM);
41 }
42
43 gl::Context *context = gl::getContext();
44
45 if (context)
46 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +000047 context->setActiveSampler(texture - GL_TEXTURE0);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000048 }
49 }
50 catch(std::bad_alloc&)
51 {
52 return error(GL_OUT_OF_MEMORY);
53 }
54}
55
56void __stdcall glAttachShader(GLuint program, GLuint shader)
57{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +000058 TRACE("(GLuint program = %d, GLuint shader = %d)", program, shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000059
60 try
61 {
62 gl::Context *context = gl::getContext();
63
64 if (context)
65 {
66 gl::Program *programObject = context->getProgram(program);
67 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +000068
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +000069 if (!programObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000070 {
daniel@transgaming.come9d6ed02010-04-13 03:26:23 +000071 if (context->getShader(program))
72 {
73 return error(GL_INVALID_OPERATION);
74 }
75 else
76 {
77 return error(GL_INVALID_VALUE);
78 }
79 }
80
81 if (!shaderObject)
82 {
83 if (context->getProgram(shader))
84 {
85 return error(GL_INVALID_OPERATION);
86 }
87 else
88 {
89 return error(GL_INVALID_VALUE);
90 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000091 }
92
93 if (!programObject->attachShader(shaderObject))
94 {
95 return error(GL_INVALID_OPERATION);
96 }
97 }
98 }
99 catch(std::bad_alloc&)
100 {
101 return error(GL_OUT_OF_MEMORY);
102 }
103}
104
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000105void __stdcall glBindAttribLocation(GLuint program, GLuint index, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000106{
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000107 TRACE("(GLuint program = %d, GLuint index = %d, const GLchar* name = 0x%0.8p)", program, index, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000108
109 try
110 {
111 if (index >= gl::MAX_VERTEX_ATTRIBS)
112 {
113 return error(GL_INVALID_VALUE);
114 }
115
116 gl::Context *context = gl::getContext();
117
118 if (context)
119 {
120 gl::Program *programObject = context->getProgram(program);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000121
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000122 if (!programObject)
123 {
daniel@transgaming.com98079832010-04-13 03:26:29 +0000124 if (context->getShader(program))
125 {
126 return error(GL_INVALID_OPERATION);
127 }
128 else
129 {
130 return error(GL_INVALID_VALUE);
131 }
132 }
133
134 if (strncmp(name, "gl_", 3) == 0)
135 {
136 return error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000137 }
138
139 programObject->bindAttributeLocation(index, name);
140 }
141 }
142 catch(std::bad_alloc&)
143 {
144 return error(GL_OUT_OF_MEMORY);
145 }
146}
147
148void __stdcall glBindBuffer(GLenum target, GLuint buffer)
149{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000150 TRACE("(GLenum target = 0x%X, GLuint buffer = %d)", target, buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000151
152 try
153 {
154 gl::Context *context = gl::getContext();
155
156 if (context)
157 {
158 switch (target)
159 {
160 case GL_ARRAY_BUFFER:
161 context->bindArrayBuffer(buffer);
162 return;
163 case GL_ELEMENT_ARRAY_BUFFER:
164 context->bindElementArrayBuffer(buffer);
165 return;
166 default:
167 return error(GL_INVALID_ENUM);
168 }
169 }
170 }
171 catch(std::bad_alloc&)
172 {
173 return error(GL_OUT_OF_MEMORY);
174 }
175}
176
177void __stdcall glBindFramebuffer(GLenum target, GLuint framebuffer)
178{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000179 TRACE("(GLenum target = 0x%X, GLuint framebuffer = %d)", target, framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000180
181 try
182 {
183 if (target != GL_FRAMEBUFFER)
184 {
185 return error(GL_INVALID_ENUM);
186 }
187
188 gl::Context *context = gl::getContext();
189
190 if (context)
191 {
192 context->bindFramebuffer(framebuffer);
193 }
194 }
195 catch(std::bad_alloc&)
196 {
197 return error(GL_OUT_OF_MEMORY);
198 }
199}
200
201void __stdcall glBindRenderbuffer(GLenum target, GLuint renderbuffer)
202{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000203 TRACE("(GLenum target = 0x%X, GLuint renderbuffer = %d)", target, renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000204
205 try
206 {
207 if (target != GL_RENDERBUFFER)
208 {
209 return error(GL_INVALID_ENUM);
210 }
211
212 gl::Context *context = gl::getContext();
213
214 if (context)
215 {
216 context->bindRenderbuffer(renderbuffer);
217 }
218 }
219 catch(std::bad_alloc&)
220 {
221 return error(GL_OUT_OF_MEMORY);
222 }
223}
224
225void __stdcall glBindTexture(GLenum target, GLuint texture)
226{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000227 TRACE("(GLenum target = 0x%X, GLuint texture = %d)", target, texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000228
229 try
230 {
231 gl::Context *context = gl::getContext();
232
233 if (context)
234 {
235 gl::Texture *textureObject = context->getTexture(texture);
236
237 if (textureObject && textureObject->getTarget() != target && texture != 0)
238 {
239 return error(GL_INVALID_OPERATION);
240 }
241
242 switch (target)
243 {
244 case GL_TEXTURE_2D:
245 context->bindTexture2D(texture);
246 return;
247 case GL_TEXTURE_CUBE_MAP:
248 context->bindTextureCubeMap(texture);
249 return;
250 default:
251 return error(GL_INVALID_ENUM);
252 }
253 }
254 }
255 catch(std::bad_alloc&)
256 {
257 return error(GL_OUT_OF_MEMORY);
258 }
259}
260
261void __stdcall glBlendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
262{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000263 TRACE("(GLclampf red = %f, GLclampf green = %f, GLclampf blue = %f, GLclampf alpha = %f)",
264 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000265
266 try
267 {
268 gl::Context* context = gl::getContext();
269
270 if (context)
271 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000272 context->setBlendColor(gl::clamp01(red), gl::clamp01(green), gl::clamp01(blue), gl::clamp01(alpha));
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000273 }
274 }
275 catch(std::bad_alloc&)
276 {
277 return error(GL_OUT_OF_MEMORY);
278 }
279}
280
281void __stdcall glBlendEquation(GLenum mode)
282{
283 glBlendEquationSeparate(mode, mode);
284}
285
286void __stdcall glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
287{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000288 TRACE("(GLenum modeRGB = 0x%X, GLenum modeAlpha = 0x%X)", modeRGB, modeAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000289
290 try
291 {
292 switch (modeRGB)
293 {
294 case GL_FUNC_ADD:
295 case GL_FUNC_SUBTRACT:
296 case GL_FUNC_REVERSE_SUBTRACT:
297 break;
298 default:
299 return error(GL_INVALID_ENUM);
300 }
301
302 switch (modeAlpha)
303 {
304 case GL_FUNC_ADD:
305 case GL_FUNC_SUBTRACT:
306 case GL_FUNC_REVERSE_SUBTRACT:
307 break;
308 default:
309 return error(GL_INVALID_ENUM);
310 }
311
312 gl::Context *context = gl::getContext();
313
314 if (context)
315 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000316 context->setBlendEquation(modeRGB, modeAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000317 }
318 }
319 catch(std::bad_alloc&)
320 {
321 return error(GL_OUT_OF_MEMORY);
322 }
323}
324
325void __stdcall glBlendFunc(GLenum sfactor, GLenum dfactor)
326{
327 glBlendFuncSeparate(sfactor, dfactor, sfactor, dfactor);
328}
329
330void __stdcall glBlendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
331{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000332 TRACE("(GLenum srcRGB = 0x%X, GLenum dstRGB = 0x%X, GLenum srcAlpha = 0x%X, GLenum dstAlpha = 0x%X)",
333 srcRGB, dstRGB, srcAlpha, dstAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000334
335 try
336 {
337 switch (srcRGB)
338 {
339 case GL_ZERO:
340 case GL_ONE:
341 case GL_SRC_COLOR:
342 case GL_ONE_MINUS_SRC_COLOR:
343 case GL_DST_COLOR:
344 case GL_ONE_MINUS_DST_COLOR:
345 case GL_SRC_ALPHA:
346 case GL_ONE_MINUS_SRC_ALPHA:
347 case GL_DST_ALPHA:
348 case GL_ONE_MINUS_DST_ALPHA:
349 case GL_CONSTANT_COLOR:
350 case GL_ONE_MINUS_CONSTANT_COLOR:
351 case GL_CONSTANT_ALPHA:
352 case GL_ONE_MINUS_CONSTANT_ALPHA:
353 case GL_SRC_ALPHA_SATURATE:
354 break;
355 default:
356 return error(GL_INVALID_ENUM);
357 }
358
359 switch (dstRGB)
360 {
361 case GL_ZERO:
362 case GL_ONE:
363 case GL_SRC_COLOR:
364 case GL_ONE_MINUS_SRC_COLOR:
365 case GL_DST_COLOR:
366 case GL_ONE_MINUS_DST_COLOR:
367 case GL_SRC_ALPHA:
368 case GL_ONE_MINUS_SRC_ALPHA:
369 case GL_DST_ALPHA:
370 case GL_ONE_MINUS_DST_ALPHA:
371 case GL_CONSTANT_COLOR:
372 case GL_ONE_MINUS_CONSTANT_COLOR:
373 case GL_CONSTANT_ALPHA:
374 case GL_ONE_MINUS_CONSTANT_ALPHA:
375 break;
376 default:
377 return error(GL_INVALID_ENUM);
378 }
379
380 switch (srcAlpha)
381 {
382 case GL_ZERO:
383 case GL_ONE:
384 case GL_SRC_COLOR:
385 case GL_ONE_MINUS_SRC_COLOR:
386 case GL_DST_COLOR:
387 case GL_ONE_MINUS_DST_COLOR:
388 case GL_SRC_ALPHA:
389 case GL_ONE_MINUS_SRC_ALPHA:
390 case GL_DST_ALPHA:
391 case GL_ONE_MINUS_DST_ALPHA:
392 case GL_CONSTANT_COLOR:
393 case GL_ONE_MINUS_CONSTANT_COLOR:
394 case GL_CONSTANT_ALPHA:
395 case GL_ONE_MINUS_CONSTANT_ALPHA:
396 case GL_SRC_ALPHA_SATURATE:
397 break;
398 default:
399 return error(GL_INVALID_ENUM);
400 }
401
402 switch (dstAlpha)
403 {
404 case GL_ZERO:
405 case GL_ONE:
406 case GL_SRC_COLOR:
407 case GL_ONE_MINUS_SRC_COLOR:
408 case GL_DST_COLOR:
409 case GL_ONE_MINUS_DST_COLOR:
410 case GL_SRC_ALPHA:
411 case GL_ONE_MINUS_SRC_ALPHA:
412 case GL_DST_ALPHA:
413 case GL_ONE_MINUS_DST_ALPHA:
414 case GL_CONSTANT_COLOR:
415 case GL_ONE_MINUS_CONSTANT_COLOR:
416 case GL_CONSTANT_ALPHA:
417 case GL_ONE_MINUS_CONSTANT_ALPHA:
418 break;
419 default:
420 return error(GL_INVALID_ENUM);
421 }
422
daniel@transgaming.comfe453652010-03-16 06:23:28 +0000423 bool constantColorUsed = (srcRGB == GL_CONSTANT_COLOR || srcRGB == GL_ONE_MINUS_CONSTANT_COLOR ||
424 dstRGB == GL_CONSTANT_COLOR || dstRGB == GL_ONE_MINUS_CONSTANT_COLOR);
425
426 bool constantAlphaUsed = (srcRGB == GL_CONSTANT_ALPHA || srcRGB == GL_ONE_MINUS_CONSTANT_ALPHA ||
427 dstRGB == GL_CONSTANT_ALPHA || dstRGB == GL_ONE_MINUS_CONSTANT_ALPHA);
428
429 if (constantColorUsed && constantAlphaUsed)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000430 {
daniel@transgaming.comfe453652010-03-16 06:23:28 +0000431 ERR("Simultaneous use of GL_CONSTANT_ALPHA/GL_ONE_MINUS_CONSTANT_ALPHA and GL_CONSTANT_COLOR/GL_ONE_MINUS_CONSTANT_COLOR invalid under WebGL");
432 return error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000433 }
434
435 gl::Context *context = gl::getContext();
436
437 if (context)
438 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000439 context->setBlendFactors(srcRGB, dstRGB, srcAlpha, dstAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000440 }
441 }
442 catch(std::bad_alloc&)
443 {
444 return error(GL_OUT_OF_MEMORY);
445 }
446}
447
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000448void __stdcall glBufferData(GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000449{
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000450 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 +0000451 target, size, data, usage);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000452
453 try
454 {
455 if (size < 0)
456 {
457 return error(GL_INVALID_VALUE);
458 }
459
460 switch (usage)
461 {
462 case GL_STREAM_DRAW:
463 case GL_STATIC_DRAW:
464 case GL_DYNAMIC_DRAW:
465 break;
466 default:
467 return error(GL_INVALID_ENUM);
468 }
469
470 gl::Context *context = gl::getContext();
471
472 if (context)
473 {
474 gl::Buffer *buffer;
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000475
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000476 switch (target)
477 {
478 case GL_ARRAY_BUFFER:
479 buffer = context->getArrayBuffer();
480 break;
481 case GL_ELEMENT_ARRAY_BUFFER:
482 buffer = context->getElementArrayBuffer();
483 break;
484 default:
485 return error(GL_INVALID_ENUM);
486 }
487
488 if (!buffer)
489 {
490 return error(GL_INVALID_OPERATION);
491 }
492
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000493 buffer->bufferData(data, size, usage);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000494 }
495 }
496 catch(std::bad_alloc&)
497 {
498 return error(GL_OUT_OF_MEMORY);
499 }
500}
501
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000502void __stdcall glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000503{
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000504 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 +0000505 target, offset, size, data);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000506
507 try
508 {
509 if (size < 0)
510 {
511 return error(GL_INVALID_VALUE);
512 }
513
daniel@transgaming.comd4620a32010-03-21 04:31:28 +0000514 if (data == NULL)
515 {
516 return;
517 }
518
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000519 gl::Context *context = gl::getContext();
520
521 if (context)
522 {
523 gl::Buffer *buffer;
524
525 switch (target)
526 {
527 case GL_ARRAY_BUFFER:
528 buffer = context->getArrayBuffer();
529 break;
530 case GL_ELEMENT_ARRAY_BUFFER:
531 buffer = context->getElementArrayBuffer();
532 break;
533 default:
534 return error(GL_INVALID_ENUM);
535 }
536
537 if (!buffer)
538 {
539 return error(GL_INVALID_OPERATION);
540 }
541
542 GLenum err = buffer->bufferSubData(data, size, offset);
543
544 if (err != GL_NO_ERROR)
545 {
546 return error(err);
547 }
548 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000549 }
550 catch(std::bad_alloc&)
551 {
552 return error(GL_OUT_OF_MEMORY);
553 }
554}
555
556GLenum __stdcall glCheckFramebufferStatus(GLenum target)
557{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000558 TRACE("(GLenum target = 0x%X)", target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000559
560 try
561 {
562 if (target != GL_FRAMEBUFFER)
563 {
564 return error(GL_INVALID_ENUM, 0);
565 }
566
567 gl::Context *context = gl::getContext();
568
569 if (context)
570 {
571 gl::Framebuffer *framebuffer = context->getFramebuffer();
572
573 return framebuffer->completeness();
574 }
575 }
576 catch(std::bad_alloc&)
577 {
578 return error(GL_OUT_OF_MEMORY, 0);
579 }
580
581 return 0;
582}
583
584void __stdcall glClear(GLbitfield mask)
585{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000586 TRACE("(GLbitfield mask = %X)", mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000587
588 try
589 {
590 gl::Context *context = gl::getContext();
591
592 if (context)
593 {
594 context->clear(mask);
595 }
596 }
597 catch(std::bad_alloc&)
598 {
599 return error(GL_OUT_OF_MEMORY);
600 }
601}
602
603void __stdcall glClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
604{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000605 TRACE("(GLclampf red = %f, GLclampf green = %f, GLclampf blue = %f, GLclampf alpha = %f)",
606 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000607
608 try
609 {
610 gl::Context *context = gl::getContext();
611
612 if (context)
613 {
614 context->setClearColor(red, green, blue, alpha);
615 }
616 }
617 catch(std::bad_alloc&)
618 {
619 return error(GL_OUT_OF_MEMORY);
620 }
621}
622
623void __stdcall glClearDepthf(GLclampf depth)
624{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000625 TRACE("(GLclampf depth = %f)", depth);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000626
627 try
628 {
629 gl::Context *context = gl::getContext();
630
631 if (context)
632 {
633 context->setClearDepth(depth);
634 }
635 }
636 catch(std::bad_alloc&)
637 {
638 return error(GL_OUT_OF_MEMORY);
639 }
640}
641
642void __stdcall glClearStencil(GLint s)
643{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000644 TRACE("(GLint s = %d)", s);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000645
646 try
647 {
648 gl::Context *context = gl::getContext();
649
650 if (context)
651 {
652 context->setClearStencil(s);
653 }
654 }
655 catch(std::bad_alloc&)
656 {
657 return error(GL_OUT_OF_MEMORY);
658 }
659}
660
661void __stdcall glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
662{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000663 TRACE("(GLboolean red = %d, GLboolean green = %d, GLboolean blue = %d, GLboolean alpha = %d)",
664 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000665
666 try
667 {
668 gl::Context *context = gl::getContext();
669
670 if (context)
671 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +0000672 context->setColorMask(red != GL_FALSE, green != GL_FALSE, blue != GL_FALSE, alpha != GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000673 }
674 }
675 catch(std::bad_alloc&)
676 {
677 return error(GL_OUT_OF_MEMORY);
678 }
679}
680
681void __stdcall glCompileShader(GLuint shader)
682{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000683 TRACE("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000684
685 try
686 {
687 gl::Context *context = gl::getContext();
688
689 if (context)
690 {
691 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000692
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000693 if (!shaderObject)
694 {
daniel@transgaming.com0cefaf42010-04-13 03:26:36 +0000695 if (context->getProgram(shader))
696 {
697 return error(GL_INVALID_OPERATION);
698 }
699 else
700 {
701 return error(GL_INVALID_VALUE);
702 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000703 }
704
705 shaderObject->compile();
706 }
707 }
708 catch(std::bad_alloc&)
709 {
710 return error(GL_OUT_OF_MEMORY);
711 }
712}
713
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000714void __stdcall glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height,
715 GLint border, GLsizei imageSize, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000716{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000717 TRACE("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000718 "GLsizei height = %d, GLint border = %d, GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000719 target, level, internalformat, width, height, border, imageSize, data);
720
721 try
722 {
daniel@transgaming.com19ffc242010-05-04 03:35:21 +0000723 if (!gl::IsTextureTarget(target))
daniel@transgaming.com41430492010-03-11 20:36:18 +0000724 {
725 return error(GL_INVALID_ENUM);
726 }
727
728 if (level < 0 || level > gl::MAX_TEXTURE_LEVELS)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000729 {
730 return error(GL_INVALID_VALUE);
731 }
732
daniel@transgaming.com41430492010-03-11 20:36:18 +0000733 if (width < 0 || height < 0 || (level > 0 && !gl::isPow2(width)) || (level > 0 && !gl::isPow2(height)) || border != 0 || imageSize < 0)
734 {
735 return error(GL_INVALID_VALUE);
736 }
737
738 return error(GL_INVALID_ENUM); // ultimately we don't support compressed textures
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000739 }
740 catch(std::bad_alloc&)
741 {
742 return error(GL_OUT_OF_MEMORY);
743 }
744}
745
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000746void __stdcall glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
747 GLenum format, GLsizei imageSize, const GLvoid* data)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000748{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000749 TRACE("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
750 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +0000751 "GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000752 target, level, xoffset, yoffset, width, height, format, imageSize, data);
753
754 try
755 {
daniel@transgaming.com19ffc242010-05-04 03:35:21 +0000756 if (!gl::IsTextureTarget(target))
daniel@transgaming.com41430492010-03-11 20:36:18 +0000757 {
758 return error(GL_INVALID_ENUM);
759 }
760
761 if (level < 0 || level > gl::MAX_TEXTURE_LEVELS)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000762 {
763 return error(GL_INVALID_VALUE);
764 }
765
daniel@transgaming.com41430492010-03-11 20:36:18 +0000766 if (xoffset < 0 || yoffset < 0 || width < 0 || height < 0 || (level > 0 && !gl::isPow2(width)) || (level > 0 && !gl::isPow2(height)) || imageSize < 0)
767 {
768 return error(GL_INVALID_VALUE);
769 }
770
771 if (xoffset != 0 || yoffset != 0)
772 {
773 return error(GL_INVALID_OPERATION);
774 }
775
776 return error(GL_INVALID_OPERATION); // The texture being operated on is not a compressed texture.
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000777 }
778 catch(std::bad_alloc&)
779 {
780 return error(GL_OUT_OF_MEMORY);
781 }
782}
783
784void __stdcall glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
785{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000786 TRACE("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
787 "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, GLint border = %d)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000788 target, level, internalformat, x, y, width, height, border);
789
790 try
791 {
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +0000792 if (level < 0 || width < 0 || height < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000793 {
794 return error(GL_INVALID_VALUE);
795 }
796
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +0000797 if (level > 0 && (!gl::isPow2(width) || !gl::isPow2(height)))
798 {
799 return error(GL_INVALID_VALUE);
800 }
801
802 switch (target)
803 {
804 case GL_TEXTURE_2D:
805 if (width > (gl::MAX_TEXTURE_SIZE >> level) || height > (gl::MAX_TEXTURE_SIZE >> level))
806 {
807 return error(GL_INVALID_VALUE);
808 }
809 break;
810 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
811 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
812 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
813 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
814 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
815 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com34dc3e82010-04-15 20:45:02 +0000816 if (width != height)
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +0000817 {
818 return error(GL_INVALID_VALUE);
819 }
820
821 if (width > (gl::MAX_CUBE_MAP_TEXTURE_SIZE >> level) || height > (gl::MAX_CUBE_MAP_TEXTURE_SIZE >> level))
822 {
823 return error(GL_INVALID_VALUE);
824 }
825 break;
826 default:
827 return error(GL_INVALID_ENUM);
828 }
829
830 switch (internalformat)
831 {
832 case GL_ALPHA:
833 case GL_LUMINANCE:
834 case GL_LUMINANCE_ALPHA:
835 case GL_RGB:
836 case GL_RGBA:
837 break;
838 default:
839 return error(GL_INVALID_VALUE);
840 }
841
842 if (border != 0)
843 {
844 return error(GL_INVALID_VALUE);
845 }
846
847 gl::Context *context = gl::getContext();
848
849 if (context)
850 {
851 gl::Renderbuffer *source = context->getFramebuffer()->getColorbuffer();
852
853 if (target == GL_TEXTURE_2D)
854 {
855 gl::Texture2D *texture = context->getTexture2D();
856
857 if (!texture)
858 {
859 return error(GL_INVALID_OPERATION);
860 }
861
862 texture->copyImage(level, internalformat, x, y, width, height, source);
863 }
daniel@transgaming.com19ffc242010-05-04 03:35:21 +0000864 else if (gl::IsCubemapTextureTarget(target))
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +0000865 {
866 gl::TextureCubeMap *texture = context->getTextureCubeMap();
867
868 if (!texture)
869 {
870 return error(GL_INVALID_OPERATION);
871 }
872
873 texture->copyImage(target, level, internalformat, x, y, width, height, source);
874 }
875 else
876 {
877 UNREACHABLE();
878 }
879 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000880 }
881 catch(std::bad_alloc&)
882 {
883 return error(GL_OUT_OF_MEMORY);
884 }
885}
886
887void __stdcall glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
888{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000889 TRACE("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
890 "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000891 target, level, xoffset, yoffset, x, y, width, height);
892
893 try
894 {
daniel@transgaming.com19ffc242010-05-04 03:35:21 +0000895 if (!gl::IsTextureTarget(target))
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +0000896 {
897 return error(GL_INVALID_ENUM);
898 }
899
900 if (level < 0 || level > gl::MAX_TEXTURE_LEVELS || xoffset < 0 || yoffset < 0 || width < 0 || height < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000901 {
902 return error(GL_INVALID_VALUE);
903 }
904
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +0000905 if (std::numeric_limits<GLsizei>::max() - xoffset < width || std::numeric_limits<GLsizei>::max() - yoffset < height)
906 {
907 return error(GL_INVALID_VALUE);
908 }
909
910 if (width == 0 || height == 0)
911 {
912 return;
913 }
914
915 gl::Context *context = gl::getContext();
916
917 if (context)
918 {
919 gl::Renderbuffer *source = context->getFramebuffer()->getColorbuffer();
920
921 if (target == GL_TEXTURE_2D)
922 {
923 gl::Texture2D *texture = context->getTexture2D();
924
925 if (!texture)
926 {
927 return error(GL_INVALID_OPERATION);
928 }
929
930 texture->copySubImage(level, xoffset, yoffset, x, y, width, height, source);
931 }
daniel@transgaming.com19ffc242010-05-04 03:35:21 +0000932 else if (gl::IsCubemapTextureTarget(target))
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +0000933 {
934 gl::TextureCubeMap *texture = context->getTextureCubeMap();
935
936 if (!texture)
937 {
938 return error(GL_INVALID_OPERATION);
939 }
940
941 texture->copySubImage(target, level, xoffset, yoffset, x, y, width, height, source);
942 }
943 else
944 {
945 UNREACHABLE();
946 }
947 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000948 }
daniel@transgaming.comb8c28ed2010-04-13 03:26:32 +0000949
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000950 catch(std::bad_alloc&)
951 {
952 return error(GL_OUT_OF_MEMORY);
953 }
954}
955
956GLuint __stdcall glCreateProgram(void)
957{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000958 TRACE("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000959
960 try
961 {
962 gl::Context *context = gl::getContext();
963
964 if (context)
965 {
966 return context->createProgram();
967 }
968 }
969 catch(std::bad_alloc&)
970 {
971 return error(GL_OUT_OF_MEMORY, 0);
972 }
973
974 return 0;
975}
976
977GLuint __stdcall glCreateShader(GLenum type)
978{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000979 TRACE("(GLenum type = 0x%X)", type);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000980
981 try
982 {
983 gl::Context *context = gl::getContext();
984
985 if (context)
986 {
987 switch (type)
988 {
989 case GL_FRAGMENT_SHADER:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000990 case GL_VERTEX_SHADER:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000991 return context->createShader(type);
992 default:
993 return error(GL_INVALID_ENUM, 0);
994 }
995 }
996 }
997 catch(std::bad_alloc&)
998 {
999 return error(GL_OUT_OF_MEMORY, 0);
1000 }
1001
1002 return 0;
1003}
1004
1005void __stdcall glCullFace(GLenum mode)
1006{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001007 TRACE("(GLenum mode = 0x%X)", mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001008
1009 try
1010 {
1011 switch (mode)
1012 {
1013 case GL_FRONT:
1014 case GL_BACK:
1015 case GL_FRONT_AND_BACK:
1016 {
1017 gl::Context *context = gl::getContext();
1018
1019 if (context)
1020 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001021 context->setCullMode(mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001022 }
1023 }
1024 break;
1025 default:
1026 return error(GL_INVALID_ENUM);
1027 }
1028 }
1029 catch(std::bad_alloc&)
1030 {
1031 return error(GL_OUT_OF_MEMORY);
1032 }
1033}
1034
1035void __stdcall glDeleteBuffers(GLsizei n, const GLuint* buffers)
1036{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001037 TRACE("(GLsizei n = %d, const GLuint* buffers = 0x%0.8p)", n, buffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001038
1039 try
1040 {
1041 if (n < 0)
1042 {
1043 return error(GL_INVALID_VALUE);
1044 }
1045
1046 gl::Context *context = gl::getContext();
1047
1048 if (context)
1049 {
1050 for (int i = 0; i < n; i++)
1051 {
1052 context->deleteBuffer(buffers[i]);
1053 }
1054 }
1055 }
1056 catch(std::bad_alloc&)
1057 {
1058 return error(GL_OUT_OF_MEMORY);
1059 }
1060}
1061
1062void __stdcall glDeleteFramebuffers(GLsizei n, const GLuint* framebuffers)
1063{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001064 TRACE("(GLsizei n = %d, const GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001065
1066 try
1067 {
1068 if (n < 0)
1069 {
1070 return error(GL_INVALID_VALUE);
1071 }
1072
1073 gl::Context *context = gl::getContext();
1074
1075 if (context)
1076 {
1077 for (int i = 0; i < n; i++)
1078 {
1079 if (framebuffers[i] != 0)
1080 {
1081 context->deleteFramebuffer(framebuffers[i]);
1082 }
1083 }
1084 }
1085 }
1086 catch(std::bad_alloc&)
1087 {
1088 return error(GL_OUT_OF_MEMORY);
1089 }
1090}
1091
1092void __stdcall glDeleteProgram(GLuint program)
1093{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001094 TRACE("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001095
1096 try
1097 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001098 if (program == 0)
1099 {
1100 return;
1101 }
1102
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001103 gl::Context *context = gl::getContext();
1104
1105 if (context)
1106 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001107 if (!context->getProgram(program))
1108 {
1109 if(context->getShader(program))
1110 {
1111 return error(GL_INVALID_OPERATION);
1112 }
1113 else
1114 {
1115 return error(GL_INVALID_VALUE);
1116 }
1117 }
1118
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001119 context->deleteProgram(program);
1120 }
1121 }
1122 catch(std::bad_alloc&)
1123 {
1124 return error(GL_OUT_OF_MEMORY);
1125 }
1126}
1127
1128void __stdcall glDeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers)
1129{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001130 TRACE("(GLsizei n = %d, const GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001131
1132 try
1133 {
1134 if (n < 0)
1135 {
1136 return error(GL_INVALID_VALUE);
1137 }
1138
1139 gl::Context *context = gl::getContext();
1140
1141 if (context)
1142 {
daniel@transgaming.come2b22122010-03-11 19:22:14 +00001143 for (int i = 0; i < n; i++)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001144 {
1145 context->deleteRenderbuffer(renderbuffers[i]);
1146 }
1147 }
1148 }
1149 catch(std::bad_alloc&)
1150 {
1151 return error(GL_OUT_OF_MEMORY);
1152 }
1153}
1154
1155void __stdcall glDeleteShader(GLuint shader)
1156{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001157 TRACE("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001158
1159 try
1160 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001161 if (shader == 0)
1162 {
1163 return;
1164 }
1165
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001166 gl::Context *context = gl::getContext();
1167
1168 if (context)
1169 {
daniel@transgaming.com75401e62010-04-13 03:26:39 +00001170 if (!context->getShader(shader))
1171 {
1172 if(context->getProgram(shader))
1173 {
1174 return error(GL_INVALID_OPERATION);
1175 }
1176 else
1177 {
1178 return error(GL_INVALID_VALUE);
1179 }
1180 }
1181
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001182 context->deleteShader(shader);
1183 }
1184 }
1185 catch(std::bad_alloc&)
1186 {
1187 return error(GL_OUT_OF_MEMORY);
1188 }
1189}
1190
1191void __stdcall glDeleteTextures(GLsizei n, const GLuint* textures)
1192{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001193 TRACE("(GLsizei n = %d, const GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001194
1195 try
1196 {
1197 if (n < 0)
1198 {
1199 return error(GL_INVALID_VALUE);
1200 }
1201
1202 gl::Context *context = gl::getContext();
1203
1204 if (context)
1205 {
1206 for (int i = 0; i < n; i++)
1207 {
1208 if (textures[i] != 0)
1209 {
1210 context->deleteTexture(textures[i]);
1211 }
1212 }
1213 }
1214 }
1215 catch(std::bad_alloc&)
1216 {
1217 return error(GL_OUT_OF_MEMORY);
1218 }
1219}
1220
1221void __stdcall glDepthFunc(GLenum func)
1222{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001223 TRACE("(GLenum func = 0x%X)", func);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001224
1225 try
1226 {
1227 switch (func)
1228 {
1229 case GL_NEVER:
1230 case GL_ALWAYS:
1231 case GL_LESS:
1232 case GL_LEQUAL:
1233 case GL_EQUAL:
1234 case GL_GREATER:
1235 case GL_GEQUAL:
1236 case GL_NOTEQUAL:
1237 break;
1238 default:
1239 return error(GL_INVALID_ENUM);
1240 }
1241
1242 gl::Context *context = gl::getContext();
1243
1244 if (context)
1245 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001246 context->setDepthFunc(func);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001247 }
1248 }
1249 catch(std::bad_alloc&)
1250 {
1251 return error(GL_OUT_OF_MEMORY);
1252 }
1253}
1254
1255void __stdcall glDepthMask(GLboolean flag)
1256{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001257 TRACE("(GLboolean flag = %d)", flag);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001258
1259 try
1260 {
1261 gl::Context *context = gl::getContext();
1262
1263 if (context)
1264 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001265 context->setDepthMask(flag != GL_FALSE);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001266 }
1267 }
1268 catch(std::bad_alloc&)
1269 {
1270 return error(GL_OUT_OF_MEMORY);
1271 }
1272}
1273
1274void __stdcall glDepthRangef(GLclampf zNear, GLclampf zFar)
1275{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001276 TRACE("(GLclampf zNear = %f, GLclampf zFar = %f)", zNear, zFar);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001277
1278 try
1279 {
1280 gl::Context *context = gl::getContext();
1281
1282 if (context)
1283 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001284 context->setDepthRange(zNear, zFar);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001285 }
1286 }
1287 catch(std::bad_alloc&)
1288 {
1289 return error(GL_OUT_OF_MEMORY);
1290 }
1291}
1292
1293void __stdcall glDetachShader(GLuint program, GLuint shader)
1294{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001295 TRACE("(GLuint program = %d, GLuint shader = %d)", program, shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001296
1297 try
1298 {
1299 gl::Context *context = gl::getContext();
1300
1301 if (context)
1302 {
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001303
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001304 gl::Program *programObject = context->getProgram(program);
1305 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001306
1307 if (!programObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001308 {
daniel@transgaming.com73c2c2e2010-04-13 03:26:11 +00001309 gl::Shader *shaderByProgramHandle;
1310 shaderByProgramHandle = context->getShader(program);
1311 if (!shaderByProgramHandle)
1312 {
1313 return error(GL_INVALID_VALUE);
1314 }
1315 else
1316 {
1317 return error(GL_INVALID_OPERATION);
1318 }
1319 }
1320
1321 if (!shaderObject)
1322 {
1323 gl::Program *programByShaderHandle = context->getProgram(shader);
1324 if (!programByShaderHandle)
1325 {
1326 return error(GL_INVALID_VALUE);
1327 }
1328 else
1329 {
1330 return error(GL_INVALID_OPERATION);
1331 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001332 }
1333
1334 if (!programObject->detachShader(shaderObject))
1335 {
1336 return error(GL_INVALID_OPERATION);
1337 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001338 }
1339 }
1340 catch(std::bad_alloc&)
1341 {
1342 return error(GL_OUT_OF_MEMORY);
1343 }
1344}
1345
1346void __stdcall glDisable(GLenum cap)
1347{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001348 TRACE("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001349
1350 try
1351 {
1352 gl::Context *context = gl::getContext();
1353
1354 if (context)
1355 {
1356 switch (cap)
1357 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001358 case GL_CULL_FACE: context->setCullFace(false); break;
1359 case GL_POLYGON_OFFSET_FILL: context->setPolygonOffsetFill(false); break;
1360 case GL_SAMPLE_ALPHA_TO_COVERAGE: context->setSampleAlphaToCoverage(false); break;
1361 case GL_SAMPLE_COVERAGE: context->setSampleCoverage(false); break;
1362 case GL_SCISSOR_TEST: context->setScissorTest(false); break;
1363 case GL_STENCIL_TEST: context->setStencilTest(false); break;
1364 case GL_DEPTH_TEST: context->setDepthTest(false); break;
1365 case GL_BLEND: context->setBlend(false); break;
1366 case GL_DITHER: context->setDither(false); break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001367 default:
1368 return error(GL_INVALID_ENUM);
1369 }
1370 }
1371 }
1372 catch(std::bad_alloc&)
1373 {
1374 return error(GL_OUT_OF_MEMORY);
1375 }
1376}
1377
1378void __stdcall glDisableVertexAttribArray(GLuint index)
1379{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001380 TRACE("(GLuint index = %d)", index);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001381
1382 try
1383 {
1384 if (index >= gl::MAX_VERTEX_ATTRIBS)
1385 {
1386 return error(GL_INVALID_VALUE);
1387 }
1388
1389 gl::Context *context = gl::getContext();
1390
1391 if (context)
1392 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001393 context->setVertexAttribEnabled(index, false);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001394 }
1395 }
1396 catch(std::bad_alloc&)
1397 {
1398 return error(GL_OUT_OF_MEMORY);
1399 }
1400}
1401
1402void __stdcall glDrawArrays(GLenum mode, GLint first, GLsizei count)
1403{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001404 TRACE("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d)", mode, first, count);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001405
1406 try
1407 {
1408 if (count < 0 || first < 0)
1409 {
1410 return error(GL_INVALID_VALUE);
1411 }
1412
1413 gl::Context *context = gl::getContext();
1414
1415 if (context)
1416 {
1417 context->drawArrays(mode, first, count);
1418 }
1419 }
1420 catch(std::bad_alloc&)
1421 {
1422 return error(GL_OUT_OF_MEMORY);
1423 }
1424}
1425
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001426void __stdcall glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001427{
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001428 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 +00001429 mode, count, type, indices);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001430
1431 try
1432 {
1433 if (count < 0)
1434 {
1435 return error(GL_INVALID_VALUE);
1436 }
1437
1438 switch (type)
1439 {
1440 case GL_UNSIGNED_BYTE:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001441 case GL_UNSIGNED_SHORT:
1442 break;
1443 default:
1444 return error(GL_INVALID_ENUM);
1445 }
1446
1447 gl::Context *context = gl::getContext();
1448
1449 if (context)
1450 {
1451 context->drawElements(mode, count, type, indices);
1452 }
1453 }
1454 catch(std::bad_alloc&)
1455 {
1456 return error(GL_OUT_OF_MEMORY);
1457 }
1458}
1459
1460void __stdcall glEnable(GLenum cap)
1461{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001462 TRACE("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001463
1464 try
1465 {
1466 gl::Context *context = gl::getContext();
1467
1468 if (context)
1469 {
1470 switch (cap)
1471 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001472 case GL_CULL_FACE: context->setCullFace(true); break;
1473 case GL_POLYGON_OFFSET_FILL: context->setPolygonOffsetFill(true); break;
1474 case GL_SAMPLE_ALPHA_TO_COVERAGE: context->setSampleAlphaToCoverage(true); break;
1475 case GL_SAMPLE_COVERAGE: context->setSampleCoverage(true); break;
1476 case GL_SCISSOR_TEST: context->setScissorTest(true); break;
1477 case GL_STENCIL_TEST: context->setStencilTest(true); break;
1478 case GL_DEPTH_TEST: context->setDepthTest(true); break;
1479 case GL_BLEND: context->setBlend(true); break;
1480 case GL_DITHER: context->setDither(true); break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001481 default:
1482 return error(GL_INVALID_ENUM);
1483 }
1484 }
1485 }
1486 catch(std::bad_alloc&)
1487 {
1488 return error(GL_OUT_OF_MEMORY);
1489 }
1490}
1491
1492void __stdcall glEnableVertexAttribArray(GLuint index)
1493{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001494 TRACE("(GLuint index = %d)", index);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001495
1496 try
1497 {
1498 if (index >= gl::MAX_VERTEX_ATTRIBS)
1499 {
1500 return error(GL_INVALID_VALUE);
1501 }
1502
1503 gl::Context *context = gl::getContext();
1504
1505 if (context)
1506 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001507 context->setVertexAttribEnabled(index, true);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001508 }
1509 }
1510 catch(std::bad_alloc&)
1511 {
1512 return error(GL_OUT_OF_MEMORY);
1513 }
1514}
1515
1516void __stdcall glFinish(void)
1517{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001518 TRACE("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001519
1520 try
1521 {
1522 gl::Context *context = gl::getContext();
1523
1524 if (context)
1525 {
1526 context->finish();
1527 }
1528 }
1529 catch(std::bad_alloc&)
1530 {
1531 return error(GL_OUT_OF_MEMORY);
1532 }
1533}
1534
1535void __stdcall glFlush(void)
1536{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001537 TRACE("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001538
1539 try
1540 {
1541 gl::Context *context = gl::getContext();
1542
1543 if (context)
1544 {
1545 context->flush();
1546 }
1547 }
1548 catch(std::bad_alloc&)
1549 {
1550 return error(GL_OUT_OF_MEMORY);
1551 }
1552}
1553
1554void __stdcall glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
1555{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001556 TRACE("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum renderbuffertarget = 0x%X, "
1557 "GLuint renderbuffer = %d)", target, attachment, renderbuffertarget, renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001558
1559 try
1560 {
1561 if (target != GL_FRAMEBUFFER || renderbuffertarget != GL_RENDERBUFFER)
1562 {
1563 return error(GL_INVALID_ENUM);
1564 }
1565
1566 gl::Context *context = gl::getContext();
1567
1568 if (context)
1569 {
1570 gl::Framebuffer *framebuffer = context->getFramebuffer();
1571
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001572 if (context->getFramebufferHandle() == 0 || !framebuffer)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001573 {
1574 return error(GL_INVALID_OPERATION);
1575 }
1576
1577 switch (attachment)
1578 {
1579 case GL_COLOR_ATTACHMENT0:
1580 framebuffer->setColorbuffer(GL_RENDERBUFFER, renderbuffer);
1581 break;
1582 case GL_DEPTH_ATTACHMENT:
1583 framebuffer->setDepthbuffer(GL_RENDERBUFFER, renderbuffer);
1584 break;
1585 case GL_STENCIL_ATTACHMENT:
1586 framebuffer->setStencilbuffer(GL_RENDERBUFFER, renderbuffer);
1587 break;
1588 default:
1589 return error(GL_INVALID_ENUM);
1590 }
1591 }
1592 }
1593 catch(std::bad_alloc&)
1594 {
1595 return error(GL_OUT_OF_MEMORY);
1596 }
1597}
1598
1599void __stdcall glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
1600{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001601 TRACE("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum textarget = 0x%X, "
1602 "GLuint texture = %d, GLint level = %d)", target, attachment, textarget, texture, level);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001603
1604 try
1605 {
1606 if (target != GL_FRAMEBUFFER)
1607 {
1608 return error(GL_INVALID_ENUM);
1609 }
1610
1611 switch (attachment)
1612 {
1613 case GL_COLOR_ATTACHMENT0:
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00001614 case GL_DEPTH_ATTACHMENT:
1615 case GL_STENCIL_ATTACHMENT:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001616 break;
1617 default:
1618 return error(GL_INVALID_ENUM);
1619 }
1620
1621 gl::Context *context = gl::getContext();
1622
1623 if (context)
1624 {
daniel@transgaming.com93a81472010-04-20 18:52:58 +00001625 if (texture == 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001626 {
daniel@transgaming.com93a81472010-04-20 18:52:58 +00001627 textarget = GL_NONE;
1628 }
1629 else
1630 {
1631 gl::Texture *tex = context->getTexture(texture);
1632
1633 if (tex == NULL)
1634 {
1635 return error(GL_INVALID_OPERATION);
1636 }
1637
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001638 switch (textarget)
1639 {
1640 case GL_TEXTURE_2D:
daniel@transgaming.com93a81472010-04-20 18:52:58 +00001641 if (tex->getTarget() != GL_TEXTURE_2D)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001642 {
1643 return error(GL_INVALID_OPERATION);
1644 }
1645 break;
daniel@transgaming.com93a81472010-04-20 18:52:58 +00001646
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001647 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001648 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001649 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001650 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001651 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001652 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com93a81472010-04-20 18:52:58 +00001653 if (tex->getTarget() != GL_TEXTURE_CUBE_MAP)
1654 {
1655 return error(GL_INVALID_OPERATION);
1656 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001657 break;
daniel@transgaming.com93a81472010-04-20 18:52:58 +00001658
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001659 default:
1660 return error(GL_INVALID_ENUM);
1661 }
1662
1663 if (level != 0)
1664 {
1665 return error(GL_INVALID_VALUE);
1666 }
1667 }
1668
1669 gl::Framebuffer *framebuffer = context->getFramebuffer();
1670
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001671 if (context->getFramebufferHandle() == 0 || !framebuffer)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001672 {
1673 return error(GL_INVALID_OPERATION);
1674 }
1675
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00001676 switch (attachment)
1677 {
1678 case GL_COLOR_ATTACHMENT0: framebuffer->setColorbuffer(textarget, texture); break;
1679 case GL_DEPTH_ATTACHMENT: framebuffer->setDepthbuffer(textarget, texture); break;
1680 case GL_STENCIL_ATTACHMENT: framebuffer->setStencilbuffer(textarget, texture); break;
1681 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001682 }
1683 }
1684 catch(std::bad_alloc&)
1685 {
1686 return error(GL_OUT_OF_MEMORY);
1687 }
1688}
1689
1690void __stdcall glFrontFace(GLenum mode)
1691{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001692 TRACE("(GLenum mode = 0x%X)", mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001693
1694 try
1695 {
1696 switch (mode)
1697 {
1698 case GL_CW:
1699 case GL_CCW:
1700 {
1701 gl::Context *context = gl::getContext();
1702
1703 if (context)
1704 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00001705 context->setFrontFace(mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001706 }
1707 }
1708 break;
1709 default:
1710 return error(GL_INVALID_ENUM);
1711 }
1712 }
1713 catch(std::bad_alloc&)
1714 {
1715 return error(GL_OUT_OF_MEMORY);
1716 }
1717}
1718
1719void __stdcall glGenBuffers(GLsizei n, GLuint* buffers)
1720{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001721 TRACE("(GLsizei n = %d, GLuint* buffers = 0x%0.8p)", n, buffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001722
1723 try
1724 {
1725 if (n < 0)
1726 {
1727 return error(GL_INVALID_VALUE);
1728 }
1729
1730 gl::Context *context = gl::getContext();
1731
1732 if (context)
1733 {
1734 for (int i = 0; i < n; i++)
1735 {
1736 buffers[i] = context->createBuffer();
1737 }
1738 }
1739 }
1740 catch(std::bad_alloc&)
1741 {
1742 return error(GL_OUT_OF_MEMORY);
1743 }
1744}
1745
1746void __stdcall glGenerateMipmap(GLenum target)
1747{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001748 TRACE("(GLenum target = 0x%X)", target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001749
1750 try
1751 {
daniel@transgaming.com8fd99e22010-04-20 18:52:00 +00001752 gl::Context *context = gl::getContext();
1753
1754 if (context)
1755 {
1756 gl::Texture *texture;
1757
1758 switch (target)
1759 {
1760 case GL_TEXTURE_2D:
1761 texture = context->getTexture2D();
1762 break;
1763
1764 case GL_TEXTURE_CUBE_MAP:
1765 texture = context->getTextureCubeMap();
1766 break;
1767
1768 default:
1769 return error(GL_INVALID_ENUM);
1770 }
1771
1772 texture->generateMipmaps();
1773 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001774 }
1775 catch(std::bad_alloc&)
1776 {
1777 return error(GL_OUT_OF_MEMORY);
1778 }
1779}
1780
1781void __stdcall glGenFramebuffers(GLsizei n, GLuint* framebuffers)
1782{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001783 TRACE("(GLsizei n = %d, GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001784
1785 try
1786 {
1787 if (n < 0)
1788 {
1789 return error(GL_INVALID_VALUE);
1790 }
1791
1792 gl::Context *context = gl::getContext();
1793
1794 if (context)
1795 {
1796 for (int i = 0; i < n; i++)
1797 {
1798 framebuffers[i] = context->createFramebuffer();
1799 }
1800 }
1801 }
1802 catch(std::bad_alloc&)
1803 {
1804 return error(GL_OUT_OF_MEMORY);
1805 }
1806}
1807
1808void __stdcall glGenRenderbuffers(GLsizei n, GLuint* renderbuffers)
1809{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001810 TRACE("(GLsizei n = %d, GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001811
1812 try
1813 {
1814 if (n < 0)
1815 {
1816 return error(GL_INVALID_VALUE);
1817 }
1818
1819 gl::Context *context = gl::getContext();
1820
1821 if (context)
1822 {
1823 for (int i = 0; i < n; i++)
1824 {
1825 renderbuffers[i] = context->createRenderbuffer();
1826 }
1827 }
1828 }
1829 catch(std::bad_alloc&)
1830 {
1831 return error(GL_OUT_OF_MEMORY);
1832 }
1833}
1834
1835void __stdcall glGenTextures(GLsizei n, GLuint* textures)
1836{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001837 TRACE("(GLsizei n = %d, GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001838
1839 try
1840 {
1841 if (n < 0)
1842 {
1843 return error(GL_INVALID_VALUE);
1844 }
1845
1846 gl::Context *context = gl::getContext();
1847
1848 if (context)
1849 {
1850 for (int i = 0; i < n; i++)
1851 {
1852 textures[i] = context->createTexture();
1853 }
1854 }
1855 }
1856 catch(std::bad_alloc&)
1857 {
1858 return error(GL_OUT_OF_MEMORY);
1859 }
1860}
1861
daniel@transgaming.com85423182010-04-22 13:35:27 +00001862void __stdcall glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001863{
daniel@transgaming.com85423182010-04-22 13:35:27 +00001864 TRACE("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, GLsizei *length = 0x%0.8p, "
1865 "GLint *size = 0x%0.8p, GLenum *type = %0.8p, GLchar *name = %0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001866 program, index, bufsize, length, size, type, name);
1867
1868 try
1869 {
1870 if (bufsize < 0)
1871 {
1872 return error(GL_INVALID_VALUE);
1873 }
1874
daniel@transgaming.com85423182010-04-22 13:35:27 +00001875 gl::Context *context = gl::getContext();
1876
1877 if (context)
1878 {
1879 gl::Program *programObject = context->getProgram(program);
1880
1881 if (!programObject)
1882 {
1883 if (context->getShader(program))
1884 {
1885 return error(GL_INVALID_OPERATION);
1886 }
1887 else
1888 {
1889 return error(GL_INVALID_VALUE);
1890 }
1891 }
1892
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00001893 if (index >= (GLuint)programObject->getActiveAttributeCount())
daniel@transgaming.com85423182010-04-22 13:35:27 +00001894 {
1895 return error(GL_INVALID_VALUE);
1896 }
1897
1898 programObject->getActiveAttribute(index, bufsize, length, size, type, name);
1899 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001900 }
1901 catch(std::bad_alloc&)
1902 {
1903 return error(GL_OUT_OF_MEMORY);
1904 }
1905}
1906
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001907void __stdcall glGetActiveUniform(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001908{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001909 TRACE("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001910 "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 +00001911 program, index, bufsize, length, size, type, name);
1912
1913 try
1914 {
1915 if (bufsize < 0)
1916 {
1917 return error(GL_INVALID_VALUE);
1918 }
1919
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00001920 gl::Context *context = gl::getContext();
1921
1922 if (context)
1923 {
1924 gl::Program *programObject = context->getProgram(program);
1925
1926 if (!programObject)
1927 {
1928 if (context->getShader(program))
1929 {
1930 return error(GL_INVALID_OPERATION);
1931 }
1932 else
1933 {
1934 return error(GL_INVALID_VALUE);
1935 }
1936 }
1937
1938 if (index >= (GLuint)programObject->getActiveUniformCount())
1939 {
1940 return error(GL_INVALID_VALUE);
1941 }
1942
1943 programObject->getActiveUniform(index, bufsize, length, size, type, name);
1944 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001945 }
1946 catch(std::bad_alloc&)
1947 {
1948 return error(GL_OUT_OF_MEMORY);
1949 }
1950}
1951
1952void __stdcall glGetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders)
1953{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001954 TRACE("(GLuint program = %d, GLsizei maxcount = %d, GLsizei* count = 0x%0.8p, GLuint* shaders = 0x%0.8p)",
1955 program, maxcount, count, shaders);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001956
1957 try
1958 {
1959 if (maxcount < 0)
1960 {
1961 return error(GL_INVALID_VALUE);
1962 }
1963
daniel@transgaming.com6c785212010-03-30 03:36:17 +00001964 gl::Context *context = gl::getContext();
1965
1966 if (context)
1967 {
1968 gl::Program *programObject = context->getProgram(program);
1969
1970 if (!programObject)
1971 {
daniel@transgaming.com23953e32010-04-13 19:53:31 +00001972 if (context->getShader(program))
1973 {
1974 return error(GL_INVALID_OPERATION);
1975 }
1976 else
1977 {
1978 return error(GL_INVALID_VALUE);
1979 }
daniel@transgaming.com6c785212010-03-30 03:36:17 +00001980 }
1981
1982 return programObject->getAttachedShaders(maxcount, count, shaders);
1983 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001984 }
1985 catch(std::bad_alloc&)
1986 {
1987 return error(GL_OUT_OF_MEMORY);
1988 }
1989}
1990
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001991int __stdcall glGetAttribLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001992{
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00001993 TRACE("(GLuint program = %d, const GLchar* name = %s)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001994
1995 try
1996 {
1997 gl::Context *context = gl::getContext();
1998
1999 if (context)
2000 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002001
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002002 gl::Program *programObject = context->getProgram(program);
2003
2004 if (!programObject)
2005 {
daniel@transgaming.combb274c32010-04-13 03:26:21 +00002006 if (context->getShader(program))
2007 {
2008 return error(GL_INVALID_OPERATION, -1);
2009 }
2010 else
2011 {
2012 return error(GL_INVALID_VALUE, -1);
2013 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002014 }
2015
daniel@transgaming.comcf4aa872010-04-13 03:26:27 +00002016 if (!programObject->isLinked())
2017 {
2018 return error(GL_INVALID_OPERATION, -1);
2019 }
2020
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002021 return programObject->getAttributeLocation(name);
2022 }
2023 }
2024 catch(std::bad_alloc&)
2025 {
2026 return error(GL_OUT_OF_MEMORY, -1);
2027 }
2028
2029 return -1;
2030}
2031
2032void __stdcall glGetBooleanv(GLenum pname, GLboolean* params)
2033{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002034 TRACE("(GLenum pname = 0x%X, GLboolean* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002035
2036 try
2037 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002038 gl::Context *context = gl::getContext();
2039
2040 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002041 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002042 if (!(context->getBooleanv(pname, params)))
2043 {
2044 GLenum nativeType;
2045 unsigned int numParams = 0;
2046 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
2047 return error(GL_INVALID_ENUM);
2048
2049 if (numParams == 0)
2050 return; // it is known that the pname is valid, but there are no parameters to return
2051
2052 if (nativeType == GL_FLOAT)
2053 {
2054 GLfloat *floatParams = NULL;
2055 floatParams = new GLfloat[numParams];
2056
2057 context->getFloatv(pname, floatParams);
2058
2059 for (unsigned int i = 0; i < numParams; ++i)
2060 {
2061 if (floatParams[i] == 0.0f)
2062 params[i] = GL_FALSE;
2063 else
2064 params[i] = GL_TRUE;
2065 }
2066
2067 delete [] floatParams;
2068 }
2069 else if (nativeType == GL_INT)
2070 {
2071 GLint *intParams = NULL;
2072 intParams = new GLint[numParams];
2073
2074 context->getIntegerv(pname, intParams);
2075
2076 for (unsigned int i = 0; i < numParams; ++i)
2077 {
2078 if (intParams[i] == 0)
2079 params[i] = GL_FALSE;
2080 else
2081 params[i] = GL_TRUE;
2082 }
2083
2084 delete [] intParams;
2085 }
2086 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002087 }
2088 }
2089 catch(std::bad_alloc&)
2090 {
2091 return error(GL_OUT_OF_MEMORY);
2092 }
2093}
2094
2095void __stdcall glGetBufferParameteriv(GLenum target, GLenum pname, GLint* params)
2096{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002097 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 +00002098
2099 try
2100 {
daniel@transgaming.comaa0ccbd2010-04-15 20:45:05 +00002101 gl::Context *context = gl::getContext();
2102
2103 if (context)
2104 {
2105 gl::Buffer *buffer;
2106
2107 switch (target)
2108 {
2109 case GL_ARRAY_BUFFER:
2110 buffer = context->getArrayBuffer();
2111 break;
2112 case GL_ELEMENT_ARRAY_BUFFER:
2113 buffer = context->getElementArrayBuffer();
2114 break;
2115 default: return error(GL_INVALID_ENUM);
2116 }
2117
2118 if (!buffer)
2119 {
2120 // A null buffer means that "0" is bound to the requested buffer target
2121 return error(GL_INVALID_OPERATION);
2122 }
2123
2124 switch (pname)
2125 {
2126 case GL_BUFFER_USAGE:
2127 *params = buffer->usage();
2128 break;
2129 case GL_BUFFER_SIZE:
2130 *params = buffer->size();
2131 break;
2132 default: return error(GL_INVALID_ENUM);
2133 }
2134 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002135 }
2136 catch(std::bad_alloc&)
2137 {
2138 return error(GL_OUT_OF_MEMORY);
2139 }
2140}
2141
2142GLenum __stdcall glGetError(void)
2143{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002144 TRACE("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002145
2146 gl::Context *context = gl::getContext();
2147
2148 if (context)
2149 {
2150 return context->getError();
2151 }
2152
2153 return GL_NO_ERROR;
2154}
2155
2156void __stdcall glGetFloatv(GLenum pname, GLfloat* params)
2157{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002158 TRACE("(GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002159
2160 try
2161 {
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00002162 gl::Context *context = gl::getContext();
2163
2164 if (context)
2165 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002166 if (!(context->getFloatv(pname, params)))
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00002167 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002168 GLenum nativeType;
2169 unsigned int numParams = 0;
2170 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
2171 return error(GL_INVALID_ENUM);
2172
2173 if (numParams == 0)
2174 return; // it is known that the pname is valid, but that there are no parameters to return.
2175
2176 if (nativeType == GL_BOOL)
2177 {
2178 GLboolean *boolParams = NULL;
2179 boolParams = new GLboolean[numParams];
2180
2181 context->getBooleanv(pname, boolParams);
2182
2183 for (unsigned int i = 0; i < numParams; ++i)
2184 {
2185 if (boolParams[i] == GL_FALSE)
2186 params[i] = 0.0f;
2187 else
2188 params[i] = 1.0f;
2189 }
2190
2191 delete [] boolParams;
2192 }
2193 else if (nativeType == GL_INT)
2194 {
2195 GLint *intParams = NULL;
2196 intParams = new GLint[numParams];
2197
2198 context->getIntegerv(pname, intParams);
2199
2200 for (unsigned int i = 0; i < numParams; ++i)
2201 {
2202 params[i] = (GLfloat)intParams[i];
2203 }
2204
2205 delete [] intParams;
2206 }
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00002207 }
2208 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002209 }
2210 catch(std::bad_alloc&)
2211 {
2212 return error(GL_OUT_OF_MEMORY);
2213 }
2214}
2215
2216void __stdcall glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params)
2217{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002218 TRACE("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
2219 target, attachment, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002220
2221 try
2222 {
2223 gl::Context *context = gl::getContext();
2224
2225 if (context)
2226 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002227 if (context->getFramebufferHandle() == 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002228 {
2229 return error(GL_INVALID_OPERATION);
2230 }
2231
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002232 if (target != GL_FRAMEBUFFER)
2233 {
2234 return error(GL_INVALID_ENUM);
2235 }
2236
2237 GLenum attachmentType;
2238 GLuint attachmentHandle;
2239 switch (attachment)
2240 {
2241 case GL_COLOR_ATTACHMENT0:
2242 attachmentType = context->getFramebuffer()->getColorbufferType();
2243 attachmentHandle = context->getFramebuffer()->getColorbufferHandle();
2244 break;
2245 case GL_DEPTH_ATTACHMENT:
2246 attachmentType = context->getFramebuffer()->getDepthbufferType();
2247 attachmentHandle = context->getFramebuffer()->getDepthbufferHandle();
2248 break;
2249 case GL_STENCIL_ATTACHMENT:
2250 attachmentType = context->getFramebuffer()->getStencilbufferType();
2251 attachmentHandle = context->getFramebuffer()->getStencilbufferHandle();
2252 break;
2253 default: return error(GL_INVALID_ENUM);
2254 }
2255
2256 GLenum attachmentObjectType; // Type category
daniel@transgaming.comfbc09532010-04-26 15:33:41 +00002257 if (attachmentType == GL_NONE || attachmentType == GL_RENDERBUFFER)
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002258 {
2259 attachmentObjectType = attachmentType;
2260 }
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00002261 else if (gl::IsTextureTarget(attachmentType))
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002262 {
2263 attachmentObjectType = GL_TEXTURE;
2264 }
2265 else UNREACHABLE();
2266
2267 switch (pname)
2268 {
2269 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
2270 *params = attachmentObjectType;
2271 break;
2272 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
2273 if (attachmentObjectType == GL_RENDERBUFFER || attachmentObjectType == GL_TEXTURE)
2274 {
2275 *params = attachmentHandle;
2276 }
2277 else
2278 {
2279 return error(GL_INVALID_ENUM);
2280 }
2281 break;
2282 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
2283 if (attachmentObjectType == GL_TEXTURE)
2284 {
2285 *params = 0; // FramebufferTexture2D will not allow level to be set to anything else in GL ES 2.0
2286 }
2287 else
2288 {
2289 return error(GL_INVALID_ENUM);
2290 }
2291 break;
2292 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
2293 if (attachmentObjectType == GL_TEXTURE)
2294 {
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00002295 if (gl::IsCubemapTextureTarget(attachmentType))
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +00002296 {
2297 *params = attachmentType;
2298 }
2299 else
2300 {
2301 *params = 0;
2302 }
2303 }
2304 else
2305 {
2306 return error(GL_INVALID_ENUM);
2307 }
2308 break;
2309 default:
2310 return error(GL_INVALID_ENUM);
2311 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002312 }
2313 }
2314 catch(std::bad_alloc&)
2315 {
2316 return error(GL_OUT_OF_MEMORY);
2317 }
2318}
2319
2320void __stdcall glGetIntegerv(GLenum pname, GLint* params)
2321{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002322 TRACE("(GLenum pname = 0x%X, GLint* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002323
2324 try
2325 {
2326 gl::Context *context = gl::getContext();
2327
2328 if (context)
2329 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002330 if (!(context->getIntegerv(pname, params)))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002331 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002332 GLenum nativeType;
2333 unsigned int numParams = 0;
2334 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
2335 return error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002336
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002337 if (numParams == 0)
2338 return; // it is known that pname is valid, but there are no parameters to return
2339
2340 if (nativeType == GL_BOOL)
2341 {
2342 GLboolean *boolParams = NULL;
2343 boolParams = new GLboolean[numParams];
2344
2345 context->getBooleanv(pname, boolParams);
2346
2347 for (unsigned int i = 0; i < numParams; ++i)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002348 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002349 if (boolParams[i] == GL_FALSE)
2350 params[i] = 0;
2351 else
2352 params[i] = 1;
2353 }
2354
2355 delete [] boolParams;
2356 }
2357 else if (nativeType == GL_FLOAT)
2358 {
2359 GLfloat *floatParams = NULL;
2360 floatParams = new GLfloat[numParams];
2361
2362 context->getFloatv(pname, floatParams);
2363
2364 for (unsigned int i = 0; i < numParams; ++i)
2365 {
daniel@transgaming.comc1641352010-04-26 15:33:36 +00002366 if (pname == GL_DEPTH_RANGE || pname == GL_COLOR_CLEAR_VALUE || pname == GL_DEPTH_CLEAR_VALUE || pname == GL_BLEND_COLOR)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002367 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002368 params[i] = (GLint)(((GLfloat)(0xFFFFFFFF) * floatParams[i] - 1.0f) / 2.0f);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002369 }
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002370 else
2371 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 +00002372 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002373
daniel@transgaming.com777f2672010-04-07 03:25:16 +00002374 delete [] floatParams;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002375 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002376 }
2377 }
2378 }
2379 catch(std::bad_alloc&)
2380 {
2381 return error(GL_OUT_OF_MEMORY);
2382 }
2383}
2384
2385void __stdcall glGetProgramiv(GLuint program, GLenum pname, GLint* params)
2386{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002387 TRACE("(GLuint program = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", program, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002388
2389 try
2390 {
2391 gl::Context *context = gl::getContext();
2392
2393 if (context)
2394 {
2395 gl::Program *programObject = context->getProgram(program);
2396
2397 if (!programObject)
2398 {
2399 return error(GL_INVALID_VALUE);
2400 }
2401
2402 switch (pname)
2403 {
2404 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00002405 *params = programObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002406 return;
2407 case GL_LINK_STATUS:
2408 *params = programObject->isLinked();
2409 return;
2410 case GL_VALIDATE_STATUS:
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00002411 *params = programObject->isValidated();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002412 return;
2413 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00002414 *params = programObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002415 return;
2416 case GL_ATTACHED_SHADERS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00002417 *params = programObject->getAttachedShadersCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002418 return;
2419 case GL_ACTIVE_ATTRIBUTES:
daniel@transgaming.com85423182010-04-22 13:35:27 +00002420 *params = programObject->getActiveAttributeCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002421 return;
2422 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
daniel@transgaming.com85423182010-04-22 13:35:27 +00002423 *params = programObject->getActiveAttributeMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002424 return;
2425 case GL_ACTIVE_UNIFORMS:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002426 *params = programObject->getActiveUniformCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002427 return;
2428 case GL_ACTIVE_UNIFORM_MAX_LENGTH:
daniel@transgaming.com09fbfef2010-04-22 13:35:31 +00002429 *params = programObject->getActiveUniformMaxLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002430 return;
2431 default:
2432 return error(GL_INVALID_ENUM);
2433 }
2434 }
2435 }
2436 catch(std::bad_alloc&)
2437 {
2438 return error(GL_OUT_OF_MEMORY);
2439 }
2440}
2441
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002442void __stdcall glGetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002443{
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002444 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 +00002445 program, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002446
2447 try
2448 {
2449 if (bufsize < 0)
2450 {
2451 return error(GL_INVALID_VALUE);
2452 }
2453
daniel@transgaming.comcba50572010-03-28 19:36:09 +00002454 gl::Context *context = gl::getContext();
2455
2456 if (context)
2457 {
2458 gl::Program *programObject = context->getProgram(program);
2459
2460 if (!programObject)
2461 {
2462 return error(GL_INVALID_VALUE);
2463 }
2464
2465 programObject->getInfoLog(bufsize, length, infolog);
2466 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002467 }
2468 catch(std::bad_alloc&)
2469 {
2470 return error(GL_OUT_OF_MEMORY);
2471 }
2472}
2473
2474void __stdcall glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params)
2475{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002476 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 +00002477
2478 try
2479 {
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00002480 gl::Context *context = gl::getContext();
2481
2482 if (context)
2483 {
2484 if (target != GL_RENDERBUFFER)
2485 {
2486 return error(GL_INVALID_ENUM);
2487 }
2488
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002489 if (context->getRenderbufferHandle() == 0)
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00002490 {
2491 return error(GL_INVALID_OPERATION);
2492 }
2493
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002494 gl::Renderbuffer *renderbuffer = context->getRenderbuffer(context->getRenderbufferHandle());
daniel@transgaming.com4901fca2010-04-20 18:52:41 +00002495
2496 switch (pname)
2497 {
2498 case GL_RENDERBUFFER_WIDTH:
2499 *params = renderbuffer->getWidth();
2500 break;
2501 case GL_RENDERBUFFER_HEIGHT:
2502 *params = renderbuffer->getHeight();
2503 break;
2504 case GL_RENDERBUFFER_INTERNAL_FORMAT:
2505 *params = renderbuffer->getFormat();
2506 break;
2507 case GL_RENDERBUFFER_RED_SIZE:
2508 if (renderbuffer->isColorbuffer())
2509 {
2510 *params = static_cast<gl::Colorbuffer*>(renderbuffer)->getRedSize();
2511 }
2512 else
2513 {
2514 *params = 0;
2515 }
2516 break;
2517 case GL_RENDERBUFFER_GREEN_SIZE:
2518 if (renderbuffer->isColorbuffer())
2519 {
2520 *params = static_cast<gl::Colorbuffer*>(renderbuffer)->getGreenSize();
2521 }
2522 else
2523 {
2524 *params = 0;
2525 }
2526 break;
2527 case GL_RENDERBUFFER_BLUE_SIZE:
2528 if (renderbuffer->isColorbuffer())
2529 {
2530 *params = static_cast<gl::Colorbuffer*>(renderbuffer)->getBlueSize();
2531 }
2532 else
2533 {
2534 *params = 0;
2535 }
2536 break;
2537 case GL_RENDERBUFFER_ALPHA_SIZE:
2538 if (renderbuffer->isColorbuffer())
2539 {
2540 *params = static_cast<gl::Colorbuffer*>(renderbuffer)->getAlphaSize();
2541 }
2542 else
2543 {
2544 *params = 0;
2545 }
2546 break;
2547 case GL_RENDERBUFFER_DEPTH_SIZE:
2548 if (renderbuffer->isDepthbuffer())
2549 {
2550 *params = static_cast<gl::Depthbuffer*>(renderbuffer)->getDepthSize();
2551 }
2552 else
2553 {
2554 *params = 0;
2555 }
2556 break;
2557 case GL_RENDERBUFFER_STENCIL_SIZE:
2558 if (renderbuffer->isStencilbuffer())
2559 {
2560 *params = static_cast<gl::Stencilbuffer*>(renderbuffer)->getStencilSize();
2561 }
2562 else
2563 {
2564 *params = 0;
2565 }
2566 break;
2567 default:
2568 return error(GL_INVALID_ENUM);
2569 }
2570 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002571 }
2572 catch(std::bad_alloc&)
2573 {
2574 return error(GL_OUT_OF_MEMORY);
2575 }
2576}
2577
2578void __stdcall glGetShaderiv(GLuint shader, GLenum pname, GLint* params)
2579{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002580 TRACE("(GLuint shader = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", shader, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002581
2582 try
2583 {
2584 gl::Context *context = gl::getContext();
2585
2586 if (context)
2587 {
2588 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00002589
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002590 if (!shaderObject)
2591 {
2592 return error(GL_INVALID_VALUE);
2593 }
2594
2595 switch (pname)
2596 {
2597 case GL_SHADER_TYPE:
2598 *params = shaderObject->getType();
2599 return;
2600 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00002601 *params = shaderObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002602 return;
2603 case GL_COMPILE_STATUS:
2604 *params = shaderObject->isCompiled() ? GL_TRUE : GL_FALSE;
2605 return;
2606 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00002607 *params = shaderObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002608 return;
2609 case GL_SHADER_SOURCE_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00002610 *params = shaderObject->getSourceLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002611 return;
2612 default:
2613 return error(GL_INVALID_ENUM);
2614 }
2615 }
2616 }
2617 catch(std::bad_alloc&)
2618 {
2619 return error(GL_OUT_OF_MEMORY);
2620 }
2621}
2622
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002623void __stdcall glGetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* infolog)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002624{
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002625 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 +00002626 shader, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002627
2628 try
2629 {
2630 if (bufsize < 0)
2631 {
2632 return error(GL_INVALID_VALUE);
2633 }
2634
daniel@transgaming.comcba50572010-03-28 19:36:09 +00002635 gl::Context *context = gl::getContext();
2636
2637 if (context)
2638 {
2639 gl::Shader *shaderObject = context->getShader(shader);
2640
2641 if (!shaderObject)
2642 {
2643 return error(GL_INVALID_VALUE);
2644 }
2645
2646 shaderObject->getInfoLog(bufsize, length, infolog);
2647 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002648 }
2649 catch(std::bad_alloc&)
2650 {
2651 return error(GL_OUT_OF_MEMORY);
2652 }
2653}
2654
2655void __stdcall glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision)
2656{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002657 TRACE("(GLenum shadertype = 0x%X, GLenum precisiontype = 0x%X, GLint* range = 0x%0.8p, GLint* precision = 0x%0.8p)",
2658 shadertype, precisiontype, range, precision);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002659
2660 try
2661 {
daniel@transgaming.com6c785212010-03-30 03:36:17 +00002662 switch (shadertype)
2663 {
2664 case GL_VERTEX_SHADER:
2665 case GL_FRAGMENT_SHADER:
2666 break;
2667 default:
2668 return error(GL_INVALID_ENUM);
2669 }
2670
2671 switch (precisiontype)
2672 {
2673 case GL_LOW_FLOAT:
2674 case GL_MEDIUM_FLOAT:
2675 case GL_HIGH_FLOAT:
2676 // Assume IEEE 754 precision
2677 range[0] = 127;
2678 range[1] = 127;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00002679 *precision = 23;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00002680 break;
2681 case GL_LOW_INT:
2682 case GL_MEDIUM_INT:
2683 case GL_HIGH_INT:
2684 // Some (most) hardware only supports single-precision floating-point numbers,
2685 // which can accurately represent integers up to +/-16777216
2686 range[0] = 24;
2687 range[1] = 24;
daniel@transgaming.comc5c15382010-04-23 18:34:49 +00002688 *precision = 0;
daniel@transgaming.com6c785212010-03-30 03:36:17 +00002689 break;
2690 default:
2691 return error(GL_INVALID_ENUM);
2692 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002693 }
2694 catch(std::bad_alloc&)
2695 {
2696 return error(GL_OUT_OF_MEMORY);
2697 }
2698}
2699
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002700void __stdcall glGetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002701{
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002702 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 +00002703 shader, bufsize, length, source);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002704
2705 try
2706 {
2707 if (bufsize < 0)
2708 {
2709 return error(GL_INVALID_VALUE);
2710 }
2711
daniel@transgaming.comcba50572010-03-28 19:36:09 +00002712 gl::Context *context = gl::getContext();
2713
2714 if (context)
2715 {
2716 gl::Shader *shaderObject = context->getShader(shader);
2717
2718 if (!shaderObject)
2719 {
daniel@transgaming.com41187f12010-04-01 13:39:29 +00002720 return error(GL_INVALID_OPERATION);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00002721 }
2722
2723 shaderObject->getSource(bufsize, length, source);
2724 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002725 }
2726 catch(std::bad_alloc&)
2727 {
2728 return error(GL_OUT_OF_MEMORY);
2729 }
2730}
2731
2732const GLubyte* __stdcall glGetString(GLenum name)
2733{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002734 TRACE("(GLenum name = 0x%X)", name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002735
2736 try
2737 {
2738 switch (name)
2739 {
2740 case GL_VENDOR:
2741 return (GLubyte*)"TransGaming Inc.";
2742 case GL_RENDERER:
2743 return (GLubyte*)"ANGLE";
2744 case GL_VERSION:
2745 return (GLubyte*)"OpenGL ES 2.0 (git-devel "__DATE__ " " __TIME__")";
2746 case GL_SHADING_LANGUAGE_VERSION:
2747 return (GLubyte*)"OpenGL ES GLSL ES 1.00 (git-devel "__DATE__ " " __TIME__")";
2748 case GL_EXTENSIONS:
2749 return (GLubyte*)"";
2750 default:
2751 return error(GL_INVALID_ENUM, (GLubyte*)NULL);
2752 }
2753 }
2754 catch(std::bad_alloc&)
2755 {
2756 return error(GL_OUT_OF_MEMORY, (GLubyte*)NULL);
2757 }
2758
2759 return NULL;
2760}
2761
2762void __stdcall glGetTexParameterfv(GLenum target, GLenum pname, GLfloat* params)
2763{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002764 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 +00002765
2766 try
2767 {
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00002768 gl::Context *context = gl::getContext();
2769
2770 if (context)
2771 {
2772 gl::Texture *texture;
2773
2774 switch (target)
2775 {
2776 case GL_TEXTURE_2D:
2777 texture = context->getTexture2D();
2778 break;
2779 case GL_TEXTURE_CUBE_MAP:
2780 texture = context->getTextureCubeMap();
2781 break;
2782 default:
2783 return error(GL_INVALID_ENUM);
2784 }
2785
2786 switch (pname)
2787 {
2788 case GL_TEXTURE_MAG_FILTER:
2789 *params = (GLfloat)texture->getMagFilter();
2790 break;
2791 case GL_TEXTURE_MIN_FILTER:
2792 *params = (GLfloat)texture->getMinFilter();
2793 break;
2794 case GL_TEXTURE_WRAP_S:
2795 *params = (GLfloat)texture->getWrapS();
2796 break;
2797 case GL_TEXTURE_WRAP_T:
2798 *params = (GLfloat)texture->getWrapT();
2799 break;
2800 default:
2801 return error(GL_INVALID_ENUM);
2802 }
2803 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002804 }
2805 catch(std::bad_alloc&)
2806 {
2807 return error(GL_OUT_OF_MEMORY);
2808 }
2809}
2810
2811void __stdcall glGetTexParameteriv(GLenum target, GLenum pname, GLint* params)
2812{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002813 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 +00002814
2815 try
2816 {
daniel@transgaming.com5d2bee92010-04-20 18:51:56 +00002817 gl::Context *context = gl::getContext();
2818
2819 if (context)
2820 {
2821 gl::Texture *texture;
2822
2823 switch (target)
2824 {
2825 case GL_TEXTURE_2D:
2826 texture = context->getTexture2D();
2827 break;
2828 case GL_TEXTURE_CUBE_MAP:
2829 texture = context->getTextureCubeMap();
2830 break;
2831 default:
2832 return error(GL_INVALID_ENUM);
2833 }
2834
2835 switch (pname)
2836 {
2837 case GL_TEXTURE_MAG_FILTER:
2838 *params = texture->getMagFilter();
2839 break;
2840 case GL_TEXTURE_MIN_FILTER:
2841 *params = texture->getMinFilter();
2842 break;
2843 case GL_TEXTURE_WRAP_S:
2844 *params = texture->getWrapS();
2845 break;
2846 case GL_TEXTURE_WRAP_T:
2847 *params = texture->getWrapT();
2848 break;
2849 default:
2850 return error(GL_INVALID_ENUM);
2851 }
2852 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002853 }
2854 catch(std::bad_alloc&)
2855 {
2856 return error(GL_OUT_OF_MEMORY);
2857 }
2858}
2859
2860void __stdcall glGetUniformfv(GLuint program, GLint location, GLfloat* params)
2861{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002862 TRACE("(GLuint program = %d, GLint location = %d, GLfloat* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002863
2864 try
2865 {
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00002866 gl::Context *context = gl::getContext();
2867
2868 if (context)
2869 {
2870 if (program == 0)
2871 {
2872 return error(GL_INVALID_VALUE);
2873 }
2874
2875 gl::Program *programObject = context->getProgram(program);
2876
2877 if (!programObject || !programObject->isLinked())
2878 {
2879 return error(GL_INVALID_OPERATION);
2880 }
2881
2882 if (!programObject->getUniformfv(location, params))
2883 {
2884 return error(GL_INVALID_OPERATION);
2885 }
2886 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002887 }
2888 catch(std::bad_alloc&)
2889 {
2890 return error(GL_OUT_OF_MEMORY);
2891 }
2892}
2893
2894void __stdcall glGetUniformiv(GLuint program, GLint location, GLint* params)
2895{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002896 TRACE("(GLuint program = %d, GLint location = %d, GLint* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002897
2898 try
2899 {
daniel@transgaming.combb3d9d02010-04-13 03:26:06 +00002900 gl::Context *context = gl::getContext();
2901
2902 if (context)
2903 {
2904 if (program == 0)
2905 {
2906 return error(GL_INVALID_VALUE);
2907 }
2908
2909 gl::Program *programObject = context->getProgram(program);
2910
2911 if (!programObject || !programObject->isLinked())
2912 {
2913 return error(GL_INVALID_OPERATION);
2914 }
2915
2916 if (!programObject)
2917 {
2918 return error(GL_INVALID_OPERATION);
2919 }
2920
2921 if (!programObject->getUniformiv(location, params))
2922 {
2923 return error(GL_INVALID_OPERATION);
2924 }
2925 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002926 }
2927 catch(std::bad_alloc&)
2928 {
2929 return error(GL_OUT_OF_MEMORY);
2930 }
2931}
2932
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002933int __stdcall glGetUniformLocation(GLuint program, const GLchar* name)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002934{
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00002935 TRACE("(GLuint program = %d, const GLchar* name = 0x%0.8p)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002936
2937 try
2938 {
2939 gl::Context *context = gl::getContext();
2940
2941 if (strstr(name, "gl_") == name)
2942 {
2943 return -1;
2944 }
2945
2946 if (context)
2947 {
2948 gl::Program *programObject = context->getProgram(program);
2949
2950 if (!programObject)
2951 {
daniel@transgaming.comd1abe5b2010-04-13 19:53:33 +00002952 if (context->getShader(program))
2953 {
2954 return error(GL_INVALID_OPERATION, -1);
2955 }
2956 else
2957 {
2958 return error(GL_INVALID_VALUE, -1);
2959 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002960 }
2961
2962 if (!programObject->isLinked())
2963 {
2964 return error(GL_INVALID_OPERATION, -1);
2965 }
2966
2967 return programObject->getUniformLocation(name);
2968 }
2969 }
2970 catch(std::bad_alloc&)
2971 {
2972 return error(GL_OUT_OF_MEMORY, -1);
2973 }
2974
2975 return -1;
2976}
2977
2978void __stdcall glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params)
2979{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002980 TRACE("(GLuint index = %d, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002981
2982 try
2983 {
daniel@transgaming.come0078962010-04-15 20:45:08 +00002984 gl::Context *context = gl::getContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002985
daniel@transgaming.come0078962010-04-15 20:45:08 +00002986 if (context)
2987 {
2988 if (index >= gl::MAX_VERTEX_ATTRIBS)
2989 {
2990 return error(GL_INVALID_VALUE);
2991 }
2992
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002993 gl::AttributeState attribState = context->getVertexAttribState(index);
2994
daniel@transgaming.come0078962010-04-15 20:45:08 +00002995 switch (pname)
2996 {
2997 case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00002998 *params = (GLfloat)(attribState.mEnabled ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00002999 break;
3000 case GL_VERTEX_ATTRIB_ARRAY_SIZE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003001 *params = (GLfloat)attribState.mSize;
daniel@transgaming.come0078962010-04-15 20:45:08 +00003002 break;
3003 case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003004 *params = (GLfloat)attribState.mStride;
daniel@transgaming.come0078962010-04-15 20:45:08 +00003005 break;
3006 case GL_VERTEX_ATTRIB_ARRAY_TYPE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003007 *params = (GLfloat)attribState.mType;
daniel@transgaming.come0078962010-04-15 20:45:08 +00003008 break;
3009 case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003010 *params = (GLfloat)(attribState.mNormalized ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003011 break;
3012 case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003013 *params = (GLfloat)attribState.mBoundBuffer;
daniel@transgaming.come0078962010-04-15 20:45:08 +00003014 break;
3015 case GL_CURRENT_VERTEX_ATTRIB:
3016 for (int i = 0; i < 4; ++i)
3017 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003018 params[i] = attribState.mCurrentValue[i];
daniel@transgaming.come0078962010-04-15 20:45:08 +00003019 }
3020 break;
3021 default: return error(GL_INVALID_ENUM);
3022 }
3023 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003024 }
3025 catch(std::bad_alloc&)
3026 {
3027 return error(GL_OUT_OF_MEMORY);
3028 }
3029}
3030
3031void __stdcall glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params)
3032{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003033 TRACE("(GLuint index = %d, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003034
3035 try
3036 {
daniel@transgaming.come0078962010-04-15 20:45:08 +00003037 gl::Context *context = gl::getContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003038
daniel@transgaming.come0078962010-04-15 20:45:08 +00003039 if (context)
3040 {
3041 if (index >= gl::MAX_VERTEX_ATTRIBS)
3042 {
3043 return error(GL_INVALID_VALUE);
3044 }
3045
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003046 gl::AttributeState attribState = context->getVertexAttribState(index);
3047
daniel@transgaming.come0078962010-04-15 20:45:08 +00003048 switch (pname)
3049 {
3050 case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003051 *params = (attribState.mEnabled ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003052 break;
3053 case GL_VERTEX_ATTRIB_ARRAY_SIZE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003054 *params = attribState.mSize;
daniel@transgaming.come0078962010-04-15 20:45:08 +00003055 break;
3056 case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003057 *params = attribState.mStride;
daniel@transgaming.come0078962010-04-15 20:45:08 +00003058 break;
3059 case GL_VERTEX_ATTRIB_ARRAY_TYPE:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003060 *params = attribState.mType;
daniel@transgaming.come0078962010-04-15 20:45:08 +00003061 break;
3062 case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003063 *params = (attribState.mNormalized ? GL_TRUE : GL_FALSE);
daniel@transgaming.come0078962010-04-15 20:45:08 +00003064 break;
3065 case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003066 *params = attribState.mBoundBuffer;
daniel@transgaming.come0078962010-04-15 20:45:08 +00003067 break;
3068 case GL_CURRENT_VERTEX_ATTRIB:
3069 for (int i = 0; i < 4; ++i)
3070 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003071 float currentValue = attribState.mCurrentValue[i];
daniel@transgaming.come0078962010-04-15 20:45:08 +00003072 params[i] = (GLint)(currentValue > 0.0f ? floor(currentValue + 0.5f) : ceil(currentValue - 0.5f));
3073 }
3074 break;
3075 default: return error(GL_INVALID_ENUM);
3076 }
3077 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003078 }
3079 catch(std::bad_alloc&)
3080 {
3081 return error(GL_OUT_OF_MEMORY);
3082 }
3083}
3084
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003085void __stdcall glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid** pointer)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003086{
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003087 TRACE("(GLuint index = %d, GLenum pname = 0x%X, GLvoid** pointer = 0x%0.8p)", index, pname, pointer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003088
3089 try
3090 {
daniel@transgaming.come0078962010-04-15 20:45:08 +00003091 gl::Context *context = gl::getContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003092
daniel@transgaming.come0078962010-04-15 20:45:08 +00003093 if (context)
3094 {
3095 if (index >= gl::MAX_VERTEX_ATTRIBS)
3096 {
3097 return error(GL_INVALID_VALUE);
3098 }
3099
3100 if (pname != GL_VERTEX_ATTRIB_ARRAY_POINTER)
3101 {
3102 return error(GL_INVALID_ENUM);
3103 }
3104
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003105 *pointer = const_cast<GLvoid*>(context->getVertexAttribPointer(index));
daniel@transgaming.come0078962010-04-15 20:45:08 +00003106 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003107 }
3108 catch(std::bad_alloc&)
3109 {
3110 return error(GL_OUT_OF_MEMORY);
3111 }
3112}
3113
3114void __stdcall glHint(GLenum target, GLenum mode)
3115{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003116 TRACE("(GLenum target = 0x%X, GLenum mode = 0x%X)", target, mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003117
3118 try
3119 {
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00003120 switch (target)
3121 {
3122 case GL_GENERATE_MIPMAP_HINT:
3123 switch (mode)
3124 {
3125 case GL_FASTEST:
3126 case GL_NICEST:
3127 case GL_DONT_CARE:
3128 break;
3129 default:
3130 return error(GL_INVALID_ENUM);
3131 }
3132 break;
3133 default:
3134 return error(GL_INVALID_ENUM);
3135 }
3136
3137 gl::Context *context = gl::getContext();
3138 if (context)
3139 {
3140 if (target == GL_GENERATE_MIPMAP_HINT)
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003141 context->setGenerateMipmapHint(mode);
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00003142 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003143 }
3144 catch(std::bad_alloc&)
3145 {
3146 return error(GL_OUT_OF_MEMORY);
3147 }
3148}
3149
3150GLboolean __stdcall glIsBuffer(GLuint buffer)
3151{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003152 TRACE("(GLuint buffer = %d)", buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003153
3154 try
3155 {
3156 gl::Context *context = gl::getContext();
3157
3158 if (context && buffer)
3159 {
3160 gl::Buffer *bufferObject = context->getBuffer(buffer);
3161
3162 if (bufferObject)
3163 {
3164 return GL_TRUE;
3165 }
3166 }
3167 }
3168 catch(std::bad_alloc&)
3169 {
3170 return error(GL_OUT_OF_MEMORY, GL_FALSE);
3171 }
3172
3173 return GL_FALSE;
3174}
3175
3176GLboolean __stdcall glIsEnabled(GLenum cap)
3177{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003178 TRACE("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003179
3180 try
3181 {
3182 gl::Context *context = gl::getContext();
3183
3184 if (context)
3185 {
3186 switch (cap)
3187 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003188 case GL_CULL_FACE: return context->isCullFaceEnabled();
3189 case GL_POLYGON_OFFSET_FILL: return context->isPolygonOffsetFillEnabled();
3190 case GL_SAMPLE_ALPHA_TO_COVERAGE: return context->isSampleAlphaToCoverageEnabled();
3191 case GL_SAMPLE_COVERAGE: return context->isSampleCoverageEnabled();
3192 case GL_SCISSOR_TEST: return context->isScissorTestEnabled();
3193 case GL_STENCIL_TEST: return context->isStencilTestEnabled();
3194 case GL_DEPTH_TEST: return context->isDepthTestEnabled();
3195 case GL_BLEND: return context->isBlendEnabled();
3196 case GL_DITHER: return context->isDitherEnabled();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003197 default:
3198 return error(GL_INVALID_ENUM, false);
3199 }
3200 }
3201 }
3202 catch(std::bad_alloc&)
3203 {
3204 return error(GL_OUT_OF_MEMORY, false);
3205 }
3206
3207 return false;
3208}
3209
3210GLboolean __stdcall glIsFramebuffer(GLuint framebuffer)
3211{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003212 TRACE("(GLuint framebuffer = %d)", framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003213
3214 try
3215 {
3216 gl::Context *context = gl::getContext();
3217
3218 if (context && framebuffer)
3219 {
3220 gl::Framebuffer *framebufferObject = context->getFramebuffer(framebuffer);
3221
3222 if (framebufferObject)
3223 {
3224 return GL_TRUE;
3225 }
3226 }
3227 }
3228 catch(std::bad_alloc&)
3229 {
3230 return error(GL_OUT_OF_MEMORY, GL_FALSE);
3231 }
3232
3233 return GL_FALSE;
3234}
3235
3236GLboolean __stdcall glIsProgram(GLuint program)
3237{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003238 TRACE("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003239
3240 try
3241 {
3242 gl::Context *context = gl::getContext();
3243
3244 if (context && program)
3245 {
3246 gl::Program *programObject = context->getProgram(program);
3247
3248 if (programObject)
3249 {
3250 return GL_TRUE;
3251 }
3252 }
3253 }
3254 catch(std::bad_alloc&)
3255 {
3256 return error(GL_OUT_OF_MEMORY, GL_FALSE);
3257 }
3258
3259 return GL_FALSE;
3260}
3261
3262GLboolean __stdcall glIsRenderbuffer(GLuint renderbuffer)
3263{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003264 TRACE("(GLuint renderbuffer = %d)", renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003265
3266 try
3267 {
3268 gl::Context *context = gl::getContext();
3269
3270 if (context && renderbuffer)
3271 {
3272 gl::Renderbuffer *renderbufferObject = context->getRenderbuffer(renderbuffer);
3273
3274 if (renderbufferObject)
3275 {
3276 return GL_TRUE;
3277 }
3278 }
3279 }
3280 catch(std::bad_alloc&)
3281 {
3282 return error(GL_OUT_OF_MEMORY, GL_FALSE);
3283 }
3284
3285 return GL_FALSE;
3286}
3287
3288GLboolean __stdcall glIsShader(GLuint shader)
3289{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003290 TRACE("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003291
3292 try
3293 {
3294 gl::Context *context = gl::getContext();
3295
3296 if (context && shader)
3297 {
3298 gl::Shader *shaderObject = context->getShader(shader);
3299
3300 if (shaderObject)
3301 {
3302 return GL_TRUE;
3303 }
3304 }
3305 }
3306 catch(std::bad_alloc&)
3307 {
3308 return error(GL_OUT_OF_MEMORY, GL_FALSE);
3309 }
3310
3311 return GL_FALSE;
3312}
3313
3314GLboolean __stdcall glIsTexture(GLuint texture)
3315{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003316 TRACE("(GLuint texture = %d)", texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003317
3318 try
3319 {
3320 gl::Context *context = gl::getContext();
3321
3322 if (context && texture)
3323 {
3324 gl::Texture *textureObject = context->getTexture(texture);
3325
3326 if (textureObject)
3327 {
3328 return GL_TRUE;
3329 }
3330 }
3331 }
3332 catch(std::bad_alloc&)
3333 {
3334 return error(GL_OUT_OF_MEMORY, GL_FALSE);
3335 }
3336
3337 return GL_FALSE;
3338}
3339
3340void __stdcall glLineWidth(GLfloat width)
3341{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003342 TRACE("(GLfloat width = %f)", width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003343
3344 try
3345 {
3346 if (width <= 0.0f)
3347 {
3348 return error(GL_INVALID_VALUE);
3349 }
3350
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00003351 gl::Context *context = gl::getContext();
3352
3353 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003354 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003355 context->setLineWidth(width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003356 }
3357 }
3358 catch(std::bad_alloc&)
3359 {
3360 return error(GL_OUT_OF_MEMORY);
3361 }
3362}
3363
3364void __stdcall glLinkProgram(GLuint program)
3365{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003366 TRACE("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003367
3368 try
3369 {
3370 gl::Context *context = gl::getContext();
3371
3372 if (context)
3373 {
3374 gl::Program *programObject = context->getProgram(program);
3375
3376 if (!programObject)
3377 {
daniel@transgaming.com277b7142010-04-13 03:26:44 +00003378 if (context->getShader(program))
3379 {
3380 return error(GL_INVALID_OPERATION);
3381 }
3382 else
3383 {
3384 return error(GL_INVALID_VALUE);
3385 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003386 }
3387
3388 programObject->link();
3389 }
3390 }
3391 catch(std::bad_alloc&)
3392 {
3393 return error(GL_OUT_OF_MEMORY);
3394 }
3395}
3396
3397void __stdcall glPixelStorei(GLenum pname, GLint param)
3398{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003399 TRACE("(GLenum pname = 0x%X, GLint param = %d)", pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003400
3401 try
3402 {
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00003403 gl::Context *context = gl::getContext();
3404
3405 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003406 {
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00003407 switch (pname)
3408 {
3409 case GL_UNPACK_ALIGNMENT:
3410 if (param != 1 && param != 2 && param != 4 && param != 8)
3411 {
3412 return error(GL_INVALID_VALUE);
3413 }
3414
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003415 context->setUnpackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00003416 break;
3417
3418 case GL_PACK_ALIGNMENT:
3419 if (param != 1 && param != 2 && param != 4 && param != 8)
3420 {
3421 return error(GL_INVALID_VALUE);
3422 }
3423
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003424 context->setPackAlignment(param);
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00003425 break;
3426
3427 default:
3428 return error(GL_INVALID_ENUM);
3429 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003430 }
3431 }
3432 catch(std::bad_alloc&)
3433 {
3434 return error(GL_OUT_OF_MEMORY);
3435 }
3436}
3437
3438void __stdcall glPolygonOffset(GLfloat factor, GLfloat units)
3439{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003440 TRACE("(GLfloat factor = %f, GLfloat units = %f)", factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003441
3442 try
3443 {
daniel@transgaming.comaede6302010-04-29 03:35:48 +00003444 gl::Context *context = gl::getContext();
3445
3446 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003447 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003448 context->setPolygonOffsetParams(factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003449 }
3450 }
3451 catch(std::bad_alloc&)
3452 {
3453 return error(GL_OUT_OF_MEMORY);
3454 }
3455}
3456
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003457void __stdcall glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003458{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003459 TRACE("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003460 "GLenum format = 0x%X, GLenum type = 0x%X, GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003461 x, y, width, height, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003462
3463 try
3464 {
3465 if (width < 0 || height < 0)
3466 {
3467 return error(GL_INVALID_VALUE);
3468 }
3469
3470 switch (format)
3471 {
3472 case GL_RGBA:
3473 switch (type)
3474 {
3475 case GL_UNSIGNED_BYTE:
3476 break;
3477 default:
3478 return error(GL_INVALID_OPERATION);
3479 }
3480 break;
3481 case gl::IMPLEMENTATION_COLOR_READ_FORMAT:
3482 switch (type)
3483 {
3484 case gl::IMPLEMENTATION_COLOR_READ_TYPE:
3485 break;
3486 default:
3487 return error(GL_INVALID_OPERATION);
3488 }
3489 break;
3490 default:
3491 return error(GL_INVALID_OPERATION);
3492 }
3493
3494 gl::Context *context = gl::getContext();
3495
3496 if (context)
3497 {
3498 context->readPixels(x, y, width, height, format, type, pixels);
3499 }
3500 }
3501 catch(std::bad_alloc&)
3502 {
3503 return error(GL_OUT_OF_MEMORY);
3504 }
3505}
3506
3507void __stdcall glReleaseShaderCompiler(void)
3508{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003509 TRACE("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003510
3511 try
3512 {
3513 gl::Shader::releaseCompiler();
3514 }
3515 catch(std::bad_alloc&)
3516 {
3517 return error(GL_OUT_OF_MEMORY);
3518 }
3519}
3520
3521void __stdcall glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
3522{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003523 TRACE("(GLenum target = 0x%X, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
3524 target, internalformat, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003525
3526 try
3527 {
3528 switch (target)
3529 {
3530 case GL_RENDERBUFFER:
3531 break;
3532 default:
3533 return error(GL_INVALID_ENUM);
3534 }
3535
3536 switch (internalformat)
3537 {
3538 case GL_DEPTH_COMPONENT16:
3539 case GL_RGBA4:
3540 case GL_RGB5_A1:
3541 case GL_RGB565:
3542 case GL_STENCIL_INDEX8:
3543 break;
3544 default:
3545 return error(GL_INVALID_ENUM);
3546 }
3547
3548 if (width < 0 || height < 0 || width > gl::MAX_RENDERBUFFER_SIZE || height > gl::MAX_RENDERBUFFER_SIZE)
3549 {
3550 return error(GL_INVALID_VALUE);
3551 }
3552
3553 gl::Context *context = gl::getContext();
3554
3555 if (context)
3556 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003557 if (context->getFramebufferHandle() == 0 || context->getRenderbufferHandle() == 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003558 {
3559 return error(GL_INVALID_OPERATION);
3560 }
3561
3562 switch (internalformat)
3563 {
3564 case GL_DEPTH_COMPONENT16:
3565 context->setRenderbuffer(new gl::Depthbuffer(width, height));
3566 break;
3567 case GL_RGBA4:
3568 case GL_RGB5_A1:
3569 case GL_RGB565:
daniel@transgaming.com70d312a2010-04-20 18:52:38 +00003570 context->setRenderbuffer(new gl::Colorbuffer(width, height, internalformat));
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003571 break;
3572 case GL_STENCIL_INDEX8:
daniel@transgaming.com4a9d65c2010-03-08 21:30:56 +00003573 context->setRenderbuffer(new gl::Stencilbuffer(width, height));
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003574 break;
3575 default:
3576 return error(GL_INVALID_ENUM);
3577 }
3578 }
3579 }
3580 catch(std::bad_alloc&)
3581 {
3582 return error(GL_OUT_OF_MEMORY);
3583 }
3584}
3585
3586void __stdcall glSampleCoverage(GLclampf value, GLboolean invert)
3587{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003588 TRACE("(GLclampf value = %f, GLboolean invert = %d)", value, invert);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003589
3590 try
3591 {
3592 gl::Context* context = gl::getContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00003593
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003594 if (context)
3595 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003596 context->setSampleCoverageParams(gl::clamp01(value), invert);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003597 }
3598 }
3599 catch(std::bad_alloc&)
3600 {
3601 return error(GL_OUT_OF_MEMORY);
3602 }
3603}
3604
3605void __stdcall glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
3606{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003607 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 +00003608
3609 try
3610 {
3611 if (width < 0 || height < 0)
3612 {
3613 return error(GL_INVALID_VALUE);
3614 }
3615
3616 gl::Context* context = gl::getContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00003617
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003618 if (context)
3619 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003620 context->setScissorParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003621 }
3622 }
3623 catch(std::bad_alloc&)
3624 {
3625 return error(GL_OUT_OF_MEMORY);
3626 }
3627}
3628
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003629void __stdcall glShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryformat, const GLvoid* binary, GLsizei length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003630{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003631 TRACE("(GLsizei n = %d, const GLuint* shaders = 0x%0.8p, GLenum binaryformat = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003632 "const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003633 n, shaders, binaryformat, binary, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003634
3635 try
3636 {
daniel@transgaming.comd1f667f2010-04-29 03:38:52 +00003637 // No binary shader formats are supported.
3638 return error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003639 }
3640 catch(std::bad_alloc&)
3641 {
3642 return error(GL_OUT_OF_MEMORY);
3643 }
3644}
3645
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003646void __stdcall glShaderSource(GLuint shader, GLsizei count, const GLchar** string, const GLint* length)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003647{
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003648 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 +00003649 shader, count, string, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003650
3651 try
3652 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00003653 if (count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003654 {
3655 return error(GL_INVALID_VALUE);
3656 }
3657
3658 gl::Context *context = gl::getContext();
3659
3660 if (context)
3661 {
3662 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00003663
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003664 if (!shaderObject)
3665 {
daniel@transgaming.com8e6a6be2010-04-13 03:26:41 +00003666 if (context->getProgram(shader))
3667 {
3668 return error(GL_INVALID_OPERATION);
3669 }
3670 else
3671 {
3672 return error(GL_INVALID_VALUE);
3673 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003674 }
3675
3676 shaderObject->setSource(count, string, length);
3677 }
3678 }
3679 catch(std::bad_alloc&)
3680 {
3681 return error(GL_OUT_OF_MEMORY);
3682 }
3683}
3684
3685void __stdcall glStencilFunc(GLenum func, GLint ref, GLuint mask)
3686{
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00003687 glStencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003688}
3689
3690void __stdcall glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
3691{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003692 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 +00003693
3694 try
3695 {
3696 switch (face)
3697 {
3698 case GL_FRONT:
3699 case GL_BACK:
3700 case GL_FRONT_AND_BACK:
3701 break;
3702 default:
3703 return error(GL_INVALID_ENUM);
3704 }
3705
3706 switch (func)
3707 {
3708 case GL_NEVER:
3709 case GL_ALWAYS:
3710 case GL_LESS:
3711 case GL_LEQUAL:
3712 case GL_EQUAL:
3713 case GL_GEQUAL:
3714 case GL_GREATER:
3715 case GL_NOTEQUAL:
3716 break;
3717 default:
3718 return error(GL_INVALID_ENUM);
3719 }
3720
3721 gl::Context *context = gl::getContext();
3722
3723 if (context)
3724 {
3725 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
3726 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003727 context->setStencilParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003728 }
3729
3730 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
3731 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003732 context->setStencilBackParams(func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003733 }
3734 }
3735 }
3736 catch(std::bad_alloc&)
3737 {
3738 return error(GL_OUT_OF_MEMORY);
3739 }
3740}
3741
3742void __stdcall glStencilMask(GLuint mask)
3743{
3744 glStencilMaskSeparate(GL_FRONT_AND_BACK, mask);
3745}
3746
3747void __stdcall glStencilMaskSeparate(GLenum face, GLuint mask)
3748{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003749 TRACE("(GLenum face = 0x%X, GLuint mask = %d)", face, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003750
3751 try
3752 {
3753 switch (face)
3754 {
3755 case GL_FRONT:
3756 case GL_BACK:
3757 case GL_FRONT_AND_BACK:
3758 break;
3759 default:
3760 return error(GL_INVALID_ENUM);
3761 }
3762
3763 gl::Context *context = gl::getContext();
3764
3765 if (context)
3766 {
3767 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
3768 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003769 context->setStencilWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003770 }
3771
3772 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
3773 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003774 context->setStencilBackWritemask(mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003775 }
3776 }
3777 }
3778 catch(std::bad_alloc&)
3779 {
3780 return error(GL_OUT_OF_MEMORY);
3781 }
3782}
3783
3784void __stdcall glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
3785{
3786 glStencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
3787}
3788
3789void __stdcall glStencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
3790{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003791 TRACE("(GLenum face = 0x%X, GLenum fail = 0x%X, GLenum zfail = 0x%X, GLenum zpas = 0x%Xs)",
3792 face, fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003793
3794 try
3795 {
3796 switch (face)
3797 {
3798 case GL_FRONT:
3799 case GL_BACK:
3800 case GL_FRONT_AND_BACK:
3801 break;
3802 default:
3803 return error(GL_INVALID_ENUM);
3804 }
3805
3806 switch (fail)
3807 {
3808 case GL_ZERO:
3809 case GL_KEEP:
3810 case GL_REPLACE:
3811 case GL_INCR:
3812 case GL_DECR:
3813 case GL_INVERT:
3814 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00003815 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003816 break;
3817 default:
3818 return error(GL_INVALID_ENUM);
3819 }
3820
3821 switch (zfail)
3822 {
3823 case GL_ZERO:
3824 case GL_KEEP:
3825 case GL_REPLACE:
3826 case GL_INCR:
3827 case GL_DECR:
3828 case GL_INVERT:
3829 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00003830 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003831 break;
3832 default:
3833 return error(GL_INVALID_ENUM);
3834 }
3835
3836 switch (zpass)
3837 {
3838 case GL_ZERO:
3839 case GL_KEEP:
3840 case GL_REPLACE:
3841 case GL_INCR:
3842 case GL_DECR:
3843 case GL_INVERT:
3844 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00003845 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003846 break;
3847 default:
3848 return error(GL_INVALID_ENUM);
3849 }
3850
3851 gl::Context *context = gl::getContext();
3852
3853 if (context)
3854 {
3855 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
3856 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003857 context->setStencilOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003858 }
3859
3860 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
3861 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003862 context->setStencilBackOperations(fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003863 }
3864 }
3865 }
3866 catch(std::bad_alloc&)
3867 {
3868 return error(GL_OUT_OF_MEMORY);
3869 }
3870}
3871
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00003872void __stdcall glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height,
3873 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003874{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003875 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 +00003876 "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 +00003877 target, level, internalformat, width, height, border, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003878
3879 try
3880 {
3881 if (level < 0 || width < 0 || height < 0)
3882 {
3883 return error(GL_INVALID_VALUE);
3884 }
3885
3886 if (level > 0 && (!gl::isPow2(width) || !gl::isPow2(height)))
3887 {
3888 return error(GL_INVALID_VALUE);
3889 }
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00003890
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003891 switch (target)
3892 {
3893 case GL_TEXTURE_2D:
3894 if (width > (gl::MAX_TEXTURE_SIZE >> level) || height > (gl::MAX_TEXTURE_SIZE >> level))
3895 {
3896 return error(GL_INVALID_VALUE);
3897 }
3898 break;
3899 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
3900 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
3901 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
3902 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
3903 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
3904 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com34dc3e82010-04-15 20:45:02 +00003905 if (width != height)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003906 {
3907 return error(GL_INVALID_VALUE);
3908 }
3909
3910 if (width > (gl::MAX_CUBE_MAP_TEXTURE_SIZE >> level) || height > (gl::MAX_CUBE_MAP_TEXTURE_SIZE >> level))
3911 {
3912 return error(GL_INVALID_VALUE);
3913 }
3914 break;
3915 default:
3916 return error(GL_INVALID_ENUM);
3917 }
3918
3919 if (internalformat != format)
3920 {
3921 return error(GL_INVALID_OPERATION);
3922 }
3923
3924 switch (internalformat)
3925 {
3926 case GL_ALPHA:
3927 case GL_LUMINANCE:
3928 case GL_LUMINANCE_ALPHA:
3929 switch (type)
3930 {
3931 case GL_UNSIGNED_BYTE:
3932 break;
3933 default:
3934 return error(GL_INVALID_ENUM);
3935 }
3936 break;
3937 case GL_RGB:
3938 switch (type)
3939 {
3940 case GL_UNSIGNED_BYTE:
3941 case GL_UNSIGNED_SHORT_5_6_5:
3942 break;
3943 default:
3944 return error(GL_INVALID_ENUM);
3945 }
3946 break;
3947 case GL_RGBA:
3948 switch (type)
3949 {
3950 case GL_UNSIGNED_BYTE:
3951 case GL_UNSIGNED_SHORT_4_4_4_4:
3952 case GL_UNSIGNED_SHORT_5_5_5_1:
3953 break;
3954 default:
3955 return error(GL_INVALID_ENUM);
3956 }
3957 break;
3958 default:
3959 return error(GL_INVALID_VALUE);
3960 }
3961
3962 if (border != 0)
3963 {
3964 return error(GL_INVALID_VALUE);
3965 }
3966
3967 gl::Context *context = gl::getContext();
3968
3969 if (context)
3970 {
3971 if (target == GL_TEXTURE_2D)
3972 {
3973 gl::Texture2D *texture = context->getTexture2D();
3974
3975 if (!texture)
3976 {
3977 return error(GL_INVALID_OPERATION);
3978 }
3979
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003980 texture->setImage(level, internalformat, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003981 }
3982 else
3983 {
3984 gl::TextureCubeMap *texture = context->getTextureCubeMap();
3985
3986 if (!texture)
3987 {
3988 return error(GL_INVALID_OPERATION);
3989 }
3990
3991 switch (target)
3992 {
3993 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003994 texture->setImagePosX(level, internalformat, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003995 break;
3996 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00003997 texture->setImageNegX(level, internalformat, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003998 break;
3999 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004000 texture->setImagePosY(level, internalformat, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004001 break;
4002 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004003 texture->setImageNegY(level, internalformat, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004004 break;
4005 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004006 texture->setImagePosZ(level, internalformat, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004007 break;
4008 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004009 texture->setImageNegZ(level, internalformat, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004010 break;
4011 default: UNREACHABLE();
4012 }
4013 }
4014 }
4015 }
4016 catch(std::bad_alloc&)
4017 {
4018 return error(GL_OUT_OF_MEMORY);
4019 }
4020}
4021
4022void __stdcall glTexParameterf(GLenum target, GLenum pname, GLfloat param)
4023{
4024 glTexParameteri(target, pname, (GLint)param);
4025}
4026
4027void __stdcall glTexParameterfv(GLenum target, GLenum pname, const GLfloat* params)
4028{
4029 glTexParameteri(target, pname, (GLint)*params);
4030}
4031
4032void __stdcall glTexParameteri(GLenum target, GLenum pname, GLint param)
4033{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004034 TRACE("(GLenum target = 0x%X, GLenum pname = 0x%X, GLfloat param = %f)", target, pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004035
4036 try
4037 {
4038 gl::Context *context = gl::getContext();
4039
4040 if (context)
4041 {
4042 gl::Texture *texture;
4043
4044 switch (target)
4045 {
4046 case GL_TEXTURE_2D:
4047 texture = context->getTexture2D();
4048 break;
4049 case GL_TEXTURE_CUBE_MAP:
4050 texture = context->getTextureCubeMap();
4051 break;
4052 default:
4053 return error(GL_INVALID_ENUM);
4054 }
4055
4056 switch (pname)
4057 {
4058 case GL_TEXTURE_WRAP_S:
4059 if (!texture->setWrapS((GLenum)param))
4060 {
4061 return error(GL_INVALID_ENUM);
4062 }
4063 break;
4064 case GL_TEXTURE_WRAP_T:
4065 if (!texture->setWrapT((GLenum)param))
4066 {
4067 return error(GL_INVALID_ENUM);
4068 }
4069 break;
4070 case GL_TEXTURE_MIN_FILTER:
4071 if (!texture->setMinFilter((GLenum)param))
4072 {
4073 return error(GL_INVALID_ENUM);
4074 }
4075 break;
4076 case GL_TEXTURE_MAG_FILTER:
4077 if (!texture->setMagFilter((GLenum)param))
4078 {
4079 return error(GL_INVALID_ENUM);
4080 }
4081 break;
4082 default:
4083 return error(GL_INVALID_ENUM);
4084 }
4085 }
4086 }
4087 catch(std::bad_alloc&)
4088 {
4089 return error(GL_OUT_OF_MEMORY);
4090 }
4091}
4092
4093void __stdcall glTexParameteriv(GLenum target, GLenum pname, const GLint* params)
4094{
4095 glTexParameteri(target, pname, *params);
4096}
4097
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004098void __stdcall glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
4099 GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004100{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004101 TRACE("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
4102 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, GLenum type = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004103 "const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004104 target, level, xoffset, yoffset, width, height, format, type, pixels);
4105
4106 try
4107 {
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00004108 if (!gl::IsTextureTarget(target))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00004109 {
4110 return error(GL_INVALID_ENUM);
4111 }
4112
4113 if (level < 0 || level > gl::MAX_TEXTURE_LEVELS || xoffset < 0 || yoffset < 0 || width < 0 || height < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004114 {
4115 return error(GL_INVALID_VALUE);
4116 }
4117
daniel@transgaming.com00c75962010-03-11 20:36:15 +00004118 if (std::numeric_limits<GLsizei>::max() - xoffset < width || std::numeric_limits<GLsizei>::max() - yoffset < height)
4119 {
4120 return error(GL_INVALID_VALUE);
4121 }
4122
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00004123 if (!gl::CheckTextureFormatType(format, type))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00004124 {
4125 return error(GL_INVALID_ENUM);
4126 }
4127
4128 if (width == 0 || height == 0 || pixels == NULL)
4129 {
4130 return;
4131 }
4132
4133 gl::Context *context = gl::getContext();
4134
4135 if (context)
4136 {
4137 if (target == GL_TEXTURE_2D)
4138 {
4139 gl::Texture2D *texture = context->getTexture2D();
4140
4141 if (!texture)
4142 {
4143 return error(GL_INVALID_OPERATION);
4144 }
4145
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004146 texture->subImage(level, xoffset, yoffset, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00004147 }
daniel@transgaming.com19ffc242010-05-04 03:35:21 +00004148 else if (gl::IsCubemapTextureTarget(target))
daniel@transgaming.com00c75962010-03-11 20:36:15 +00004149 {
4150 gl::TextureCubeMap *texture = context->getTextureCubeMap();
4151
4152 if (!texture)
4153 {
4154 return error(GL_INVALID_OPERATION);
4155 }
4156
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004157 texture->subImage(target, level, xoffset, yoffset, width, height, format, type, context->getUnpackAlignment(), pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00004158 }
4159 else
4160 {
4161 UNREACHABLE();
4162 }
4163 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004164 }
4165 catch(std::bad_alloc&)
4166 {
4167 return error(GL_OUT_OF_MEMORY);
4168 }
4169}
4170
4171void __stdcall glUniform1f(GLint location, GLfloat x)
4172{
4173 glUniform1fv(location, 1, &x);
4174}
4175
4176void __stdcall glUniform1fv(GLint location, GLsizei count, const GLfloat* v)
4177{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004178 TRACE("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004179
4180 try
4181 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004182 if (count < 0)
4183 {
4184 return error(GL_INVALID_VALUE);
4185 }
4186
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00004187 if (location == -1)
4188 {
4189 return;
4190 }
4191
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004192 gl::Context *context = gl::getContext();
4193
4194 if (context)
4195 {
4196 gl::Program *program = context->getCurrentProgram();
4197
4198 if (!program)
4199 {
4200 return error(GL_INVALID_OPERATION);
4201 }
4202
4203 if (!program->setUniform1fv(location, count, v))
4204 {
4205 return error(GL_INVALID_OPERATION);
4206 }
4207 }
4208 }
4209 catch(std::bad_alloc&)
4210 {
4211 return error(GL_OUT_OF_MEMORY);
4212 }
4213}
4214
4215void __stdcall glUniform1i(GLint location, GLint x)
4216{
4217 glUniform1iv(location, 1, &x);
4218}
4219
4220void __stdcall glUniform1iv(GLint location, GLsizei count, const GLint* v)
4221{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004222 TRACE("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004223
4224 try
4225 {
4226 if (count < 0)
4227 {
4228 return error(GL_INVALID_VALUE);
4229 }
4230
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00004231 if (location == -1)
4232 {
4233 return;
4234 }
4235
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004236 gl::Context *context = gl::getContext();
4237
4238 if (context)
4239 {
4240 gl::Program *program = context->getCurrentProgram();
4241
4242 if (!program)
4243 {
4244 return error(GL_INVALID_OPERATION);
4245 }
4246
4247 if (!program->setUniform1iv(location, count, v))
4248 {
4249 return error(GL_INVALID_OPERATION);
4250 }
4251 }
4252 }
4253 catch(std::bad_alloc&)
4254 {
4255 return error(GL_OUT_OF_MEMORY);
4256 }
4257}
4258
4259void __stdcall glUniform2f(GLint location, GLfloat x, GLfloat y)
4260{
4261 GLfloat xy[2] = {x, y};
4262
4263 glUniform2fv(location, 1, (GLfloat*)&xy);
4264}
4265
4266void __stdcall glUniform2fv(GLint location, GLsizei count, const GLfloat* v)
4267{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004268 TRACE("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004269
4270 try
4271 {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004272 if (count < 0)
4273 {
4274 return error(GL_INVALID_VALUE);
4275 }
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00004276
4277 if (location == -1)
4278 {
4279 return;
4280 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004281
4282 gl::Context *context = gl::getContext();
4283
4284 if (context)
4285 {
4286 gl::Program *program = context->getCurrentProgram();
4287
4288 if (!program)
4289 {
4290 return error(GL_INVALID_OPERATION);
4291 }
4292
4293 if (!program->setUniform2fv(location, count, v))
4294 {
4295 return error(GL_INVALID_OPERATION);
4296 }
4297 }
4298 }
4299 catch(std::bad_alloc&)
4300 {
4301 return error(GL_OUT_OF_MEMORY);
4302 }
4303}
4304
4305void __stdcall glUniform2i(GLint location, GLint x, GLint y)
4306{
4307 GLint xy[4] = {x, y};
4308
4309 glUniform2iv(location, 1, (GLint*)&xy);
4310}
4311
4312void __stdcall glUniform2iv(GLint location, GLsizei count, const GLint* v)
4313{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004314 TRACE("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004315
4316 try
4317 {
4318 if (count < 0)
4319 {
4320 return error(GL_INVALID_VALUE);
4321 }
4322
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00004323 if (location == -1)
4324 {
4325 return;
4326 }
4327
4328 gl::Context *context = gl::getContext();
4329
4330 if (context)
4331 {
4332 gl::Program *program = context->getCurrentProgram();
4333
4334 if (!program)
4335 {
4336 return error(GL_INVALID_OPERATION);
4337 }
4338
4339 if (!program->setUniform2iv(location, count, v))
4340 {
4341 return error(GL_INVALID_OPERATION);
4342 }
4343 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004344 }
4345 catch(std::bad_alloc&)
4346 {
4347 return error(GL_OUT_OF_MEMORY);
4348 }
4349}
4350
4351void __stdcall glUniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
4352{
4353 GLfloat xyz[3] = {x, y, z};
4354
4355 glUniform3fv(location, 1, (GLfloat*)&xyz);
4356}
4357
4358void __stdcall glUniform3fv(GLint location, GLsizei count, const GLfloat* v)
4359{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004360 TRACE("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004361
4362 try
4363 {
4364 if (count < 0)
4365 {
4366 return error(GL_INVALID_VALUE);
4367 }
4368
4369 if (location == -1)
4370 {
4371 return;
4372 }
4373
4374 gl::Context *context = gl::getContext();
4375
4376 if (context)
4377 {
4378 gl::Program *program = context->getCurrentProgram();
4379
4380 if (!program)
4381 {
4382 return error(GL_INVALID_OPERATION);
4383 }
4384
4385 if (!program->setUniform3fv(location, count, v))
4386 {
4387 return error(GL_INVALID_OPERATION);
4388 }
4389 }
4390 }
4391 catch(std::bad_alloc&)
4392 {
4393 return error(GL_OUT_OF_MEMORY);
4394 }
4395}
4396
4397void __stdcall glUniform3i(GLint location, GLint x, GLint y, GLint z)
4398{
4399 GLint xyz[3] = {x, y, z};
4400
4401 glUniform3iv(location, 1, (GLint*)&xyz);
4402}
4403
4404void __stdcall glUniform3iv(GLint location, GLsizei count, const GLint* v)
4405{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004406 TRACE("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004407
4408 try
4409 {
4410 if (count < 0)
4411 {
4412 return error(GL_INVALID_VALUE);
4413 }
4414
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00004415 if (location == -1)
4416 {
4417 return;
4418 }
4419
4420 gl::Context *context = gl::getContext();
4421
4422 if (context)
4423 {
4424 gl::Program *program = context->getCurrentProgram();
4425
4426 if (!program)
4427 {
4428 return error(GL_INVALID_OPERATION);
4429 }
4430
4431 if (!program->setUniform3iv(location, count, v))
4432 {
4433 return error(GL_INVALID_OPERATION);
4434 }
4435 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004436 }
4437 catch(std::bad_alloc&)
4438 {
4439 return error(GL_OUT_OF_MEMORY);
4440 }
4441}
4442
4443void __stdcall glUniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
4444{
4445 GLfloat xyzw[4] = {x, y, z, w};
4446
4447 glUniform4fv(location, 1, (GLfloat*)&xyzw);
4448}
4449
4450void __stdcall glUniform4fv(GLint location, GLsizei count, const GLfloat* v)
4451{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004452 TRACE("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004453
4454 try
4455 {
4456 if (count < 0)
4457 {
4458 return error(GL_INVALID_VALUE);
4459 }
4460
4461 if (location == -1)
4462 {
4463 return;
4464 }
4465
4466 gl::Context *context = gl::getContext();
4467
4468 if (context)
4469 {
4470 gl::Program *program = context->getCurrentProgram();
4471
4472 if (!program)
4473 {
4474 return error(GL_INVALID_OPERATION);
4475 }
4476
4477 if (!program->setUniform4fv(location, count, v))
4478 {
4479 return error(GL_INVALID_OPERATION);
4480 }
4481 }
4482 }
4483 catch(std::bad_alloc&)
4484 {
4485 return error(GL_OUT_OF_MEMORY);
4486 }
4487}
4488
4489void __stdcall glUniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
4490{
4491 GLint xyzw[4] = {x, y, z, w};
4492
4493 glUniform4iv(location, 1, (GLint*)&xyzw);
4494}
4495
4496void __stdcall glUniform4iv(GLint location, GLsizei count, const GLint* v)
4497{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004498 TRACE("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004499
4500 try
4501 {
4502 if (count < 0)
4503 {
4504 return error(GL_INVALID_VALUE);
4505 }
4506
daniel@transgaming.com9a95e2b2010-04-13 03:26:03 +00004507 if (location == -1)
4508 {
4509 return;
4510 }
4511
4512 gl::Context *context = gl::getContext();
4513
4514 if (context)
4515 {
4516 gl::Program *program = context->getCurrentProgram();
4517
4518 if (!program)
4519 {
4520 return error(GL_INVALID_OPERATION);
4521 }
4522
4523 if (!program->setUniform4iv(location, count, v))
4524 {
4525 return error(GL_INVALID_OPERATION);
4526 }
4527 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004528 }
4529 catch(std::bad_alloc&)
4530 {
4531 return error(GL_OUT_OF_MEMORY);
4532 }
4533}
4534
4535void __stdcall glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
4536{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004537 TRACE("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %d, const GLfloat* value = 0x%0.8p)",
4538 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004539
4540 try
4541 {
4542 if (count < 0 || transpose != GL_FALSE)
4543 {
4544 return error(GL_INVALID_VALUE);
4545 }
4546
4547 if (location == -1)
4548 {
4549 return;
4550 }
4551
4552 gl::Context *context = gl::getContext();
4553
4554 if (context)
4555 {
4556 gl::Program *program = context->getCurrentProgram();
4557
4558 if (!program)
4559 {
4560 return error(GL_INVALID_OPERATION);
4561 }
4562
4563 if (!program->setUniformMatrix2fv(location, count, value))
4564 {
4565 return error(GL_INVALID_OPERATION);
4566 }
4567 }
4568 }
4569 catch(std::bad_alloc&)
4570 {
4571 return error(GL_OUT_OF_MEMORY);
4572 }
4573}
4574
4575void __stdcall glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
4576{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004577 TRACE("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %d, const GLfloat* value = 0x%0.8p)",
4578 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004579
4580 try
4581 {
4582 if (count < 0 || transpose != GL_FALSE)
4583 {
4584 return error(GL_INVALID_VALUE);
4585 }
4586
4587 if (location == -1)
4588 {
4589 return;
4590 }
4591
4592 gl::Context *context = gl::getContext();
4593
4594 if (context)
4595 {
4596 gl::Program *program = context->getCurrentProgram();
4597
4598 if (!program)
4599 {
4600 return error(GL_INVALID_OPERATION);
4601 }
4602
4603 if (!program->setUniformMatrix3fv(location, count, value))
4604 {
4605 return error(GL_INVALID_OPERATION);
4606 }
4607 }
4608 }
4609 catch(std::bad_alloc&)
4610 {
4611 return error(GL_OUT_OF_MEMORY);
4612 }
4613}
4614
4615void __stdcall glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
4616{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004617 TRACE("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %d, const GLfloat* value = 0x%0.8p)",
4618 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004619
4620 try
4621 {
4622 if (count < 0 || transpose != GL_FALSE)
4623 {
4624 return error(GL_INVALID_VALUE);
4625 }
4626
4627 if (location == -1)
4628 {
4629 return;
4630 }
4631
4632 gl::Context *context = gl::getContext();
4633
4634 if (context)
4635 {
4636 gl::Program *program = context->getCurrentProgram();
4637
4638 if (!program)
4639 {
4640 return error(GL_INVALID_OPERATION);
4641 }
4642
4643 if (!program->setUniformMatrix4fv(location, count, value))
4644 {
4645 return error(GL_INVALID_OPERATION);
4646 }
4647 }
4648 }
4649 catch(std::bad_alloc&)
4650 {
4651 return error(GL_OUT_OF_MEMORY);
4652 }
4653}
4654
4655void __stdcall glUseProgram(GLuint program)
4656{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004657 TRACE("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004658
4659 try
4660 {
4661 gl::Context *context = gl::getContext();
4662
4663 if (context)
4664 {
4665 gl::Program *programObject = context->getProgram(program);
4666
daniel@transgaming.comc8478202010-04-13 19:53:35 +00004667 if (!programObject && program != 0)
4668 {
4669 if (context->getShader(program))
4670 {
4671 return error(GL_INVALID_OPERATION);
4672 }
4673 else
4674 {
4675 return error(GL_INVALID_VALUE);
4676 }
4677 }
4678
4679 if (program != 0 && !programObject->isLinked())
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004680 {
4681 return error(GL_INVALID_OPERATION);
4682 }
4683
4684 context->useProgram(program);
4685 }
4686 }
4687 catch(std::bad_alloc&)
4688 {
4689 return error(GL_OUT_OF_MEMORY);
4690 }
4691}
4692
4693void __stdcall glValidateProgram(GLuint program)
4694{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004695 TRACE("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004696
4697 try
4698 {
daniel@transgaming.com86a7a132010-04-29 03:32:32 +00004699 gl::Context *context = gl::getContext();
4700
4701 if (context)
4702 {
4703 gl::Program *programObject = context->getProgram(program);
4704
4705 if (!programObject)
4706 {
4707 if (context->getShader(program))
4708 {
4709 return error(GL_INVALID_OPERATION);
4710 }
4711 else
4712 {
4713 return error(GL_INVALID_VALUE);
4714 }
4715 }
4716
4717 programObject->validate();
4718 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004719 }
4720 catch(std::bad_alloc&)
4721 {
4722 return error(GL_OUT_OF_MEMORY);
4723 }
4724}
4725
4726void __stdcall glVertexAttrib1f(GLuint index, GLfloat x)
4727{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004728 TRACE("(GLuint index = %d, GLfloat x = %f)", index, x);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004729
4730 try
4731 {
4732 if (index >= gl::MAX_VERTEX_ATTRIBS)
4733 {
4734 return error(GL_INVALID_VALUE);
4735 }
4736
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00004737 gl::Context *context = gl::getContext();
4738
4739 if (context)
4740 {
4741 GLfloat vals[4] = { x, 0, 0, 1 };
4742 context->setVertexAttrib(index, vals);
4743 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004744 }
4745 catch(std::bad_alloc&)
4746 {
4747 return error(GL_OUT_OF_MEMORY);
4748 }
4749}
4750
4751void __stdcall glVertexAttrib1fv(GLuint index, const GLfloat* values)
4752{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004753 TRACE("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004754
4755 try
4756 {
4757 if (index >= gl::MAX_VERTEX_ATTRIBS)
4758 {
4759 return error(GL_INVALID_VALUE);
4760 }
4761
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00004762 gl::Context *context = gl::getContext();
4763
4764 if (context)
4765 {
4766 GLfloat vals[4] = { values[0], 0, 0, 1 };
4767 context->setVertexAttrib(index, vals);
4768 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004769 }
4770 catch(std::bad_alloc&)
4771 {
4772 return error(GL_OUT_OF_MEMORY);
4773 }
4774}
4775
4776void __stdcall glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
4777{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004778 TRACE("(GLuint index = %d, GLfloat x = %f, GLfloat y = %f)", index, x, y);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004779
4780 try
4781 {
4782 if (index >= gl::MAX_VERTEX_ATTRIBS)
4783 {
4784 return error(GL_INVALID_VALUE);
4785 }
4786
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00004787 gl::Context *context = gl::getContext();
4788
4789 if (context)
4790 {
4791 GLfloat vals[4] = { x, y, 0, 1 };
4792 context->setVertexAttrib(index, vals);
4793 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004794 }
4795 catch(std::bad_alloc&)
4796 {
4797 return error(GL_OUT_OF_MEMORY);
4798 }
4799}
4800
4801void __stdcall glVertexAttrib2fv(GLuint index, const GLfloat* values)
4802{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004803 TRACE("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004804
4805 try
4806 {
4807 if (index >= gl::MAX_VERTEX_ATTRIBS)
4808 {
4809 return error(GL_INVALID_VALUE);
4810 }
4811
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00004812 gl::Context *context = gl::getContext();
4813
4814 if (context)
4815 {
4816 GLfloat vals[4] = { values[0], values[1], 0, 1 };
4817 context->setVertexAttrib(index, vals);
4818 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004819 }
4820 catch(std::bad_alloc&)
4821 {
4822 return error(GL_OUT_OF_MEMORY);
4823 }
4824}
4825
4826void __stdcall glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
4827{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004828 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 +00004829
4830 try
4831 {
4832 if (index >= gl::MAX_VERTEX_ATTRIBS)
4833 {
4834 return error(GL_INVALID_VALUE);
4835 }
4836
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00004837 gl::Context *context = gl::getContext();
4838
4839 if (context)
4840 {
4841 GLfloat vals[4] = { x, y, z, 1 };
4842 context->setVertexAttrib(index, vals);
4843 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004844 }
4845 catch(std::bad_alloc&)
4846 {
4847 return error(GL_OUT_OF_MEMORY);
4848 }
4849}
4850
4851void __stdcall glVertexAttrib3fv(GLuint index, const GLfloat* values)
4852{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004853 TRACE("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004854
4855 try
4856 {
4857 if (index >= gl::MAX_VERTEX_ATTRIBS)
4858 {
4859 return error(GL_INVALID_VALUE);
4860 }
4861
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00004862 gl::Context *context = gl::getContext();
4863
4864 if (context)
4865 {
4866 GLfloat vals[4] = { values[0], values[1], values[2], 1 };
4867 context->setVertexAttrib(index, vals);
4868 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004869 }
4870 catch(std::bad_alloc&)
4871 {
4872 return error(GL_OUT_OF_MEMORY);
4873 }
4874}
4875
4876void __stdcall glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
4877{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004878 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 +00004879
4880 try
4881 {
4882 if (index >= gl::MAX_VERTEX_ATTRIBS)
4883 {
4884 return error(GL_INVALID_VALUE);
4885 }
4886
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00004887 gl::Context *context = gl::getContext();
4888
4889 if (context)
4890 {
4891 GLfloat vals[4] = { x, y, z, w };
4892 context->setVertexAttrib(index, vals);
4893 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004894 }
4895 catch(std::bad_alloc&)
4896 {
4897 return error(GL_OUT_OF_MEMORY);
4898 }
4899}
4900
4901void __stdcall glVertexAttrib4fv(GLuint index, const GLfloat* values)
4902{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004903 TRACE("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004904
4905 try
4906 {
4907 if (index >= gl::MAX_VERTEX_ATTRIBS)
4908 {
4909 return error(GL_INVALID_VALUE);
4910 }
4911
daniel@transgaming.come4b08c82010-04-20 18:53:06 +00004912 gl::Context *context = gl::getContext();
4913
4914 if (context)
4915 {
4916 context->setVertexAttrib(index, values);
4917 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004918 }
4919 catch(std::bad_alloc&)
4920 {
4921 return error(GL_OUT_OF_MEMORY);
4922 }
4923}
4924
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004925void __stdcall glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004926{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004927 TRACE("(GLuint index = %d, GLint size = %d, GLenum type = 0x%X, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004928 "GLboolean normalized = %d, GLsizei stride = %d, const GLvoid* ptr = 0x%0.8p)",
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004929 index, size, type, normalized, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004930
4931 try
4932 {
4933 if (index >= gl::MAX_VERTEX_ATTRIBS)
4934 {
4935 return error(GL_INVALID_VALUE);
4936 }
4937
4938 if (size < 1 || size > 4)
4939 {
4940 return error(GL_INVALID_VALUE);
4941 }
4942
4943 switch (type)
4944 {
4945 case GL_BYTE:
4946 case GL_UNSIGNED_BYTE:
4947 case GL_SHORT:
4948 case GL_UNSIGNED_SHORT:
4949 case GL_FIXED:
4950 case GL_FLOAT:
4951 break;
4952 default:
4953 return error(GL_INVALID_ENUM);
4954 }
4955
4956 if (stride < 0)
4957 {
4958 return error(GL_INVALID_VALUE);
4959 }
4960
4961 gl::Context *context = gl::getContext();
4962
4963 if (context)
4964 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004965 context->setVertexAttribState(index, context->getArrayBufferHandle(), size, type, (normalized == GL_TRUE), stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004966 }
4967 }
4968 catch(std::bad_alloc&)
4969 {
4970 return error(GL_OUT_OF_MEMORY);
4971 }
4972}
4973
4974void __stdcall glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
4975{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004976 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 +00004977
4978 try
4979 {
4980 if (width < 0 || height < 0)
4981 {
4982 return error(GL_INVALID_VALUE);
4983 }
4984
4985 gl::Context *context = gl::getContext();
4986
4987 if (context)
4988 {
daniel@transgaming.com428d1582010-05-04 03:35:25 +00004989 context->setViewportParams(x, y, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004990 }
4991 }
4992 catch(std::bad_alloc&)
4993 {
4994 return error(GL_OUT_OF_MEMORY);
4995 }
4996}
4997
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00004998void __stdcall glTexImage3DOES(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth,
4999 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005000{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00005001 TRACE("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
5002 "GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, GLint border = %d, "
daniel@transgaming.comfe4b8272010-04-08 03:51:20 +00005003 "GLenum format = 0x%X, GLenum type = 0x%x, const GLvoid* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005004 target, level, internalformat, width, height, depth, border, format, type, pixels);
5005
5006 try
5007 {
5008 UNIMPLEMENTED(); // FIXME
5009 }
5010 catch(std::bad_alloc&)
5011 {
5012 return error(GL_OUT_OF_MEMORY);
5013 }
5014}
daniel@transgaming.comce3d0f22010-05-04 03:35:14 +00005015
5016__eglMustCastToProperFunctionPointerType __stdcall glGetProcAddress(const char *procname)
5017{
5018 struct Extension
5019 {
5020 const char *name;
5021 __eglMustCastToProperFunctionPointerType address;
5022 };
5023
5024 static const Extension glExtensions[] =
5025 {
5026 {"glTexImage3DOES", (__eglMustCastToProperFunctionPointerType)glTexImage3DOES},
5027 };
5028
5029 for (int ext = 0; ext < sizeof(glExtensions) / sizeof(Extension); ext++)
5030 {
5031 if (strcmp(procname, glExtensions[ext].name) == 0)
5032 {
5033 return (__eglMustCastToProperFunctionPointerType)glExtensions[ext].address;
5034 }
5035 }
5036
5037 return NULL;
5038}
5039
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00005040}