blob: a715691bc6016c12b69c7499ce34bcdec201f7d6 [file] [log] [blame]
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001//
2// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
3// Use of this source code is governed by a BSD-style license that can be
4// found in the LICENSE file.
5//
6
7// libGLESv2.cpp: Implements the exported OpenGL ES 2.0 functions.
8
9#define GL_APICALL
10#include <GLES2/gl2.h>
11#include <GLES2/gl2ext.h>
12
daniel@transgaming.com00c75962010-03-11 20:36:15 +000013#include <exception>
14#include <limits>
15
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000016#include "Context.h"
17#include "main.h"
18#include "Program.h"
19#include "Shader.h"
20#include "Buffer.h"
21#include "Texture.h"
22#include "Renderbuffer.h"
23#include "Framebuffer.h"
24#include "mathutil.h"
alokp@chromium.orgea0e1af2010-03-22 19:33:14 +000025#include "common/debug.h"
daniel@transgaming.com00c75962010-03-11 20:36:15 +000026#include "utilities.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000027
28extern "C"
29{
30
31void __stdcall glActiveTexture(GLenum texture)
32{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +000033 TRACE("(GLenum texture = 0x%X)", texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000034
35 try
36 {
37 if (texture < GL_TEXTURE0 || texture > GL_TEXTURE0 + gl::MAX_TEXTURE_IMAGE_UNITS - 1)
38 {
39 return error(GL_INVALID_ENUM);
40 }
41
42 gl::Context *context = gl::getContext();
43
44 if (context)
45 {
46 context->activeSampler = texture - GL_TEXTURE0;
47 }
48 }
49 catch(std::bad_alloc&)
50 {
51 return error(GL_OUT_OF_MEMORY);
52 }
53}
54
55void __stdcall glAttachShader(GLuint program, GLuint shader)
56{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +000057 TRACE("(GLuint program = %d, GLuint shader = %d)", program, shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000058
59 try
60 {
61 gl::Context *context = gl::getContext();
62
63 if (context)
64 {
65 gl::Program *programObject = context->getProgram(program);
66 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +000067
daniel@transgaming.come2b22122010-03-11 19:22:14 +000068 if (!programObject || !shaderObject)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000069 {
70 return error(GL_INVALID_VALUE);
71 }
72
73 if (!programObject->attachShader(shaderObject))
74 {
75 return error(GL_INVALID_OPERATION);
76 }
77 }
78 }
79 catch(std::bad_alloc&)
80 {
81 return error(GL_OUT_OF_MEMORY);
82 }
83}
84
85void __stdcall glBindAttribLocation(GLuint program, GLuint index, const char* name)
86{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +000087 TRACE("(GLuint program = %d, GLuint index = %d, const char* name = 0x%0.8p)", program, index, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000088
89 try
90 {
91 if (index >= gl::MAX_VERTEX_ATTRIBS)
92 {
93 return error(GL_INVALID_VALUE);
94 }
95
96 gl::Context *context = gl::getContext();
97
98 if (context)
99 {
100 gl::Program *programObject = context->getProgram(program);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000101
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000102 if (!programObject)
103 {
104 return error(GL_INVALID_VALUE);
105 }
106
107 programObject->bindAttributeLocation(index, name);
108 }
109 }
110 catch(std::bad_alloc&)
111 {
112 return error(GL_OUT_OF_MEMORY);
113 }
114}
115
116void __stdcall glBindBuffer(GLenum target, GLuint buffer)
117{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000118 TRACE("(GLenum target = 0x%X, GLuint buffer = %d)", target, buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000119
120 try
121 {
122 gl::Context *context = gl::getContext();
123
124 if (context)
125 {
126 switch (target)
127 {
128 case GL_ARRAY_BUFFER:
129 context->bindArrayBuffer(buffer);
130 return;
131 case GL_ELEMENT_ARRAY_BUFFER:
132 context->bindElementArrayBuffer(buffer);
133 return;
134 default:
135 return error(GL_INVALID_ENUM);
136 }
137 }
138 }
139 catch(std::bad_alloc&)
140 {
141 return error(GL_OUT_OF_MEMORY);
142 }
143}
144
145void __stdcall glBindFramebuffer(GLenum target, GLuint framebuffer)
146{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000147 TRACE("(GLenum target = 0x%X, GLuint framebuffer = %d)", target, framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000148
149 try
150 {
151 if (target != GL_FRAMEBUFFER)
152 {
153 return error(GL_INVALID_ENUM);
154 }
155
156 gl::Context *context = gl::getContext();
157
158 if (context)
159 {
160 context->bindFramebuffer(framebuffer);
161 }
162 }
163 catch(std::bad_alloc&)
164 {
165 return error(GL_OUT_OF_MEMORY);
166 }
167}
168
169void __stdcall glBindRenderbuffer(GLenum target, GLuint renderbuffer)
170{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000171 TRACE("(GLenum target = 0x%X, GLuint renderbuffer = %d)", target, renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000172
173 try
174 {
175 if (target != GL_RENDERBUFFER)
176 {
177 return error(GL_INVALID_ENUM);
178 }
179
180 gl::Context *context = gl::getContext();
181
182 if (context)
183 {
184 context->bindRenderbuffer(renderbuffer);
185 }
186 }
187 catch(std::bad_alloc&)
188 {
189 return error(GL_OUT_OF_MEMORY);
190 }
191}
192
193void __stdcall glBindTexture(GLenum target, GLuint texture)
194{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000195 TRACE("(GLenum target = 0x%X, GLuint texture = %d)", target, texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000196
197 try
198 {
199 gl::Context *context = gl::getContext();
200
201 if (context)
202 {
203 gl::Texture *textureObject = context->getTexture(texture);
204
205 if (textureObject && textureObject->getTarget() != target && texture != 0)
206 {
207 return error(GL_INVALID_OPERATION);
208 }
209
210 switch (target)
211 {
212 case GL_TEXTURE_2D:
213 context->bindTexture2D(texture);
214 return;
215 case GL_TEXTURE_CUBE_MAP:
216 context->bindTextureCubeMap(texture);
217 return;
218 default:
219 return error(GL_INVALID_ENUM);
220 }
221 }
222 }
223 catch(std::bad_alloc&)
224 {
225 return error(GL_OUT_OF_MEMORY);
226 }
227}
228
229void __stdcall glBlendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
230{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000231 TRACE("(GLclampf red = %f, GLclampf green = %f, GLclampf blue = %f, GLclampf alpha = %f)",
232 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000233
234 try
235 {
236 gl::Context* context = gl::getContext();
237
238 if (context)
239 {
240 context->blendColor.red = gl::clamp01(red);
241 context->blendColor.blue = gl::clamp01(blue);
242 context->blendColor.green = gl::clamp01(green);
243 context->blendColor.alpha = gl::clamp01(alpha);
244 }
245 }
246 catch(std::bad_alloc&)
247 {
248 return error(GL_OUT_OF_MEMORY);
249 }
250}
251
252void __stdcall glBlendEquation(GLenum mode)
253{
254 glBlendEquationSeparate(mode, mode);
255}
256
257void __stdcall glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
258{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000259 TRACE("(GLenum modeRGB = 0x%X, GLenum modeAlpha = 0x%X)", modeRGB, modeAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000260
261 try
262 {
263 switch (modeRGB)
264 {
265 case GL_FUNC_ADD:
266 case GL_FUNC_SUBTRACT:
267 case GL_FUNC_REVERSE_SUBTRACT:
268 break;
269 default:
270 return error(GL_INVALID_ENUM);
271 }
272
273 switch (modeAlpha)
274 {
275 case GL_FUNC_ADD:
276 case GL_FUNC_SUBTRACT:
277 case GL_FUNC_REVERSE_SUBTRACT:
278 break;
279 default:
280 return error(GL_INVALID_ENUM);
281 }
282
283 gl::Context *context = gl::getContext();
284
285 if (context)
286 {
287 context->blendEquationRGB = modeRGB;
288 context->blendEquationAlpha = modeAlpha;
289 }
290 }
291 catch(std::bad_alloc&)
292 {
293 return error(GL_OUT_OF_MEMORY);
294 }
295}
296
297void __stdcall glBlendFunc(GLenum sfactor, GLenum dfactor)
298{
299 glBlendFuncSeparate(sfactor, dfactor, sfactor, dfactor);
300}
301
302void __stdcall glBlendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
303{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000304 TRACE("(GLenum srcRGB = 0x%X, GLenum dstRGB = 0x%X, GLenum srcAlpha = 0x%X, GLenum dstAlpha = 0x%X)",
305 srcRGB, dstRGB, srcAlpha, dstAlpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000306
307 try
308 {
309 switch (srcRGB)
310 {
311 case GL_ZERO:
312 case GL_ONE:
313 case GL_SRC_COLOR:
314 case GL_ONE_MINUS_SRC_COLOR:
315 case GL_DST_COLOR:
316 case GL_ONE_MINUS_DST_COLOR:
317 case GL_SRC_ALPHA:
318 case GL_ONE_MINUS_SRC_ALPHA:
319 case GL_DST_ALPHA:
320 case GL_ONE_MINUS_DST_ALPHA:
321 case GL_CONSTANT_COLOR:
322 case GL_ONE_MINUS_CONSTANT_COLOR:
323 case GL_CONSTANT_ALPHA:
324 case GL_ONE_MINUS_CONSTANT_ALPHA:
325 case GL_SRC_ALPHA_SATURATE:
326 break;
327 default:
328 return error(GL_INVALID_ENUM);
329 }
330
331 switch (dstRGB)
332 {
333 case GL_ZERO:
334 case GL_ONE:
335 case GL_SRC_COLOR:
336 case GL_ONE_MINUS_SRC_COLOR:
337 case GL_DST_COLOR:
338 case GL_ONE_MINUS_DST_COLOR:
339 case GL_SRC_ALPHA:
340 case GL_ONE_MINUS_SRC_ALPHA:
341 case GL_DST_ALPHA:
342 case GL_ONE_MINUS_DST_ALPHA:
343 case GL_CONSTANT_COLOR:
344 case GL_ONE_MINUS_CONSTANT_COLOR:
345 case GL_CONSTANT_ALPHA:
346 case GL_ONE_MINUS_CONSTANT_ALPHA:
347 break;
348 default:
349 return error(GL_INVALID_ENUM);
350 }
351
352 switch (srcAlpha)
353 {
354 case GL_ZERO:
355 case GL_ONE:
356 case GL_SRC_COLOR:
357 case GL_ONE_MINUS_SRC_COLOR:
358 case GL_DST_COLOR:
359 case GL_ONE_MINUS_DST_COLOR:
360 case GL_SRC_ALPHA:
361 case GL_ONE_MINUS_SRC_ALPHA:
362 case GL_DST_ALPHA:
363 case GL_ONE_MINUS_DST_ALPHA:
364 case GL_CONSTANT_COLOR:
365 case GL_ONE_MINUS_CONSTANT_COLOR:
366 case GL_CONSTANT_ALPHA:
367 case GL_ONE_MINUS_CONSTANT_ALPHA:
368 case GL_SRC_ALPHA_SATURATE:
369 break;
370 default:
371 return error(GL_INVALID_ENUM);
372 }
373
374 switch (dstAlpha)
375 {
376 case GL_ZERO:
377 case GL_ONE:
378 case GL_SRC_COLOR:
379 case GL_ONE_MINUS_SRC_COLOR:
380 case GL_DST_COLOR:
381 case GL_ONE_MINUS_DST_COLOR:
382 case GL_SRC_ALPHA:
383 case GL_ONE_MINUS_SRC_ALPHA:
384 case GL_DST_ALPHA:
385 case GL_ONE_MINUS_DST_ALPHA:
386 case GL_CONSTANT_COLOR:
387 case GL_ONE_MINUS_CONSTANT_COLOR:
388 case GL_CONSTANT_ALPHA:
389 case GL_ONE_MINUS_CONSTANT_ALPHA:
390 break;
391 default:
392 return error(GL_INVALID_ENUM);
393 }
394
daniel@transgaming.comfe453652010-03-16 06:23:28 +0000395 bool constantColorUsed = (srcRGB == GL_CONSTANT_COLOR || srcRGB == GL_ONE_MINUS_CONSTANT_COLOR ||
396 dstRGB == GL_CONSTANT_COLOR || dstRGB == GL_ONE_MINUS_CONSTANT_COLOR);
397
398 bool constantAlphaUsed = (srcRGB == GL_CONSTANT_ALPHA || srcRGB == GL_ONE_MINUS_CONSTANT_ALPHA ||
399 dstRGB == GL_CONSTANT_ALPHA || dstRGB == GL_ONE_MINUS_CONSTANT_ALPHA);
400
401 if (constantColorUsed && constantAlphaUsed)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000402 {
daniel@transgaming.comfe453652010-03-16 06:23:28 +0000403 ERR("Simultaneous use of GL_CONSTANT_ALPHA/GL_ONE_MINUS_CONSTANT_ALPHA and GL_CONSTANT_COLOR/GL_ONE_MINUS_CONSTANT_COLOR invalid under WebGL");
404 return error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000405 }
406
407 gl::Context *context = gl::getContext();
408
409 if (context)
410 {
411 context->sourceBlendRGB = srcRGB;
412 context->sourceBlendAlpha = srcAlpha;
413 context->destBlendRGB = dstRGB;
414 context->destBlendAlpha = dstAlpha;
415 }
416 }
417 catch(std::bad_alloc&)
418 {
419 return error(GL_OUT_OF_MEMORY);
420 }
421}
422
423void __stdcall glBufferData(GLenum target, GLsizeiptr size, const void* data, GLenum usage)
424{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000425 TRACE("(GLenum target = 0x%X, GLsizeiptr size = %d, const void* data = 0x%0.8p, GLenum usage = %d)",
426 target, size, data, usage);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000427
428 try
429 {
430 if (size < 0)
431 {
432 return error(GL_INVALID_VALUE);
433 }
434
435 switch (usage)
436 {
437 case GL_STREAM_DRAW:
438 case GL_STATIC_DRAW:
439 case GL_DYNAMIC_DRAW:
440 break;
441 default:
442 return error(GL_INVALID_ENUM);
443 }
444
445 gl::Context *context = gl::getContext();
446
447 if (context)
448 {
449 gl::Buffer *buffer;
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000450
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000451 switch (target)
452 {
453 case GL_ARRAY_BUFFER:
454 buffer = context->getArrayBuffer();
455 break;
456 case GL_ELEMENT_ARRAY_BUFFER:
457 buffer = context->getElementArrayBuffer();
458 break;
459 default:
460 return error(GL_INVALID_ENUM);
461 }
462
463 if (!buffer)
464 {
465 return error(GL_INVALID_OPERATION);
466 }
467
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000468 buffer->bufferData(data, size, usage);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000469 }
470 }
471 catch(std::bad_alloc&)
472 {
473 return error(GL_OUT_OF_MEMORY);
474 }
475}
476
477void __stdcall glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const void* data)
478{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000479 TRACE("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr size = %d, const void* data = 0x%0.8p)",
480 target, offset, size, data);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000481
482 try
483 {
484 if (size < 0)
485 {
486 return error(GL_INVALID_VALUE);
487 }
488
daniel@transgaming.comd4620a32010-03-21 04:31:28 +0000489 if (data == NULL)
490 {
491 return;
492 }
493
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +0000494 gl::Context *context = gl::getContext();
495
496 if (context)
497 {
498 gl::Buffer *buffer;
499
500 switch (target)
501 {
502 case GL_ARRAY_BUFFER:
503 buffer = context->getArrayBuffer();
504 break;
505 case GL_ELEMENT_ARRAY_BUFFER:
506 buffer = context->getElementArrayBuffer();
507 break;
508 default:
509 return error(GL_INVALID_ENUM);
510 }
511
512 if (!buffer)
513 {
514 return error(GL_INVALID_OPERATION);
515 }
516
517 GLenum err = buffer->bufferSubData(data, size, offset);
518
519 if (err != GL_NO_ERROR)
520 {
521 return error(err);
522 }
523 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000524 }
525 catch(std::bad_alloc&)
526 {
527 return error(GL_OUT_OF_MEMORY);
528 }
529}
530
531GLenum __stdcall glCheckFramebufferStatus(GLenum target)
532{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000533 TRACE("(GLenum target = 0x%X)", target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000534
535 try
536 {
537 if (target != GL_FRAMEBUFFER)
538 {
539 return error(GL_INVALID_ENUM, 0);
540 }
541
542 gl::Context *context = gl::getContext();
543
544 if (context)
545 {
546 gl::Framebuffer *framebuffer = context->getFramebuffer();
547
548 return framebuffer->completeness();
549 }
550 }
551 catch(std::bad_alloc&)
552 {
553 return error(GL_OUT_OF_MEMORY, 0);
554 }
555
556 return 0;
557}
558
559void __stdcall glClear(GLbitfield mask)
560{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000561 TRACE("(GLbitfield mask = %X)", mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000562
563 try
564 {
565 gl::Context *context = gl::getContext();
566
567 if (context)
568 {
569 context->clear(mask);
570 }
571 }
572 catch(std::bad_alloc&)
573 {
574 return error(GL_OUT_OF_MEMORY);
575 }
576}
577
578void __stdcall glClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
579{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000580 TRACE("(GLclampf red = %f, GLclampf green = %f, GLclampf blue = %f, GLclampf alpha = %f)",
581 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000582
583 try
584 {
585 gl::Context *context = gl::getContext();
586
587 if (context)
588 {
589 context->setClearColor(red, green, blue, alpha);
590 }
591 }
592 catch(std::bad_alloc&)
593 {
594 return error(GL_OUT_OF_MEMORY);
595 }
596}
597
598void __stdcall glClearDepthf(GLclampf depth)
599{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000600 TRACE("(GLclampf depth = %f)", depth);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000601
602 try
603 {
604 gl::Context *context = gl::getContext();
605
606 if (context)
607 {
608 context->setClearDepth(depth);
609 }
610 }
611 catch(std::bad_alloc&)
612 {
613 return error(GL_OUT_OF_MEMORY);
614 }
615}
616
617void __stdcall glClearStencil(GLint s)
618{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000619 TRACE("(GLint s = %d)", s);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000620
621 try
622 {
623 gl::Context *context = gl::getContext();
624
625 if (context)
626 {
627 context->setClearStencil(s);
628 }
629 }
630 catch(std::bad_alloc&)
631 {
632 return error(GL_OUT_OF_MEMORY);
633 }
634}
635
636void __stdcall glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
637{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000638 TRACE("(GLboolean red = %d, GLboolean green = %d, GLboolean blue = %d, GLboolean alpha = %d)",
639 red, green, blue, alpha);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000640
641 try
642 {
643 gl::Context *context = gl::getContext();
644
645 if (context)
646 {
647 context->colorMaskRed = red != GL_FALSE;
648 context->colorMaskGreen = green != GL_FALSE;
649 context->colorMaskBlue = blue != GL_FALSE;
650 context->colorMaskAlpha = alpha != GL_FALSE;
651 }
652 }
653 catch(std::bad_alloc&)
654 {
655 return error(GL_OUT_OF_MEMORY);
656 }
657}
658
659void __stdcall glCompileShader(GLuint shader)
660{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000661 TRACE("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000662
663 try
664 {
665 gl::Context *context = gl::getContext();
666
667 if (context)
668 {
669 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000670
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000671 if (!shaderObject)
672 {
673 return error(GL_INVALID_VALUE);
674 }
675
676 shaderObject->compile();
677 }
678 }
679 catch(std::bad_alloc&)
680 {
681 return error(GL_OUT_OF_MEMORY);
682 }
683}
684
685void __stdcall glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void* data)
686{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000687 TRACE("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
688 "GLsizei height = %d, GLint border = %d, GLsizei imageSize = %d, const void* data = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000689 target, level, internalformat, width, height, border, imageSize, data);
690
691 try
692 {
daniel@transgaming.com41430492010-03-11 20:36:18 +0000693 if (target != GL_TEXTURE_2D && !es2dx::IsCubemapTextureTarget(target))
694 {
695 return error(GL_INVALID_ENUM);
696 }
697
698 if (level < 0 || level > gl::MAX_TEXTURE_LEVELS)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000699 {
700 return error(GL_INVALID_VALUE);
701 }
702
daniel@transgaming.com41430492010-03-11 20:36:18 +0000703 if (width < 0 || height < 0 || (level > 0 && !gl::isPow2(width)) || (level > 0 && !gl::isPow2(height)) || border != 0 || imageSize < 0)
704 {
705 return error(GL_INVALID_VALUE);
706 }
707
708 return error(GL_INVALID_ENUM); // ultimately we don't support compressed textures
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000709 }
710 catch(std::bad_alloc&)
711 {
712 return error(GL_OUT_OF_MEMORY);
713 }
714}
715
716void __stdcall glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void* data)
717{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000718 TRACE("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
719 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, "
720 "GLsizei imageSize = %d, const void* data = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000721 target, level, xoffset, yoffset, width, height, format, imageSize, data);
722
723 try
724 {
daniel@transgaming.com41430492010-03-11 20:36:18 +0000725 if (target != GL_TEXTURE_2D && !es2dx::IsCubemapTextureTarget(target))
726 {
727 return error(GL_INVALID_ENUM);
728 }
729
730 if (level < 0 || level > gl::MAX_TEXTURE_LEVELS)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000731 {
732 return error(GL_INVALID_VALUE);
733 }
734
daniel@transgaming.com41430492010-03-11 20:36:18 +0000735 if (xoffset < 0 || yoffset < 0 || width < 0 || height < 0 || (level > 0 && !gl::isPow2(width)) || (level > 0 && !gl::isPow2(height)) || imageSize < 0)
736 {
737 return error(GL_INVALID_VALUE);
738 }
739
740 if (xoffset != 0 || yoffset != 0)
741 {
742 return error(GL_INVALID_OPERATION);
743 }
744
745 return error(GL_INVALID_OPERATION); // The texture being operated on is not a compressed texture.
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000746 }
747 catch(std::bad_alloc&)
748 {
749 return error(GL_OUT_OF_MEMORY);
750 }
751}
752
753void __stdcall glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
754{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000755 TRACE("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
756 "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, GLint border = %d)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000757 target, level, internalformat, x, y, width, height, border);
758
759 try
760 {
761 if (width < 0 || height < 0)
762 {
763 return error(GL_INVALID_VALUE);
764 }
765
766 UNIMPLEMENTED(); // FIXME
767 }
768 catch(std::bad_alloc&)
769 {
770 return error(GL_OUT_OF_MEMORY);
771 }
772}
773
774void __stdcall glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
775{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000776 TRACE("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
777 "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000778 target, level, xoffset, yoffset, x, y, width, height);
779
780 try
781 {
782 if (width < 0 || height < 0)
783 {
784 return error(GL_INVALID_VALUE);
785 }
786
787 UNIMPLEMENTED(); // FIXME
788 }
789 catch(std::bad_alloc&)
790 {
791 return error(GL_OUT_OF_MEMORY);
792 }
793}
794
795GLuint __stdcall glCreateProgram(void)
796{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000797 TRACE("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000798
799 try
800 {
801 gl::Context *context = gl::getContext();
802
803 if (context)
804 {
805 return context->createProgram();
806 }
807 }
808 catch(std::bad_alloc&)
809 {
810 return error(GL_OUT_OF_MEMORY, 0);
811 }
812
813 return 0;
814}
815
816GLuint __stdcall glCreateShader(GLenum type)
817{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000818 TRACE("(GLenum type = 0x%X)", type);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000819
820 try
821 {
822 gl::Context *context = gl::getContext();
823
824 if (context)
825 {
826 switch (type)
827 {
828 case GL_FRAGMENT_SHADER:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000829 case GL_VERTEX_SHADER:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000830 return context->createShader(type);
831 default:
832 return error(GL_INVALID_ENUM, 0);
833 }
834 }
835 }
836 catch(std::bad_alloc&)
837 {
838 return error(GL_OUT_OF_MEMORY, 0);
839 }
840
841 return 0;
842}
843
844void __stdcall glCullFace(GLenum mode)
845{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000846 TRACE("(GLenum mode = 0x%X)", mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000847
848 try
849 {
850 switch (mode)
851 {
852 case GL_FRONT:
853 case GL_BACK:
854 case GL_FRONT_AND_BACK:
855 {
856 gl::Context *context = gl::getContext();
857
858 if (context)
859 {
860 context->cullMode = mode;
861 }
862 }
863 break;
864 default:
865 return error(GL_INVALID_ENUM);
866 }
867 }
868 catch(std::bad_alloc&)
869 {
870 return error(GL_OUT_OF_MEMORY);
871 }
872}
873
874void __stdcall glDeleteBuffers(GLsizei n, const GLuint* buffers)
875{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000876 TRACE("(GLsizei n = %d, const GLuint* buffers = 0x%0.8p)", n, buffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000877
878 try
879 {
880 if (n < 0)
881 {
882 return error(GL_INVALID_VALUE);
883 }
884
885 gl::Context *context = gl::getContext();
886
887 if (context)
888 {
889 for (int i = 0; i < n; i++)
890 {
891 context->deleteBuffer(buffers[i]);
892 }
893 }
894 }
895 catch(std::bad_alloc&)
896 {
897 return error(GL_OUT_OF_MEMORY);
898 }
899}
900
901void __stdcall glDeleteFramebuffers(GLsizei n, const GLuint* framebuffers)
902{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000903 TRACE("(GLsizei n = %d, const GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000904
905 try
906 {
907 if (n < 0)
908 {
909 return error(GL_INVALID_VALUE);
910 }
911
912 gl::Context *context = gl::getContext();
913
914 if (context)
915 {
916 for (int i = 0; i < n; i++)
917 {
918 if (framebuffers[i] != 0)
919 {
920 context->deleteFramebuffer(framebuffers[i]);
921 }
922 }
923 }
924 }
925 catch(std::bad_alloc&)
926 {
927 return error(GL_OUT_OF_MEMORY);
928 }
929}
930
931void __stdcall glDeleteProgram(GLuint program)
932{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000933 TRACE("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000934
935 try
936 {
937 gl::Context *context = gl::getContext();
938
939 if (context)
940 {
941 context->deleteProgram(program);
942 }
943 }
944 catch(std::bad_alloc&)
945 {
946 return error(GL_OUT_OF_MEMORY);
947 }
948}
949
950void __stdcall glDeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers)
951{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000952 TRACE("(GLsizei n = %d, const GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000953
954 try
955 {
956 if (n < 0)
957 {
958 return error(GL_INVALID_VALUE);
959 }
960
961 gl::Context *context = gl::getContext();
962
963 if (context)
964 {
daniel@transgaming.come2b22122010-03-11 19:22:14 +0000965 for (int i = 0; i < n; i++)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000966 {
967 context->deleteRenderbuffer(renderbuffers[i]);
968 }
969 }
970 }
971 catch(std::bad_alloc&)
972 {
973 return error(GL_OUT_OF_MEMORY);
974 }
975}
976
977void __stdcall glDeleteShader(GLuint shader)
978{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000979 TRACE("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000980
981 try
982 {
983 gl::Context *context = gl::getContext();
984
985 if (context)
986 {
987 context->deleteShader(shader);
988 }
989 }
990 catch(std::bad_alloc&)
991 {
992 return error(GL_OUT_OF_MEMORY);
993 }
994}
995
996void __stdcall glDeleteTextures(GLsizei n, const GLuint* textures)
997{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +0000998 TRACE("(GLsizei n = %d, const GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000999
1000 try
1001 {
1002 if (n < 0)
1003 {
1004 return error(GL_INVALID_VALUE);
1005 }
1006
1007 gl::Context *context = gl::getContext();
1008
1009 if (context)
1010 {
1011 for (int i = 0; i < n; i++)
1012 {
1013 if (textures[i] != 0)
1014 {
1015 context->deleteTexture(textures[i]);
1016 }
1017 }
1018 }
1019 }
1020 catch(std::bad_alloc&)
1021 {
1022 return error(GL_OUT_OF_MEMORY);
1023 }
1024}
1025
1026void __stdcall glDepthFunc(GLenum func)
1027{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001028 TRACE("(GLenum func = 0x%X)", func);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001029
1030 try
1031 {
1032 switch (func)
1033 {
1034 case GL_NEVER:
1035 case GL_ALWAYS:
1036 case GL_LESS:
1037 case GL_LEQUAL:
1038 case GL_EQUAL:
1039 case GL_GREATER:
1040 case GL_GEQUAL:
1041 case GL_NOTEQUAL:
1042 break;
1043 default:
1044 return error(GL_INVALID_ENUM);
1045 }
1046
1047 gl::Context *context = gl::getContext();
1048
1049 if (context)
1050 {
1051 context->depthFunc = func;
1052 }
1053 }
1054 catch(std::bad_alloc&)
1055 {
1056 return error(GL_OUT_OF_MEMORY);
1057 }
1058}
1059
1060void __stdcall glDepthMask(GLboolean flag)
1061{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001062 TRACE("(GLboolean flag = %d)", flag);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001063
1064 try
1065 {
1066 gl::Context *context = gl::getContext();
1067
1068 if (context)
1069 {
1070 context->depthMask = flag != GL_FALSE;
1071 }
1072 }
1073 catch(std::bad_alloc&)
1074 {
1075 return error(GL_OUT_OF_MEMORY);
1076 }
1077}
1078
1079void __stdcall glDepthRangef(GLclampf zNear, GLclampf zFar)
1080{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001081 TRACE("(GLclampf zNear = %f, GLclampf zFar = %f)", zNear, zFar);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001082
1083 try
1084 {
1085 gl::Context *context = gl::getContext();
1086
1087 if (context)
1088 {
1089 context->zNear = zNear;
1090 context->zFar = zFar;
1091 }
1092 }
1093 catch(std::bad_alloc&)
1094 {
1095 return error(GL_OUT_OF_MEMORY);
1096 }
1097}
1098
1099void __stdcall glDetachShader(GLuint program, GLuint shader)
1100{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001101 TRACE("(GLuint program = %d, GLuint shader = %d)", program, shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001102
1103 try
1104 {
1105 gl::Context *context = gl::getContext();
1106
1107 if (context)
1108 {
1109 gl::Program *programObject = context->getProgram(program);
1110 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00001111
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001112 if (!programObject || !shaderObject)
1113 {
1114 return error(GL_INVALID_VALUE);
1115 }
1116
1117 if (!programObject->detachShader(shaderObject))
1118 {
1119 return error(GL_INVALID_OPERATION);
1120 }
1121
1122 if (shaderObject->isDeletable())
1123 {
1124 context->deleteShader(shader);
1125 }
1126 }
1127 }
1128 catch(std::bad_alloc&)
1129 {
1130 return error(GL_OUT_OF_MEMORY);
1131 }
1132}
1133
1134void __stdcall glDisable(GLenum cap)
1135{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001136 TRACE("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001137
1138 try
1139 {
1140 gl::Context *context = gl::getContext();
1141
1142 if (context)
1143 {
1144 switch (cap)
1145 {
1146 case GL_CULL_FACE: context->cullFace = false; break;
1147 case GL_POLYGON_OFFSET_FILL: context->polygonOffsetFill = false; break;
1148 case GL_SAMPLE_ALPHA_TO_COVERAGE: context->sampleAlphaToCoverage = false; break;
1149 case GL_SAMPLE_COVERAGE: context->sampleCoverage = false; break;
1150 case GL_SCISSOR_TEST: context->scissorTest = false; break;
1151 case GL_STENCIL_TEST: context->stencilTest = false; break;
1152 case GL_DEPTH_TEST: context->depthTest = false; break;
1153 case GL_BLEND: context->blend = false; break;
1154 case GL_DITHER: context->dither = false; break;
1155 default:
1156 return error(GL_INVALID_ENUM);
1157 }
1158 }
1159 }
1160 catch(std::bad_alloc&)
1161 {
1162 return error(GL_OUT_OF_MEMORY);
1163 }
1164}
1165
1166void __stdcall glDisableVertexAttribArray(GLuint index)
1167{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001168 TRACE("(GLuint index = %d)", index);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001169
1170 try
1171 {
1172 if (index >= gl::MAX_VERTEX_ATTRIBS)
1173 {
1174 return error(GL_INVALID_VALUE);
1175 }
1176
1177 gl::Context *context = gl::getContext();
1178
1179 if (context)
1180 {
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +00001181 context->vertexAttribute[index].mEnabled = false;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001182 }
1183 }
1184 catch(std::bad_alloc&)
1185 {
1186 return error(GL_OUT_OF_MEMORY);
1187 }
1188}
1189
1190void __stdcall glDrawArrays(GLenum mode, GLint first, GLsizei count)
1191{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001192 TRACE("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d)", mode, first, count);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001193
1194 try
1195 {
1196 if (count < 0 || first < 0)
1197 {
1198 return error(GL_INVALID_VALUE);
1199 }
1200
1201 gl::Context *context = gl::getContext();
1202
1203 if (context)
1204 {
1205 context->drawArrays(mode, first, count);
1206 }
1207 }
1208 catch(std::bad_alloc&)
1209 {
1210 return error(GL_OUT_OF_MEMORY);
1211 }
1212}
1213
1214void __stdcall glDrawElements(GLenum mode, GLsizei count, GLenum type, const void* indices)
1215{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001216 TRACE("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const void* indices = 0x%0.8p)",
1217 mode, count, type, indices);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001218
1219 try
1220 {
1221 if (count < 0)
1222 {
1223 return error(GL_INVALID_VALUE);
1224 }
1225
1226 switch (type)
1227 {
1228 case GL_UNSIGNED_BYTE:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001229 case GL_UNSIGNED_SHORT:
1230 break;
1231 default:
1232 return error(GL_INVALID_ENUM);
1233 }
1234
1235 gl::Context *context = gl::getContext();
1236
1237 if (context)
1238 {
1239 context->drawElements(mode, count, type, indices);
1240 }
1241 }
1242 catch(std::bad_alloc&)
1243 {
1244 return error(GL_OUT_OF_MEMORY);
1245 }
1246}
1247
1248void __stdcall glEnable(GLenum cap)
1249{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001250 TRACE("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001251
1252 try
1253 {
1254 gl::Context *context = gl::getContext();
1255
1256 if (context)
1257 {
1258 switch (cap)
1259 {
1260 case GL_CULL_FACE: context->cullFace = true; break;
1261 case GL_POLYGON_OFFSET_FILL: context->polygonOffsetFill = true; break;
1262 case GL_SAMPLE_ALPHA_TO_COVERAGE: context->sampleAlphaToCoverage = true; break;
1263 case GL_SAMPLE_COVERAGE: context->sampleCoverage = true; break;
1264 case GL_SCISSOR_TEST: context->scissorTest = true; break;
1265 case GL_STENCIL_TEST: context->stencilTest = true; break;
1266 case GL_DEPTH_TEST: context->depthTest = true; break;
1267 case GL_BLEND: context->blend = true; break;
1268 case GL_DITHER: context->dither = true; break;
1269 default:
1270 return error(GL_INVALID_ENUM);
1271 }
1272 }
1273 }
1274 catch(std::bad_alloc&)
1275 {
1276 return error(GL_OUT_OF_MEMORY);
1277 }
1278}
1279
1280void __stdcall glEnableVertexAttribArray(GLuint index)
1281{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001282 TRACE("(GLuint index = %d)", index);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001283
1284 try
1285 {
1286 if (index >= gl::MAX_VERTEX_ATTRIBS)
1287 {
1288 return error(GL_INVALID_VALUE);
1289 }
1290
1291 gl::Context *context = gl::getContext();
1292
1293 if (context)
1294 {
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +00001295 context->vertexAttribute[index].mEnabled = true;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001296 }
1297 }
1298 catch(std::bad_alloc&)
1299 {
1300 return error(GL_OUT_OF_MEMORY);
1301 }
1302}
1303
1304void __stdcall glFinish(void)
1305{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001306 TRACE("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001307
1308 try
1309 {
1310 gl::Context *context = gl::getContext();
1311
1312 if (context)
1313 {
1314 context->finish();
1315 }
1316 }
1317 catch(std::bad_alloc&)
1318 {
1319 return error(GL_OUT_OF_MEMORY);
1320 }
1321}
1322
1323void __stdcall glFlush(void)
1324{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001325 TRACE("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001326
1327 try
1328 {
1329 gl::Context *context = gl::getContext();
1330
1331 if (context)
1332 {
1333 context->flush();
1334 }
1335 }
1336 catch(std::bad_alloc&)
1337 {
1338 return error(GL_OUT_OF_MEMORY);
1339 }
1340}
1341
1342void __stdcall glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
1343{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001344 TRACE("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum renderbuffertarget = 0x%X, "
1345 "GLuint renderbuffer = %d)", target, attachment, renderbuffertarget, renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001346
1347 try
1348 {
1349 if (target != GL_FRAMEBUFFER || renderbuffertarget != GL_RENDERBUFFER)
1350 {
1351 return error(GL_INVALID_ENUM);
1352 }
1353
1354 gl::Context *context = gl::getContext();
1355
1356 if (context)
1357 {
1358 gl::Framebuffer *framebuffer = context->getFramebuffer();
1359
1360 if (context->framebuffer == 0 || !framebuffer)
1361 {
1362 return error(GL_INVALID_OPERATION);
1363 }
1364
1365 switch (attachment)
1366 {
1367 case GL_COLOR_ATTACHMENT0:
1368 framebuffer->setColorbuffer(GL_RENDERBUFFER, renderbuffer);
1369 break;
1370 case GL_DEPTH_ATTACHMENT:
1371 framebuffer->setDepthbuffer(GL_RENDERBUFFER, renderbuffer);
1372 break;
1373 case GL_STENCIL_ATTACHMENT:
1374 framebuffer->setStencilbuffer(GL_RENDERBUFFER, renderbuffer);
1375 break;
1376 default:
1377 return error(GL_INVALID_ENUM);
1378 }
1379 }
1380 }
1381 catch(std::bad_alloc&)
1382 {
1383 return error(GL_OUT_OF_MEMORY);
1384 }
1385}
1386
1387void __stdcall glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
1388{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001389 TRACE("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum textarget = 0x%X, "
1390 "GLuint texture = %d, GLint level = %d)", target, attachment, textarget, texture, level);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001391
1392 try
1393 {
1394 if (target != GL_FRAMEBUFFER)
1395 {
1396 return error(GL_INVALID_ENUM);
1397 }
1398
1399 switch (attachment)
1400 {
1401 case GL_COLOR_ATTACHMENT0:
1402 break;
1403 default:
1404 return error(GL_INVALID_ENUM);
1405 }
1406
1407 gl::Context *context = gl::getContext();
1408
1409 if (context)
1410 {
1411 if (texture)
1412 {
1413 switch (textarget)
1414 {
1415 case GL_TEXTURE_2D:
1416 if (!context->getTexture2D())
1417 {
1418 return error(GL_INVALID_OPERATION);
1419 }
1420 break;
1421 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1422 UNIMPLEMENTED(); // FIXME
1423 break;
1424 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1425 UNIMPLEMENTED(); // FIXME
1426 break;
1427 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1428 UNIMPLEMENTED(); // FIXME
1429 break;
1430 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1431 UNIMPLEMENTED(); // FIXME
1432 break;
1433 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1434 UNIMPLEMENTED(); // FIXME
1435 break;
1436 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
1437 UNIMPLEMENTED(); // FIXME
1438 break;
1439 default:
1440 return error(GL_INVALID_ENUM);
1441 }
1442
1443 if (level != 0)
1444 {
1445 return error(GL_INVALID_VALUE);
1446 }
1447 }
1448
1449 gl::Framebuffer *framebuffer = context->getFramebuffer();
1450
1451 if (context->framebuffer == 0 || !framebuffer)
1452 {
1453 return error(GL_INVALID_OPERATION);
1454 }
1455
1456 framebuffer->setColorbuffer(GL_TEXTURE, texture);
1457 }
1458 }
1459 catch(std::bad_alloc&)
1460 {
1461 return error(GL_OUT_OF_MEMORY);
1462 }
1463}
1464
1465void __stdcall glFrontFace(GLenum mode)
1466{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001467 TRACE("(GLenum mode = 0x%X)", mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001468
1469 try
1470 {
1471 switch (mode)
1472 {
1473 case GL_CW:
1474 case GL_CCW:
1475 {
1476 gl::Context *context = gl::getContext();
1477
1478 if (context)
1479 {
1480 context->frontFace = mode;
1481 }
1482 }
1483 break;
1484 default:
1485 return error(GL_INVALID_ENUM);
1486 }
1487 }
1488 catch(std::bad_alloc&)
1489 {
1490 return error(GL_OUT_OF_MEMORY);
1491 }
1492}
1493
1494void __stdcall glGenBuffers(GLsizei n, GLuint* buffers)
1495{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001496 TRACE("(GLsizei n = %d, GLuint* buffers = 0x%0.8p)", n, buffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001497
1498 try
1499 {
1500 if (n < 0)
1501 {
1502 return error(GL_INVALID_VALUE);
1503 }
1504
1505 gl::Context *context = gl::getContext();
1506
1507 if (context)
1508 {
1509 for (int i = 0; i < n; i++)
1510 {
1511 buffers[i] = context->createBuffer();
1512 }
1513 }
1514 }
1515 catch(std::bad_alloc&)
1516 {
1517 return error(GL_OUT_OF_MEMORY);
1518 }
1519}
1520
1521void __stdcall glGenerateMipmap(GLenum target)
1522{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001523 TRACE("(GLenum target = 0x%X)", target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001524
1525 try
1526 {
1527 UNIMPLEMENTED(); // FIXME
1528 }
1529 catch(std::bad_alloc&)
1530 {
1531 return error(GL_OUT_OF_MEMORY);
1532 }
1533}
1534
1535void __stdcall glGenFramebuffers(GLsizei n, GLuint* framebuffers)
1536{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001537 TRACE("(GLsizei n = %d, GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001538
1539 try
1540 {
1541 if (n < 0)
1542 {
1543 return error(GL_INVALID_VALUE);
1544 }
1545
1546 gl::Context *context = gl::getContext();
1547
1548 if (context)
1549 {
1550 for (int i = 0; i < n; i++)
1551 {
1552 framebuffers[i] = context->createFramebuffer();
1553 }
1554 }
1555 }
1556 catch(std::bad_alloc&)
1557 {
1558 return error(GL_OUT_OF_MEMORY);
1559 }
1560}
1561
1562void __stdcall glGenRenderbuffers(GLsizei n, GLuint* renderbuffers)
1563{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001564 TRACE("(GLsizei n = %d, GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001565
1566 try
1567 {
1568 if (n < 0)
1569 {
1570 return error(GL_INVALID_VALUE);
1571 }
1572
1573 gl::Context *context = gl::getContext();
1574
1575 if (context)
1576 {
1577 for (int i = 0; i < n; i++)
1578 {
1579 renderbuffers[i] = context->createRenderbuffer();
1580 }
1581 }
1582 }
1583 catch(std::bad_alloc&)
1584 {
1585 return error(GL_OUT_OF_MEMORY);
1586 }
1587}
1588
1589void __stdcall glGenTextures(GLsizei n, GLuint* textures)
1590{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001591 TRACE("(GLsizei n = %d, GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001592
1593 try
1594 {
1595 if (n < 0)
1596 {
1597 return error(GL_INVALID_VALUE);
1598 }
1599
1600 gl::Context *context = gl::getContext();
1601
1602 if (context)
1603 {
1604 for (int i = 0; i < n; i++)
1605 {
1606 textures[i] = context->createTexture();
1607 }
1608 }
1609 }
1610 catch(std::bad_alloc&)
1611 {
1612 return error(GL_OUT_OF_MEMORY);
1613 }
1614}
1615
1616void __stdcall glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, char* name)
1617{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001618 TRACE("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, "
1619 "GLint* size = 0x%0.8p, GLenum* type = %0.8p, char* name = %0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001620 program, index, bufsize, length, size, type, name);
1621
1622 try
1623 {
1624 if (bufsize < 0)
1625 {
1626 return error(GL_INVALID_VALUE);
1627 }
1628
1629 UNIMPLEMENTED(); // FIXME
1630 }
1631 catch(std::bad_alloc&)
1632 {
1633 return error(GL_OUT_OF_MEMORY);
1634 }
1635}
1636
1637void __stdcall glGetActiveUniform(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, char* name)
1638{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001639 TRACE("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, "
1640 "GLsizei* length = 0x%0.8p, GLint* size = 0x%0.8p, GLenum* type = 0x%0.8p, char* name = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001641 program, index, bufsize, length, size, type, name);
1642
1643 try
1644 {
1645 if (bufsize < 0)
1646 {
1647 return error(GL_INVALID_VALUE);
1648 }
1649
1650 UNIMPLEMENTED(); // FIXME
1651 }
1652 catch(std::bad_alloc&)
1653 {
1654 return error(GL_OUT_OF_MEMORY);
1655 }
1656}
1657
1658void __stdcall glGetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders)
1659{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001660 TRACE("(GLuint program = %d, GLsizei maxcount = %d, GLsizei* count = 0x%0.8p, GLuint* shaders = 0x%0.8p)",
1661 program, maxcount, count, shaders);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001662
1663 try
1664 {
1665 if (maxcount < 0)
1666 {
1667 return error(GL_INVALID_VALUE);
1668 }
1669
daniel@transgaming.com6c785212010-03-30 03:36:17 +00001670 gl::Context *context = gl::getContext();
1671
1672 if (context)
1673 {
1674 gl::Program *programObject = context->getProgram(program);
1675
1676 if (!programObject)
1677 {
1678 return error(GL_INVALID_VALUE);
1679 }
1680
1681 return programObject->getAttachedShaders(maxcount, count, shaders);
1682 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001683 }
1684 catch(std::bad_alloc&)
1685 {
1686 return error(GL_OUT_OF_MEMORY);
1687 }
1688}
1689
1690int __stdcall glGetAttribLocation(GLuint program, const char* name)
1691{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001692 TRACE("(GLuint program = %d, const char* name = %s)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001693
1694 try
1695 {
1696 gl::Context *context = gl::getContext();
1697
1698 if (context)
1699 {
1700 gl::Program *programObject = context->getProgram(program);
1701
1702 if (!programObject)
1703 {
1704 return error(GL_INVALID_VALUE, -1);
1705 }
1706
1707 return programObject->getAttributeLocation(name);
1708 }
1709 }
1710 catch(std::bad_alloc&)
1711 {
1712 return error(GL_OUT_OF_MEMORY, -1);
1713 }
1714
1715 return -1;
1716}
1717
1718void __stdcall glGetBooleanv(GLenum pname, GLboolean* params)
1719{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001720 TRACE("(GLenum pname = 0x%X, GLboolean* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001721
1722 try
1723 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00001724 gl::Context *context = gl::getContext();
1725
1726 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001727 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00001728 if (!(context->getBooleanv(pname, params)))
1729 {
1730 GLenum nativeType;
1731 unsigned int numParams = 0;
1732 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
1733 return error(GL_INVALID_ENUM);
1734
1735 if (numParams == 0)
1736 return; // it is known that the pname is valid, but there are no parameters to return
1737
1738 if (nativeType == GL_FLOAT)
1739 {
1740 GLfloat *floatParams = NULL;
1741 floatParams = new GLfloat[numParams];
1742
1743 context->getFloatv(pname, floatParams);
1744
1745 for (unsigned int i = 0; i < numParams; ++i)
1746 {
1747 if (floatParams[i] == 0.0f)
1748 params[i] = GL_FALSE;
1749 else
1750 params[i] = GL_TRUE;
1751 }
1752
1753 delete [] floatParams;
1754 }
1755 else if (nativeType == GL_INT)
1756 {
1757 GLint *intParams = NULL;
1758 intParams = new GLint[numParams];
1759
1760 context->getIntegerv(pname, intParams);
1761
1762 for (unsigned int i = 0; i < numParams; ++i)
1763 {
1764 if (intParams[i] == 0)
1765 params[i] = GL_FALSE;
1766 else
1767 params[i] = GL_TRUE;
1768 }
1769
1770 delete [] intParams;
1771 }
1772 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001773 }
1774 }
1775 catch(std::bad_alloc&)
1776 {
1777 return error(GL_OUT_OF_MEMORY);
1778 }
1779}
1780
1781void __stdcall glGetBufferParameteriv(GLenum target, GLenum pname, GLint* params)
1782{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001783 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 +00001784
1785 try
1786 {
1787 UNIMPLEMENTED(); // FIXME
1788 }
1789 catch(std::bad_alloc&)
1790 {
1791 return error(GL_OUT_OF_MEMORY);
1792 }
1793}
1794
1795GLenum __stdcall glGetError(void)
1796{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001797 TRACE("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001798
1799 gl::Context *context = gl::getContext();
1800
1801 if (context)
1802 {
1803 return context->getError();
1804 }
1805
1806 return GL_NO_ERROR;
1807}
1808
1809void __stdcall glGetFloatv(GLenum pname, GLfloat* params)
1810{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001811 TRACE("(GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001812
1813 try
1814 {
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00001815 gl::Context *context = gl::getContext();
1816
1817 if (context)
1818 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00001819 if (!(context->getFloatv(pname, params)))
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00001820 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00001821 GLenum nativeType;
1822 unsigned int numParams = 0;
1823 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
1824 return error(GL_INVALID_ENUM);
1825
1826 if (numParams == 0)
1827 return; // it is known that the pname is valid, but that there are no parameters to return.
1828
1829 if (nativeType == GL_BOOL)
1830 {
1831 GLboolean *boolParams = NULL;
1832 boolParams = new GLboolean[numParams];
1833
1834 context->getBooleanv(pname, boolParams);
1835
1836 for (unsigned int i = 0; i < numParams; ++i)
1837 {
1838 if (boolParams[i] == GL_FALSE)
1839 params[i] = 0.0f;
1840 else
1841 params[i] = 1.0f;
1842 }
1843
1844 delete [] boolParams;
1845 }
1846 else if (nativeType == GL_INT)
1847 {
1848 GLint *intParams = NULL;
1849 intParams = new GLint[numParams];
1850
1851 context->getIntegerv(pname, intParams);
1852
1853 for (unsigned int i = 0; i < numParams; ++i)
1854 {
1855 params[i] = (GLfloat)intParams[i];
1856 }
1857
1858 delete [] intParams;
1859 }
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00001860 }
1861 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001862 }
1863 catch(std::bad_alloc&)
1864 {
1865 return error(GL_OUT_OF_MEMORY);
1866 }
1867}
1868
1869void __stdcall glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params)
1870{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001871 TRACE("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
1872 target, attachment, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001873
1874 try
1875 {
1876 gl::Context *context = gl::getContext();
1877
1878 if (context)
1879 {
1880 if (context->framebuffer == 0)
1881 {
1882 return error(GL_INVALID_OPERATION);
1883 }
1884
1885 UNIMPLEMENTED(); // FIXME
1886 }
1887 }
1888 catch(std::bad_alloc&)
1889 {
1890 return error(GL_OUT_OF_MEMORY);
1891 }
1892}
1893
1894void __stdcall glGetIntegerv(GLenum pname, GLint* params)
1895{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001896 TRACE("(GLenum pname = 0x%X, GLint* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001897
1898 try
1899 {
1900 gl::Context *context = gl::getContext();
1901
1902 if (context)
1903 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00001904 if (!(context->getIntegerv(pname, params)))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001905 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00001906 GLenum nativeType;
1907 unsigned int numParams = 0;
1908 if (!context->getQueryParameterInfo(pname, &nativeType, &numParams))
1909 return error(GL_INVALID_ENUM);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001910
daniel@transgaming.com777f2672010-04-07 03:25:16 +00001911 if (numParams == 0)
1912 return; // it is known that pname is valid, but there are no parameters to return
1913
1914 if (nativeType == GL_BOOL)
1915 {
1916 GLboolean *boolParams = NULL;
1917 boolParams = new GLboolean[numParams];
1918
1919 context->getBooleanv(pname, boolParams);
1920
1921 for (unsigned int i = 0; i < numParams; ++i)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001922 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00001923 if (boolParams[i] == GL_FALSE)
1924 params[i] = 0;
1925 else
1926 params[i] = 1;
1927 }
1928
1929 delete [] boolParams;
1930 }
1931 else if (nativeType == GL_FLOAT)
1932 {
1933 GLfloat *floatParams = NULL;
1934 floatParams = new GLfloat[numParams];
1935
1936 context->getFloatv(pname, floatParams);
1937
1938 for (unsigned int i = 0; i < numParams; ++i)
1939 {
1940 if (pname == GL_DEPTH_RANGE || pname == GL_COLOR_CLEAR_VALUE || pname == GL_DEPTH_CLEAR_VALUE)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001941 {
daniel@transgaming.com777f2672010-04-07 03:25:16 +00001942 params[i] = (GLint)(((GLfloat)(0xFFFFFFFF) * floatParams[i] - 1.0f) / 2.0f);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001943 }
daniel@transgaming.com777f2672010-04-07 03:25:16 +00001944 else
1945 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 +00001946 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001947
daniel@transgaming.com777f2672010-04-07 03:25:16 +00001948 delete [] floatParams;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001949 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001950 }
1951 }
1952 }
1953 catch(std::bad_alloc&)
1954 {
1955 return error(GL_OUT_OF_MEMORY);
1956 }
1957}
1958
1959void __stdcall glGetProgramiv(GLuint program, GLenum pname, GLint* params)
1960{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001961 TRACE("(GLuint program = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", program, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001962
1963 try
1964 {
1965 gl::Context *context = gl::getContext();
1966
1967 if (context)
1968 {
1969 gl::Program *programObject = context->getProgram(program);
1970
1971 if (!programObject)
1972 {
1973 return error(GL_INVALID_VALUE);
1974 }
1975
1976 switch (pname)
1977 {
1978 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00001979 *params = programObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001980 return;
1981 case GL_LINK_STATUS:
1982 *params = programObject->isLinked();
1983 return;
1984 case GL_VALIDATE_STATUS:
1985 UNIMPLEMENTED(); // FIXME
1986 *params = GL_TRUE;
1987 return;
1988 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00001989 *params = programObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001990 return;
1991 case GL_ATTACHED_SHADERS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00001992 *params = programObject->getAttachedShadersCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001993 return;
1994 case GL_ACTIVE_ATTRIBUTES:
1995 UNIMPLEMENTED(); // FIXME
1996 *params = 0;
1997 return;
1998 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
1999 UNIMPLEMENTED(); // FIXME
2000 *params = 0;
2001 return;
2002 case GL_ACTIVE_UNIFORMS:
2003 UNIMPLEMENTED(); // FIXME
2004 *params = 0;
2005 return;
2006 case GL_ACTIVE_UNIFORM_MAX_LENGTH:
2007 UNIMPLEMENTED(); // FIXME
2008 *params = 0;
2009 return;
2010 default:
2011 return error(GL_INVALID_ENUM);
2012 }
2013 }
2014 }
2015 catch(std::bad_alloc&)
2016 {
2017 return error(GL_OUT_OF_MEMORY);
2018 }
2019}
2020
2021void __stdcall glGetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, char* infolog)
2022{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002023 TRACE("(GLuint program = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, char* infolog = 0x%0.8p)",
2024 program, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002025
2026 try
2027 {
2028 if (bufsize < 0)
2029 {
2030 return error(GL_INVALID_VALUE);
2031 }
2032
daniel@transgaming.comcba50572010-03-28 19:36:09 +00002033 gl::Context *context = gl::getContext();
2034
2035 if (context)
2036 {
2037 gl::Program *programObject = context->getProgram(program);
2038
2039 if (!programObject)
2040 {
2041 return error(GL_INVALID_VALUE);
2042 }
2043
2044 programObject->getInfoLog(bufsize, length, infolog);
2045 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002046 }
2047 catch(std::bad_alloc&)
2048 {
2049 return error(GL_OUT_OF_MEMORY);
2050 }
2051}
2052
2053void __stdcall glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params)
2054{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002055 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 +00002056
2057 try
2058 {
2059 UNIMPLEMENTED(); // FIXME
2060 }
2061 catch(std::bad_alloc&)
2062 {
2063 return error(GL_OUT_OF_MEMORY);
2064 }
2065}
2066
2067void __stdcall glGetShaderiv(GLuint shader, GLenum pname, GLint* params)
2068{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002069 TRACE("(GLuint shader = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", shader, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002070
2071 try
2072 {
2073 gl::Context *context = gl::getContext();
2074
2075 if (context)
2076 {
2077 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00002078
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002079 if (!shaderObject)
2080 {
2081 return error(GL_INVALID_VALUE);
2082 }
2083
2084 switch (pname)
2085 {
2086 case GL_SHADER_TYPE:
2087 *params = shaderObject->getType();
2088 return;
2089 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00002090 *params = shaderObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002091 return;
2092 case GL_COMPILE_STATUS:
2093 *params = shaderObject->isCompiled() ? GL_TRUE : GL_FALSE;
2094 return;
2095 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00002096 *params = shaderObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002097 return;
2098 case GL_SHADER_SOURCE_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00002099 *params = shaderObject->getSourceLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002100 return;
2101 default:
2102 return error(GL_INVALID_ENUM);
2103 }
2104 }
2105 }
2106 catch(std::bad_alloc&)
2107 {
2108 return error(GL_OUT_OF_MEMORY);
2109 }
2110}
2111
2112void __stdcall glGetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, char* infolog)
2113{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002114 TRACE("(GLuint shader = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, char* infolog = 0x%0.8p)",
2115 shader, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002116
2117 try
2118 {
2119 if (bufsize < 0)
2120 {
2121 return error(GL_INVALID_VALUE);
2122 }
2123
daniel@transgaming.comcba50572010-03-28 19:36:09 +00002124 gl::Context *context = gl::getContext();
2125
2126 if (context)
2127 {
2128 gl::Shader *shaderObject = context->getShader(shader);
2129
2130 if (!shaderObject)
2131 {
2132 return error(GL_INVALID_VALUE);
2133 }
2134
2135 shaderObject->getInfoLog(bufsize, length, infolog);
2136 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002137 }
2138 catch(std::bad_alloc&)
2139 {
2140 return error(GL_OUT_OF_MEMORY);
2141 }
2142}
2143
2144void __stdcall glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision)
2145{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002146 TRACE("(GLenum shadertype = 0x%X, GLenum precisiontype = 0x%X, GLint* range = 0x%0.8p, GLint* precision = 0x%0.8p)",
2147 shadertype, precisiontype, range, precision);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002148
2149 try
2150 {
daniel@transgaming.com6c785212010-03-30 03:36:17 +00002151 switch (shadertype)
2152 {
2153 case GL_VERTEX_SHADER:
2154 case GL_FRAGMENT_SHADER:
2155 break;
2156 default:
2157 return error(GL_INVALID_ENUM);
2158 }
2159
2160 switch (precisiontype)
2161 {
2162 case GL_LOW_FLOAT:
2163 case GL_MEDIUM_FLOAT:
2164 case GL_HIGH_FLOAT:
2165 // Assume IEEE 754 precision
2166 range[0] = 127;
2167 range[1] = 127;
2168 precision[0] = 23;
2169 precision[1] = 23;
2170 break;
2171 case GL_LOW_INT:
2172 case GL_MEDIUM_INT:
2173 case GL_HIGH_INT:
2174 // Some (most) hardware only supports single-precision floating-point numbers,
2175 // which can accurately represent integers up to +/-16777216
2176 range[0] = 24;
2177 range[1] = 24;
2178 precision[0] = 0;
2179 precision[1] = 0;
2180 break;
2181 default:
2182 return error(GL_INVALID_ENUM);
2183 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002184 }
2185 catch(std::bad_alloc&)
2186 {
2187 return error(GL_OUT_OF_MEMORY);
2188 }
2189}
2190
2191void __stdcall glGetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, char* source)
2192{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002193 TRACE("(GLuint shader = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, char* source = 0x%0.8p)",
2194 shader, bufsize, length, source);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002195
2196 try
2197 {
2198 if (bufsize < 0)
2199 {
2200 return error(GL_INVALID_VALUE);
2201 }
2202
daniel@transgaming.comcba50572010-03-28 19:36:09 +00002203 gl::Context *context = gl::getContext();
2204
2205 if (context)
2206 {
2207 gl::Shader *shaderObject = context->getShader(shader);
2208
2209 if (!shaderObject)
2210 {
daniel@transgaming.com41187f12010-04-01 13:39:29 +00002211 return error(GL_INVALID_OPERATION);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00002212 }
2213
2214 shaderObject->getSource(bufsize, length, source);
2215 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002216 }
2217 catch(std::bad_alloc&)
2218 {
2219 return error(GL_OUT_OF_MEMORY);
2220 }
2221}
2222
2223const GLubyte* __stdcall glGetString(GLenum name)
2224{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002225 TRACE("(GLenum name = 0x%X)", name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002226
2227 try
2228 {
2229 switch (name)
2230 {
2231 case GL_VENDOR:
2232 return (GLubyte*)"TransGaming Inc.";
2233 case GL_RENDERER:
2234 return (GLubyte*)"ANGLE";
2235 case GL_VERSION:
2236 return (GLubyte*)"OpenGL ES 2.0 (git-devel "__DATE__ " " __TIME__")";
2237 case GL_SHADING_LANGUAGE_VERSION:
2238 return (GLubyte*)"OpenGL ES GLSL ES 1.00 (git-devel "__DATE__ " " __TIME__")";
2239 case GL_EXTENSIONS:
2240 return (GLubyte*)"";
2241 default:
2242 return error(GL_INVALID_ENUM, (GLubyte*)NULL);
2243 }
2244 }
2245 catch(std::bad_alloc&)
2246 {
2247 return error(GL_OUT_OF_MEMORY, (GLubyte*)NULL);
2248 }
2249
2250 return NULL;
2251}
2252
2253void __stdcall glGetTexParameterfv(GLenum target, GLenum pname, GLfloat* params)
2254{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002255 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 +00002256
2257 try
2258 {
2259 UNIMPLEMENTED(); // FIXME
2260 }
2261 catch(std::bad_alloc&)
2262 {
2263 return error(GL_OUT_OF_MEMORY);
2264 }
2265}
2266
2267void __stdcall glGetTexParameteriv(GLenum target, GLenum pname, GLint* params)
2268{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002269 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 +00002270
2271 try
2272 {
2273 UNIMPLEMENTED(); // FIXME
2274 }
2275 catch(std::bad_alloc&)
2276 {
2277 return error(GL_OUT_OF_MEMORY);
2278 }
2279}
2280
2281void __stdcall glGetUniformfv(GLuint program, GLint location, GLfloat* params)
2282{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002283 TRACE("(GLuint program = %d, GLint location = %d, GLfloat* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002284
2285 try
2286 {
2287 UNIMPLEMENTED(); // FIXME
2288 }
2289 catch(std::bad_alloc&)
2290 {
2291 return error(GL_OUT_OF_MEMORY);
2292 }
2293}
2294
2295void __stdcall glGetUniformiv(GLuint program, GLint location, GLint* params)
2296{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002297 TRACE("(GLuint program = %d, GLint location = %d, GLint* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002298
2299 try
2300 {
2301 UNIMPLEMENTED(); // FIXME
2302 }
2303 catch(std::bad_alloc&)
2304 {
2305 return error(GL_OUT_OF_MEMORY);
2306 }
2307}
2308
2309int __stdcall glGetUniformLocation(GLuint program, const char* name)
2310{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002311 TRACE("(GLuint program = %d, const char* name = 0x%0.8p)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002312
2313 try
2314 {
2315 gl::Context *context = gl::getContext();
2316
2317 if (strstr(name, "gl_") == name)
2318 {
2319 return -1;
2320 }
2321
2322 if (context)
2323 {
2324 gl::Program *programObject = context->getProgram(program);
2325
2326 if (!programObject)
2327 {
2328 return error(GL_INVALID_VALUE, -1);
2329 }
2330
2331 if (!programObject->isLinked())
2332 {
2333 return error(GL_INVALID_OPERATION, -1);
2334 }
2335
2336 return programObject->getUniformLocation(name);
2337 }
2338 }
2339 catch(std::bad_alloc&)
2340 {
2341 return error(GL_OUT_OF_MEMORY, -1);
2342 }
2343
2344 return -1;
2345}
2346
2347void __stdcall glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params)
2348{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002349 TRACE("(GLuint index = %d, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002350
2351 try
2352 {
2353 if (index >= gl::MAX_VERTEX_ATTRIBS)
2354 {
2355 return error(GL_INVALID_VALUE);
2356 }
2357
2358 UNIMPLEMENTED(); // FIXME
2359 }
2360 catch(std::bad_alloc&)
2361 {
2362 return error(GL_OUT_OF_MEMORY);
2363 }
2364}
2365
2366void __stdcall glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params)
2367{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002368 TRACE("(GLuint index = %d, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002369
2370 try
2371 {
2372 if (index >= gl::MAX_VERTEX_ATTRIBS)
2373 {
2374 return error(GL_INVALID_VALUE);
2375 }
2376
2377 UNIMPLEMENTED(); // FIXME
2378 }
2379 catch(std::bad_alloc&)
2380 {
2381 return error(GL_OUT_OF_MEMORY);
2382 }
2383}
2384
2385void __stdcall glGetVertexAttribPointerv(GLuint index, GLenum pname, void** pointer)
2386{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002387 TRACE("(GLuint index = %d, GLenum pname = 0x%X, void** pointer = 0x%0.8p)", index, pname, pointer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002388
2389 try
2390 {
2391 if (index >= gl::MAX_VERTEX_ATTRIBS)
2392 {
2393 return error(GL_INVALID_VALUE);
2394 }
2395
2396 UNIMPLEMENTED(); // FIXME
2397 }
2398 catch(std::bad_alloc&)
2399 {
2400 return error(GL_OUT_OF_MEMORY);
2401 }
2402}
2403
2404void __stdcall glHint(GLenum target, GLenum mode)
2405{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002406 TRACE("(GLenum target = 0x%X, GLenum mode = 0x%X)", target, mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002407
2408 try
2409 {
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00002410 switch (target)
2411 {
2412 case GL_GENERATE_MIPMAP_HINT:
2413 switch (mode)
2414 {
2415 case GL_FASTEST:
2416 case GL_NICEST:
2417 case GL_DONT_CARE:
2418 break;
2419 default:
2420 return error(GL_INVALID_ENUM);
2421 }
2422 break;
2423 default:
2424 return error(GL_INVALID_ENUM);
2425 }
2426
2427 gl::Context *context = gl::getContext();
2428 if (context)
2429 {
2430 if (target == GL_GENERATE_MIPMAP_HINT)
2431 context->generateMipmapHint = mode;
2432 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002433 }
2434 catch(std::bad_alloc&)
2435 {
2436 return error(GL_OUT_OF_MEMORY);
2437 }
2438}
2439
2440GLboolean __stdcall glIsBuffer(GLuint buffer)
2441{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002442 TRACE("(GLuint buffer = %d)", buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002443
2444 try
2445 {
2446 gl::Context *context = gl::getContext();
2447
2448 if (context && buffer)
2449 {
2450 gl::Buffer *bufferObject = context->getBuffer(buffer);
2451
2452 if (bufferObject)
2453 {
2454 return GL_TRUE;
2455 }
2456 }
2457 }
2458 catch(std::bad_alloc&)
2459 {
2460 return error(GL_OUT_OF_MEMORY, GL_FALSE);
2461 }
2462
2463 return GL_FALSE;
2464}
2465
2466GLboolean __stdcall glIsEnabled(GLenum cap)
2467{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002468 TRACE("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002469
2470 try
2471 {
2472 gl::Context *context = gl::getContext();
2473
2474 if (context)
2475 {
2476 switch (cap)
2477 {
2478 case GL_CULL_FACE: return context->cullFace;
2479 case GL_POLYGON_OFFSET_FILL: return context->polygonOffsetFill;
2480 case GL_SAMPLE_ALPHA_TO_COVERAGE: return context->sampleAlphaToCoverage;
2481 case GL_SAMPLE_COVERAGE: return context->sampleCoverage;
2482 case GL_SCISSOR_TEST: return context->scissorTest;
2483 case GL_STENCIL_TEST: return context->stencilTest;
2484 case GL_DEPTH_TEST: return context->depthTest;
2485 case GL_BLEND: return context->blend;
2486 case GL_DITHER: return context->dither;
2487 default:
2488 return error(GL_INVALID_ENUM, false);
2489 }
2490 }
2491 }
2492 catch(std::bad_alloc&)
2493 {
2494 return error(GL_OUT_OF_MEMORY, false);
2495 }
2496
2497 return false;
2498}
2499
2500GLboolean __stdcall glIsFramebuffer(GLuint framebuffer)
2501{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002502 TRACE("(GLuint framebuffer = %d)", framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002503
2504 try
2505 {
2506 gl::Context *context = gl::getContext();
2507
2508 if (context && framebuffer)
2509 {
2510 gl::Framebuffer *framebufferObject = context->getFramebuffer(framebuffer);
2511
2512 if (framebufferObject)
2513 {
2514 return GL_TRUE;
2515 }
2516 }
2517 }
2518 catch(std::bad_alloc&)
2519 {
2520 return error(GL_OUT_OF_MEMORY, GL_FALSE);
2521 }
2522
2523 return GL_FALSE;
2524}
2525
2526GLboolean __stdcall glIsProgram(GLuint program)
2527{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002528 TRACE("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002529
2530 try
2531 {
2532 gl::Context *context = gl::getContext();
2533
2534 if (context && program)
2535 {
2536 gl::Program *programObject = context->getProgram(program);
2537
2538 if (programObject)
2539 {
2540 return GL_TRUE;
2541 }
2542 }
2543 }
2544 catch(std::bad_alloc&)
2545 {
2546 return error(GL_OUT_OF_MEMORY, GL_FALSE);
2547 }
2548
2549 return GL_FALSE;
2550}
2551
2552GLboolean __stdcall glIsRenderbuffer(GLuint renderbuffer)
2553{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002554 TRACE("(GLuint renderbuffer = %d)", renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002555
2556 try
2557 {
2558 gl::Context *context = gl::getContext();
2559
2560 if (context && renderbuffer)
2561 {
2562 gl::Renderbuffer *renderbufferObject = context->getRenderbuffer(renderbuffer);
2563
2564 if (renderbufferObject)
2565 {
2566 return GL_TRUE;
2567 }
2568 }
2569 }
2570 catch(std::bad_alloc&)
2571 {
2572 return error(GL_OUT_OF_MEMORY, GL_FALSE);
2573 }
2574
2575 return GL_FALSE;
2576}
2577
2578GLboolean __stdcall glIsShader(GLuint shader)
2579{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002580 TRACE("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002581
2582 try
2583 {
2584 gl::Context *context = gl::getContext();
2585
2586 if (context && shader)
2587 {
2588 gl::Shader *shaderObject = context->getShader(shader);
2589
2590 if (shaderObject)
2591 {
2592 return GL_TRUE;
2593 }
2594 }
2595 }
2596 catch(std::bad_alloc&)
2597 {
2598 return error(GL_OUT_OF_MEMORY, GL_FALSE);
2599 }
2600
2601 return GL_FALSE;
2602}
2603
2604GLboolean __stdcall glIsTexture(GLuint texture)
2605{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002606 TRACE("(GLuint texture = %d)", texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002607
2608 try
2609 {
2610 gl::Context *context = gl::getContext();
2611
2612 if (context && texture)
2613 {
2614 gl::Texture *textureObject = context->getTexture(texture);
2615
2616 if (textureObject)
2617 {
2618 return GL_TRUE;
2619 }
2620 }
2621 }
2622 catch(std::bad_alloc&)
2623 {
2624 return error(GL_OUT_OF_MEMORY, GL_FALSE);
2625 }
2626
2627 return GL_FALSE;
2628}
2629
2630void __stdcall glLineWidth(GLfloat width)
2631{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002632 TRACE("(GLfloat width = %f)", width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002633
2634 try
2635 {
2636 if (width <= 0.0f)
2637 {
2638 return error(GL_INVALID_VALUE);
2639 }
2640
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00002641 gl::Context *context = gl::getContext();
2642
2643 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002644 {
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00002645 context->lineWidth = width;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002646 }
2647 }
2648 catch(std::bad_alloc&)
2649 {
2650 return error(GL_OUT_OF_MEMORY);
2651 }
2652}
2653
2654void __stdcall glLinkProgram(GLuint program)
2655{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002656 TRACE("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002657
2658 try
2659 {
2660 gl::Context *context = gl::getContext();
2661
2662 if (context)
2663 {
2664 gl::Program *programObject = context->getProgram(program);
2665
2666 if (!programObject)
2667 {
2668 return error(GL_INVALID_VALUE);
2669 }
2670
2671 programObject->link();
2672 }
2673 }
2674 catch(std::bad_alloc&)
2675 {
2676 return error(GL_OUT_OF_MEMORY);
2677 }
2678}
2679
2680void __stdcall glPixelStorei(GLenum pname, GLint param)
2681{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002682 TRACE("(GLenum pname = 0x%X, GLint param = %d)", pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002683
2684 try
2685 {
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00002686 gl::Context *context = gl::getContext();
2687
2688 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002689 {
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00002690 switch (pname)
2691 {
2692 case GL_UNPACK_ALIGNMENT:
2693 if (param != 1 && param != 2 && param != 4 && param != 8)
2694 {
2695 return error(GL_INVALID_VALUE);
2696 }
2697
2698 context->unpackAlignment = param;
2699 break;
2700
2701 case GL_PACK_ALIGNMENT:
2702 if (param != 1 && param != 2 && param != 4 && param != 8)
2703 {
2704 return error(GL_INVALID_VALUE);
2705 }
2706
2707 context->packAlignment = param;
2708 break;
2709
2710 default:
2711 return error(GL_INVALID_ENUM);
2712 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002713 }
2714 }
2715 catch(std::bad_alloc&)
2716 {
2717 return error(GL_OUT_OF_MEMORY);
2718 }
2719}
2720
2721void __stdcall glPolygonOffset(GLfloat factor, GLfloat units)
2722{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002723 TRACE("(GLfloat factor = %f, GLfloat units = %f)", factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002724
2725 try
2726 {
2727 if (factor != 0.0f || units != 0.0f)
2728 {
2729 UNIMPLEMENTED(); // FIXME
2730 }
2731 }
2732 catch(std::bad_alloc&)
2733 {
2734 return error(GL_OUT_OF_MEMORY);
2735 }
2736}
2737
2738void __stdcall glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void* pixels)
2739{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002740 TRACE("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
2741 "GLenum format = 0x%X, GLenum type = 0x%X, void* pixels = 0x%0.8p)",
2742 x, y, width, height, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002743
2744 try
2745 {
2746 if (width < 0 || height < 0)
2747 {
2748 return error(GL_INVALID_VALUE);
2749 }
2750
2751 switch (format)
2752 {
2753 case GL_RGBA:
2754 switch (type)
2755 {
2756 case GL_UNSIGNED_BYTE:
2757 break;
2758 default:
2759 return error(GL_INVALID_OPERATION);
2760 }
2761 break;
2762 case gl::IMPLEMENTATION_COLOR_READ_FORMAT:
2763 switch (type)
2764 {
2765 case gl::IMPLEMENTATION_COLOR_READ_TYPE:
2766 break;
2767 default:
2768 return error(GL_INVALID_OPERATION);
2769 }
2770 break;
2771 default:
2772 return error(GL_INVALID_OPERATION);
2773 }
2774
2775 gl::Context *context = gl::getContext();
2776
2777 if (context)
2778 {
2779 context->readPixels(x, y, width, height, format, type, pixels);
2780 }
2781 }
2782 catch(std::bad_alloc&)
2783 {
2784 return error(GL_OUT_OF_MEMORY);
2785 }
2786}
2787
2788void __stdcall glReleaseShaderCompiler(void)
2789{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002790 TRACE("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002791
2792 try
2793 {
2794 gl::Shader::releaseCompiler();
2795 }
2796 catch(std::bad_alloc&)
2797 {
2798 return error(GL_OUT_OF_MEMORY);
2799 }
2800}
2801
2802void __stdcall glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
2803{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002804 TRACE("(GLenum target = 0x%X, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
2805 target, internalformat, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002806
2807 try
2808 {
2809 switch (target)
2810 {
2811 case GL_RENDERBUFFER:
2812 break;
2813 default:
2814 return error(GL_INVALID_ENUM);
2815 }
2816
2817 switch (internalformat)
2818 {
2819 case GL_DEPTH_COMPONENT16:
2820 case GL_RGBA4:
2821 case GL_RGB5_A1:
2822 case GL_RGB565:
2823 case GL_STENCIL_INDEX8:
2824 break;
2825 default:
2826 return error(GL_INVALID_ENUM);
2827 }
2828
2829 if (width < 0 || height < 0 || width > gl::MAX_RENDERBUFFER_SIZE || height > gl::MAX_RENDERBUFFER_SIZE)
2830 {
2831 return error(GL_INVALID_VALUE);
2832 }
2833
2834 gl::Context *context = gl::getContext();
2835
2836 if (context)
2837 {
2838 if (context->framebuffer == 0 || context->renderbuffer == 0)
2839 {
2840 return error(GL_INVALID_OPERATION);
2841 }
2842
2843 switch (internalformat)
2844 {
2845 case GL_DEPTH_COMPONENT16:
2846 context->setRenderbuffer(new gl::Depthbuffer(width, height));
2847 break;
2848 case GL_RGBA4:
2849 case GL_RGB5_A1:
2850 case GL_RGB565:
2851 UNIMPLEMENTED(); // FIXME
daniel@transgaming.com4a9d65c2010-03-08 21:30:56 +00002852 // context->setRenderbuffer(new Colorbuffer(renderTarget));
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002853 break;
2854 case GL_STENCIL_INDEX8:
daniel@transgaming.com4a9d65c2010-03-08 21:30:56 +00002855 context->setRenderbuffer(new gl::Stencilbuffer(width, height));
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002856 break;
2857 default:
2858 return error(GL_INVALID_ENUM);
2859 }
2860 }
2861 }
2862 catch(std::bad_alloc&)
2863 {
2864 return error(GL_OUT_OF_MEMORY);
2865 }
2866}
2867
2868void __stdcall glSampleCoverage(GLclampf value, GLboolean invert)
2869{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002870 TRACE("(GLclampf value = %f, GLboolean invert = %d)", value, invert);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002871
2872 try
2873 {
2874 gl::Context* context = gl::getContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00002875
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002876 if (context)
2877 {
2878 context->sampleCoverageValue = gl::clamp01(value);
2879 context->sampleCoverageInvert = invert;
2880 }
2881 }
2882 catch(std::bad_alloc&)
2883 {
2884 return error(GL_OUT_OF_MEMORY);
2885 }
2886}
2887
2888void __stdcall glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
2889{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002890 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 +00002891
2892 try
2893 {
2894 if (width < 0 || height < 0)
2895 {
2896 return error(GL_INVALID_VALUE);
2897 }
2898
2899 gl::Context* context = gl::getContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00002900
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002901 if (context)
2902 {
2903 context->scissorX = x;
2904 context->scissorY = y;
2905 context->scissorWidth = width;
2906 context->scissorHeight = height;
2907 }
2908 }
2909 catch(std::bad_alloc&)
2910 {
2911 return error(GL_OUT_OF_MEMORY);
2912 }
2913}
2914
2915void __stdcall glShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryformat, const void* binary, GLsizei length)
2916{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002917 TRACE("(GLsizei n = %d, const GLuint* shaders = 0x%0.8p, GLenum binaryformat = 0x%X, "
2918 "const void* binary = 0x%0.8p, GLsizei length = %d)",
2919 n, shaders, binaryformat, binary, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002920
2921 try
2922 {
2923 if (n < 0 || length < 0)
2924 {
2925 return error(GL_INVALID_VALUE);
2926 }
2927
2928 UNIMPLEMENTED(); // FIXME
2929 }
2930 catch(std::bad_alloc&)
2931 {
2932 return error(GL_OUT_OF_MEMORY);
2933 }
2934}
2935
2936void __stdcall glShaderSource(GLuint shader, GLsizei count, const char** string, const GLint* length)
2937{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002938 TRACE("(GLuint shader = %d, GLsizei count = %d, const char** string = 0x%0.8p, const GLint* length = 0x%0.8p)",
2939 shader, count, string, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002940
2941 try
2942 {
daniel@transgaming.com57a0bab2010-04-03 20:56:10 +00002943 if (shader == 0 || count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002944 {
2945 return error(GL_INVALID_VALUE);
2946 }
2947
2948 gl::Context *context = gl::getContext();
2949
2950 if (context)
2951 {
2952 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00002953
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002954 if (!shaderObject)
2955 {
daniel@transgaming.com41187f12010-04-01 13:39:29 +00002956 return error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002957 }
2958
2959 shaderObject->setSource(count, string, length);
2960 }
2961 }
2962 catch(std::bad_alloc&)
2963 {
2964 return error(GL_OUT_OF_MEMORY);
2965 }
2966}
2967
2968void __stdcall glStencilFunc(GLenum func, GLint ref, GLuint mask)
2969{
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00002970 glStencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002971}
2972
2973void __stdcall glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
2974{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002975 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 +00002976
2977 try
2978 {
2979 switch (face)
2980 {
2981 case GL_FRONT:
2982 case GL_BACK:
2983 case GL_FRONT_AND_BACK:
2984 break;
2985 default:
2986 return error(GL_INVALID_ENUM);
2987 }
2988
2989 switch (func)
2990 {
2991 case GL_NEVER:
2992 case GL_ALWAYS:
2993 case GL_LESS:
2994 case GL_LEQUAL:
2995 case GL_EQUAL:
2996 case GL_GEQUAL:
2997 case GL_GREATER:
2998 case GL_NOTEQUAL:
2999 break;
3000 default:
3001 return error(GL_INVALID_ENUM);
3002 }
3003
3004 gl::Context *context = gl::getContext();
3005
3006 if (context)
3007 {
3008 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
3009 {
3010 context->stencilFunc = func;
3011 context->stencilRef = ref;
3012 context->stencilMask = mask;
3013 }
3014
3015 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
3016 {
3017 context->stencilBackFunc = func;
3018 context->stencilBackRef = ref;
3019 context->stencilBackMask = mask;
3020 }
3021 }
3022 }
3023 catch(std::bad_alloc&)
3024 {
3025 return error(GL_OUT_OF_MEMORY);
3026 }
3027}
3028
3029void __stdcall glStencilMask(GLuint mask)
3030{
3031 glStencilMaskSeparate(GL_FRONT_AND_BACK, mask);
3032}
3033
3034void __stdcall glStencilMaskSeparate(GLenum face, GLuint mask)
3035{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003036 TRACE("(GLenum face = 0x%X, GLuint mask = %d)", face, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003037
3038 try
3039 {
3040 switch (face)
3041 {
3042 case GL_FRONT:
3043 case GL_BACK:
3044 case GL_FRONT_AND_BACK:
3045 break;
3046 default:
3047 return error(GL_INVALID_ENUM);
3048 }
3049
3050 gl::Context *context = gl::getContext();
3051
3052 if (context)
3053 {
3054 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
3055 {
3056 context->stencilWritemask = mask;
3057 }
3058
3059 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
3060 {
3061 context->stencilBackWritemask = mask;
3062 }
3063 }
3064 }
3065 catch(std::bad_alloc&)
3066 {
3067 return error(GL_OUT_OF_MEMORY);
3068 }
3069}
3070
3071void __stdcall glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
3072{
3073 glStencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
3074}
3075
3076void __stdcall glStencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
3077{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003078 TRACE("(GLenum face = 0x%X, GLenum fail = 0x%X, GLenum zfail = 0x%X, GLenum zpas = 0x%Xs)",
3079 face, fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003080
3081 try
3082 {
3083 switch (face)
3084 {
3085 case GL_FRONT:
3086 case GL_BACK:
3087 case GL_FRONT_AND_BACK:
3088 break;
3089 default:
3090 return error(GL_INVALID_ENUM);
3091 }
3092
3093 switch (fail)
3094 {
3095 case GL_ZERO:
3096 case GL_KEEP:
3097 case GL_REPLACE:
3098 case GL_INCR:
3099 case GL_DECR:
3100 case GL_INVERT:
3101 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00003102 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003103 break;
3104 default:
3105 return error(GL_INVALID_ENUM);
3106 }
3107
3108 switch (zfail)
3109 {
3110 case GL_ZERO:
3111 case GL_KEEP:
3112 case GL_REPLACE:
3113 case GL_INCR:
3114 case GL_DECR:
3115 case GL_INVERT:
3116 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00003117 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003118 break;
3119 default:
3120 return error(GL_INVALID_ENUM);
3121 }
3122
3123 switch (zpass)
3124 {
3125 case GL_ZERO:
3126 case GL_KEEP:
3127 case GL_REPLACE:
3128 case GL_INCR:
3129 case GL_DECR:
3130 case GL_INVERT:
3131 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00003132 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003133 break;
3134 default:
3135 return error(GL_INVALID_ENUM);
3136 }
3137
3138 gl::Context *context = gl::getContext();
3139
3140 if (context)
3141 {
3142 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
3143 {
3144 context->stencilFail = fail;
3145 context->stencilPassDepthFail = zfail;
3146 context->stencilPassDepthPass = zpass;
3147 }
3148
3149 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
3150 {
3151 context->stencilBackFail = fail;
3152 context->stencilBackPassDepthFail = zfail;
3153 context->stencilBackPassDepthPass = zpass;
3154 }
3155 }
3156 }
3157 catch(std::bad_alloc&)
3158 {
3159 return error(GL_OUT_OF_MEMORY);
3160 }
3161}
3162
3163void __stdcall glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void* pixels)
3164{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003165 TRACE("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, GLsizei height = %d, "
3166 "GLint border = %d, GLenum format = 0x%X, GLenum type = 0x%X, const void* pixels = 0x%0.8p)",
3167 target, level, internalformat, width, height, border, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003168
3169 try
3170 {
3171 if (level < 0 || width < 0 || height < 0)
3172 {
3173 return error(GL_INVALID_VALUE);
3174 }
3175
3176 if (level > 0 && (!gl::isPow2(width) || !gl::isPow2(height)))
3177 {
3178 return error(GL_INVALID_VALUE);
3179 }
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00003180
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003181 switch (target)
3182 {
3183 case GL_TEXTURE_2D:
3184 if (width > (gl::MAX_TEXTURE_SIZE >> level) || height > (gl::MAX_TEXTURE_SIZE >> level))
3185 {
3186 return error(GL_INVALID_VALUE);
3187 }
3188 break;
3189 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
3190 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
3191 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
3192 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
3193 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
3194 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
3195 if (!gl::isPow2(width) || !gl::isPow2(height))
3196 {
3197 return error(GL_INVALID_VALUE);
3198 }
3199
3200 if (width > (gl::MAX_CUBE_MAP_TEXTURE_SIZE >> level) || height > (gl::MAX_CUBE_MAP_TEXTURE_SIZE >> level))
3201 {
3202 return error(GL_INVALID_VALUE);
3203 }
3204 break;
3205 default:
3206 return error(GL_INVALID_ENUM);
3207 }
3208
3209 if (internalformat != format)
3210 {
3211 return error(GL_INVALID_OPERATION);
3212 }
3213
3214 switch (internalformat)
3215 {
3216 case GL_ALPHA:
3217 case GL_LUMINANCE:
3218 case GL_LUMINANCE_ALPHA:
3219 switch (type)
3220 {
3221 case GL_UNSIGNED_BYTE:
3222 break;
3223 default:
3224 return error(GL_INVALID_ENUM);
3225 }
3226 break;
3227 case GL_RGB:
3228 switch (type)
3229 {
3230 case GL_UNSIGNED_BYTE:
3231 case GL_UNSIGNED_SHORT_5_6_5:
3232 break;
3233 default:
3234 return error(GL_INVALID_ENUM);
3235 }
3236 break;
3237 case GL_RGBA:
3238 switch (type)
3239 {
3240 case GL_UNSIGNED_BYTE:
3241 case GL_UNSIGNED_SHORT_4_4_4_4:
3242 case GL_UNSIGNED_SHORT_5_5_5_1:
3243 break;
3244 default:
3245 return error(GL_INVALID_ENUM);
3246 }
3247 break;
3248 default:
3249 return error(GL_INVALID_VALUE);
3250 }
3251
3252 if (border != 0)
3253 {
3254 return error(GL_INVALID_VALUE);
3255 }
3256
3257 gl::Context *context = gl::getContext();
3258
3259 if (context)
3260 {
3261 if (target == GL_TEXTURE_2D)
3262 {
3263 gl::Texture2D *texture = context->getTexture2D();
3264
3265 if (!texture)
3266 {
3267 return error(GL_INVALID_OPERATION);
3268 }
3269
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00003270 texture->setImage(level, internalformat, width, height, format, type, context->unpackAlignment, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003271 }
3272 else
3273 {
3274 gl::TextureCubeMap *texture = context->getTextureCubeMap();
3275
3276 if (!texture)
3277 {
3278 return error(GL_INVALID_OPERATION);
3279 }
3280
3281 switch (target)
3282 {
3283 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00003284 texture->setImagePosX(level, internalformat, width, height, format, type, context->unpackAlignment, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003285 break;
3286 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00003287 texture->setImageNegX(level, internalformat, width, height, format, type, context->unpackAlignment, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003288 break;
3289 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00003290 texture->setImagePosY(level, internalformat, width, height, format, type, context->unpackAlignment, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003291 break;
3292 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00003293 texture->setImageNegY(level, internalformat, width, height, format, type, context->unpackAlignment, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003294 break;
3295 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00003296 texture->setImagePosZ(level, internalformat, width, height, format, type, context->unpackAlignment, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003297 break;
3298 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00003299 texture->setImageNegZ(level, internalformat, width, height, format, type, context->unpackAlignment, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003300 break;
3301 default: UNREACHABLE();
3302 }
3303 }
3304 }
3305 }
3306 catch(std::bad_alloc&)
3307 {
3308 return error(GL_OUT_OF_MEMORY);
3309 }
3310}
3311
3312void __stdcall glTexParameterf(GLenum target, GLenum pname, GLfloat param)
3313{
3314 glTexParameteri(target, pname, (GLint)param);
3315}
3316
3317void __stdcall glTexParameterfv(GLenum target, GLenum pname, const GLfloat* params)
3318{
3319 glTexParameteri(target, pname, (GLint)*params);
3320}
3321
3322void __stdcall glTexParameteri(GLenum target, GLenum pname, GLint param)
3323{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003324 TRACE("(GLenum target = 0x%X, GLenum pname = 0x%X, GLfloat param = %f)", target, pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003325
3326 try
3327 {
3328 gl::Context *context = gl::getContext();
3329
3330 if (context)
3331 {
3332 gl::Texture *texture;
3333
3334 switch (target)
3335 {
3336 case GL_TEXTURE_2D:
3337 texture = context->getTexture2D();
3338 break;
3339 case GL_TEXTURE_CUBE_MAP:
3340 texture = context->getTextureCubeMap();
3341 break;
3342 default:
3343 return error(GL_INVALID_ENUM);
3344 }
3345
3346 switch (pname)
3347 {
3348 case GL_TEXTURE_WRAP_S:
3349 if (!texture->setWrapS((GLenum)param))
3350 {
3351 return error(GL_INVALID_ENUM);
3352 }
3353 break;
3354 case GL_TEXTURE_WRAP_T:
3355 if (!texture->setWrapT((GLenum)param))
3356 {
3357 return error(GL_INVALID_ENUM);
3358 }
3359 break;
3360 case GL_TEXTURE_MIN_FILTER:
3361 if (!texture->setMinFilter((GLenum)param))
3362 {
3363 return error(GL_INVALID_ENUM);
3364 }
3365 break;
3366 case GL_TEXTURE_MAG_FILTER:
3367 if (!texture->setMagFilter((GLenum)param))
3368 {
3369 return error(GL_INVALID_ENUM);
3370 }
3371 break;
3372 default:
3373 return error(GL_INVALID_ENUM);
3374 }
3375 }
3376 }
3377 catch(std::bad_alloc&)
3378 {
3379 return error(GL_OUT_OF_MEMORY);
3380 }
3381}
3382
3383void __stdcall glTexParameteriv(GLenum target, GLenum pname, const GLint* params)
3384{
3385 glTexParameteri(target, pname, *params);
3386}
3387
3388void __stdcall glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* pixels)
3389{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003390 TRACE("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
3391 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, GLenum type = 0x%X, "
3392 "const void* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003393 target, level, xoffset, yoffset, width, height, format, type, pixels);
3394
3395 try
3396 {
daniel@transgaming.com00c75962010-03-11 20:36:15 +00003397 if (target != GL_TEXTURE_2D && !es2dx::IsCubemapTextureTarget(target))
3398 {
3399 return error(GL_INVALID_ENUM);
3400 }
3401
3402 if (level < 0 || level > gl::MAX_TEXTURE_LEVELS || xoffset < 0 || yoffset < 0 || width < 0 || height < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003403 {
3404 return error(GL_INVALID_VALUE);
3405 }
3406
daniel@transgaming.com00c75962010-03-11 20:36:15 +00003407 if (std::numeric_limits<GLsizei>::max() - xoffset < width || std::numeric_limits<GLsizei>::max() - yoffset < height)
3408 {
3409 return error(GL_INVALID_VALUE);
3410 }
3411
3412 if (!es2dx::CheckTextureFormatType(format, type))
3413 {
3414 return error(GL_INVALID_ENUM);
3415 }
3416
3417 if (width == 0 || height == 0 || pixels == NULL)
3418 {
3419 return;
3420 }
3421
3422 gl::Context *context = gl::getContext();
3423
3424 if (context)
3425 {
3426 if (target == GL_TEXTURE_2D)
3427 {
3428 gl::Texture2D *texture = context->getTexture2D();
3429
3430 if (!texture)
3431 {
3432 return error(GL_INVALID_OPERATION);
3433 }
3434
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00003435 texture->subImage(level, xoffset, yoffset, width, height, format, type, context->unpackAlignment, pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00003436 }
3437 else if (es2dx::IsCubemapTextureTarget(target))
3438 {
3439 gl::TextureCubeMap *texture = context->getTextureCubeMap();
3440
3441 if (!texture)
3442 {
3443 return error(GL_INVALID_OPERATION);
3444 }
3445
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00003446 texture->subImage(target, level, xoffset, yoffset, width, height, format, type, context->unpackAlignment, pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00003447 }
3448 else
3449 {
3450 UNREACHABLE();
3451 }
3452 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003453 }
3454 catch(std::bad_alloc&)
3455 {
3456 return error(GL_OUT_OF_MEMORY);
3457 }
3458}
3459
3460void __stdcall glUniform1f(GLint location, GLfloat x)
3461{
3462 glUniform1fv(location, 1, &x);
3463}
3464
3465void __stdcall glUniform1fv(GLint location, GLsizei count, const GLfloat* v)
3466{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003467 TRACE("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003468
3469 try
3470 {
3471 if (location == -1)
3472 {
3473 return;
3474 }
3475
3476 if (count < 0)
3477 {
3478 return error(GL_INVALID_VALUE);
3479 }
3480
3481 gl::Context *context = gl::getContext();
3482
3483 if (context)
3484 {
3485 gl::Program *program = context->getCurrentProgram();
3486
3487 if (!program)
3488 {
3489 return error(GL_INVALID_OPERATION);
3490 }
3491
3492 if (!program->setUniform1fv(location, count, v))
3493 {
3494 return error(GL_INVALID_OPERATION);
3495 }
3496 }
3497 }
3498 catch(std::bad_alloc&)
3499 {
3500 return error(GL_OUT_OF_MEMORY);
3501 }
3502}
3503
3504void __stdcall glUniform1i(GLint location, GLint x)
3505{
3506 glUniform1iv(location, 1, &x);
3507}
3508
3509void __stdcall glUniform1iv(GLint location, GLsizei count, const GLint* v)
3510{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003511 TRACE("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003512
3513 try
3514 {
3515 if (count < 0)
3516 {
3517 return error(GL_INVALID_VALUE);
3518 }
3519
3520 gl::Context *context = gl::getContext();
3521
3522 if (context)
3523 {
3524 gl::Program *program = context->getCurrentProgram();
3525
3526 if (!program)
3527 {
3528 return error(GL_INVALID_OPERATION);
3529 }
3530
3531 if (!program->setUniform1iv(location, count, v))
3532 {
3533 return error(GL_INVALID_OPERATION);
3534 }
3535 }
3536 }
3537 catch(std::bad_alloc&)
3538 {
3539 return error(GL_OUT_OF_MEMORY);
3540 }
3541}
3542
3543void __stdcall glUniform2f(GLint location, GLfloat x, GLfloat y)
3544{
3545 GLfloat xy[2] = {x, y};
3546
3547 glUniform2fv(location, 1, (GLfloat*)&xy);
3548}
3549
3550void __stdcall glUniform2fv(GLint location, GLsizei count, const GLfloat* v)
3551{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003552 TRACE("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003553
3554 try
3555 {
3556 if (location == -1)
3557 {
3558 return;
3559 }
3560
3561 if (count < 0)
3562 {
3563 return error(GL_INVALID_VALUE);
3564 }
3565
3566 gl::Context *context = gl::getContext();
3567
3568 if (context)
3569 {
3570 gl::Program *program = context->getCurrentProgram();
3571
3572 if (!program)
3573 {
3574 return error(GL_INVALID_OPERATION);
3575 }
3576
3577 if (!program->setUniform2fv(location, count, v))
3578 {
3579 return error(GL_INVALID_OPERATION);
3580 }
3581 }
3582 }
3583 catch(std::bad_alloc&)
3584 {
3585 return error(GL_OUT_OF_MEMORY);
3586 }
3587}
3588
3589void __stdcall glUniform2i(GLint location, GLint x, GLint y)
3590{
3591 GLint xy[4] = {x, y};
3592
3593 glUniform2iv(location, 1, (GLint*)&xy);
3594}
3595
3596void __stdcall glUniform2iv(GLint location, GLsizei count, const GLint* v)
3597{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003598 TRACE("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003599
3600 try
3601 {
3602 if (count < 0)
3603 {
3604 return error(GL_INVALID_VALUE);
3605 }
3606
3607 UNIMPLEMENTED(); // FIXME
3608 }
3609 catch(std::bad_alloc&)
3610 {
3611 return error(GL_OUT_OF_MEMORY);
3612 }
3613}
3614
3615void __stdcall glUniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
3616{
3617 GLfloat xyz[3] = {x, y, z};
3618
3619 glUniform3fv(location, 1, (GLfloat*)&xyz);
3620}
3621
3622void __stdcall glUniform3fv(GLint location, GLsizei count, const GLfloat* v)
3623{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003624 TRACE("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003625
3626 try
3627 {
3628 if (count < 0)
3629 {
3630 return error(GL_INVALID_VALUE);
3631 }
3632
3633 if (location == -1)
3634 {
3635 return;
3636 }
3637
3638 gl::Context *context = gl::getContext();
3639
3640 if (context)
3641 {
3642 gl::Program *program = context->getCurrentProgram();
3643
3644 if (!program)
3645 {
3646 return error(GL_INVALID_OPERATION);
3647 }
3648
3649 if (!program->setUniform3fv(location, count, v))
3650 {
3651 return error(GL_INVALID_OPERATION);
3652 }
3653 }
3654 }
3655 catch(std::bad_alloc&)
3656 {
3657 return error(GL_OUT_OF_MEMORY);
3658 }
3659}
3660
3661void __stdcall glUniform3i(GLint location, GLint x, GLint y, GLint z)
3662{
3663 GLint xyz[3] = {x, y, z};
3664
3665 glUniform3iv(location, 1, (GLint*)&xyz);
3666}
3667
3668void __stdcall glUniform3iv(GLint location, GLsizei count, const GLint* v)
3669{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003670 TRACE("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003671
3672 try
3673 {
3674 if (count < 0)
3675 {
3676 return error(GL_INVALID_VALUE);
3677 }
3678
3679 UNIMPLEMENTED(); // FIXME
3680 }
3681 catch(std::bad_alloc&)
3682 {
3683 return error(GL_OUT_OF_MEMORY);
3684 }
3685}
3686
3687void __stdcall glUniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
3688{
3689 GLfloat xyzw[4] = {x, y, z, w};
3690
3691 glUniform4fv(location, 1, (GLfloat*)&xyzw);
3692}
3693
3694void __stdcall glUniform4fv(GLint location, GLsizei count, const GLfloat* v)
3695{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003696 TRACE("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003697
3698 try
3699 {
3700 if (count < 0)
3701 {
3702 return error(GL_INVALID_VALUE);
3703 }
3704
3705 if (location == -1)
3706 {
3707 return;
3708 }
3709
3710 gl::Context *context = gl::getContext();
3711
3712 if (context)
3713 {
3714 gl::Program *program = context->getCurrentProgram();
3715
3716 if (!program)
3717 {
3718 return error(GL_INVALID_OPERATION);
3719 }
3720
3721 if (!program->setUniform4fv(location, count, v))
3722 {
3723 return error(GL_INVALID_OPERATION);
3724 }
3725 }
3726 }
3727 catch(std::bad_alloc&)
3728 {
3729 return error(GL_OUT_OF_MEMORY);
3730 }
3731}
3732
3733void __stdcall glUniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
3734{
3735 GLint xyzw[4] = {x, y, z, w};
3736
3737 glUniform4iv(location, 1, (GLint*)&xyzw);
3738}
3739
3740void __stdcall glUniform4iv(GLint location, GLsizei count, const GLint* v)
3741{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003742 TRACE("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003743
3744 try
3745 {
3746 if (count < 0)
3747 {
3748 return error(GL_INVALID_VALUE);
3749 }
3750
3751 UNIMPLEMENTED(); // FIXME
3752 }
3753 catch(std::bad_alloc&)
3754 {
3755 return error(GL_OUT_OF_MEMORY);
3756 }
3757}
3758
3759void __stdcall glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
3760{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003761 TRACE("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %d, const GLfloat* value = 0x%0.8p)",
3762 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003763
3764 try
3765 {
3766 if (count < 0 || transpose != GL_FALSE)
3767 {
3768 return error(GL_INVALID_VALUE);
3769 }
3770
3771 if (location == -1)
3772 {
3773 return;
3774 }
3775
3776 gl::Context *context = gl::getContext();
3777
3778 if (context)
3779 {
3780 gl::Program *program = context->getCurrentProgram();
3781
3782 if (!program)
3783 {
3784 return error(GL_INVALID_OPERATION);
3785 }
3786
3787 if (!program->setUniformMatrix2fv(location, count, value))
3788 {
3789 return error(GL_INVALID_OPERATION);
3790 }
3791 }
3792 }
3793 catch(std::bad_alloc&)
3794 {
3795 return error(GL_OUT_OF_MEMORY);
3796 }
3797}
3798
3799void __stdcall glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
3800{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003801 TRACE("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %d, const GLfloat* value = 0x%0.8p)",
3802 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003803
3804 try
3805 {
3806 if (count < 0 || transpose != GL_FALSE)
3807 {
3808 return error(GL_INVALID_VALUE);
3809 }
3810
3811 if (location == -1)
3812 {
3813 return;
3814 }
3815
3816 gl::Context *context = gl::getContext();
3817
3818 if (context)
3819 {
3820 gl::Program *program = context->getCurrentProgram();
3821
3822 if (!program)
3823 {
3824 return error(GL_INVALID_OPERATION);
3825 }
3826
3827 if (!program->setUniformMatrix3fv(location, count, value))
3828 {
3829 return error(GL_INVALID_OPERATION);
3830 }
3831 }
3832 }
3833 catch(std::bad_alloc&)
3834 {
3835 return error(GL_OUT_OF_MEMORY);
3836 }
3837}
3838
3839void __stdcall glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
3840{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003841 TRACE("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %d, const GLfloat* value = 0x%0.8p)",
3842 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003843
3844 try
3845 {
3846 if (count < 0 || transpose != GL_FALSE)
3847 {
3848 return error(GL_INVALID_VALUE);
3849 }
3850
3851 if (location == -1)
3852 {
3853 return;
3854 }
3855
3856 gl::Context *context = gl::getContext();
3857
3858 if (context)
3859 {
3860 gl::Program *program = context->getCurrentProgram();
3861
3862 if (!program)
3863 {
3864 return error(GL_INVALID_OPERATION);
3865 }
3866
3867 if (!program->setUniformMatrix4fv(location, count, value))
3868 {
3869 return error(GL_INVALID_OPERATION);
3870 }
3871 }
3872 }
3873 catch(std::bad_alloc&)
3874 {
3875 return error(GL_OUT_OF_MEMORY);
3876 }
3877}
3878
3879void __stdcall glUseProgram(GLuint program)
3880{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003881 TRACE("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003882
3883 try
3884 {
3885 gl::Context *context = gl::getContext();
3886
3887 if (context)
3888 {
3889 gl::Program *programObject = context->getProgram(program);
3890
3891 if (programObject && !programObject->isLinked())
3892 {
3893 return error(GL_INVALID_OPERATION);
3894 }
3895
3896 context->useProgram(program);
3897 }
3898 }
3899 catch(std::bad_alloc&)
3900 {
3901 return error(GL_OUT_OF_MEMORY);
3902 }
3903}
3904
3905void __stdcall glValidateProgram(GLuint program)
3906{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003907 TRACE("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003908
3909 try
3910 {
3911 UNIMPLEMENTED(); // FIXME
3912 }
3913 catch(std::bad_alloc&)
3914 {
3915 return error(GL_OUT_OF_MEMORY);
3916 }
3917}
3918
3919void __stdcall glVertexAttrib1f(GLuint index, GLfloat x)
3920{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003921 TRACE("(GLuint index = %d, GLfloat x = %f)", index, x);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003922
3923 try
3924 {
3925 if (index >= gl::MAX_VERTEX_ATTRIBS)
3926 {
3927 return error(GL_INVALID_VALUE);
3928 }
3929
3930 UNIMPLEMENTED(); // FIXME
3931 }
3932 catch(std::bad_alloc&)
3933 {
3934 return error(GL_OUT_OF_MEMORY);
3935 }
3936}
3937
3938void __stdcall glVertexAttrib1fv(GLuint index, const GLfloat* values)
3939{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003940 TRACE("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003941
3942 try
3943 {
3944 if (index >= gl::MAX_VERTEX_ATTRIBS)
3945 {
3946 return error(GL_INVALID_VALUE);
3947 }
3948
3949 UNIMPLEMENTED(); // FIXME
3950 }
3951 catch(std::bad_alloc&)
3952 {
3953 return error(GL_OUT_OF_MEMORY);
3954 }
3955}
3956
3957void __stdcall glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
3958{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003959 TRACE("(GLuint index = %d, GLfloat x = %f, GLfloat y = %f)", index, x, y);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003960
3961 try
3962 {
3963 if (index >= gl::MAX_VERTEX_ATTRIBS)
3964 {
3965 return error(GL_INVALID_VALUE);
3966 }
3967
3968 UNIMPLEMENTED(); // FIXME
3969 }
3970 catch(std::bad_alloc&)
3971 {
3972 return error(GL_OUT_OF_MEMORY);
3973 }
3974}
3975
3976void __stdcall glVertexAttrib2fv(GLuint index, const GLfloat* values)
3977{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003978 TRACE("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003979
3980 try
3981 {
3982 if (index >= gl::MAX_VERTEX_ATTRIBS)
3983 {
3984 return error(GL_INVALID_VALUE);
3985 }
3986
3987 UNIMPLEMENTED(); // FIXME
3988 }
3989 catch(std::bad_alloc&)
3990 {
3991 return error(GL_OUT_OF_MEMORY);
3992 }
3993}
3994
3995void __stdcall glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
3996{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003997 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 +00003998
3999 try
4000 {
4001 if (index >= gl::MAX_VERTEX_ATTRIBS)
4002 {
4003 return error(GL_INVALID_VALUE);
4004 }
4005
4006 UNIMPLEMENTED(); // FIXME
4007 }
4008 catch(std::bad_alloc&)
4009 {
4010 return error(GL_OUT_OF_MEMORY);
4011 }
4012}
4013
4014void __stdcall glVertexAttrib3fv(GLuint index, const GLfloat* values)
4015{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004016 TRACE("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004017
4018 try
4019 {
4020 if (index >= gl::MAX_VERTEX_ATTRIBS)
4021 {
4022 return error(GL_INVALID_VALUE);
4023 }
4024
4025 UNIMPLEMENTED(); // FIXME
4026 }
4027 catch(std::bad_alloc&)
4028 {
4029 return error(GL_OUT_OF_MEMORY);
4030 }
4031}
4032
4033void __stdcall glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
4034{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004035 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 +00004036
4037 try
4038 {
4039 if (index >= gl::MAX_VERTEX_ATTRIBS)
4040 {
4041 return error(GL_INVALID_VALUE);
4042 }
4043
4044 UNIMPLEMENTED(); // FIXME
4045 }
4046 catch(std::bad_alloc&)
4047 {
4048 return error(GL_OUT_OF_MEMORY);
4049 }
4050}
4051
4052void __stdcall glVertexAttrib4fv(GLuint index, const GLfloat* values)
4053{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004054 TRACE("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004055
4056 try
4057 {
4058 if (index >= gl::MAX_VERTEX_ATTRIBS)
4059 {
4060 return error(GL_INVALID_VALUE);
4061 }
4062
4063 UNIMPLEMENTED(); // FIXME
4064 }
4065 catch(std::bad_alloc&)
4066 {
4067 return error(GL_OUT_OF_MEMORY);
4068 }
4069}
4070
4071void __stdcall glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void* ptr)
4072{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004073 TRACE("(GLuint index = %d, GLint size = %d, GLenum type = 0x%X, "
4074 "GLboolean normalized = %d, GLsizei stride = %d, const void* ptr = 0x%0.8p)",
4075 index, size, type, normalized, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004076
4077 try
4078 {
4079 if (index >= gl::MAX_VERTEX_ATTRIBS)
4080 {
4081 return error(GL_INVALID_VALUE);
4082 }
4083
4084 if (size < 1 || size > 4)
4085 {
4086 return error(GL_INVALID_VALUE);
4087 }
4088
4089 switch (type)
4090 {
4091 case GL_BYTE:
4092 case GL_UNSIGNED_BYTE:
4093 case GL_SHORT:
4094 case GL_UNSIGNED_SHORT:
4095 case GL_FIXED:
4096 case GL_FLOAT:
4097 break;
4098 default:
4099 return error(GL_INVALID_ENUM);
4100 }
4101
4102 if (stride < 0)
4103 {
4104 return error(GL_INVALID_VALUE);
4105 }
4106
4107 gl::Context *context = gl::getContext();
4108
4109 if (context)
4110 {
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +00004111 context->vertexAttribute[index].mBoundBuffer = context->arrayBuffer;
4112 context->vertexAttribute[index].mSize = size;
4113 context->vertexAttribute[index].mType = type;
daniel@transgaming.comb994e3b2010-03-26 04:08:50 +00004114 context->vertexAttribute[index].mNormalized = (normalized == GL_TRUE);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +00004115 context->vertexAttribute[index].mStride = stride;
4116 context->vertexAttribute[index].mPointer = ptr;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004117 }
4118 }
4119 catch(std::bad_alloc&)
4120 {
4121 return error(GL_OUT_OF_MEMORY);
4122 }
4123}
4124
4125void __stdcall glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
4126{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004127 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 +00004128
4129 try
4130 {
4131 if (width < 0 || height < 0)
4132 {
4133 return error(GL_INVALID_VALUE);
4134 }
4135
4136 gl::Context *context = gl::getContext();
4137
4138 if (context)
4139 {
4140 context->viewportX = x;
4141 context->viewportY = y;
4142 context->viewportWidth = width;
4143 context->viewportHeight = height;
4144 }
4145 }
4146 catch(std::bad_alloc&)
4147 {
4148 return error(GL_OUT_OF_MEMORY);
4149 }
4150}
4151
4152void __stdcall glTexImage3DOES(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void* pixels)
4153{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004154 TRACE("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
4155 "GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, GLint border = %d, "
4156 "GLenum format = 0x%X, GLenum type = 0x%x, const void* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004157 target, level, internalformat, width, height, depth, border, format, type, pixels);
4158
4159 try
4160 {
4161 UNIMPLEMENTED(); // FIXME
4162 }
4163 catch(std::bad_alloc&)
4164 {
4165 return error(GL_OUT_OF_MEMORY);
4166 }
4167}
4168}