blob: ec4f0faac64bbc2ed48b48186513aa42215ab7ab [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:
1229 UNIMPLEMENTED(); // FIXME
1230 case GL_UNSIGNED_SHORT:
1231 break;
1232 default:
1233 return error(GL_INVALID_ENUM);
1234 }
1235
1236 gl::Context *context = gl::getContext();
1237
1238 if (context)
1239 {
1240 context->drawElements(mode, count, type, indices);
1241 }
1242 }
1243 catch(std::bad_alloc&)
1244 {
1245 return error(GL_OUT_OF_MEMORY);
1246 }
1247}
1248
1249void __stdcall glEnable(GLenum cap)
1250{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001251 TRACE("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001252
1253 try
1254 {
1255 gl::Context *context = gl::getContext();
1256
1257 if (context)
1258 {
1259 switch (cap)
1260 {
1261 case GL_CULL_FACE: context->cullFace = true; break;
1262 case GL_POLYGON_OFFSET_FILL: context->polygonOffsetFill = true; break;
1263 case GL_SAMPLE_ALPHA_TO_COVERAGE: context->sampleAlphaToCoverage = true; break;
1264 case GL_SAMPLE_COVERAGE: context->sampleCoverage = true; break;
1265 case GL_SCISSOR_TEST: context->scissorTest = true; break;
1266 case GL_STENCIL_TEST: context->stencilTest = true; break;
1267 case GL_DEPTH_TEST: context->depthTest = true; break;
1268 case GL_BLEND: context->blend = true; break;
1269 case GL_DITHER: context->dither = true; break;
1270 default:
1271 return error(GL_INVALID_ENUM);
1272 }
1273 }
1274 }
1275 catch(std::bad_alloc&)
1276 {
1277 return error(GL_OUT_OF_MEMORY);
1278 }
1279}
1280
1281void __stdcall glEnableVertexAttribArray(GLuint index)
1282{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001283 TRACE("(GLuint index = %d)", index);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001284
1285 try
1286 {
1287 if (index >= gl::MAX_VERTEX_ATTRIBS)
1288 {
1289 return error(GL_INVALID_VALUE);
1290 }
1291
1292 gl::Context *context = gl::getContext();
1293
1294 if (context)
1295 {
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +00001296 context->vertexAttribute[index].mEnabled = true;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001297 }
1298 }
1299 catch(std::bad_alloc&)
1300 {
1301 return error(GL_OUT_OF_MEMORY);
1302 }
1303}
1304
1305void __stdcall glFinish(void)
1306{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001307 TRACE("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001308
1309 try
1310 {
1311 gl::Context *context = gl::getContext();
1312
1313 if (context)
1314 {
1315 context->finish();
1316 }
1317 }
1318 catch(std::bad_alloc&)
1319 {
1320 return error(GL_OUT_OF_MEMORY);
1321 }
1322}
1323
1324void __stdcall glFlush(void)
1325{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001326 TRACE("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001327
1328 try
1329 {
1330 gl::Context *context = gl::getContext();
1331
1332 if (context)
1333 {
1334 context->flush();
1335 }
1336 }
1337 catch(std::bad_alloc&)
1338 {
1339 return error(GL_OUT_OF_MEMORY);
1340 }
1341}
1342
1343void __stdcall glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
1344{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001345 TRACE("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum renderbuffertarget = 0x%X, "
1346 "GLuint renderbuffer = %d)", target, attachment, renderbuffertarget, renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001347
1348 try
1349 {
1350 if (target != GL_FRAMEBUFFER || renderbuffertarget != GL_RENDERBUFFER)
1351 {
1352 return error(GL_INVALID_ENUM);
1353 }
1354
1355 gl::Context *context = gl::getContext();
1356
1357 if (context)
1358 {
1359 gl::Framebuffer *framebuffer = context->getFramebuffer();
1360
1361 if (context->framebuffer == 0 || !framebuffer)
1362 {
1363 return error(GL_INVALID_OPERATION);
1364 }
1365
1366 switch (attachment)
1367 {
1368 case GL_COLOR_ATTACHMENT0:
1369 framebuffer->setColorbuffer(GL_RENDERBUFFER, renderbuffer);
1370 break;
1371 case GL_DEPTH_ATTACHMENT:
1372 framebuffer->setDepthbuffer(GL_RENDERBUFFER, renderbuffer);
1373 break;
1374 case GL_STENCIL_ATTACHMENT:
1375 framebuffer->setStencilbuffer(GL_RENDERBUFFER, renderbuffer);
1376 break;
1377 default:
1378 return error(GL_INVALID_ENUM);
1379 }
1380 }
1381 }
1382 catch(std::bad_alloc&)
1383 {
1384 return error(GL_OUT_OF_MEMORY);
1385 }
1386}
1387
1388void __stdcall glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
1389{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001390 TRACE("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum textarget = 0x%X, "
1391 "GLuint texture = %d, GLint level = %d)", target, attachment, textarget, texture, level);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001392
1393 try
1394 {
1395 if (target != GL_FRAMEBUFFER)
1396 {
1397 return error(GL_INVALID_ENUM);
1398 }
1399
1400 switch (attachment)
1401 {
1402 case GL_COLOR_ATTACHMENT0:
1403 break;
1404 default:
1405 return error(GL_INVALID_ENUM);
1406 }
1407
1408 gl::Context *context = gl::getContext();
1409
1410 if (context)
1411 {
1412 if (texture)
1413 {
1414 switch (textarget)
1415 {
1416 case GL_TEXTURE_2D:
1417 if (!context->getTexture2D())
1418 {
1419 return error(GL_INVALID_OPERATION);
1420 }
1421 break;
1422 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1423 UNIMPLEMENTED(); // FIXME
1424 break;
1425 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1426 UNIMPLEMENTED(); // FIXME
1427 break;
1428 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1429 UNIMPLEMENTED(); // FIXME
1430 break;
1431 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1432 UNIMPLEMENTED(); // FIXME
1433 break;
1434 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1435 UNIMPLEMENTED(); // FIXME
1436 break;
1437 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
1438 UNIMPLEMENTED(); // FIXME
1439 break;
1440 default:
1441 return error(GL_INVALID_ENUM);
1442 }
1443
1444 if (level != 0)
1445 {
1446 return error(GL_INVALID_VALUE);
1447 }
1448 }
1449
1450 gl::Framebuffer *framebuffer = context->getFramebuffer();
1451
1452 if (context->framebuffer == 0 || !framebuffer)
1453 {
1454 return error(GL_INVALID_OPERATION);
1455 }
1456
1457 framebuffer->setColorbuffer(GL_TEXTURE, texture);
1458 }
1459 }
1460 catch(std::bad_alloc&)
1461 {
1462 return error(GL_OUT_OF_MEMORY);
1463 }
1464}
1465
1466void __stdcall glFrontFace(GLenum mode)
1467{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001468 TRACE("(GLenum mode = 0x%X)", mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001469
1470 try
1471 {
1472 switch (mode)
1473 {
1474 case GL_CW:
1475 case GL_CCW:
1476 {
1477 gl::Context *context = gl::getContext();
1478
1479 if (context)
1480 {
1481 context->frontFace = mode;
1482 }
1483 }
1484 break;
1485 default:
1486 return error(GL_INVALID_ENUM);
1487 }
1488 }
1489 catch(std::bad_alloc&)
1490 {
1491 return error(GL_OUT_OF_MEMORY);
1492 }
1493}
1494
1495void __stdcall glGenBuffers(GLsizei n, GLuint* buffers)
1496{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001497 TRACE("(GLsizei n = %d, GLuint* buffers = 0x%0.8p)", n, buffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001498
1499 try
1500 {
1501 if (n < 0)
1502 {
1503 return error(GL_INVALID_VALUE);
1504 }
1505
1506 gl::Context *context = gl::getContext();
1507
1508 if (context)
1509 {
1510 for (int i = 0; i < n; i++)
1511 {
1512 buffers[i] = context->createBuffer();
1513 }
1514 }
1515 }
1516 catch(std::bad_alloc&)
1517 {
1518 return error(GL_OUT_OF_MEMORY);
1519 }
1520}
1521
1522void __stdcall glGenerateMipmap(GLenum target)
1523{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001524 TRACE("(GLenum target = 0x%X)", target);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001525
1526 try
1527 {
1528 UNIMPLEMENTED(); // FIXME
1529 }
1530 catch(std::bad_alloc&)
1531 {
1532 return error(GL_OUT_OF_MEMORY);
1533 }
1534}
1535
1536void __stdcall glGenFramebuffers(GLsizei n, GLuint* framebuffers)
1537{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001538 TRACE("(GLsizei n = %d, GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001539
1540 try
1541 {
1542 if (n < 0)
1543 {
1544 return error(GL_INVALID_VALUE);
1545 }
1546
1547 gl::Context *context = gl::getContext();
1548
1549 if (context)
1550 {
1551 for (int i = 0; i < n; i++)
1552 {
1553 framebuffers[i] = context->createFramebuffer();
1554 }
1555 }
1556 }
1557 catch(std::bad_alloc&)
1558 {
1559 return error(GL_OUT_OF_MEMORY);
1560 }
1561}
1562
1563void __stdcall glGenRenderbuffers(GLsizei n, GLuint* renderbuffers)
1564{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001565 TRACE("(GLsizei n = %d, GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001566
1567 try
1568 {
1569 if (n < 0)
1570 {
1571 return error(GL_INVALID_VALUE);
1572 }
1573
1574 gl::Context *context = gl::getContext();
1575
1576 if (context)
1577 {
1578 for (int i = 0; i < n; i++)
1579 {
1580 renderbuffers[i] = context->createRenderbuffer();
1581 }
1582 }
1583 }
1584 catch(std::bad_alloc&)
1585 {
1586 return error(GL_OUT_OF_MEMORY);
1587 }
1588}
1589
1590void __stdcall glGenTextures(GLsizei n, GLuint* textures)
1591{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001592 TRACE("(GLsizei n = %d, GLuint* textures = 0x%0.8p)", n, textures);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001593
1594 try
1595 {
1596 if (n < 0)
1597 {
1598 return error(GL_INVALID_VALUE);
1599 }
1600
1601 gl::Context *context = gl::getContext();
1602
1603 if (context)
1604 {
1605 for (int i = 0; i < n; i++)
1606 {
1607 textures[i] = context->createTexture();
1608 }
1609 }
1610 }
1611 catch(std::bad_alloc&)
1612 {
1613 return error(GL_OUT_OF_MEMORY);
1614 }
1615}
1616
1617void __stdcall glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, char* name)
1618{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001619 TRACE("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, "
1620 "GLint* size = 0x%0.8p, GLenum* type = %0.8p, char* name = %0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001621 program, index, bufsize, length, size, type, name);
1622
1623 try
1624 {
1625 if (bufsize < 0)
1626 {
1627 return error(GL_INVALID_VALUE);
1628 }
1629
1630 UNIMPLEMENTED(); // FIXME
1631 }
1632 catch(std::bad_alloc&)
1633 {
1634 return error(GL_OUT_OF_MEMORY);
1635 }
1636}
1637
1638void __stdcall glGetActiveUniform(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, char* name)
1639{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001640 TRACE("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, "
1641 "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 +00001642 program, index, bufsize, length, size, type, name);
1643
1644 try
1645 {
1646 if (bufsize < 0)
1647 {
1648 return error(GL_INVALID_VALUE);
1649 }
1650
1651 UNIMPLEMENTED(); // FIXME
1652 }
1653 catch(std::bad_alloc&)
1654 {
1655 return error(GL_OUT_OF_MEMORY);
1656 }
1657}
1658
1659void __stdcall glGetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders)
1660{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001661 TRACE("(GLuint program = %d, GLsizei maxcount = %d, GLsizei* count = 0x%0.8p, GLuint* shaders = 0x%0.8p)",
1662 program, maxcount, count, shaders);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001663
1664 try
1665 {
1666 if (maxcount < 0)
1667 {
1668 return error(GL_INVALID_VALUE);
1669 }
1670
1671 UNIMPLEMENTED(); // FIXME
1672 }
1673 catch(std::bad_alloc&)
1674 {
1675 return error(GL_OUT_OF_MEMORY);
1676 }
1677}
1678
1679int __stdcall glGetAttribLocation(GLuint program, const char* name)
1680{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001681 TRACE("(GLuint program = %d, const char* name = %s)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001682
1683 try
1684 {
1685 gl::Context *context = gl::getContext();
1686
1687 if (context)
1688 {
1689 gl::Program *programObject = context->getProgram(program);
1690
1691 if (!programObject)
1692 {
1693 return error(GL_INVALID_VALUE, -1);
1694 }
1695
1696 return programObject->getAttributeLocation(name);
1697 }
1698 }
1699 catch(std::bad_alloc&)
1700 {
1701 return error(GL_OUT_OF_MEMORY, -1);
1702 }
1703
1704 return -1;
1705}
1706
1707void __stdcall glGetBooleanv(GLenum pname, GLboolean* params)
1708{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001709 TRACE("(GLenum pname = 0x%X, GLboolean* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001710
1711 try
1712 {
1713 switch (pname)
1714 {
1715 case GL_SHADER_COMPILER: *params = GL_TRUE; break;
1716 default:
1717 UNIMPLEMENTED(); // FIXME
1718 return error(GL_INVALID_ENUM);
1719 }
1720 }
1721 catch(std::bad_alloc&)
1722 {
1723 return error(GL_OUT_OF_MEMORY);
1724 }
1725}
1726
1727void __stdcall glGetBufferParameteriv(GLenum target, GLenum pname, GLint* params)
1728{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001729 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 +00001730
1731 try
1732 {
1733 UNIMPLEMENTED(); // FIXME
1734 }
1735 catch(std::bad_alloc&)
1736 {
1737 return error(GL_OUT_OF_MEMORY);
1738 }
1739}
1740
1741GLenum __stdcall glGetError(void)
1742{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001743 TRACE("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001744
1745 gl::Context *context = gl::getContext();
1746
1747 if (context)
1748 {
1749 return context->getError();
1750 }
1751
1752 return GL_NO_ERROR;
1753}
1754
1755void __stdcall glGetFloatv(GLenum pname, GLfloat* params)
1756{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001757 TRACE("(GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001758
1759 try
1760 {
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00001761 gl::Context *context = gl::getContext();
1762
1763 if (context)
1764 {
1765 switch (pname)
1766 {
daniel@transgaming.comccad59f2010-03-26 04:08:39 +00001767 case GL_LINE_WIDTH:
1768 *params = context->lineWidth;
1769 break;
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00001770 case GL_ALIASED_LINE_WIDTH_RANGE:
daniel@transgaming.comd989add2010-03-26 04:08:42 +00001771 params[0] = gl::ALIASED_LINE_WIDTH_RANGE_MIN;
1772 params[1] = gl::ALIASED_LINE_WIDTH_RANGE_MAX;
1773 break;
1774 case GL_ALIASED_POINT_SIZE_RANGE:
daniel@transgaming.comccad59f2010-03-26 04:08:39 +00001775 params[0] = gl::ALIASED_POINT_SIZE_RANGE_MIN;
1776 params[1] = gl::ALIASED_POINT_SIZE_RANGE_MAX;
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00001777 break;
1778 default:
1779 UNIMPLEMENTED(); // FIXME
1780 return error(GL_INVALID_ENUM);
1781 }
1782 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001783 }
1784 catch(std::bad_alloc&)
1785 {
1786 return error(GL_OUT_OF_MEMORY);
1787 }
1788}
1789
1790void __stdcall glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params)
1791{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001792 TRACE("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
1793 target, attachment, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001794
1795 try
1796 {
1797 gl::Context *context = gl::getContext();
1798
1799 if (context)
1800 {
1801 if (context->framebuffer == 0)
1802 {
1803 return error(GL_INVALID_OPERATION);
1804 }
1805
1806 UNIMPLEMENTED(); // FIXME
1807 }
1808 }
1809 catch(std::bad_alloc&)
1810 {
1811 return error(GL_OUT_OF_MEMORY);
1812 }
1813}
1814
1815void __stdcall glGetIntegerv(GLenum pname, GLint* params)
1816{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001817 TRACE("(GLenum pname = 0x%X, GLint* params = 0x%0.8p)", pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001818
1819 try
1820 {
1821 gl::Context *context = gl::getContext();
1822
1823 if (context)
1824 {
1825 switch (pname)
1826 {
1827 case GL_MAX_VERTEX_ATTRIBS: *params = gl::MAX_VERTEX_ATTRIBS; break;
1828 case GL_MAX_VERTEX_UNIFORM_VECTORS: *params = gl::MAX_VERTEX_UNIFORM_VECTORS; break;
1829 case GL_MAX_VARYING_VECTORS: *params = gl::MAX_VARYING_VECTORS; break;
1830 case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS: *params = gl::MAX_COMBINED_TEXTURE_IMAGE_UNITS; break;
1831 case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS: *params = gl::MAX_VERTEX_TEXTURE_IMAGE_UNITS; break;
1832 case GL_MAX_TEXTURE_IMAGE_UNITS: *params = gl::MAX_TEXTURE_IMAGE_UNITS; break;
1833 case GL_MAX_FRAGMENT_UNIFORM_VECTORS: *params = gl::MAX_FRAGMENT_UNIFORM_VECTORS; break;
1834 case GL_MAX_RENDERBUFFER_SIZE: *params = gl::MAX_RENDERBUFFER_SIZE; break;
1835 case GL_NUM_SHADER_BINARY_FORMATS: *params = 0; break;
daniel@transgaming.com41430492010-03-11 20:36:18 +00001836 case GL_NUM_COMPRESSED_TEXTURE_FORMATS: *params = 0; break;
1837 case GL_COMPRESSED_TEXTURE_FORMATS: /* no compressed texture formats are supported */ break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001838 case GL_ARRAY_BUFFER_BINDING: *params = context->arrayBuffer; break;
1839 case GL_FRAMEBUFFER_BINDING: *params = context->framebuffer; break;
1840 case GL_RENDERBUFFER_BINDING: *params = context->renderbuffer; break;
1841 case GL_CURRENT_PROGRAM: *params = context->currentProgram; break;
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00001842 case GL_PACK_ALIGNMENT: *params = context->packAlignment; break;
1843 case GL_UNPACK_ALIGNMENT: *params = context->unpackAlignment; break;
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00001844 case GL_GENERATE_MIPMAP_HINT: *params = context->generateMipmapHint; break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001845 case GL_RED_BITS:
1846 case GL_GREEN_BITS:
1847 case GL_BLUE_BITS:
1848 case GL_ALPHA_BITS:
1849 {
1850 gl::Framebuffer *framebuffer = context->getFramebuffer();
1851 gl::Colorbuffer *colorbuffer = framebuffer->getColorbuffer();
1852
1853 if (colorbuffer)
1854 {
1855 switch (pname)
1856 {
1857 case GL_RED_BITS: *params = colorbuffer->getRedSize(); break;
1858 case GL_GREEN_BITS: *params = colorbuffer->getGreenSize(); break;
1859 case GL_BLUE_BITS: *params = colorbuffer->getBlueSize(); break;
1860 case GL_ALPHA_BITS: *params = colorbuffer->getAlphaSize(); break;
1861 }
1862 }
1863 else
1864 {
1865 *params = 0;
1866 }
1867 }
1868 break;
1869 case GL_DEPTH_BITS:
1870 {
1871 gl::Framebuffer *framebuffer = context->getFramebuffer();
1872 gl::Depthbuffer *depthbuffer = framebuffer->getDepthbuffer();
1873
1874 if (depthbuffer)
1875 {
1876 *params = depthbuffer->getDepthSize();
1877 }
1878 else
1879 {
1880 *params = 0;
1881 }
1882 }
1883 break;
1884 case GL_STENCIL_BITS:
1885 {
1886 gl::Framebuffer *framebuffer = context->getFramebuffer();
1887 gl::Stencilbuffer *stencilbuffer = framebuffer->getStencilbuffer();
1888
1889 if (stencilbuffer)
1890 {
1891 *params = stencilbuffer->getStencilSize();
1892 }
1893 else
1894 {
1895 *params = 0;
1896 }
1897 }
1898 break;
1899 default:
1900 UNIMPLEMENTED(); // FIXME
1901 return error(GL_INVALID_ENUM);
1902 }
1903 }
1904 }
1905 catch(std::bad_alloc&)
1906 {
1907 return error(GL_OUT_OF_MEMORY);
1908 }
1909}
1910
1911void __stdcall glGetProgramiv(GLuint program, GLenum pname, GLint* params)
1912{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001913 TRACE("(GLuint program = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", program, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001914
1915 try
1916 {
1917 gl::Context *context = gl::getContext();
1918
1919 if (context)
1920 {
1921 gl::Program *programObject = context->getProgram(program);
1922
1923 if (!programObject)
1924 {
1925 return error(GL_INVALID_VALUE);
1926 }
1927
1928 switch (pname)
1929 {
1930 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00001931 *params = programObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001932 return;
1933 case GL_LINK_STATUS:
1934 *params = programObject->isLinked();
1935 return;
1936 case GL_VALIDATE_STATUS:
1937 UNIMPLEMENTED(); // FIXME
1938 *params = GL_TRUE;
1939 return;
1940 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00001941 *params = programObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001942 return;
1943 case GL_ATTACHED_SHADERS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00001944 *params = programObject->getAttachedShadersCount();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001945 return;
1946 case GL_ACTIVE_ATTRIBUTES:
1947 UNIMPLEMENTED(); // FIXME
1948 *params = 0;
1949 return;
1950 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
1951 UNIMPLEMENTED(); // FIXME
1952 *params = 0;
1953 return;
1954 case GL_ACTIVE_UNIFORMS:
1955 UNIMPLEMENTED(); // FIXME
1956 *params = 0;
1957 return;
1958 case GL_ACTIVE_UNIFORM_MAX_LENGTH:
1959 UNIMPLEMENTED(); // FIXME
1960 *params = 0;
1961 return;
1962 default:
1963 return error(GL_INVALID_ENUM);
1964 }
1965 }
1966 }
1967 catch(std::bad_alloc&)
1968 {
1969 return error(GL_OUT_OF_MEMORY);
1970 }
1971}
1972
1973void __stdcall glGetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, char* infolog)
1974{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00001975 TRACE("(GLuint program = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, char* infolog = 0x%0.8p)",
1976 program, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001977
1978 try
1979 {
1980 if (bufsize < 0)
1981 {
1982 return error(GL_INVALID_VALUE);
1983 }
1984
daniel@transgaming.comcba50572010-03-28 19:36:09 +00001985 gl::Context *context = gl::getContext();
1986
1987 if (context)
1988 {
1989 gl::Program *programObject = context->getProgram(program);
1990
1991 if (!programObject)
1992 {
1993 return error(GL_INVALID_VALUE);
1994 }
1995
1996 programObject->getInfoLog(bufsize, length, infolog);
1997 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001998 }
1999 catch(std::bad_alloc&)
2000 {
2001 return error(GL_OUT_OF_MEMORY);
2002 }
2003}
2004
2005void __stdcall glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params)
2006{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002007 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 +00002008
2009 try
2010 {
2011 UNIMPLEMENTED(); // FIXME
2012 }
2013 catch(std::bad_alloc&)
2014 {
2015 return error(GL_OUT_OF_MEMORY);
2016 }
2017}
2018
2019void __stdcall glGetShaderiv(GLuint shader, GLenum pname, GLint* params)
2020{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002021 TRACE("(GLuint shader = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", shader, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002022
2023 try
2024 {
2025 gl::Context *context = gl::getContext();
2026
2027 if (context)
2028 {
2029 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00002030
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002031 if (!shaderObject)
2032 {
2033 return error(GL_INVALID_VALUE);
2034 }
2035
2036 switch (pname)
2037 {
2038 case GL_SHADER_TYPE:
2039 *params = shaderObject->getType();
2040 return;
2041 case GL_DELETE_STATUS:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00002042 *params = shaderObject->isFlaggedForDeletion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002043 return;
2044 case GL_COMPILE_STATUS:
2045 *params = shaderObject->isCompiled() ? GL_TRUE : GL_FALSE;
2046 return;
2047 case GL_INFO_LOG_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00002048 *params = shaderObject->getInfoLogLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002049 return;
2050 case GL_SHADER_SOURCE_LENGTH:
daniel@transgaming.comcba50572010-03-28 19:36:09 +00002051 *params = shaderObject->getSourceLength();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002052 return;
2053 default:
2054 return error(GL_INVALID_ENUM);
2055 }
2056 }
2057 }
2058 catch(std::bad_alloc&)
2059 {
2060 return error(GL_OUT_OF_MEMORY);
2061 }
2062}
2063
2064void __stdcall glGetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, char* infolog)
2065{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002066 TRACE("(GLuint shader = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, char* infolog = 0x%0.8p)",
2067 shader, bufsize, length, infolog);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002068
2069 try
2070 {
2071 if (bufsize < 0)
2072 {
2073 return error(GL_INVALID_VALUE);
2074 }
2075
daniel@transgaming.comcba50572010-03-28 19:36:09 +00002076 gl::Context *context = gl::getContext();
2077
2078 if (context)
2079 {
2080 gl::Shader *shaderObject = context->getShader(shader);
2081
2082 if (!shaderObject)
2083 {
2084 return error(GL_INVALID_VALUE);
2085 }
2086
2087 shaderObject->getInfoLog(bufsize, length, infolog);
2088 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002089 }
2090 catch(std::bad_alloc&)
2091 {
2092 return error(GL_OUT_OF_MEMORY);
2093 }
2094}
2095
2096void __stdcall glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision)
2097{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002098 TRACE("(GLenum shadertype = 0x%X, GLenum precisiontype = 0x%X, GLint* range = 0x%0.8p, GLint* precision = 0x%0.8p)",
2099 shadertype, precisiontype, range, precision);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002100
2101 try
2102 {
2103 UNIMPLEMENTED(); // FIXME
2104 }
2105 catch(std::bad_alloc&)
2106 {
2107 return error(GL_OUT_OF_MEMORY);
2108 }
2109}
2110
2111void __stdcall glGetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, char* source)
2112{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002113 TRACE("(GLuint shader = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, char* source = 0x%0.8p)",
2114 shader, bufsize, length, source);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002115
2116 try
2117 {
2118 if (bufsize < 0)
2119 {
2120 return error(GL_INVALID_VALUE);
2121 }
2122
daniel@transgaming.comcba50572010-03-28 19:36:09 +00002123 gl::Context *context = gl::getContext();
2124
2125 if (context)
2126 {
2127 gl::Shader *shaderObject = context->getShader(shader);
2128
2129 if (!shaderObject)
2130 {
2131 return error(GL_INVALID_VALUE);
2132 }
2133
2134 shaderObject->getSource(bufsize, length, source);
2135 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002136 }
2137 catch(std::bad_alloc&)
2138 {
2139 return error(GL_OUT_OF_MEMORY);
2140 }
2141}
2142
2143const GLubyte* __stdcall glGetString(GLenum name)
2144{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002145 TRACE("(GLenum name = 0x%X)", name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002146
2147 try
2148 {
2149 switch (name)
2150 {
2151 case GL_VENDOR:
2152 return (GLubyte*)"TransGaming Inc.";
2153 case GL_RENDERER:
2154 return (GLubyte*)"ANGLE";
2155 case GL_VERSION:
2156 return (GLubyte*)"OpenGL ES 2.0 (git-devel "__DATE__ " " __TIME__")";
2157 case GL_SHADING_LANGUAGE_VERSION:
2158 return (GLubyte*)"OpenGL ES GLSL ES 1.00 (git-devel "__DATE__ " " __TIME__")";
2159 case GL_EXTENSIONS:
2160 return (GLubyte*)"";
2161 default:
2162 return error(GL_INVALID_ENUM, (GLubyte*)NULL);
2163 }
2164 }
2165 catch(std::bad_alloc&)
2166 {
2167 return error(GL_OUT_OF_MEMORY, (GLubyte*)NULL);
2168 }
2169
2170 return NULL;
2171}
2172
2173void __stdcall glGetTexParameterfv(GLenum target, GLenum pname, GLfloat* params)
2174{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002175 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 +00002176
2177 try
2178 {
2179 UNIMPLEMENTED(); // FIXME
2180 }
2181 catch(std::bad_alloc&)
2182 {
2183 return error(GL_OUT_OF_MEMORY);
2184 }
2185}
2186
2187void __stdcall glGetTexParameteriv(GLenum target, GLenum pname, GLint* params)
2188{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002189 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 +00002190
2191 try
2192 {
2193 UNIMPLEMENTED(); // FIXME
2194 }
2195 catch(std::bad_alloc&)
2196 {
2197 return error(GL_OUT_OF_MEMORY);
2198 }
2199}
2200
2201void __stdcall glGetUniformfv(GLuint program, GLint location, GLfloat* params)
2202{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002203 TRACE("(GLuint program = %d, GLint location = %d, GLfloat* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002204
2205 try
2206 {
2207 UNIMPLEMENTED(); // FIXME
2208 }
2209 catch(std::bad_alloc&)
2210 {
2211 return error(GL_OUT_OF_MEMORY);
2212 }
2213}
2214
2215void __stdcall glGetUniformiv(GLuint program, GLint location, GLint* params)
2216{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002217 TRACE("(GLuint program = %d, GLint location = %d, GLint* params = 0x%0.8p)", program, location, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002218
2219 try
2220 {
2221 UNIMPLEMENTED(); // FIXME
2222 }
2223 catch(std::bad_alloc&)
2224 {
2225 return error(GL_OUT_OF_MEMORY);
2226 }
2227}
2228
2229int __stdcall glGetUniformLocation(GLuint program, const char* name)
2230{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002231 TRACE("(GLuint program = %d, const char* name = 0x%0.8p)", program, name);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002232
2233 try
2234 {
2235 gl::Context *context = gl::getContext();
2236
2237 if (strstr(name, "gl_") == name)
2238 {
2239 return -1;
2240 }
2241
2242 if (context)
2243 {
2244 gl::Program *programObject = context->getProgram(program);
2245
2246 if (!programObject)
2247 {
2248 return error(GL_INVALID_VALUE, -1);
2249 }
2250
2251 if (!programObject->isLinked())
2252 {
2253 return error(GL_INVALID_OPERATION, -1);
2254 }
2255
2256 return programObject->getUniformLocation(name);
2257 }
2258 }
2259 catch(std::bad_alloc&)
2260 {
2261 return error(GL_OUT_OF_MEMORY, -1);
2262 }
2263
2264 return -1;
2265}
2266
2267void __stdcall glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params)
2268{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002269 TRACE("(GLuint index = %d, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002270
2271 try
2272 {
2273 if (index >= gl::MAX_VERTEX_ATTRIBS)
2274 {
2275 return error(GL_INVALID_VALUE);
2276 }
2277
2278 UNIMPLEMENTED(); // FIXME
2279 }
2280 catch(std::bad_alloc&)
2281 {
2282 return error(GL_OUT_OF_MEMORY);
2283 }
2284}
2285
2286void __stdcall glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params)
2287{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002288 TRACE("(GLuint index = %d, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", index, pname, params);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002289
2290 try
2291 {
2292 if (index >= gl::MAX_VERTEX_ATTRIBS)
2293 {
2294 return error(GL_INVALID_VALUE);
2295 }
2296
2297 UNIMPLEMENTED(); // FIXME
2298 }
2299 catch(std::bad_alloc&)
2300 {
2301 return error(GL_OUT_OF_MEMORY);
2302 }
2303}
2304
2305void __stdcall glGetVertexAttribPointerv(GLuint index, GLenum pname, void** pointer)
2306{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002307 TRACE("(GLuint index = %d, GLenum pname = 0x%X, void** pointer = 0x%0.8p)", index, pname, pointer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002308
2309 try
2310 {
2311 if (index >= gl::MAX_VERTEX_ATTRIBS)
2312 {
2313 return error(GL_INVALID_VALUE);
2314 }
2315
2316 UNIMPLEMENTED(); // FIXME
2317 }
2318 catch(std::bad_alloc&)
2319 {
2320 return error(GL_OUT_OF_MEMORY);
2321 }
2322}
2323
2324void __stdcall glHint(GLenum target, GLenum mode)
2325{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002326 TRACE("(GLenum target = 0x%X, GLenum mode = 0x%X)", target, mode);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002327
2328 try
2329 {
daniel@transgaming.com5949aa12010-03-21 04:31:15 +00002330 switch (target)
2331 {
2332 case GL_GENERATE_MIPMAP_HINT:
2333 switch (mode)
2334 {
2335 case GL_FASTEST:
2336 case GL_NICEST:
2337 case GL_DONT_CARE:
2338 break;
2339 default:
2340 return error(GL_INVALID_ENUM);
2341 }
2342 break;
2343 default:
2344 return error(GL_INVALID_ENUM);
2345 }
2346
2347 gl::Context *context = gl::getContext();
2348 if (context)
2349 {
2350 if (target == GL_GENERATE_MIPMAP_HINT)
2351 context->generateMipmapHint = mode;
2352 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002353 }
2354 catch(std::bad_alloc&)
2355 {
2356 return error(GL_OUT_OF_MEMORY);
2357 }
2358}
2359
2360GLboolean __stdcall glIsBuffer(GLuint buffer)
2361{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002362 TRACE("(GLuint buffer = %d)", buffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002363
2364 try
2365 {
2366 gl::Context *context = gl::getContext();
2367
2368 if (context && buffer)
2369 {
2370 gl::Buffer *bufferObject = context->getBuffer(buffer);
2371
2372 if (bufferObject)
2373 {
2374 return GL_TRUE;
2375 }
2376 }
2377 }
2378 catch(std::bad_alloc&)
2379 {
2380 return error(GL_OUT_OF_MEMORY, GL_FALSE);
2381 }
2382
2383 return GL_FALSE;
2384}
2385
2386GLboolean __stdcall glIsEnabled(GLenum cap)
2387{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002388 TRACE("(GLenum cap = 0x%X)", cap);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002389
2390 try
2391 {
2392 gl::Context *context = gl::getContext();
2393
2394 if (context)
2395 {
2396 switch (cap)
2397 {
2398 case GL_CULL_FACE: return context->cullFace;
2399 case GL_POLYGON_OFFSET_FILL: return context->polygonOffsetFill;
2400 case GL_SAMPLE_ALPHA_TO_COVERAGE: return context->sampleAlphaToCoverage;
2401 case GL_SAMPLE_COVERAGE: return context->sampleCoverage;
2402 case GL_SCISSOR_TEST: return context->scissorTest;
2403 case GL_STENCIL_TEST: return context->stencilTest;
2404 case GL_DEPTH_TEST: return context->depthTest;
2405 case GL_BLEND: return context->blend;
2406 case GL_DITHER: return context->dither;
2407 default:
2408 return error(GL_INVALID_ENUM, false);
2409 }
2410 }
2411 }
2412 catch(std::bad_alloc&)
2413 {
2414 return error(GL_OUT_OF_MEMORY, false);
2415 }
2416
2417 return false;
2418}
2419
2420GLboolean __stdcall glIsFramebuffer(GLuint framebuffer)
2421{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002422 TRACE("(GLuint framebuffer = %d)", framebuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002423
2424 try
2425 {
2426 gl::Context *context = gl::getContext();
2427
2428 if (context && framebuffer)
2429 {
2430 gl::Framebuffer *framebufferObject = context->getFramebuffer(framebuffer);
2431
2432 if (framebufferObject)
2433 {
2434 return GL_TRUE;
2435 }
2436 }
2437 }
2438 catch(std::bad_alloc&)
2439 {
2440 return error(GL_OUT_OF_MEMORY, GL_FALSE);
2441 }
2442
2443 return GL_FALSE;
2444}
2445
2446GLboolean __stdcall glIsProgram(GLuint program)
2447{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002448 TRACE("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002449
2450 try
2451 {
2452 gl::Context *context = gl::getContext();
2453
2454 if (context && program)
2455 {
2456 gl::Program *programObject = context->getProgram(program);
2457
2458 if (programObject)
2459 {
2460 return GL_TRUE;
2461 }
2462 }
2463 }
2464 catch(std::bad_alloc&)
2465 {
2466 return error(GL_OUT_OF_MEMORY, GL_FALSE);
2467 }
2468
2469 return GL_FALSE;
2470}
2471
2472GLboolean __stdcall glIsRenderbuffer(GLuint renderbuffer)
2473{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002474 TRACE("(GLuint renderbuffer = %d)", renderbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002475
2476 try
2477 {
2478 gl::Context *context = gl::getContext();
2479
2480 if (context && renderbuffer)
2481 {
2482 gl::Renderbuffer *renderbufferObject = context->getRenderbuffer(renderbuffer);
2483
2484 if (renderbufferObject)
2485 {
2486 return GL_TRUE;
2487 }
2488 }
2489 }
2490 catch(std::bad_alloc&)
2491 {
2492 return error(GL_OUT_OF_MEMORY, GL_FALSE);
2493 }
2494
2495 return GL_FALSE;
2496}
2497
2498GLboolean __stdcall glIsShader(GLuint shader)
2499{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002500 TRACE("(GLuint shader = %d)", shader);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002501
2502 try
2503 {
2504 gl::Context *context = gl::getContext();
2505
2506 if (context && shader)
2507 {
2508 gl::Shader *shaderObject = context->getShader(shader);
2509
2510 if (shaderObject)
2511 {
2512 return GL_TRUE;
2513 }
2514 }
2515 }
2516 catch(std::bad_alloc&)
2517 {
2518 return error(GL_OUT_OF_MEMORY, GL_FALSE);
2519 }
2520
2521 return GL_FALSE;
2522}
2523
2524GLboolean __stdcall glIsTexture(GLuint texture)
2525{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002526 TRACE("(GLuint texture = %d)", texture);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002527
2528 try
2529 {
2530 gl::Context *context = gl::getContext();
2531
2532 if (context && texture)
2533 {
2534 gl::Texture *textureObject = context->getTexture(texture);
2535
2536 if (textureObject)
2537 {
2538 return GL_TRUE;
2539 }
2540 }
2541 }
2542 catch(std::bad_alloc&)
2543 {
2544 return error(GL_OUT_OF_MEMORY, GL_FALSE);
2545 }
2546
2547 return GL_FALSE;
2548}
2549
2550void __stdcall glLineWidth(GLfloat width)
2551{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002552 TRACE("(GLfloat width = %f)", width);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002553
2554 try
2555 {
2556 if (width <= 0.0f)
2557 {
2558 return error(GL_INVALID_VALUE);
2559 }
2560
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00002561 gl::Context *context = gl::getContext();
2562
2563 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002564 {
daniel@transgaming.com32e58cd2010-03-24 09:44:10 +00002565 context->lineWidth = width;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002566 }
2567 }
2568 catch(std::bad_alloc&)
2569 {
2570 return error(GL_OUT_OF_MEMORY);
2571 }
2572}
2573
2574void __stdcall glLinkProgram(GLuint program)
2575{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002576 TRACE("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002577
2578 try
2579 {
2580 gl::Context *context = gl::getContext();
2581
2582 if (context)
2583 {
2584 gl::Program *programObject = context->getProgram(program);
2585
2586 if (!programObject)
2587 {
2588 return error(GL_INVALID_VALUE);
2589 }
2590
2591 programObject->link();
2592 }
2593 }
2594 catch(std::bad_alloc&)
2595 {
2596 return error(GL_OUT_OF_MEMORY);
2597 }
2598}
2599
2600void __stdcall glPixelStorei(GLenum pname, GLint param)
2601{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002602 TRACE("(GLenum pname = 0x%X, GLint param = %d)", pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002603
2604 try
2605 {
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00002606 gl::Context *context = gl::getContext();
2607
2608 if (context)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002609 {
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00002610 switch (pname)
2611 {
2612 case GL_UNPACK_ALIGNMENT:
2613 if (param != 1 && param != 2 && param != 4 && param != 8)
2614 {
2615 return error(GL_INVALID_VALUE);
2616 }
2617
2618 context->unpackAlignment = param;
2619 break;
2620
2621 case GL_PACK_ALIGNMENT:
2622 if (param != 1 && param != 2 && param != 4 && param != 8)
2623 {
2624 return error(GL_INVALID_VALUE);
2625 }
2626
2627 context->packAlignment = param;
2628 break;
2629
2630 default:
2631 return error(GL_INVALID_ENUM);
2632 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002633 }
2634 }
2635 catch(std::bad_alloc&)
2636 {
2637 return error(GL_OUT_OF_MEMORY);
2638 }
2639}
2640
2641void __stdcall glPolygonOffset(GLfloat factor, GLfloat units)
2642{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002643 TRACE("(GLfloat factor = %f, GLfloat units = %f)", factor, units);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002644
2645 try
2646 {
2647 if (factor != 0.0f || units != 0.0f)
2648 {
2649 UNIMPLEMENTED(); // FIXME
2650 }
2651 }
2652 catch(std::bad_alloc&)
2653 {
2654 return error(GL_OUT_OF_MEMORY);
2655 }
2656}
2657
2658void __stdcall glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void* pixels)
2659{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002660 TRACE("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
2661 "GLenum format = 0x%X, GLenum type = 0x%X, void* pixels = 0x%0.8p)",
2662 x, y, width, height, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002663
2664 try
2665 {
2666 if (width < 0 || height < 0)
2667 {
2668 return error(GL_INVALID_VALUE);
2669 }
2670
2671 switch (format)
2672 {
2673 case GL_RGBA:
2674 switch (type)
2675 {
2676 case GL_UNSIGNED_BYTE:
2677 break;
2678 default:
2679 return error(GL_INVALID_OPERATION);
2680 }
2681 break;
2682 case gl::IMPLEMENTATION_COLOR_READ_FORMAT:
2683 switch (type)
2684 {
2685 case gl::IMPLEMENTATION_COLOR_READ_TYPE:
2686 break;
2687 default:
2688 return error(GL_INVALID_OPERATION);
2689 }
2690 break;
2691 default:
2692 return error(GL_INVALID_OPERATION);
2693 }
2694
2695 gl::Context *context = gl::getContext();
2696
2697 if (context)
2698 {
2699 context->readPixels(x, y, width, height, format, type, pixels);
2700 }
2701 }
2702 catch(std::bad_alloc&)
2703 {
2704 return error(GL_OUT_OF_MEMORY);
2705 }
2706}
2707
2708void __stdcall glReleaseShaderCompiler(void)
2709{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002710 TRACE("()");
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002711
2712 try
2713 {
2714 gl::Shader::releaseCompiler();
2715 }
2716 catch(std::bad_alloc&)
2717 {
2718 return error(GL_OUT_OF_MEMORY);
2719 }
2720}
2721
2722void __stdcall glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
2723{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002724 TRACE("(GLenum target = 0x%X, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
2725 target, internalformat, width, height);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002726
2727 try
2728 {
2729 switch (target)
2730 {
2731 case GL_RENDERBUFFER:
2732 break;
2733 default:
2734 return error(GL_INVALID_ENUM);
2735 }
2736
2737 switch (internalformat)
2738 {
2739 case GL_DEPTH_COMPONENT16:
2740 case GL_RGBA4:
2741 case GL_RGB5_A1:
2742 case GL_RGB565:
2743 case GL_STENCIL_INDEX8:
2744 break;
2745 default:
2746 return error(GL_INVALID_ENUM);
2747 }
2748
2749 if (width < 0 || height < 0 || width > gl::MAX_RENDERBUFFER_SIZE || height > gl::MAX_RENDERBUFFER_SIZE)
2750 {
2751 return error(GL_INVALID_VALUE);
2752 }
2753
2754 gl::Context *context = gl::getContext();
2755
2756 if (context)
2757 {
2758 if (context->framebuffer == 0 || context->renderbuffer == 0)
2759 {
2760 return error(GL_INVALID_OPERATION);
2761 }
2762
2763 switch (internalformat)
2764 {
2765 case GL_DEPTH_COMPONENT16:
2766 context->setRenderbuffer(new gl::Depthbuffer(width, height));
2767 break;
2768 case GL_RGBA4:
2769 case GL_RGB5_A1:
2770 case GL_RGB565:
2771 UNIMPLEMENTED(); // FIXME
daniel@transgaming.com4a9d65c2010-03-08 21:30:56 +00002772 // context->setRenderbuffer(new Colorbuffer(renderTarget));
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002773 break;
2774 case GL_STENCIL_INDEX8:
daniel@transgaming.com4a9d65c2010-03-08 21:30:56 +00002775 context->setRenderbuffer(new gl::Stencilbuffer(width, height));
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002776 break;
2777 default:
2778 return error(GL_INVALID_ENUM);
2779 }
2780 }
2781 }
2782 catch(std::bad_alloc&)
2783 {
2784 return error(GL_OUT_OF_MEMORY);
2785 }
2786}
2787
2788void __stdcall glSampleCoverage(GLclampf value, GLboolean invert)
2789{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002790 TRACE("(GLclampf value = %f, GLboolean invert = %d)", value, invert);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002791
2792 try
2793 {
2794 gl::Context* context = gl::getContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00002795
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002796 if (context)
2797 {
2798 context->sampleCoverageValue = gl::clamp01(value);
2799 context->sampleCoverageInvert = invert;
2800 }
2801 }
2802 catch(std::bad_alloc&)
2803 {
2804 return error(GL_OUT_OF_MEMORY);
2805 }
2806}
2807
2808void __stdcall glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
2809{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002810 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 +00002811
2812 try
2813 {
2814 if (width < 0 || height < 0)
2815 {
2816 return error(GL_INVALID_VALUE);
2817 }
2818
2819 gl::Context* context = gl::getContext();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00002820
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002821 if (context)
2822 {
2823 context->scissorX = x;
2824 context->scissorY = y;
2825 context->scissorWidth = width;
2826 context->scissorHeight = height;
2827 }
2828 }
2829 catch(std::bad_alloc&)
2830 {
2831 return error(GL_OUT_OF_MEMORY);
2832 }
2833}
2834
2835void __stdcall glShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryformat, const void* binary, GLsizei length)
2836{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002837 TRACE("(GLsizei n = %d, const GLuint* shaders = 0x%0.8p, GLenum binaryformat = 0x%X, "
2838 "const void* binary = 0x%0.8p, GLsizei length = %d)",
2839 n, shaders, binaryformat, binary, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002840
2841 try
2842 {
2843 if (n < 0 || length < 0)
2844 {
2845 return error(GL_INVALID_VALUE);
2846 }
2847
2848 UNIMPLEMENTED(); // FIXME
2849 }
2850 catch(std::bad_alloc&)
2851 {
2852 return error(GL_OUT_OF_MEMORY);
2853 }
2854}
2855
2856void __stdcall glShaderSource(GLuint shader, GLsizei count, const char** string, const GLint* length)
2857{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002858 TRACE("(GLuint shader = %d, GLsizei count = %d, const char** string = 0x%0.8p, const GLint* length = 0x%0.8p)",
2859 shader, count, string, length);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002860
2861 try
2862 {
2863 if (count < 0)
2864 {
2865 return error(GL_INVALID_VALUE);
2866 }
2867
2868 gl::Context *context = gl::getContext();
2869
2870 if (context)
2871 {
2872 gl::Shader *shaderObject = context->getShader(shader);
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00002873
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002874 if (!shaderObject)
2875 {
2876 return error(GL_INVALID_VALUE);
2877 }
2878
2879 shaderObject->setSource(count, string, length);
2880 }
2881 }
2882 catch(std::bad_alloc&)
2883 {
2884 return error(GL_OUT_OF_MEMORY);
2885 }
2886}
2887
2888void __stdcall glStencilFunc(GLenum func, GLint ref, GLuint mask)
2889{
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00002890 glStencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002891}
2892
2893void __stdcall glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
2894{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002895 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 +00002896
2897 try
2898 {
2899 switch (face)
2900 {
2901 case GL_FRONT:
2902 case GL_BACK:
2903 case GL_FRONT_AND_BACK:
2904 break;
2905 default:
2906 return error(GL_INVALID_ENUM);
2907 }
2908
2909 switch (func)
2910 {
2911 case GL_NEVER:
2912 case GL_ALWAYS:
2913 case GL_LESS:
2914 case GL_LEQUAL:
2915 case GL_EQUAL:
2916 case GL_GEQUAL:
2917 case GL_GREATER:
2918 case GL_NOTEQUAL:
2919 break;
2920 default:
2921 return error(GL_INVALID_ENUM);
2922 }
2923
2924 gl::Context *context = gl::getContext();
2925
2926 if (context)
2927 {
2928 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
2929 {
2930 context->stencilFunc = func;
2931 context->stencilRef = ref;
2932 context->stencilMask = mask;
2933 }
2934
2935 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
2936 {
2937 context->stencilBackFunc = func;
2938 context->stencilBackRef = ref;
2939 context->stencilBackMask = mask;
2940 }
2941 }
2942 }
2943 catch(std::bad_alloc&)
2944 {
2945 return error(GL_OUT_OF_MEMORY);
2946 }
2947}
2948
2949void __stdcall glStencilMask(GLuint mask)
2950{
2951 glStencilMaskSeparate(GL_FRONT_AND_BACK, mask);
2952}
2953
2954void __stdcall glStencilMaskSeparate(GLenum face, GLuint mask)
2955{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002956 TRACE("(GLenum face = 0x%X, GLuint mask = %d)", face, mask);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00002957
2958 try
2959 {
2960 switch (face)
2961 {
2962 case GL_FRONT:
2963 case GL_BACK:
2964 case GL_FRONT_AND_BACK:
2965 break;
2966 default:
2967 return error(GL_INVALID_ENUM);
2968 }
2969
2970 gl::Context *context = gl::getContext();
2971
2972 if (context)
2973 {
2974 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
2975 {
2976 context->stencilWritemask = mask;
2977 }
2978
2979 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
2980 {
2981 context->stencilBackWritemask = mask;
2982 }
2983 }
2984 }
2985 catch(std::bad_alloc&)
2986 {
2987 return error(GL_OUT_OF_MEMORY);
2988 }
2989}
2990
2991void __stdcall glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
2992{
2993 glStencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
2994}
2995
2996void __stdcall glStencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
2997{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00002998 TRACE("(GLenum face = 0x%X, GLenum fail = 0x%X, GLenum zfail = 0x%X, GLenum zpas = 0x%Xs)",
2999 face, fail, zfail, zpass);
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 switch (fail)
3014 {
3015 case GL_ZERO:
3016 case GL_KEEP:
3017 case GL_REPLACE:
3018 case GL_INCR:
3019 case GL_DECR:
3020 case GL_INVERT:
3021 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00003022 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003023 break;
3024 default:
3025 return error(GL_INVALID_ENUM);
3026 }
3027
3028 switch (zfail)
3029 {
3030 case GL_ZERO:
3031 case GL_KEEP:
3032 case GL_REPLACE:
3033 case GL_INCR:
3034 case GL_DECR:
3035 case GL_INVERT:
3036 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00003037 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003038 break;
3039 default:
3040 return error(GL_INVALID_ENUM);
3041 }
3042
3043 switch (zpass)
3044 {
3045 case GL_ZERO:
3046 case GL_KEEP:
3047 case GL_REPLACE:
3048 case GL_INCR:
3049 case GL_DECR:
3050 case GL_INVERT:
3051 case GL_INCR_WRAP:
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00003052 case GL_DECR_WRAP:
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003053 break;
3054 default:
3055 return error(GL_INVALID_ENUM);
3056 }
3057
3058 gl::Context *context = gl::getContext();
3059
3060 if (context)
3061 {
3062 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
3063 {
3064 context->stencilFail = fail;
3065 context->stencilPassDepthFail = zfail;
3066 context->stencilPassDepthPass = zpass;
3067 }
3068
3069 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
3070 {
3071 context->stencilBackFail = fail;
3072 context->stencilBackPassDepthFail = zfail;
3073 context->stencilBackPassDepthPass = zpass;
3074 }
3075 }
3076 }
3077 catch(std::bad_alloc&)
3078 {
3079 return error(GL_OUT_OF_MEMORY);
3080 }
3081}
3082
3083void __stdcall glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void* pixels)
3084{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003085 TRACE("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, GLsizei height = %d, "
3086 "GLint border = %d, GLenum format = 0x%X, GLenum type = 0x%X, const void* pixels = 0x%0.8p)",
3087 target, level, internalformat, width, height, border, format, type, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003088
3089 try
3090 {
3091 if (level < 0 || width < 0 || height < 0)
3092 {
3093 return error(GL_INVALID_VALUE);
3094 }
3095
3096 if (level > 0 && (!gl::isPow2(width) || !gl::isPow2(height)))
3097 {
3098 return error(GL_INVALID_VALUE);
3099 }
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +00003100
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003101 switch (target)
3102 {
3103 case GL_TEXTURE_2D:
3104 if (width > (gl::MAX_TEXTURE_SIZE >> level) || height > (gl::MAX_TEXTURE_SIZE >> level))
3105 {
3106 return error(GL_INVALID_VALUE);
3107 }
3108 break;
3109 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
3110 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
3111 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
3112 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
3113 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
3114 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
3115 if (!gl::isPow2(width) || !gl::isPow2(height))
3116 {
3117 return error(GL_INVALID_VALUE);
3118 }
3119
3120 if (width > (gl::MAX_CUBE_MAP_TEXTURE_SIZE >> level) || height > (gl::MAX_CUBE_MAP_TEXTURE_SIZE >> level))
3121 {
3122 return error(GL_INVALID_VALUE);
3123 }
3124 break;
3125 default:
3126 return error(GL_INVALID_ENUM);
3127 }
3128
3129 if (internalformat != format)
3130 {
3131 return error(GL_INVALID_OPERATION);
3132 }
3133
3134 switch (internalformat)
3135 {
3136 case GL_ALPHA:
3137 case GL_LUMINANCE:
3138 case GL_LUMINANCE_ALPHA:
3139 switch (type)
3140 {
3141 case GL_UNSIGNED_BYTE:
3142 break;
3143 default:
3144 return error(GL_INVALID_ENUM);
3145 }
3146 break;
3147 case GL_RGB:
3148 switch (type)
3149 {
3150 case GL_UNSIGNED_BYTE:
3151 case GL_UNSIGNED_SHORT_5_6_5:
3152 break;
3153 default:
3154 return error(GL_INVALID_ENUM);
3155 }
3156 break;
3157 case GL_RGBA:
3158 switch (type)
3159 {
3160 case GL_UNSIGNED_BYTE:
3161 case GL_UNSIGNED_SHORT_4_4_4_4:
3162 case GL_UNSIGNED_SHORT_5_5_5_1:
3163 break;
3164 default:
3165 return error(GL_INVALID_ENUM);
3166 }
3167 break;
3168 default:
3169 return error(GL_INVALID_VALUE);
3170 }
3171
3172 if (border != 0)
3173 {
3174 return error(GL_INVALID_VALUE);
3175 }
3176
3177 gl::Context *context = gl::getContext();
3178
3179 if (context)
3180 {
3181 if (target == GL_TEXTURE_2D)
3182 {
3183 gl::Texture2D *texture = context->getTexture2D();
3184
3185 if (!texture)
3186 {
3187 return error(GL_INVALID_OPERATION);
3188 }
3189
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00003190 texture->setImage(level, internalformat, width, height, format, type, context->unpackAlignment, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003191 }
3192 else
3193 {
3194 gl::TextureCubeMap *texture = context->getTextureCubeMap();
3195
3196 if (!texture)
3197 {
3198 return error(GL_INVALID_OPERATION);
3199 }
3200
3201 switch (target)
3202 {
3203 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00003204 texture->setImagePosX(level, internalformat, width, height, format, type, context->unpackAlignment, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003205 break;
3206 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00003207 texture->setImageNegX(level, internalformat, width, height, format, type, context->unpackAlignment, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003208 break;
3209 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00003210 texture->setImagePosY(level, internalformat, width, height, format, type, context->unpackAlignment, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003211 break;
3212 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00003213 texture->setImageNegY(level, internalformat, width, height, format, type, context->unpackAlignment, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003214 break;
3215 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00003216 texture->setImagePosZ(level, internalformat, width, height, format, type, context->unpackAlignment, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003217 break;
3218 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00003219 texture->setImageNegZ(level, internalformat, width, height, format, type, context->unpackAlignment, pixels);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003220 break;
3221 default: UNREACHABLE();
3222 }
3223 }
3224 }
3225 }
3226 catch(std::bad_alloc&)
3227 {
3228 return error(GL_OUT_OF_MEMORY);
3229 }
3230}
3231
3232void __stdcall glTexParameterf(GLenum target, GLenum pname, GLfloat param)
3233{
3234 glTexParameteri(target, pname, (GLint)param);
3235}
3236
3237void __stdcall glTexParameterfv(GLenum target, GLenum pname, const GLfloat* params)
3238{
3239 glTexParameteri(target, pname, (GLint)*params);
3240}
3241
3242void __stdcall glTexParameteri(GLenum target, GLenum pname, GLint param)
3243{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003244 TRACE("(GLenum target = 0x%X, GLenum pname = 0x%X, GLfloat param = %f)", target, pname, param);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003245
3246 try
3247 {
3248 gl::Context *context = gl::getContext();
3249
3250 if (context)
3251 {
3252 gl::Texture *texture;
3253
3254 switch (target)
3255 {
3256 case GL_TEXTURE_2D:
3257 texture = context->getTexture2D();
3258 break;
3259 case GL_TEXTURE_CUBE_MAP:
3260 texture = context->getTextureCubeMap();
3261 break;
3262 default:
3263 return error(GL_INVALID_ENUM);
3264 }
3265
3266 switch (pname)
3267 {
3268 case GL_TEXTURE_WRAP_S:
3269 if (!texture->setWrapS((GLenum)param))
3270 {
3271 return error(GL_INVALID_ENUM);
3272 }
3273 break;
3274 case GL_TEXTURE_WRAP_T:
3275 if (!texture->setWrapT((GLenum)param))
3276 {
3277 return error(GL_INVALID_ENUM);
3278 }
3279 break;
3280 case GL_TEXTURE_MIN_FILTER:
3281 if (!texture->setMinFilter((GLenum)param))
3282 {
3283 return error(GL_INVALID_ENUM);
3284 }
3285 break;
3286 case GL_TEXTURE_MAG_FILTER:
3287 if (!texture->setMagFilter((GLenum)param))
3288 {
3289 return error(GL_INVALID_ENUM);
3290 }
3291 break;
3292 default:
3293 return error(GL_INVALID_ENUM);
3294 }
3295 }
3296 }
3297 catch(std::bad_alloc&)
3298 {
3299 return error(GL_OUT_OF_MEMORY);
3300 }
3301}
3302
3303void __stdcall glTexParameteriv(GLenum target, GLenum pname, const GLint* params)
3304{
3305 glTexParameteri(target, pname, *params);
3306}
3307
3308void __stdcall glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* pixels)
3309{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003310 TRACE("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
3311 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, GLenum type = 0x%X, "
3312 "const void* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003313 target, level, xoffset, yoffset, width, height, format, type, pixels);
3314
3315 try
3316 {
daniel@transgaming.com00c75962010-03-11 20:36:15 +00003317 if (target != GL_TEXTURE_2D && !es2dx::IsCubemapTextureTarget(target))
3318 {
3319 return error(GL_INVALID_ENUM);
3320 }
3321
3322 if (level < 0 || level > gl::MAX_TEXTURE_LEVELS || xoffset < 0 || yoffset < 0 || width < 0 || height < 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003323 {
3324 return error(GL_INVALID_VALUE);
3325 }
3326
daniel@transgaming.com00c75962010-03-11 20:36:15 +00003327 if (std::numeric_limits<GLsizei>::max() - xoffset < width || std::numeric_limits<GLsizei>::max() - yoffset < height)
3328 {
3329 return error(GL_INVALID_VALUE);
3330 }
3331
3332 if (!es2dx::CheckTextureFormatType(format, type))
3333 {
3334 return error(GL_INVALID_ENUM);
3335 }
3336
3337 if (width == 0 || height == 0 || pixels == NULL)
3338 {
3339 return;
3340 }
3341
3342 gl::Context *context = gl::getContext();
3343
3344 if (context)
3345 {
3346 if (target == GL_TEXTURE_2D)
3347 {
3348 gl::Texture2D *texture = context->getTexture2D();
3349
3350 if (!texture)
3351 {
3352 return error(GL_INVALID_OPERATION);
3353 }
3354
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00003355 texture->subImage(level, xoffset, yoffset, width, height, format, type, context->unpackAlignment, pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00003356 }
3357 else if (es2dx::IsCubemapTextureTarget(target))
3358 {
3359 gl::TextureCubeMap *texture = context->getTextureCubeMap();
3360
3361 if (!texture)
3362 {
3363 return error(GL_INVALID_OPERATION);
3364 }
3365
daniel@transgaming.com3489e3a2010-03-21 04:31:11 +00003366 texture->subImage(target, level, xoffset, yoffset, width, height, format, type, context->unpackAlignment, pixels);
daniel@transgaming.com00c75962010-03-11 20:36:15 +00003367 }
3368 else
3369 {
3370 UNREACHABLE();
3371 }
3372 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003373 }
3374 catch(std::bad_alloc&)
3375 {
3376 return error(GL_OUT_OF_MEMORY);
3377 }
3378}
3379
3380void __stdcall glUniform1f(GLint location, GLfloat x)
3381{
3382 glUniform1fv(location, 1, &x);
3383}
3384
3385void __stdcall glUniform1fv(GLint location, GLsizei count, const GLfloat* v)
3386{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003387 TRACE("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003388
3389 try
3390 {
3391 if (location == -1)
3392 {
3393 return;
3394 }
3395
3396 if (count < 0)
3397 {
3398 return error(GL_INVALID_VALUE);
3399 }
3400
3401 gl::Context *context = gl::getContext();
3402
3403 if (context)
3404 {
3405 gl::Program *program = context->getCurrentProgram();
3406
3407 if (!program)
3408 {
3409 return error(GL_INVALID_OPERATION);
3410 }
3411
3412 if (!program->setUniform1fv(location, count, v))
3413 {
3414 return error(GL_INVALID_OPERATION);
3415 }
3416 }
3417 }
3418 catch(std::bad_alloc&)
3419 {
3420 return error(GL_OUT_OF_MEMORY);
3421 }
3422}
3423
3424void __stdcall glUniform1i(GLint location, GLint x)
3425{
3426 glUniform1iv(location, 1, &x);
3427}
3428
3429void __stdcall glUniform1iv(GLint location, GLsizei count, const GLint* v)
3430{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003431 TRACE("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003432
3433 try
3434 {
3435 if (count < 0)
3436 {
3437 return error(GL_INVALID_VALUE);
3438 }
3439
3440 gl::Context *context = gl::getContext();
3441
3442 if (context)
3443 {
3444 gl::Program *program = context->getCurrentProgram();
3445
3446 if (!program)
3447 {
3448 return error(GL_INVALID_OPERATION);
3449 }
3450
3451 if (!program->setUniform1iv(location, count, v))
3452 {
3453 return error(GL_INVALID_OPERATION);
3454 }
3455 }
3456 }
3457 catch(std::bad_alloc&)
3458 {
3459 return error(GL_OUT_OF_MEMORY);
3460 }
3461}
3462
3463void __stdcall glUniform2f(GLint location, GLfloat x, GLfloat y)
3464{
3465 GLfloat xy[2] = {x, y};
3466
3467 glUniform2fv(location, 1, (GLfloat*)&xy);
3468}
3469
3470void __stdcall glUniform2fv(GLint location, GLsizei count, const GLfloat* v)
3471{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003472 TRACE("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003473
3474 try
3475 {
3476 if (location == -1)
3477 {
3478 return;
3479 }
3480
3481 if (count < 0)
3482 {
3483 return error(GL_INVALID_VALUE);
3484 }
3485
3486 gl::Context *context = gl::getContext();
3487
3488 if (context)
3489 {
3490 gl::Program *program = context->getCurrentProgram();
3491
3492 if (!program)
3493 {
3494 return error(GL_INVALID_OPERATION);
3495 }
3496
3497 if (!program->setUniform2fv(location, count, v))
3498 {
3499 return error(GL_INVALID_OPERATION);
3500 }
3501 }
3502 }
3503 catch(std::bad_alloc&)
3504 {
3505 return error(GL_OUT_OF_MEMORY);
3506 }
3507}
3508
3509void __stdcall glUniform2i(GLint location, GLint x, GLint y)
3510{
3511 GLint xy[4] = {x, y};
3512
3513 glUniform2iv(location, 1, (GLint*)&xy);
3514}
3515
3516void __stdcall glUniform2iv(GLint location, GLsizei count, const GLint* v)
3517{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003518 TRACE("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003519
3520 try
3521 {
3522 if (count < 0)
3523 {
3524 return error(GL_INVALID_VALUE);
3525 }
3526
3527 UNIMPLEMENTED(); // FIXME
3528 }
3529 catch(std::bad_alloc&)
3530 {
3531 return error(GL_OUT_OF_MEMORY);
3532 }
3533}
3534
3535void __stdcall glUniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
3536{
3537 GLfloat xyz[3] = {x, y, z};
3538
3539 glUniform3fv(location, 1, (GLfloat*)&xyz);
3540}
3541
3542void __stdcall glUniform3fv(GLint location, GLsizei count, const GLfloat* v)
3543{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003544 TRACE("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003545
3546 try
3547 {
3548 if (count < 0)
3549 {
3550 return error(GL_INVALID_VALUE);
3551 }
3552
3553 if (location == -1)
3554 {
3555 return;
3556 }
3557
3558 gl::Context *context = gl::getContext();
3559
3560 if (context)
3561 {
3562 gl::Program *program = context->getCurrentProgram();
3563
3564 if (!program)
3565 {
3566 return error(GL_INVALID_OPERATION);
3567 }
3568
3569 if (!program->setUniform3fv(location, count, v))
3570 {
3571 return error(GL_INVALID_OPERATION);
3572 }
3573 }
3574 }
3575 catch(std::bad_alloc&)
3576 {
3577 return error(GL_OUT_OF_MEMORY);
3578 }
3579}
3580
3581void __stdcall glUniform3i(GLint location, GLint x, GLint y, GLint z)
3582{
3583 GLint xyz[3] = {x, y, z};
3584
3585 glUniform3iv(location, 1, (GLint*)&xyz);
3586}
3587
3588void __stdcall glUniform3iv(GLint location, GLsizei count, const GLint* v)
3589{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003590 TRACE("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003591
3592 try
3593 {
3594 if (count < 0)
3595 {
3596 return error(GL_INVALID_VALUE);
3597 }
3598
3599 UNIMPLEMENTED(); // FIXME
3600 }
3601 catch(std::bad_alloc&)
3602 {
3603 return error(GL_OUT_OF_MEMORY);
3604 }
3605}
3606
3607void __stdcall glUniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
3608{
3609 GLfloat xyzw[4] = {x, y, z, w};
3610
3611 glUniform4fv(location, 1, (GLfloat*)&xyzw);
3612}
3613
3614void __stdcall glUniform4fv(GLint location, GLsizei count, const GLfloat* v)
3615{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003616 TRACE("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003617
3618 try
3619 {
3620 if (count < 0)
3621 {
3622 return error(GL_INVALID_VALUE);
3623 }
3624
3625 if (location == -1)
3626 {
3627 return;
3628 }
3629
3630 gl::Context *context = gl::getContext();
3631
3632 if (context)
3633 {
3634 gl::Program *program = context->getCurrentProgram();
3635
3636 if (!program)
3637 {
3638 return error(GL_INVALID_OPERATION);
3639 }
3640
3641 if (!program->setUniform4fv(location, count, v))
3642 {
3643 return error(GL_INVALID_OPERATION);
3644 }
3645 }
3646 }
3647 catch(std::bad_alloc&)
3648 {
3649 return error(GL_OUT_OF_MEMORY);
3650 }
3651}
3652
3653void __stdcall glUniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
3654{
3655 GLint xyzw[4] = {x, y, z, w};
3656
3657 glUniform4iv(location, 1, (GLint*)&xyzw);
3658}
3659
3660void __stdcall glUniform4iv(GLint location, GLsizei count, const GLint* v)
3661{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003662 TRACE("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003663
3664 try
3665 {
3666 if (count < 0)
3667 {
3668 return error(GL_INVALID_VALUE);
3669 }
3670
3671 UNIMPLEMENTED(); // FIXME
3672 }
3673 catch(std::bad_alloc&)
3674 {
3675 return error(GL_OUT_OF_MEMORY);
3676 }
3677}
3678
3679void __stdcall glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
3680{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003681 TRACE("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %d, const GLfloat* value = 0x%0.8p)",
3682 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003683
3684 try
3685 {
3686 if (count < 0 || transpose != GL_FALSE)
3687 {
3688 return error(GL_INVALID_VALUE);
3689 }
3690
3691 if (location == -1)
3692 {
3693 return;
3694 }
3695
3696 gl::Context *context = gl::getContext();
3697
3698 if (context)
3699 {
3700 gl::Program *program = context->getCurrentProgram();
3701
3702 if (!program)
3703 {
3704 return error(GL_INVALID_OPERATION);
3705 }
3706
3707 if (!program->setUniformMatrix2fv(location, count, value))
3708 {
3709 return error(GL_INVALID_OPERATION);
3710 }
3711 }
3712 }
3713 catch(std::bad_alloc&)
3714 {
3715 return error(GL_OUT_OF_MEMORY);
3716 }
3717}
3718
3719void __stdcall glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
3720{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003721 TRACE("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %d, const GLfloat* value = 0x%0.8p)",
3722 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003723
3724 try
3725 {
3726 if (count < 0 || transpose != GL_FALSE)
3727 {
3728 return error(GL_INVALID_VALUE);
3729 }
3730
3731 if (location == -1)
3732 {
3733 return;
3734 }
3735
3736 gl::Context *context = gl::getContext();
3737
3738 if (context)
3739 {
3740 gl::Program *program = context->getCurrentProgram();
3741
3742 if (!program)
3743 {
3744 return error(GL_INVALID_OPERATION);
3745 }
3746
3747 if (!program->setUniformMatrix3fv(location, count, value))
3748 {
3749 return error(GL_INVALID_OPERATION);
3750 }
3751 }
3752 }
3753 catch(std::bad_alloc&)
3754 {
3755 return error(GL_OUT_OF_MEMORY);
3756 }
3757}
3758
3759void __stdcall glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
3760{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003761 TRACE("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %d, const GLfloat* value = 0x%0.8p)",
3762 location, count, transpose, value);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003763
3764 try
3765 {
3766 if (count < 0 || transpose != GL_FALSE)
3767 {
3768 return error(GL_INVALID_VALUE);
3769 }
3770
3771 if (location == -1)
3772 {
3773 return;
3774 }
3775
3776 gl::Context *context = gl::getContext();
3777
3778 if (context)
3779 {
3780 gl::Program *program = context->getCurrentProgram();
3781
3782 if (!program)
3783 {
3784 return error(GL_INVALID_OPERATION);
3785 }
3786
3787 if (!program->setUniformMatrix4fv(location, count, value))
3788 {
3789 return error(GL_INVALID_OPERATION);
3790 }
3791 }
3792 }
3793 catch(std::bad_alloc&)
3794 {
3795 return error(GL_OUT_OF_MEMORY);
3796 }
3797}
3798
3799void __stdcall glUseProgram(GLuint program)
3800{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003801 TRACE("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003802
3803 try
3804 {
3805 gl::Context *context = gl::getContext();
3806
3807 if (context)
3808 {
3809 gl::Program *programObject = context->getProgram(program);
3810
3811 if (programObject && !programObject->isLinked())
3812 {
3813 return error(GL_INVALID_OPERATION);
3814 }
3815
3816 context->useProgram(program);
3817 }
3818 }
3819 catch(std::bad_alloc&)
3820 {
3821 return error(GL_OUT_OF_MEMORY);
3822 }
3823}
3824
3825void __stdcall glValidateProgram(GLuint program)
3826{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003827 TRACE("(GLuint program = %d)", program);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003828
3829 try
3830 {
3831 UNIMPLEMENTED(); // FIXME
3832 }
3833 catch(std::bad_alloc&)
3834 {
3835 return error(GL_OUT_OF_MEMORY);
3836 }
3837}
3838
3839void __stdcall glVertexAttrib1f(GLuint index, GLfloat x)
3840{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003841 TRACE("(GLuint index = %d, GLfloat x = %f)", index, x);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003842
3843 try
3844 {
3845 if (index >= gl::MAX_VERTEX_ATTRIBS)
3846 {
3847 return error(GL_INVALID_VALUE);
3848 }
3849
3850 UNIMPLEMENTED(); // FIXME
3851 }
3852 catch(std::bad_alloc&)
3853 {
3854 return error(GL_OUT_OF_MEMORY);
3855 }
3856}
3857
3858void __stdcall glVertexAttrib1fv(GLuint index, const GLfloat* values)
3859{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003860 TRACE("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003861
3862 try
3863 {
3864 if (index >= gl::MAX_VERTEX_ATTRIBS)
3865 {
3866 return error(GL_INVALID_VALUE);
3867 }
3868
3869 UNIMPLEMENTED(); // FIXME
3870 }
3871 catch(std::bad_alloc&)
3872 {
3873 return error(GL_OUT_OF_MEMORY);
3874 }
3875}
3876
3877void __stdcall glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
3878{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003879 TRACE("(GLuint index = %d, GLfloat x = %f, GLfloat y = %f)", index, x, y);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003880
3881 try
3882 {
3883 if (index >= gl::MAX_VERTEX_ATTRIBS)
3884 {
3885 return error(GL_INVALID_VALUE);
3886 }
3887
3888 UNIMPLEMENTED(); // FIXME
3889 }
3890 catch(std::bad_alloc&)
3891 {
3892 return error(GL_OUT_OF_MEMORY);
3893 }
3894}
3895
3896void __stdcall glVertexAttrib2fv(GLuint index, const GLfloat* values)
3897{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003898 TRACE("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003899
3900 try
3901 {
3902 if (index >= gl::MAX_VERTEX_ATTRIBS)
3903 {
3904 return error(GL_INVALID_VALUE);
3905 }
3906
3907 UNIMPLEMENTED(); // FIXME
3908 }
3909 catch(std::bad_alloc&)
3910 {
3911 return error(GL_OUT_OF_MEMORY);
3912 }
3913}
3914
3915void __stdcall glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
3916{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003917 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 +00003918
3919 try
3920 {
3921 if (index >= gl::MAX_VERTEX_ATTRIBS)
3922 {
3923 return error(GL_INVALID_VALUE);
3924 }
3925
3926 UNIMPLEMENTED(); // FIXME
3927 }
3928 catch(std::bad_alloc&)
3929 {
3930 return error(GL_OUT_OF_MEMORY);
3931 }
3932}
3933
3934void __stdcall glVertexAttrib3fv(GLuint index, const GLfloat* values)
3935{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003936 TRACE("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003937
3938 try
3939 {
3940 if (index >= gl::MAX_VERTEX_ATTRIBS)
3941 {
3942 return error(GL_INVALID_VALUE);
3943 }
3944
3945 UNIMPLEMENTED(); // FIXME
3946 }
3947 catch(std::bad_alloc&)
3948 {
3949 return error(GL_OUT_OF_MEMORY);
3950 }
3951}
3952
3953void __stdcall glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
3954{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003955 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 +00003956
3957 try
3958 {
3959 if (index >= gl::MAX_VERTEX_ATTRIBS)
3960 {
3961 return error(GL_INVALID_VALUE);
3962 }
3963
3964 UNIMPLEMENTED(); // FIXME
3965 }
3966 catch(std::bad_alloc&)
3967 {
3968 return error(GL_OUT_OF_MEMORY);
3969 }
3970}
3971
3972void __stdcall glVertexAttrib4fv(GLuint index, const GLfloat* values)
3973{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003974 TRACE("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003975
3976 try
3977 {
3978 if (index >= gl::MAX_VERTEX_ATTRIBS)
3979 {
3980 return error(GL_INVALID_VALUE);
3981 }
3982
3983 UNIMPLEMENTED(); // FIXME
3984 }
3985 catch(std::bad_alloc&)
3986 {
3987 return error(GL_OUT_OF_MEMORY);
3988 }
3989}
3990
3991void __stdcall glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void* ptr)
3992{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00003993 TRACE("(GLuint index = %d, GLint size = %d, GLenum type = 0x%X, "
3994 "GLboolean normalized = %d, GLsizei stride = %d, const void* ptr = 0x%0.8p)",
3995 index, size, type, normalized, stride, ptr);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003996
3997 try
3998 {
3999 if (index >= gl::MAX_VERTEX_ATTRIBS)
4000 {
4001 return error(GL_INVALID_VALUE);
4002 }
4003
4004 if (size < 1 || size > 4)
4005 {
4006 return error(GL_INVALID_VALUE);
4007 }
4008
4009 switch (type)
4010 {
4011 case GL_BYTE:
4012 case GL_UNSIGNED_BYTE:
4013 case GL_SHORT:
4014 case GL_UNSIGNED_SHORT:
4015 case GL_FIXED:
4016 case GL_FLOAT:
4017 break;
4018 default:
4019 return error(GL_INVALID_ENUM);
4020 }
4021
4022 if (stride < 0)
4023 {
4024 return error(GL_INVALID_VALUE);
4025 }
4026
4027 gl::Context *context = gl::getContext();
4028
4029 if (context)
4030 {
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +00004031 context->vertexAttribute[index].mBoundBuffer = context->arrayBuffer;
4032 context->vertexAttribute[index].mSize = size;
4033 context->vertexAttribute[index].mType = type;
daniel@transgaming.comb994e3b2010-03-26 04:08:50 +00004034 context->vertexAttribute[index].mNormalized = (normalized == GL_TRUE);
daniel@transgaming.com0f7aaf52010-03-11 19:41:38 +00004035 context->vertexAttribute[index].mStride = stride;
4036 context->vertexAttribute[index].mPointer = ptr;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004037 }
4038 }
4039 catch(std::bad_alloc&)
4040 {
4041 return error(GL_OUT_OF_MEMORY);
4042 }
4043}
4044
4045void __stdcall glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
4046{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004047 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 +00004048
4049 try
4050 {
4051 if (width < 0 || height < 0)
4052 {
4053 return error(GL_INVALID_VALUE);
4054 }
4055
4056 gl::Context *context = gl::getContext();
4057
4058 if (context)
4059 {
4060 context->viewportX = x;
4061 context->viewportY = y;
4062 context->viewportWidth = width;
4063 context->viewportHeight = height;
4064 }
4065 }
4066 catch(std::bad_alloc&)
4067 {
4068 return error(GL_OUT_OF_MEMORY);
4069 }
4070}
4071
4072void __stdcall glTexImage3DOES(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void* pixels)
4073{
daniel@transgaming.comb5b06162010-03-21 04:31:32 +00004074 TRACE("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
4075 "GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, GLint border = %d, "
4076 "GLenum format = 0x%X, GLenum type = 0x%x, const void* pixels = 0x%0.8p)",
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00004077 target, level, internalformat, width, height, depth, border, format, type, pixels);
4078
4079 try
4080 {
4081 UNIMPLEMENTED(); // FIXME
4082 }
4083 catch(std::bad_alloc&)
4084 {
4085 return error(GL_OUT_OF_MEMORY);
4086 }
4087}
4088}