blob: c03cfbac84b6a677f33f4860403ae73989abf082 [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 {
1724 switch (pname)
1725 {
1726 case GL_SHADER_COMPILER: *params = GL_TRUE; break;
1727 default:
1728 UNIMPLEMENTED(); // FIXME
1729 return error(GL_INVALID_ENUM);
1730 }
1731 }
1732 catch(std::bad_alloc&)
1733 {
1734 return error(GL_OUT_OF_MEMORY);
1735 }
1736}
1737
1738void __stdcall glGetBufferParameteriv(GLenum target, GLenum pname, GLint* params)
1739{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001740 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 +00001741
1742 try
1743 {
1744 UNIMPLEMENTED(); // FIXME
1745 }
1746 catch(std::bad_alloc&)
1747 {
1748 return error(GL_OUT_OF_MEMORY);
1749 }
1750}
1751
1752GLenum __stdcall glGetError(void)
1753{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001754 TRACE("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001755
1756 gl::Context *context = gl::getContext();
1757
1758 if (context)
1759 {
1760 return context->getError();
1761 }
1762
1763 return GL_NO_ERROR;
1764}
1765
1766void __stdcall glGetFloatv(GLenum pname, GLfloat* params)
1767{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001768 TRACE("(GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001769
1770 try
1771 {
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00001772 gl::Context *context = gl::getContext();
1773
1774 if (context)
1775 {
1776 switch (pname)
1777 {
daniel@transgaming.comccad59f2010-03-26 04:08:39 +00001778 case GL_LINE_WIDTH:
1779 *params = context->lineWidth;
1780 break;
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00001781 case GL_ALIASED_LINE_WIDTH_RANGE:
daniel@transgaming.comd989add2010-03-26 04:08:42 +00001782 params[0] = gl::ALIASED_LINE_WIDTH_RANGE_MIN;
1783 params[1] = gl::ALIASED_LINE_WIDTH_RANGE_MAX;
1784 break;
1785 case GL_ALIASED_POINT_SIZE_RANGE:
daniel@transgaming.comccad59f2010-03-26 04:08:39 +00001786 params[0] = gl::ALIASED_POINT_SIZE_RANGE_MIN;
1787 params[1] = gl::ALIASED_POINT_SIZE_RANGE_MAX;
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00001788 break;
1789 default:
1790 UNIMPLEMENTED(); // FIXME
1791 return error(GL_INVALID_ENUM);
1792 }
1793 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001794 }
1795 catch(std::bad_alloc&)
1796 {
1797 return error(GL_OUT_OF_MEMORY);
1798 }
1799}
1800
1801void __stdcall glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params)
1802{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001803 TRACE("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
1804 target, attachment, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001805
1806 try
1807 {
1808 gl::Context *context = gl::getContext();
1809
1810 if (context)
1811 {
1812 if (context->framebuffer == 0)
1813 {
1814 return error(GL_INVALID_OPERATION);
1815 }
1816
1817 UNIMPLEMENTED(); // FIXME
1818 }
1819 }
1820 catch(std::bad_alloc&)
1821 {
1822 return error(GL_OUT_OF_MEMORY);
1823 }
1824}
1825
1826void __stdcall glGetIntegerv(GLenum pname, GLint* params)
1827{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001828 TRACE("(GLenum pname = 0x%X, GLint* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001829
1830 try
1831 {
1832 gl::Context *context = gl::getContext();
1833
1834 if (context)
1835 {
1836 switch (pname)
1837 {
1838 case GL_MAX_VERTEX_ATTRIBS: *params = gl::MAX_VERTEX_ATTRIBS; break;
1839 case GL_MAX_VERTEX_UNIFORM_VECTORS: *params = gl::MAX_VERTEX_UNIFORM_VECTORS; break;
1840 case GL_MAX_VARYING_VECTORS: *params = gl::MAX_VARYING_VECTORS; break;
1841 case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS: *params = gl::MAX_COMBINED_TEXTURE_IMAGE_UNITS; break;
1842 case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS: *params = gl::MAX_VERTEX_TEXTURE_IMAGE_UNITS; break;
1843 case GL_MAX_TEXTURE_IMAGE_UNITS: *params = gl::MAX_TEXTURE_IMAGE_UNITS; break;
1844 case GL_MAX_FRAGMENT_UNIFORM_VECTORS: *params = gl::MAX_FRAGMENT_UNIFORM_VECTORS; break;
1845 case GL_MAX_RENDERBUFFER_SIZE: *params = gl::MAX_RENDERBUFFER_SIZE; break;
1846 case GL_NUM_SHADER_BINARY_FORMATS: *params = 0; break;
daniel@transgaming.com41430492010-03-11 20:36:18 +00001847 case GL_NUM_COMPRESSED_TEXTURE_FORMATS: *params = 0; break;
1848 case GL_COMPRESSED_TEXTURE_FORMATS: /* no compressed texture formats are supported */ break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001849 case GL_ARRAY_BUFFER_BINDING: *params = context->arrayBuffer; break;
1850 case GL_FRAMEBUFFER_BINDING: *params = context->framebuffer; break;
1851 case GL_RENDERBUFFER_BINDING: *params = context->renderbuffer; break;
1852 case GL_CURRENT_PROGRAM: *params = context->currentProgram; break;
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00001853 case GL_PACK_ALIGNMENT: *params = context->packAlignment; break;
1854 case GL_UNPACK_ALIGNMENT: *params = context->unpackAlignment; break;
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00001855 case GL_GENERATE_MIPMAP_HINT: *params = context->generateMipmapHint; break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001856 case GL_RED_BITS:
1857 case GL_GREEN_BITS:
1858 case GL_BLUE_BITS:
1859 case GL_ALPHA_BITS:
1860 {
1861 gl::Framebuffer *framebuffer = context->getFramebuffer();
1862 gl::Colorbuffer *colorbuffer = framebuffer->getColorbuffer();
1863
1864 if (colorbuffer)
1865 {
1866 switch (pname)
1867 {
1868 case GL_RED_BITS: *params = colorbuffer->getRedSize(); break;
1869 case GL_GREEN_BITS: *params = colorbuffer->getGreenSize(); break;
1870 case GL_BLUE_BITS: *params = colorbuffer->getBlueSize(); break;
1871 case GL_ALPHA_BITS: *params = colorbuffer->getAlphaSize(); break;
1872 }
1873 }
1874 else
1875 {
1876 *params = 0;
1877 }
1878 }
1879 break;
1880 case GL_DEPTH_BITS:
1881 {
1882 gl::Framebuffer *framebuffer = context->getFramebuffer();
1883 gl::Depthbuffer *depthbuffer = framebuffer->getDepthbuffer();
1884
1885 if (depthbuffer)
1886 {
1887 *params = depthbuffer->getDepthSize();
1888 }
1889 else
1890 {
1891 *params = 0;
1892 }
1893 }
1894 break;
1895 case GL_STENCIL_BITS:
1896 {
1897 gl::Framebuffer *framebuffer = context->getFramebuffer();
1898 gl::Stencilbuffer *stencilbuffer = framebuffer->getStencilbuffer();
1899
1900 if (stencilbuffer)
1901 {
1902 *params = stencilbuffer->getStencilSize();
1903 }
1904 else
1905 {
1906 *params = 0;
1907 }
1908 }
1909 break;
1910 default:
1911 UNIMPLEMENTED(); // FIXME
1912 return error(GL_INVALID_ENUM);
1913 }
1914 }
1915 }
1916 catch(std::bad_alloc&)
1917 {
1918 return error(GL_OUT_OF_MEMORY);
1919 }
1920}
1921
1922void __stdcall glGetProgramiv(GLuint program, GLenum pname, GLint* params)
1923{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001924 TRACE("(GLuint program = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", program, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001925
1926 try
1927 {
1928 gl::Context *context = gl::getContext();
1929
1930 if (context)
1931 {
1932 gl::Program *programObject = context->getProgram(program);
1933
1934 if (!programObject)
1935 {
1936 return error(GL_INVALID_VALUE);
1937 }
1938
1939 switch (pname)
1940 {
1941 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00001942 *params = programObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001943 return;
1944 case GL_LINK_STATUS:
1945 *params = programObject->isLinked();
1946 return;
1947 case GL_VALIDATE_STATUS:
1948 UNIMPLEMENTED(); // FIXME
1949 *params = GL_TRUE;
1950 return;
1951 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00001952 *params = programObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001953 return;
1954 case GL_ATTACHED_SHADERS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00001955 *params = programObject->getAttachedShadersCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001956 return;
1957 case GL_ACTIVE_ATTRIBUTES:
1958 UNIMPLEMENTED(); // FIXME
1959 *params = 0;
1960 return;
1961 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
1962 UNIMPLEMENTED(); // FIXME
1963 *params = 0;
1964 return;
1965 case GL_ACTIVE_UNIFORMS:
1966 UNIMPLEMENTED(); // FIXME
1967 *params = 0;
1968 return;
1969 case GL_ACTIVE_UNIFORM_MAX_LENGTH:
1970 UNIMPLEMENTED(); // FIXME
1971 *params = 0;
1972 return;
1973 default:
1974 return error(GL_INVALID_ENUM);
1975 }
1976 }
1977 }
1978 catch(std::bad_alloc&)
1979 {
1980 return error(GL_OUT_OF_MEMORY);
1981 }
1982}
1983
1984void __stdcall glGetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, char* infolog)
1985{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001986 TRACE("(GLuint program = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, char* infolog = 0x%0.8p)",
1987 program, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001988
1989 try
1990 {
1991 if (bufsize < 0)
1992 {
1993 return error(GL_INVALID_VALUE);
1994 }
1995
daniel@transgaming.comcba50572010-03-28 19:36:09 +00001996 gl::Context *context = gl::getContext();
1997
1998 if (context)
1999 {
2000 gl::Program *programObject = context->getProgram(program);
2001
2002 if (!programObject)
2003 {
2004 return error(GL_INVALID_VALUE);
2005 }
2006
2007 programObject->getInfoLog(bufsize, length, infolog);
2008 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002009 }
2010 catch(std::bad_alloc&)
2011 {
2012 return error(GL_OUT_OF_MEMORY);
2013 }
2014}
2015
2016void __stdcall glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params)
2017{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002018 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 +00002019
2020 try
2021 {
2022 UNIMPLEMENTED(); // FIXME
2023 }
2024 catch(std::bad_alloc&)
2025 {
2026 return error(GL_OUT_OF_MEMORY);
2027 }
2028}
2029
2030void __stdcall glGetShaderiv(GLuint shader, GLenum pname, GLint* params)
2031{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002032 TRACE("(GLuint shader = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", shader, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002033
2034 try
2035 {
2036 gl::Context *context = gl::getContext();
2037
2038 if (context)
2039 {
2040 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00002041
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002042 if (!shaderObject)
2043 {
2044 return error(GL_INVALID_VALUE);
2045 }
2046
2047 switch (pname)
2048 {
2049 case GL_SHADER_TYPE:
2050 *params = shaderObject->getType();
2051 return;
2052 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00002053 *params = shaderObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002054 return;
2055 case GL_COMPILE_STATUS:
2056 *params = shaderObject->isCompiled() ? GL_TRUE : GL_FALSE;
2057 return;
2058 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00002059 *params = shaderObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002060 return;
2061 case GL_SHADER_SOURCE_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00002062 *params = shaderObject->getSourceLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002063 return;
2064 default:
2065 return error(GL_INVALID_ENUM);
2066 }
2067 }
2068 }
2069 catch(std::bad_alloc&)
2070 {
2071 return error(GL_OUT_OF_MEMORY);
2072 }
2073}
2074
2075void __stdcall glGetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, char* infolog)
2076{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002077 TRACE("(GLuint shader = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, char* infolog = 0x%0.8p)",
2078 shader, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002079
2080 try
2081 {
2082 if (bufsize < 0)
2083 {
2084 return error(GL_INVALID_VALUE);
2085 }
2086
daniel@transgaming.comcba50572010-03-28 19:36:09 +00002087 gl::Context *context = gl::getContext();
2088
2089 if (context)
2090 {
2091 gl::Shader *shaderObject = context->getShader(shader);
2092
2093 if (!shaderObject)
2094 {
2095 return error(GL_INVALID_VALUE);
2096 }
2097
2098 shaderObject->getInfoLog(bufsize, length, infolog);
2099 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002100 }
2101 catch(std::bad_alloc&)
2102 {
2103 return error(GL_OUT_OF_MEMORY);
2104 }
2105}
2106
2107void __stdcall glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision)
2108{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002109 TRACE("(GLenum shadertype = 0x%X, GLenum precisiontype = 0x%X, GLint* range = 0x%0.8p, GLint* precision = 0x%0.8p)",
2110 shadertype, precisiontype, range, precision);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002111
2112 try
2113 {
daniel@transgaming.com6c785212010-03-30 03:36:17 +00002114 switch (shadertype)
2115 {
2116 case GL_VERTEX_SHADER:
2117 case GL_FRAGMENT_SHADER:
2118 break;
2119 default:
2120 return error(GL_INVALID_ENUM);
2121 }
2122
2123 switch (precisiontype)
2124 {
2125 case GL_LOW_FLOAT:
2126 case GL_MEDIUM_FLOAT:
2127 case GL_HIGH_FLOAT:
2128 // Assume IEEE 754 precision
2129 range[0] = 127;
2130 range[1] = 127;
2131 precision[0] = 23;
2132 precision[1] = 23;
2133 break;
2134 case GL_LOW_INT:
2135 case GL_MEDIUM_INT:
2136 case GL_HIGH_INT:
2137 // Some (most) hardware only supports single-precision floating-point numbers,
2138 // which can accurately represent integers up to +/-16777216
2139 range[0] = 24;
2140 range[1] = 24;
2141 precision[0] = 0;
2142 precision[1] = 0;
2143 break;
2144 default:
2145 return error(GL_INVALID_ENUM);
2146 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002147 }
2148 catch(std::bad_alloc&)
2149 {
2150 return error(GL_OUT_OF_MEMORY);
2151 }
2152}
2153
2154void __stdcall glGetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, char* source)
2155{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002156 TRACE("(GLuint shader = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, char* source = 0x%0.8p)",
2157 shader, bufsize, length, source);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002158
2159 try
2160 {
2161 if (bufsize < 0)
2162 {
2163 return error(GL_INVALID_VALUE);
2164 }
2165
daniel@transgaming.comcba50572010-03-28 19:36:09 +00002166 gl::Context *context = gl::getContext();
2167
2168 if (context)
2169 {
2170 gl::Shader *shaderObject = context->getShader(shader);
2171
2172 if (!shaderObject)
2173 {
daniel@transgaming.com41187f12010-04-01 13:39:29 +00002174 return error(GL_INVALID_OPERATION);
daniel@transgaming.comcba50572010-03-28 19:36:09 +00002175 }
2176
2177 shaderObject->getSource(bufsize, length, source);
2178 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002179 }
2180 catch(std::bad_alloc&)
2181 {
2182 return error(GL_OUT_OF_MEMORY);
2183 }
2184}
2185
2186const GLubyte* __stdcall glGetString(GLenum name)
2187{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002188 TRACE("(GLenum name = 0x%X)", name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002189
2190 try
2191 {
2192 switch (name)
2193 {
2194 case GL_VENDOR:
2195 return (GLubyte*)"TransGaming Inc.";
2196 case GL_RENDERER:
2197 return (GLubyte*)"ANGLE";
2198 case GL_VERSION:
2199 return (GLubyte*)"OpenGL ES 2.0 (git-devel "__DATE__ " " __TIME__")";
2200 case GL_SHADING_LANGUAGE_VERSION:
2201 return (GLubyte*)"OpenGL ES GLSL ES 1.00 (git-devel "__DATE__ " " __TIME__")";
2202 case GL_EXTENSIONS:
2203 return (GLubyte*)"";
2204 default:
2205 return error(GL_INVALID_ENUM, (GLubyte*)NULL);
2206 }
2207 }
2208 catch(std::bad_alloc&)
2209 {
2210 return error(GL_OUT_OF_MEMORY, (GLubyte*)NULL);
2211 }
2212
2213 return NULL;
2214}
2215
2216void __stdcall glGetTexParameterfv(GLenum target, GLenum pname, GLfloat* params)
2217{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002218 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 +00002219
2220 try
2221 {
2222 UNIMPLEMENTED(); // FIXME
2223 }
2224 catch(std::bad_alloc&)
2225 {
2226 return error(GL_OUT_OF_MEMORY);
2227 }
2228}
2229
2230void __stdcall glGetTexParameteriv(GLenum target, GLenum pname, GLint* params)
2231{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002232 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 +00002233
2234 try
2235 {
2236 UNIMPLEMENTED(); // FIXME
2237 }
2238 catch(std::bad_alloc&)
2239 {
2240 return error(GL_OUT_OF_MEMORY);
2241 }
2242}
2243
2244void __stdcall glGetUniformfv(GLuint program, GLint location, GLfloat* params)
2245{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002246 TRACE("(GLuint program = %d, GLint location = %d, GLfloat* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002247
2248 try
2249 {
2250 UNIMPLEMENTED(); // FIXME
2251 }
2252 catch(std::bad_alloc&)
2253 {
2254 return error(GL_OUT_OF_MEMORY);
2255 }
2256}
2257
2258void __stdcall glGetUniformiv(GLuint program, GLint location, GLint* params)
2259{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002260 TRACE("(GLuint program = %d, GLint location = %d, GLint* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002261
2262 try
2263 {
2264 UNIMPLEMENTED(); // FIXME
2265 }
2266 catch(std::bad_alloc&)
2267 {
2268 return error(GL_OUT_OF_MEMORY);
2269 }
2270}
2271
2272int __stdcall glGetUniformLocation(GLuint program, const char* name)
2273{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002274 TRACE("(GLuint program = %d, const char* name = 0x%0.8p)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002275
2276 try
2277 {
2278 gl::Context *context = gl::getContext();
2279
2280 if (strstr(name, "gl_") == name)
2281 {
2282 return -1;
2283 }
2284
2285 if (context)
2286 {
2287 gl::Program *programObject = context->getProgram(program);
2288
2289 if (!programObject)
2290 {
2291 return error(GL_INVALID_VALUE, -1);
2292 }
2293
2294 if (!programObject->isLinked())
2295 {
2296 return error(GL_INVALID_OPERATION, -1);
2297 }
2298
2299 return programObject->getUniformLocation(name);
2300 }
2301 }
2302 catch(std::bad_alloc&)
2303 {
2304 return error(GL_OUT_OF_MEMORY, -1);
2305 }
2306
2307 return -1;
2308}
2309
2310void __stdcall glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params)
2311{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002312 TRACE("(GLuint index = %d, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002313
2314 try
2315 {
2316 if (index >= gl::MAX_VERTEX_ATTRIBS)
2317 {
2318 return error(GL_INVALID_VALUE);
2319 }
2320
2321 UNIMPLEMENTED(); // FIXME
2322 }
2323 catch(std::bad_alloc&)
2324 {
2325 return error(GL_OUT_OF_MEMORY);
2326 }
2327}
2328
2329void __stdcall glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params)
2330{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002331 TRACE("(GLuint index = %d, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002332
2333 try
2334 {
2335 if (index >= gl::MAX_VERTEX_ATTRIBS)
2336 {
2337 return error(GL_INVALID_VALUE);
2338 }
2339
2340 UNIMPLEMENTED(); // FIXME
2341 }
2342 catch(std::bad_alloc&)
2343 {
2344 return error(GL_OUT_OF_MEMORY);
2345 }
2346}
2347
2348void __stdcall glGetVertexAttribPointerv(GLuint index, GLenum pname, void** pointer)
2349{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002350 TRACE("(GLuint index = %d, GLenum pname = 0x%X, void** pointer = 0x%0.8p)", index, pname, pointer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002351
2352 try
2353 {
2354 if (index >= gl::MAX_VERTEX_ATTRIBS)
2355 {
2356 return error(GL_INVALID_VALUE);
2357 }
2358
2359 UNIMPLEMENTED(); // FIXME
2360 }
2361 catch(std::bad_alloc&)
2362 {
2363 return error(GL_OUT_OF_MEMORY);
2364 }
2365}
2366
2367void __stdcall glHint(GLenum target, GLenum mode)
2368{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002369 TRACE("(GLenum target = 0x%X, GLenum mode = 0x%X)", target, mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002370
2371 try
2372 {
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00002373 switch (target)
2374 {
2375 case GL_GENERATE_MIPMAP_HINT:
2376 switch (mode)
2377 {
2378 case GL_FASTEST:
2379 case GL_NICEST:
2380 case GL_DONT_CARE:
2381 break;
2382 default:
2383 return error(GL_INVALID_ENUM);
2384 }
2385 break;
2386 default:
2387 return error(GL_INVALID_ENUM);
2388 }
2389
2390 gl::Context *context = gl::getContext();
2391 if (context)
2392 {
2393 if (target == GL_GENERATE_MIPMAP_HINT)
2394 context->generateMipmapHint = mode;
2395 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002396 }
2397 catch(std::bad_alloc&)
2398 {
2399 return error(GL_OUT_OF_MEMORY);
2400 }
2401}
2402
2403GLboolean __stdcall glIsBuffer(GLuint buffer)
2404{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002405 TRACE("(GLuint buffer = %d)", buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002406
2407 try
2408 {
2409 gl::Context *context = gl::getContext();
2410
2411 if (context && buffer)
2412 {
2413 gl::Buffer *bufferObject = context->getBuffer(buffer);
2414
2415 if (bufferObject)
2416 {
2417 return GL_TRUE;
2418 }
2419 }
2420 }
2421 catch(std::bad_alloc&)
2422 {
2423 return error(GL_OUT_OF_MEMORY, GL_FALSE);
2424 }
2425
2426 return GL_FALSE;
2427}
2428
2429GLboolean __stdcall glIsEnabled(GLenum cap)
2430{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002431 TRACE("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002432
2433 try
2434 {
2435 gl::Context *context = gl::getContext();
2436
2437 if (context)
2438 {
2439 switch (cap)
2440 {
2441 case GL_CULL_FACE: return context->cullFace;
2442 case GL_POLYGON_OFFSET_FILL: return context->polygonOffsetFill;
2443 case GL_SAMPLE_ALPHA_TO_COVERAGE: return context->sampleAlphaToCoverage;
2444 case GL_SAMPLE_COVERAGE: return context->sampleCoverage;
2445 case GL_SCISSOR_TEST: return context->scissorTest;
2446 case GL_STENCIL_TEST: return context->stencilTest;
2447 case GL_DEPTH_TEST: return context->depthTest;
2448 case GL_BLEND: return context->blend;
2449 case GL_DITHER: return context->dither;
2450 default:
2451 return error(GL_INVALID_ENUM, false);
2452 }
2453 }
2454 }
2455 catch(std::bad_alloc&)
2456 {
2457 return error(GL_OUT_OF_MEMORY, false);
2458 }
2459
2460 return false;
2461}
2462
2463GLboolean __stdcall glIsFramebuffer(GLuint framebuffer)
2464{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002465 TRACE("(GLuint framebuffer = %d)", framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002466
2467 try
2468 {
2469 gl::Context *context = gl::getContext();
2470
2471 if (context && framebuffer)
2472 {
2473 gl::Framebuffer *framebufferObject = context->getFramebuffer(framebuffer);
2474
2475 if (framebufferObject)
2476 {
2477 return GL_TRUE;
2478 }
2479 }
2480 }
2481 catch(std::bad_alloc&)
2482 {
2483 return error(GL_OUT_OF_MEMORY, GL_FALSE);
2484 }
2485
2486 return GL_FALSE;
2487}
2488
2489GLboolean __stdcall glIsProgram(GLuint program)
2490{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002491 TRACE("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002492
2493 try
2494 {
2495 gl::Context *context = gl::getContext();
2496
2497 if (context && program)
2498 {
2499 gl::Program *programObject = context->getProgram(program);
2500
2501 if (programObject)
2502 {
2503 return GL_TRUE;
2504 }
2505 }
2506 }
2507 catch(std::bad_alloc&)
2508 {
2509 return error(GL_OUT_OF_MEMORY, GL_FALSE);
2510 }
2511
2512 return GL_FALSE;
2513}
2514
2515GLboolean __stdcall glIsRenderbuffer(GLuint renderbuffer)
2516{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002517 TRACE("(GLuint renderbuffer = %d)", renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002518
2519 try
2520 {
2521 gl::Context *context = gl::getContext();
2522
2523 if (context && renderbuffer)
2524 {
2525 gl::Renderbuffer *renderbufferObject = context->getRenderbuffer(renderbuffer);
2526
2527 if (renderbufferObject)
2528 {
2529 return GL_TRUE;
2530 }
2531 }
2532 }
2533 catch(std::bad_alloc&)
2534 {
2535 return error(GL_OUT_OF_MEMORY, GL_FALSE);
2536 }
2537
2538 return GL_FALSE;
2539}
2540
2541GLboolean __stdcall glIsShader(GLuint shader)
2542{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002543 TRACE("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002544
2545 try
2546 {
2547 gl::Context *context = gl::getContext();
2548
2549 if (context && shader)
2550 {
2551 gl::Shader *shaderObject = context->getShader(shader);
2552
2553 if (shaderObject)
2554 {
2555 return GL_TRUE;
2556 }
2557 }
2558 }
2559 catch(std::bad_alloc&)
2560 {
2561 return error(GL_OUT_OF_MEMORY, GL_FALSE);
2562 }
2563
2564 return GL_FALSE;
2565}
2566
2567GLboolean __stdcall glIsTexture(GLuint texture)
2568{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002569 TRACE("(GLuint texture = %d)", texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002570
2571 try
2572 {
2573 gl::Context *context = gl::getContext();
2574
2575 if (context && texture)
2576 {
2577 gl::Texture *textureObject = context->getTexture(texture);
2578
2579 if (textureObject)
2580 {
2581 return GL_TRUE;
2582 }
2583 }
2584 }
2585 catch(std::bad_alloc&)
2586 {
2587 return error(GL_OUT_OF_MEMORY, GL_FALSE);
2588 }
2589
2590 return GL_FALSE;
2591}
2592
2593void __stdcall glLineWidth(GLfloat width)
2594{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002595 TRACE("(GLfloat width = %f)", width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002596
2597 try
2598 {
2599 if (width <= 0.0f)
2600 {
2601 return error(GL_INVALID_VALUE);
2602 }
2603
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00002604 gl::Context *context = gl::getContext();
2605
2606 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002607 {
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00002608 context->lineWidth = width;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002609 }
2610 }
2611 catch(std::bad_alloc&)
2612 {
2613 return error(GL_OUT_OF_MEMORY);
2614 }
2615}
2616
2617void __stdcall glLinkProgram(GLuint program)
2618{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002619 TRACE("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002620
2621 try
2622 {
2623 gl::Context *context = gl::getContext();
2624
2625 if (context)
2626 {
2627 gl::Program *programObject = context->getProgram(program);
2628
2629 if (!programObject)
2630 {
2631 return error(GL_INVALID_VALUE);
2632 }
2633
2634 programObject->link();
2635 }
2636 }
2637 catch(std::bad_alloc&)
2638 {
2639 return error(GL_OUT_OF_MEMORY);
2640 }
2641}
2642
2643void __stdcall glPixelStorei(GLenum pname, GLint param)
2644{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002645 TRACE("(GLenum pname = 0x%X, GLint param = %d)", pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002646
2647 try
2648 {
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00002649 gl::Context *context = gl::getContext();
2650
2651 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002652 {
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00002653 switch (pname)
2654 {
2655 case GL_UNPACK_ALIGNMENT:
2656 if (param != 1 && param != 2 && param != 4 && param != 8)
2657 {
2658 return error(GL_INVALID_VALUE);
2659 }
2660
2661 context->unpackAlignment = param;
2662 break;
2663
2664 case GL_PACK_ALIGNMENT:
2665 if (param != 1 && param != 2 && param != 4 && param != 8)
2666 {
2667 return error(GL_INVALID_VALUE);
2668 }
2669
2670 context->packAlignment = param;
2671 break;
2672
2673 default:
2674 return error(GL_INVALID_ENUM);
2675 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002676 }
2677 }
2678 catch(std::bad_alloc&)
2679 {
2680 return error(GL_OUT_OF_MEMORY);
2681 }
2682}
2683
2684void __stdcall glPolygonOffset(GLfloat factor, GLfloat units)
2685{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002686 TRACE("(GLfloat factor = %f, GLfloat units = %f)", factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002687
2688 try
2689 {
2690 if (factor != 0.0f || units != 0.0f)
2691 {
2692 UNIMPLEMENTED(); // FIXME
2693 }
2694 }
2695 catch(std::bad_alloc&)
2696 {
2697 return error(GL_OUT_OF_MEMORY);
2698 }
2699}
2700
2701void __stdcall glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void* pixels)
2702{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002703 TRACE("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
2704 "GLenum format = 0x%X, GLenum type = 0x%X, void* pixels = 0x%0.8p)",
2705 x, y, width, height, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002706
2707 try
2708 {
2709 if (width < 0 || height < 0)
2710 {
2711 return error(GL_INVALID_VALUE);
2712 }
2713
2714 switch (format)
2715 {
2716 case GL_RGBA:
2717 switch (type)
2718 {
2719 case GL_UNSIGNED_BYTE:
2720 break;
2721 default:
2722 return error(GL_INVALID_OPERATION);
2723 }
2724 break;
2725 case gl::IMPLEMENTATION_COLOR_READ_FORMAT:
2726 switch (type)
2727 {
2728 case gl::IMPLEMENTATION_COLOR_READ_TYPE:
2729 break;
2730 default:
2731 return error(GL_INVALID_OPERATION);
2732 }
2733 break;
2734 default:
2735 return error(GL_INVALID_OPERATION);
2736 }
2737
2738 gl::Context *context = gl::getContext();
2739
2740 if (context)
2741 {
2742 context->readPixels(x, y, width, height, format, type, pixels);
2743 }
2744 }
2745 catch(std::bad_alloc&)
2746 {
2747 return error(GL_OUT_OF_MEMORY);
2748 }
2749}
2750
2751void __stdcall glReleaseShaderCompiler(void)
2752{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002753 TRACE("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002754
2755 try
2756 {
2757 gl::Shader::releaseCompiler();
2758 }
2759 catch(std::bad_alloc&)
2760 {
2761 return error(GL_OUT_OF_MEMORY);
2762 }
2763}
2764
2765void __stdcall glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
2766{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002767 TRACE("(GLenum target = 0x%X, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
2768 target, internalformat, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002769
2770 try
2771 {
2772 switch (target)
2773 {
2774 case GL_RENDERBUFFER:
2775 break;
2776 default:
2777 return error(GL_INVALID_ENUM);
2778 }
2779
2780 switch (internalformat)
2781 {
2782 case GL_DEPTH_COMPONENT16:
2783 case GL_RGBA4:
2784 case GL_RGB5_A1:
2785 case GL_RGB565:
2786 case GL_STENCIL_INDEX8:
2787 break;
2788 default:
2789 return error(GL_INVALID_ENUM);
2790 }
2791
2792 if (width < 0 || height < 0 || width > gl::MAX_RENDERBUFFER_SIZE || height > gl::MAX_RENDERBUFFER_SIZE)
2793 {
2794 return error(GL_INVALID_VALUE);
2795 }
2796
2797 gl::Context *context = gl::getContext();
2798
2799 if (context)
2800 {
2801 if (context->framebuffer == 0 || context->renderbuffer == 0)
2802 {
2803 return error(GL_INVALID_OPERATION);
2804 }
2805
2806 switch (internalformat)
2807 {
2808 case GL_DEPTH_COMPONENT16:
2809 context->setRenderbuffer(new gl::Depthbuffer(width, height));
2810 break;
2811 case GL_RGBA4:
2812 case GL_RGB5_A1:
2813 case GL_RGB565:
2814 UNIMPLEMENTED(); // FIXME
daniel@transgaming.com4a9d65c2010-03-08 21:30:56 +00002815 // context->setRenderbuffer(new Colorbuffer(renderTarget));
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002816 break;
2817 case GL_STENCIL_INDEX8:
daniel@transgaming.com4a9d65c2010-03-08 21:30:56 +00002818 context->setRenderbuffer(new gl::Stencilbuffer(width, height));
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002819 break;
2820 default:
2821 return error(GL_INVALID_ENUM);
2822 }
2823 }
2824 }
2825 catch(std::bad_alloc&)
2826 {
2827 return error(GL_OUT_OF_MEMORY);
2828 }
2829}
2830
2831void __stdcall glSampleCoverage(GLclampf value, GLboolean invert)
2832{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002833 TRACE("(GLclampf value = %f, GLboolean invert = %d)", value, invert);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002834
2835 try
2836 {
2837 gl::Context* context = gl::getContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00002838
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002839 if (context)
2840 {
2841 context->sampleCoverageValue = gl::clamp01(value);
2842 context->sampleCoverageInvert = invert;
2843 }
2844 }
2845 catch(std::bad_alloc&)
2846 {
2847 return error(GL_OUT_OF_MEMORY);
2848 }
2849}
2850
2851void __stdcall glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
2852{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002853 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 +00002854
2855 try
2856 {
2857 if (width < 0 || height < 0)
2858 {
2859 return error(GL_INVALID_VALUE);
2860 }
2861
2862 gl::Context* context = gl::getContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00002863
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002864 if (context)
2865 {
2866 context->scissorX = x;
2867 context->scissorY = y;
2868 context->scissorWidth = width;
2869 context->scissorHeight = height;
2870 }
2871 }
2872 catch(std::bad_alloc&)
2873 {
2874 return error(GL_OUT_OF_MEMORY);
2875 }
2876}
2877
2878void __stdcall glShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryformat, const void* binary, GLsizei length)
2879{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002880 TRACE("(GLsizei n = %d, const GLuint* shaders = 0x%0.8p, GLenum binaryformat = 0x%X, "
2881 "const void* binary = 0x%0.8p, GLsizei length = %d)",
2882 n, shaders, binaryformat, binary, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002883
2884 try
2885 {
2886 if (n < 0 || length < 0)
2887 {
2888 return error(GL_INVALID_VALUE);
2889 }
2890
2891 UNIMPLEMENTED(); // FIXME
2892 }
2893 catch(std::bad_alloc&)
2894 {
2895 return error(GL_OUT_OF_MEMORY);
2896 }
2897}
2898
2899void __stdcall glShaderSource(GLuint shader, GLsizei count, const char** string, const GLint* length)
2900{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002901 TRACE("(GLuint shader = %d, GLsizei count = %d, const char** string = 0x%0.8p, const GLint* length = 0x%0.8p)",
2902 shader, count, string, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002903
2904 try
2905 {
daniel@transgaming.com57a0bab2010-04-03 20:56:10 +00002906 if (shader == 0 || count < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002907 {
2908 return error(GL_INVALID_VALUE);
2909 }
2910
2911 gl::Context *context = gl::getContext();
2912
2913 if (context)
2914 {
2915 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00002916
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002917 if (!shaderObject)
2918 {
daniel@transgaming.com41187f12010-04-01 13:39:29 +00002919 return error(GL_INVALID_OPERATION);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002920 }
2921
2922 shaderObject->setSource(count, string, length);
2923 }
2924 }
2925 catch(std::bad_alloc&)
2926 {
2927 return error(GL_OUT_OF_MEMORY);
2928 }
2929}
2930
2931void __stdcall glStencilFunc(GLenum func, GLint ref, GLuint mask)
2932{
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00002933 glStencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002934}
2935
2936void __stdcall glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
2937{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002938 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 +00002939
2940 try
2941 {
2942 switch (face)
2943 {
2944 case GL_FRONT:
2945 case GL_BACK:
2946 case GL_FRONT_AND_BACK:
2947 break;
2948 default:
2949 return error(GL_INVALID_ENUM);
2950 }
2951
2952 switch (func)
2953 {
2954 case GL_NEVER:
2955 case GL_ALWAYS:
2956 case GL_LESS:
2957 case GL_LEQUAL:
2958 case GL_EQUAL:
2959 case GL_GEQUAL:
2960 case GL_GREATER:
2961 case GL_NOTEQUAL:
2962 break;
2963 default:
2964 return error(GL_INVALID_ENUM);
2965 }
2966
2967 gl::Context *context = gl::getContext();
2968
2969 if (context)
2970 {
2971 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
2972 {
2973 context->stencilFunc = func;
2974 context->stencilRef = ref;
2975 context->stencilMask = mask;
2976 }
2977
2978 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
2979 {
2980 context->stencilBackFunc = func;
2981 context->stencilBackRef = ref;
2982 context->stencilBackMask = mask;
2983 }
2984 }
2985 }
2986 catch(std::bad_alloc&)
2987 {
2988 return error(GL_OUT_OF_MEMORY);
2989 }
2990}
2991
2992void __stdcall glStencilMask(GLuint mask)
2993{
2994 glStencilMaskSeparate(GL_FRONT_AND_BACK, mask);
2995}
2996
2997void __stdcall glStencilMaskSeparate(GLenum face, GLuint mask)
2998{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002999 TRACE("(GLenum face = 0x%X, GLuint mask = %d)", face, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003000
3001 try
3002 {
3003 switch (face)
3004 {
3005 case GL_FRONT:
3006 case GL_BACK:
3007 case GL_FRONT_AND_BACK:
3008 break;
3009 default:
3010 return error(GL_INVALID_ENUM);
3011 }
3012
3013 gl::Context *context = gl::getContext();
3014
3015 if (context)
3016 {
3017 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
3018 {
3019 context->stencilWritemask = mask;
3020 }
3021
3022 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
3023 {
3024 context->stencilBackWritemask = mask;
3025 }
3026 }
3027 }
3028 catch(std::bad_alloc&)
3029 {
3030 return error(GL_OUT_OF_MEMORY);
3031 }
3032}
3033
3034void __stdcall glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
3035{
3036 glStencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
3037}
3038
3039void __stdcall glStencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
3040{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003041 TRACE("(GLenum face = 0x%X, GLenum fail = 0x%X, GLenum zfail = 0x%X, GLenum zpas = 0x%Xs)",
3042 face, fail, zfail, zpass);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003043
3044 try
3045 {
3046 switch (face)
3047 {
3048 case GL_FRONT:
3049 case GL_BACK:
3050 case GL_FRONT_AND_BACK:
3051 break;
3052 default:
3053 return error(GL_INVALID_ENUM);
3054 }
3055
3056 switch (fail)
3057 {
3058 case GL_ZERO:
3059 case GL_KEEP:
3060 case GL_REPLACE:
3061 case GL_INCR:
3062 case GL_DECR:
3063 case GL_INVERT:
3064 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00003065 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003066 break;
3067 default:
3068 return error(GL_INVALID_ENUM);
3069 }
3070
3071 switch (zfail)
3072 {
3073 case GL_ZERO:
3074 case GL_KEEP:
3075 case GL_REPLACE:
3076 case GL_INCR:
3077 case GL_DECR:
3078 case GL_INVERT:
3079 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00003080 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003081 break;
3082 default:
3083 return error(GL_INVALID_ENUM);
3084 }
3085
3086 switch (zpass)
3087 {
3088 case GL_ZERO:
3089 case GL_KEEP:
3090 case GL_REPLACE:
3091 case GL_INCR:
3092 case GL_DECR:
3093 case GL_INVERT:
3094 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00003095 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003096 break;
3097 default:
3098 return error(GL_INVALID_ENUM);
3099 }
3100
3101 gl::Context *context = gl::getContext();
3102
3103 if (context)
3104 {
3105 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
3106 {
3107 context->stencilFail = fail;
3108 context->stencilPassDepthFail = zfail;
3109 context->stencilPassDepthPass = zpass;
3110 }
3111
3112 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
3113 {
3114 context->stencilBackFail = fail;
3115 context->stencilBackPassDepthFail = zfail;
3116 context->stencilBackPassDepthPass = zpass;
3117 }
3118 }
3119 }
3120 catch(std::bad_alloc&)
3121 {
3122 return error(GL_OUT_OF_MEMORY);
3123 }
3124}
3125
3126void __stdcall glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void* pixels)
3127{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003128 TRACE("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, GLsizei height = %d, "
3129 "GLint border = %d, GLenum format = 0x%X, GLenum type = 0x%X, const void* pixels = 0x%0.8p)",
3130 target, level, internalformat, width, height, border, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003131
3132 try
3133 {
3134 if (level < 0 || width < 0 || height < 0)
3135 {
3136 return error(GL_INVALID_VALUE);
3137 }
3138
3139 if (level > 0 && (!gl::isPow2(width) || !gl::isPow2(height)))
3140 {
3141 return error(GL_INVALID_VALUE);
3142 }
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00003143
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003144 switch (target)
3145 {
3146 case GL_TEXTURE_2D:
3147 if (width > (gl::MAX_TEXTURE_SIZE >> level) || height > (gl::MAX_TEXTURE_SIZE >> level))
3148 {
3149 return error(GL_INVALID_VALUE);
3150 }
3151 break;
3152 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
3153 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
3154 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
3155 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
3156 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
3157 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
3158 if (!gl::isPow2(width) || !gl::isPow2(height))
3159 {
3160 return error(GL_INVALID_VALUE);
3161 }
3162
3163 if (width > (gl::MAX_CUBE_MAP_TEXTURE_SIZE >> level) || height > (gl::MAX_CUBE_MAP_TEXTURE_SIZE >> level))
3164 {
3165 return error(GL_INVALID_VALUE);
3166 }
3167 break;
3168 default:
3169 return error(GL_INVALID_ENUM);
3170 }
3171
3172 if (internalformat != format)
3173 {
3174 return error(GL_INVALID_OPERATION);
3175 }
3176
3177 switch (internalformat)
3178 {
3179 case GL_ALPHA:
3180 case GL_LUMINANCE:
3181 case GL_LUMINANCE_ALPHA:
3182 switch (type)
3183 {
3184 case GL_UNSIGNED_BYTE:
3185 break;
3186 default:
3187 return error(GL_INVALID_ENUM);
3188 }
3189 break;
3190 case GL_RGB:
3191 switch (type)
3192 {
3193 case GL_UNSIGNED_BYTE:
3194 case GL_UNSIGNED_SHORT_5_6_5:
3195 break;
3196 default:
3197 return error(GL_INVALID_ENUM);
3198 }
3199 break;
3200 case GL_RGBA:
3201 switch (type)
3202 {
3203 case GL_UNSIGNED_BYTE:
3204 case GL_UNSIGNED_SHORT_4_4_4_4:
3205 case GL_UNSIGNED_SHORT_5_5_5_1:
3206 break;
3207 default:
3208 return error(GL_INVALID_ENUM);
3209 }
3210 break;
3211 default:
3212 return error(GL_INVALID_VALUE);
3213 }
3214
3215 if (border != 0)
3216 {
3217 return error(GL_INVALID_VALUE);
3218 }
3219
3220 gl::Context *context = gl::getContext();
3221
3222 if (context)
3223 {
3224 if (target == GL_TEXTURE_2D)
3225 {
3226 gl::Texture2D *texture = context->getTexture2D();
3227
3228 if (!texture)
3229 {
3230 return error(GL_INVALID_OPERATION);
3231 }
3232
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00003233 texture->setImage(level, internalformat, width, height, format, type, context->unpackAlignment, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003234 }
3235 else
3236 {
3237 gl::TextureCubeMap *texture = context->getTextureCubeMap();
3238
3239 if (!texture)
3240 {
3241 return error(GL_INVALID_OPERATION);
3242 }
3243
3244 switch (target)
3245 {
3246 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00003247 texture->setImagePosX(level, internalformat, width, height, format, type, context->unpackAlignment, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003248 break;
3249 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00003250 texture->setImageNegX(level, internalformat, width, height, format, type, context->unpackAlignment, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003251 break;
3252 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00003253 texture->setImagePosY(level, internalformat, width, height, format, type, context->unpackAlignment, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003254 break;
3255 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00003256 texture->setImageNegY(level, internalformat, width, height, format, type, context->unpackAlignment, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003257 break;
3258 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00003259 texture->setImagePosZ(level, internalformat, width, height, format, type, context->unpackAlignment, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003260 break;
3261 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00003262 texture->setImageNegZ(level, internalformat, width, height, format, type, context->unpackAlignment, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003263 break;
3264 default: UNREACHABLE();
3265 }
3266 }
3267 }
3268 }
3269 catch(std::bad_alloc&)
3270 {
3271 return error(GL_OUT_OF_MEMORY);
3272 }
3273}
3274
3275void __stdcall glTexParameterf(GLenum target, GLenum pname, GLfloat param)
3276{
3277 glTexParameteri(target, pname, (GLint)param);
3278}
3279
3280void __stdcall glTexParameterfv(GLenum target, GLenum pname, const GLfloat* params)
3281{
3282 glTexParameteri(target, pname, (GLint)*params);
3283}
3284
3285void __stdcall glTexParameteri(GLenum target, GLenum pname, GLint param)
3286{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003287 TRACE("(GLenum target = 0x%X, GLenum pname = 0x%X, GLfloat param = %f)", target, pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003288
3289 try
3290 {
3291 gl::Context *context = gl::getContext();
3292
3293 if (context)
3294 {
3295 gl::Texture *texture;
3296
3297 switch (target)
3298 {
3299 case GL_TEXTURE_2D:
3300 texture = context->getTexture2D();
3301 break;
3302 case GL_TEXTURE_CUBE_MAP:
3303 texture = context->getTextureCubeMap();
3304 break;
3305 default:
3306 return error(GL_INVALID_ENUM);
3307 }
3308
3309 switch (pname)
3310 {
3311 case GL_TEXTURE_WRAP_S:
3312 if (!texture->setWrapS((GLenum)param))
3313 {
3314 return error(GL_INVALID_ENUM);
3315 }
3316 break;
3317 case GL_TEXTURE_WRAP_T:
3318 if (!texture->setWrapT((GLenum)param))
3319 {
3320 return error(GL_INVALID_ENUM);
3321 }
3322 break;
3323 case GL_TEXTURE_MIN_FILTER:
3324 if (!texture->setMinFilter((GLenum)param))
3325 {
3326 return error(GL_INVALID_ENUM);
3327 }
3328 break;
3329 case GL_TEXTURE_MAG_FILTER:
3330 if (!texture->setMagFilter((GLenum)param))
3331 {
3332 return error(GL_INVALID_ENUM);
3333 }
3334 break;
3335 default:
3336 return error(GL_INVALID_ENUM);
3337 }
3338 }
3339 }
3340 catch(std::bad_alloc&)
3341 {
3342 return error(GL_OUT_OF_MEMORY);
3343 }
3344}
3345
3346void __stdcall glTexParameteriv(GLenum target, GLenum pname, const GLint* params)
3347{
3348 glTexParameteri(target, pname, *params);
3349}
3350
3351void __stdcall glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* pixels)
3352{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003353 TRACE("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
3354 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, GLenum type = 0x%X, "
3355 "const void* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003356 target, level, xoffset, yoffset, width, height, format, type, pixels);
3357
3358 try
3359 {
daniel@transgaming.com00c75962010-03-11 20:36:15 +00003360 if (target != GL_TEXTURE_2D && !es2dx::IsCubemapTextureTarget(target))
3361 {
3362 return error(GL_INVALID_ENUM);
3363 }
3364
3365 if (level < 0 || level > gl::MAX_TEXTURE_LEVELS || xoffset < 0 || yoffset < 0 || width < 0 || height < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003366 {
3367 return error(GL_INVALID_VALUE);
3368 }
3369
daniel@transgaming.com00c75962010-03-11 20:36:15 +00003370 if (std::numeric_limits<GLsizei>::max() - xoffset < width || std::numeric_limits<GLsizei>::max() - yoffset < height)
3371 {
3372 return error(GL_INVALID_VALUE);
3373 }
3374
3375 if (!es2dx::CheckTextureFormatType(format, type))
3376 {
3377 return error(GL_INVALID_ENUM);
3378 }
3379
3380 if (width == 0 || height == 0 || pixels == NULL)
3381 {
3382 return;
3383 }
3384
3385 gl::Context *context = gl::getContext();
3386
3387 if (context)
3388 {
3389 if (target == GL_TEXTURE_2D)
3390 {
3391 gl::Texture2D *texture = context->getTexture2D();
3392
3393 if (!texture)
3394 {
3395 return error(GL_INVALID_OPERATION);
3396 }
3397
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00003398 texture->subImage(level, xoffset, yoffset, width, height, format, type, context->unpackAlignment, pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00003399 }
3400 else if (es2dx::IsCubemapTextureTarget(target))
3401 {
3402 gl::TextureCubeMap *texture = context->getTextureCubeMap();
3403
3404 if (!texture)
3405 {
3406 return error(GL_INVALID_OPERATION);
3407 }
3408
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00003409 texture->subImage(target, level, xoffset, yoffset, width, height, format, type, context->unpackAlignment, pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00003410 }
3411 else
3412 {
3413 UNREACHABLE();
3414 }
3415 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003416 }
3417 catch(std::bad_alloc&)
3418 {
3419 return error(GL_OUT_OF_MEMORY);
3420 }
3421}
3422
3423void __stdcall glUniform1f(GLint location, GLfloat x)
3424{
3425 glUniform1fv(location, 1, &x);
3426}
3427
3428void __stdcall glUniform1fv(GLint location, GLsizei count, const GLfloat* v)
3429{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003430 TRACE("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003431
3432 try
3433 {
3434 if (location == -1)
3435 {
3436 return;
3437 }
3438
3439 if (count < 0)
3440 {
3441 return error(GL_INVALID_VALUE);
3442 }
3443
3444 gl::Context *context = gl::getContext();
3445
3446 if (context)
3447 {
3448 gl::Program *program = context->getCurrentProgram();
3449
3450 if (!program)
3451 {
3452 return error(GL_INVALID_OPERATION);
3453 }
3454
3455 if (!program->setUniform1fv(location, count, v))
3456 {
3457 return error(GL_INVALID_OPERATION);
3458 }
3459 }
3460 }
3461 catch(std::bad_alloc&)
3462 {
3463 return error(GL_OUT_OF_MEMORY);
3464 }
3465}
3466
3467void __stdcall glUniform1i(GLint location, GLint x)
3468{
3469 glUniform1iv(location, 1, &x);
3470}
3471
3472void __stdcall glUniform1iv(GLint location, GLsizei count, const GLint* v)
3473{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003474 TRACE("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003475
3476 try
3477 {
3478 if (count < 0)
3479 {
3480 return error(GL_INVALID_VALUE);
3481 }
3482
3483 gl::Context *context = gl::getContext();
3484
3485 if (context)
3486 {
3487 gl::Program *program = context->getCurrentProgram();
3488
3489 if (!program)
3490 {
3491 return error(GL_INVALID_OPERATION);
3492 }
3493
3494 if (!program->setUniform1iv(location, count, v))
3495 {
3496 return error(GL_INVALID_OPERATION);
3497 }
3498 }
3499 }
3500 catch(std::bad_alloc&)
3501 {
3502 return error(GL_OUT_OF_MEMORY);
3503 }
3504}
3505
3506void __stdcall glUniform2f(GLint location, GLfloat x, GLfloat y)
3507{
3508 GLfloat xy[2] = {x, y};
3509
3510 glUniform2fv(location, 1, (GLfloat*)&xy);
3511}
3512
3513void __stdcall glUniform2fv(GLint location, GLsizei count, const GLfloat* v)
3514{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003515 TRACE("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003516
3517 try
3518 {
3519 if (location == -1)
3520 {
3521 return;
3522 }
3523
3524 if (count < 0)
3525 {
3526 return error(GL_INVALID_VALUE);
3527 }
3528
3529 gl::Context *context = gl::getContext();
3530
3531 if (context)
3532 {
3533 gl::Program *program = context->getCurrentProgram();
3534
3535 if (!program)
3536 {
3537 return error(GL_INVALID_OPERATION);
3538 }
3539
3540 if (!program->setUniform2fv(location, count, v))
3541 {
3542 return error(GL_INVALID_OPERATION);
3543 }
3544 }
3545 }
3546 catch(std::bad_alloc&)
3547 {
3548 return error(GL_OUT_OF_MEMORY);
3549 }
3550}
3551
3552void __stdcall glUniform2i(GLint location, GLint x, GLint y)
3553{
3554 GLint xy[4] = {x, y};
3555
3556 glUniform2iv(location, 1, (GLint*)&xy);
3557}
3558
3559void __stdcall glUniform2iv(GLint location, GLsizei count, const GLint* v)
3560{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003561 TRACE("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003562
3563 try
3564 {
3565 if (count < 0)
3566 {
3567 return error(GL_INVALID_VALUE);
3568 }
3569
3570 UNIMPLEMENTED(); // FIXME
3571 }
3572 catch(std::bad_alloc&)
3573 {
3574 return error(GL_OUT_OF_MEMORY);
3575 }
3576}
3577
3578void __stdcall glUniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
3579{
3580 GLfloat xyz[3] = {x, y, z};
3581
3582 glUniform3fv(location, 1, (GLfloat*)&xyz);
3583}
3584
3585void __stdcall glUniform3fv(GLint location, GLsizei count, const GLfloat* v)
3586{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003587 TRACE("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003588
3589 try
3590 {
3591 if (count < 0)
3592 {
3593 return error(GL_INVALID_VALUE);
3594 }
3595
3596 if (location == -1)
3597 {
3598 return;
3599 }
3600
3601 gl::Context *context = gl::getContext();
3602
3603 if (context)
3604 {
3605 gl::Program *program = context->getCurrentProgram();
3606
3607 if (!program)
3608 {
3609 return error(GL_INVALID_OPERATION);
3610 }
3611
3612 if (!program->setUniform3fv(location, count, v))
3613 {
3614 return error(GL_INVALID_OPERATION);
3615 }
3616 }
3617 }
3618 catch(std::bad_alloc&)
3619 {
3620 return error(GL_OUT_OF_MEMORY);
3621 }
3622}
3623
3624void __stdcall glUniform3i(GLint location, GLint x, GLint y, GLint z)
3625{
3626 GLint xyz[3] = {x, y, z};
3627
3628 glUniform3iv(location, 1, (GLint*)&xyz);
3629}
3630
3631void __stdcall glUniform3iv(GLint location, GLsizei count, const GLint* v)
3632{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003633 TRACE("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003634
3635 try
3636 {
3637 if (count < 0)
3638 {
3639 return error(GL_INVALID_VALUE);
3640 }
3641
3642 UNIMPLEMENTED(); // FIXME
3643 }
3644 catch(std::bad_alloc&)
3645 {
3646 return error(GL_OUT_OF_MEMORY);
3647 }
3648}
3649
3650void __stdcall glUniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
3651{
3652 GLfloat xyzw[4] = {x, y, z, w};
3653
3654 glUniform4fv(location, 1, (GLfloat*)&xyzw);
3655}
3656
3657void __stdcall glUniform4fv(GLint location, GLsizei count, const GLfloat* v)
3658{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003659 TRACE("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003660
3661 try
3662 {
3663 if (count < 0)
3664 {
3665 return error(GL_INVALID_VALUE);
3666 }
3667
3668 if (location == -1)
3669 {
3670 return;
3671 }
3672
3673 gl::Context *context = gl::getContext();
3674
3675 if (context)
3676 {
3677 gl::Program *program = context->getCurrentProgram();
3678
3679 if (!program)
3680 {
3681 return error(GL_INVALID_OPERATION);
3682 }
3683
3684 if (!program->setUniform4fv(location, count, v))
3685 {
3686 return error(GL_INVALID_OPERATION);
3687 }
3688 }
3689 }
3690 catch(std::bad_alloc&)
3691 {
3692 return error(GL_OUT_OF_MEMORY);
3693 }
3694}
3695
3696void __stdcall glUniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
3697{
3698 GLint xyzw[4] = {x, y, z, w};
3699
3700 glUniform4iv(location, 1, (GLint*)&xyzw);
3701}
3702
3703void __stdcall glUniform4iv(GLint location, GLsizei count, const GLint* v)
3704{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003705 TRACE("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003706
3707 try
3708 {
3709 if (count < 0)
3710 {
3711 return error(GL_INVALID_VALUE);
3712 }
3713
3714 UNIMPLEMENTED(); // FIXME
3715 }
3716 catch(std::bad_alloc&)
3717 {
3718 return error(GL_OUT_OF_MEMORY);
3719 }
3720}
3721
3722void __stdcall glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
3723{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003724 TRACE("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %d, const GLfloat* value = 0x%0.8p)",
3725 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003726
3727 try
3728 {
3729 if (count < 0 || transpose != GL_FALSE)
3730 {
3731 return error(GL_INVALID_VALUE);
3732 }
3733
3734 if (location == -1)
3735 {
3736 return;
3737 }
3738
3739 gl::Context *context = gl::getContext();
3740
3741 if (context)
3742 {
3743 gl::Program *program = context->getCurrentProgram();
3744
3745 if (!program)
3746 {
3747 return error(GL_INVALID_OPERATION);
3748 }
3749
3750 if (!program->setUniformMatrix2fv(location, count, value))
3751 {
3752 return error(GL_INVALID_OPERATION);
3753 }
3754 }
3755 }
3756 catch(std::bad_alloc&)
3757 {
3758 return error(GL_OUT_OF_MEMORY);
3759 }
3760}
3761
3762void __stdcall glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
3763{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003764 TRACE("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %d, const GLfloat* value = 0x%0.8p)",
3765 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003766
3767 try
3768 {
3769 if (count < 0 || transpose != GL_FALSE)
3770 {
3771 return error(GL_INVALID_VALUE);
3772 }
3773
3774 if (location == -1)
3775 {
3776 return;
3777 }
3778
3779 gl::Context *context = gl::getContext();
3780
3781 if (context)
3782 {
3783 gl::Program *program = context->getCurrentProgram();
3784
3785 if (!program)
3786 {
3787 return error(GL_INVALID_OPERATION);
3788 }
3789
3790 if (!program->setUniformMatrix3fv(location, count, value))
3791 {
3792 return error(GL_INVALID_OPERATION);
3793 }
3794 }
3795 }
3796 catch(std::bad_alloc&)
3797 {
3798 return error(GL_OUT_OF_MEMORY);
3799 }
3800}
3801
3802void __stdcall glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
3803{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003804 TRACE("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %d, const GLfloat* value = 0x%0.8p)",
3805 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003806
3807 try
3808 {
3809 if (count < 0 || transpose != GL_FALSE)
3810 {
3811 return error(GL_INVALID_VALUE);
3812 }
3813
3814 if (location == -1)
3815 {
3816 return;
3817 }
3818
3819 gl::Context *context = gl::getContext();
3820
3821 if (context)
3822 {
3823 gl::Program *program = context->getCurrentProgram();
3824
3825 if (!program)
3826 {
3827 return error(GL_INVALID_OPERATION);
3828 }
3829
3830 if (!program->setUniformMatrix4fv(location, count, value))
3831 {
3832 return error(GL_INVALID_OPERATION);
3833 }
3834 }
3835 }
3836 catch(std::bad_alloc&)
3837 {
3838 return error(GL_OUT_OF_MEMORY);
3839 }
3840}
3841
3842void __stdcall glUseProgram(GLuint program)
3843{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003844 TRACE("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003845
3846 try
3847 {
3848 gl::Context *context = gl::getContext();
3849
3850 if (context)
3851 {
3852 gl::Program *programObject = context->getProgram(program);
3853
3854 if (programObject && !programObject->isLinked())
3855 {
3856 return error(GL_INVALID_OPERATION);
3857 }
3858
3859 context->useProgram(program);
3860 }
3861 }
3862 catch(std::bad_alloc&)
3863 {
3864 return error(GL_OUT_OF_MEMORY);
3865 }
3866}
3867
3868void __stdcall glValidateProgram(GLuint program)
3869{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003870 TRACE("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003871
3872 try
3873 {
3874 UNIMPLEMENTED(); // FIXME
3875 }
3876 catch(std::bad_alloc&)
3877 {
3878 return error(GL_OUT_OF_MEMORY);
3879 }
3880}
3881
3882void __stdcall glVertexAttrib1f(GLuint index, GLfloat x)
3883{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003884 TRACE("(GLuint index = %d, GLfloat x = %f)", index, x);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003885
3886 try
3887 {
3888 if (index >= gl::MAX_VERTEX_ATTRIBS)
3889 {
3890 return error(GL_INVALID_VALUE);
3891 }
3892
3893 UNIMPLEMENTED(); // FIXME
3894 }
3895 catch(std::bad_alloc&)
3896 {
3897 return error(GL_OUT_OF_MEMORY);
3898 }
3899}
3900
3901void __stdcall glVertexAttrib1fv(GLuint index, const GLfloat* values)
3902{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003903 TRACE("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003904
3905 try
3906 {
3907 if (index >= gl::MAX_VERTEX_ATTRIBS)
3908 {
3909 return error(GL_INVALID_VALUE);
3910 }
3911
3912 UNIMPLEMENTED(); // FIXME
3913 }
3914 catch(std::bad_alloc&)
3915 {
3916 return error(GL_OUT_OF_MEMORY);
3917 }
3918}
3919
3920void __stdcall glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
3921{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003922 TRACE("(GLuint index = %d, GLfloat x = %f, GLfloat y = %f)", index, x, y);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003923
3924 try
3925 {
3926 if (index >= gl::MAX_VERTEX_ATTRIBS)
3927 {
3928 return error(GL_INVALID_VALUE);
3929 }
3930
3931 UNIMPLEMENTED(); // FIXME
3932 }
3933 catch(std::bad_alloc&)
3934 {
3935 return error(GL_OUT_OF_MEMORY);
3936 }
3937}
3938
3939void __stdcall glVertexAttrib2fv(GLuint index, const GLfloat* values)
3940{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003941 TRACE("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003942
3943 try
3944 {
3945 if (index >= gl::MAX_VERTEX_ATTRIBS)
3946 {
3947 return error(GL_INVALID_VALUE);
3948 }
3949
3950 UNIMPLEMENTED(); // FIXME
3951 }
3952 catch(std::bad_alloc&)
3953 {
3954 return error(GL_OUT_OF_MEMORY);
3955 }
3956}
3957
3958void __stdcall glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
3959{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003960 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 +00003961
3962 try
3963 {
3964 if (index >= gl::MAX_VERTEX_ATTRIBS)
3965 {
3966 return error(GL_INVALID_VALUE);
3967 }
3968
3969 UNIMPLEMENTED(); // FIXME
3970 }
3971 catch(std::bad_alloc&)
3972 {
3973 return error(GL_OUT_OF_MEMORY);
3974 }
3975}
3976
3977void __stdcall glVertexAttrib3fv(GLuint index, const GLfloat* values)
3978{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003979 TRACE("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003980
3981 try
3982 {
3983 if (index >= gl::MAX_VERTEX_ATTRIBS)
3984 {
3985 return error(GL_INVALID_VALUE);
3986 }
3987
3988 UNIMPLEMENTED(); // FIXME
3989 }
3990 catch(std::bad_alloc&)
3991 {
3992 return error(GL_OUT_OF_MEMORY);
3993 }
3994}
3995
3996void __stdcall glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
3997{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003998 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 +00003999
4000 try
4001 {
4002 if (index >= gl::MAX_VERTEX_ATTRIBS)
4003 {
4004 return error(GL_INVALID_VALUE);
4005 }
4006
4007 UNIMPLEMENTED(); // FIXME
4008 }
4009 catch(std::bad_alloc&)
4010 {
4011 return error(GL_OUT_OF_MEMORY);
4012 }
4013}
4014
4015void __stdcall glVertexAttrib4fv(GLuint index, const GLfloat* values)
4016{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004017 TRACE("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004018
4019 try
4020 {
4021 if (index >= gl::MAX_VERTEX_ATTRIBS)
4022 {
4023 return error(GL_INVALID_VALUE);
4024 }
4025
4026 UNIMPLEMENTED(); // FIXME
4027 }
4028 catch(std::bad_alloc&)
4029 {
4030 return error(GL_OUT_OF_MEMORY);
4031 }
4032}
4033
4034void __stdcall glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void* ptr)
4035{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004036 TRACE("(GLuint index = %d, GLint size = %d, GLenum type = 0x%X, "
4037 "GLboolean normalized = %d, GLsizei stride = %d, const void* ptr = 0x%0.8p)",
4038 index, size, type, normalized, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004039
4040 try
4041 {
4042 if (index >= gl::MAX_VERTEX_ATTRIBS)
4043 {
4044 return error(GL_INVALID_VALUE);
4045 }
4046
4047 if (size < 1 || size > 4)
4048 {
4049 return error(GL_INVALID_VALUE);
4050 }
4051
4052 switch (type)
4053 {
4054 case GL_BYTE:
4055 case GL_UNSIGNED_BYTE:
4056 case GL_SHORT:
4057 case GL_UNSIGNED_SHORT:
4058 case GL_FIXED:
4059 case GL_FLOAT:
4060 break;
4061 default:
4062 return error(GL_INVALID_ENUM);
4063 }
4064
4065 if (stride < 0)
4066 {
4067 return error(GL_INVALID_VALUE);
4068 }
4069
4070 gl::Context *context = gl::getContext();
4071
4072 if (context)
4073 {
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +00004074 context->vertexAttribute[index].mBoundBuffer = context->arrayBuffer;
4075 context->vertexAttribute[index].mSize = size;
4076 context->vertexAttribute[index].mType = type;
daniel@transgaming.comb994e3b2010-03-26 04:08:50 +00004077 context->vertexAttribute[index].mNormalized = (normalized == GL_TRUE);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +00004078 context->vertexAttribute[index].mStride = stride;
4079 context->vertexAttribute[index].mPointer = ptr;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004080 }
4081 }
4082 catch(std::bad_alloc&)
4083 {
4084 return error(GL_OUT_OF_MEMORY);
4085 }
4086}
4087
4088void __stdcall glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
4089{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004090 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 +00004091
4092 try
4093 {
4094 if (width < 0 || height < 0)
4095 {
4096 return error(GL_INVALID_VALUE);
4097 }
4098
4099 gl::Context *context = gl::getContext();
4100
4101 if (context)
4102 {
4103 context->viewportX = x;
4104 context->viewportY = y;
4105 context->viewportWidth = width;
4106 context->viewportHeight = height;
4107 }
4108 }
4109 catch(std::bad_alloc&)
4110 {
4111 return error(GL_OUT_OF_MEMORY);
4112 }
4113}
4114
4115void __stdcall glTexImage3DOES(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void* pixels)
4116{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004117 TRACE("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
4118 "GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, GLint border = %d, "
4119 "GLenum format = 0x%X, GLenum type = 0x%x, const void* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004120 target, level, internalformat, width, height, depth, border, format, type, pixels);
4121
4122 try
4123 {
4124 UNIMPLEMENTED(); // FIXME
4125 }
4126 catch(std::bad_alloc&)
4127 {
4128 return error(GL_OUT_OF_MEMORY);
4129 }
4130}
4131}