1 // SwiftShader Software Renderer
\r
3 // Copyright(c) 2014 Google Inc.
\r
5 // All rights reserved. No part of this software may be copied, distributed, transmitted,
\r
6 // transcribed, stored in a retrieval system, translated into any human or computer
\r
7 // language by any means, or disclosed to third parties without the explicit written
\r
8 // agreement of TransGaming Inc. Without such an agreement, no rights or licenses, express
\r
9 // or implied, including but not limited to any patent rights, are granted to you.
\r
11 // libRAD.cpp: Implements the exported Radiance functions.
\r
15 #include "Context.h"
\r
16 #include "Program.h"
\r
18 #include "Texture.h"
\r
19 #include "common/debug.h"
\r
20 #include "Common/Version.h"
\r
21 #include "Main/Register.hpp"
\r
22 #include "../libEGL/Surface.h"
\r
25 #include <RAD/rad.h>
\r
34 typedef std::set<const Object*> ObjectPool;
\r
46 sw::atomicIncrement(&referenceCount);
\r
51 ASSERT(referenceCount > 0);
\r
53 if(referenceCount > 0)
\r
55 sw::atomicDecrement(&referenceCount);
\r
58 if(referenceCount == 0)
\r
64 void addObject(const Object *object)
\r
66 pool.insert(object);
\r
69 void removeObject(const Object *object)
\r
77 ASSERT(referenceCount == 0);
\r
79 size_t leakedObjectCount = pool.size();
\r
81 if(leakedObjectCount != 0)
\r
83 const Object *leakedObject = *pool.begin();
\r
84 ASSERT(!leakedObject);
\r
88 volatile int referenceCount;
\r
96 Object(Device *device) : device(device)
\r
100 device->addObject(this);
\r
105 sw::atomicIncrement(&referenceCount);
\r
110 ASSERT(referenceCount > 0);
\r
112 if(referenceCount > 0)
\r
114 sw::atomicDecrement(&referenceCount);
\r
117 if(referenceCount == 0)
\r
119 device->removeObject(this);
\r
128 ASSERT(referenceCount == 0);
\r
131 Device *const device;
\r
134 volatile int referenceCount;
\r
137 static void Release(Object *object)
\r
145 class Buffer : public Object
\r
148 Buffer(Device *device) : Object(device)
\r
151 access = 0; // FIXME: default?
\r
152 mapAccess = 0; // FIXME: default?
\r
163 void storage(RADsizei size)
\r
166 buffer = new es2::Buffer(0);
\r
168 buffer->mContents = new sw::Resource(size);
\r
169 buffer->mSize = size;
\r
175 return const_cast<void*>(buffer->data());
\r
178 es2::Buffer *buffer;
\r
180 RADbitfield access;
\r
181 RADbitfield mapAccess;
\r
184 class Sampler : public Object
\r
187 Sampler(Device *device) : Object(device)
\r
198 minFilter = RAD_MIN_FILTER_NEAREST_MIPMAP_LINEAR; // FIXME: default?
\r
199 magFilter = RAD_MAG_FILTER_LINEAR; // FIXME: default?
\r
201 wrapModeS = RAD_WRAP_MODE_REPEAT; // FIXME: default?
\r
202 wrapModeT = RAD_WRAP_MODE_REPEAT; // FIXME: default?
\r
203 wrapModeR = RAD_WRAP_MODE_REPEAT; // FIXME: default?
\r
205 minLod = -1000.0f; // FIXME: default?
\r
206 maxLod = 1000.0f; // FIXME: default?
\r
208 compareMode = RAD_COMPARE_MODE_NONE;
\r
209 compareFunc = RAD_COMPARE_FUNC_LEQUAL; // FIXME: default?
\r
210 borderColor[0] = 0.0f; // FIXME: default?
\r
211 borderColor[1] = 0.0f; // FIXME: default?
\r
212 borderColor[2] = 0.0f; // FIXME: default?
\r
213 borderColor[3] = 0.0f; // FIXME: default?
\r
214 borderColorInt[0] = 0; // FIXME: default?
\r
215 borderColorInt[1] = 0; // FIXME: default?
\r
216 borderColorInt[2] = 0; // FIXME: default?
\r
217 borderColorInt[3] = 0; // FIXME: default?
\r
220 RADminFilter minFilter;
\r
221 RADmagFilter magFilter;
\r
223 RADwrapMode wrapModeS;
\r
224 RADwrapMode wrapModeT;
\r
225 RADwrapMode wrapModeR;
\r
230 RADcompareMode compareMode;
\r
231 RADcompareFunc compareFunc;
\r
232 RADfloat borderColor[4];
\r
233 RADuint borderColorInt[4];
\r
238 struct TextureSampler
\r
240 TextureSampler(Texture *texture, Sampler *sampler, RADtextureTarget target, RADinternalFormat internalFormat, RADuint minLevel, RADuint numLevels, RADuint minLayer, RADuint numLayers);
\r
242 virtual TextureSampler::~TextureSampler();
\r
246 RADtextureTarget target;
\r
247 RADinternalFormat internalFormat;
\r
254 class Texture : public Object
\r
257 Texture(Device *device) : Object(device)
\r
260 access = 0; // FIXME: default?
\r
263 //internalFormat = 0;
\r
274 texture->release();
\r
277 for(size_t i = 0; i < textureSamplers.size(); i++)
\r
279 delete textureSamplers[i];
\r
283 es2::Texture *texture;
\r
285 RADbitfield access;
\r
287 RADtextureTarget target;
\r
289 RADinternalFormat internalFormat;
\r
295 std::vector<TextureSampler*> textureSamplers;
\r
298 TextureSampler::TextureSampler(Texture *texture, Sampler *sampler, RADtextureTarget target, RADinternalFormat internalFormat, RADuint minLevel, RADuint numLevels, RADuint minLayer, RADuint numLayers)
\r
302 //texture->reference();
\r
303 this->texture = texture;
\r
304 //sampler->reference();
\r
305 this->sampler = sampler;
\r
306 this->target = target;
\r
307 this->internalFormat = internalFormat;
\r
308 this->minLevel = minLevel;
\r
309 this->numLevels = numLevels;
\r
310 this->minLayer = minLayer;
\r
311 this->numLayers = numLayers;
\r
314 TextureSampler::~TextureSampler()
\r
316 //texture->release();
\r
317 //sampler->release();
\r
322 class Program : public Object
\r
325 Program(Device *device) : Object(device)
\r
327 program = new es2::Program(nullptr, 0);
\r
332 program->release();
\r
335 es2::Program *program;
\r
338 template<typename T, size_t n>
\r
339 inline size_t arraySize(T(&)[n])
\r
344 const int RAD_MAX_COLOR_TARGETS = 1;
\r
346 struct ColorState : public Object
\r
348 ColorState(Device *device) : Object(device)
\r
355 enable = RAD_FALSE;
\r
357 for(size_t i = 0; i < arraySize(blend); i++)
\r
359 blend[i].default();
\r
363 logicOpEnable = RAD_FALSE;
\r
364 logicOp = RAD_LOGIC_OP_COPY;
\r
365 alphaToCoverageEnable = RAD_FALSE;
\r
366 blendColor[0] = 0.0f;
\r
367 blendColor[1] = 0.0f;
\r
368 blendColor[2] = 0.0f;
\r
369 blendColor[3] = 0.0f;
\r
383 enable = RAD_FALSE;
\r
384 srcFunc = RAD_BLEND_FUNC_ONE;
\r
385 dstFunc = RAD_BLEND_FUNC_ZERO;
\r
386 srcFuncAlpha = RAD_BLEND_FUNC_ONE;
\r
387 dstFuncAlpha = RAD_BLEND_FUNC_ZERO;
\r
388 modeRGB = RAD_BLEND_EQUATION_ADD;
\r
389 modeAlpha = RAD_BLEND_EQUATION_ADD;
\r
390 maskRGBA[0] = RAD_TRUE;
\r
391 maskRGBA[1] = RAD_TRUE;
\r
392 maskRGBA[2] = RAD_TRUE;
\r
393 maskRGBA[3] = RAD_TRUE;
\r
397 RADblendFunc srcFunc;
\r
398 RADblendFunc dstFunc;
\r
399 RADblendFunc srcFuncAlpha;
\r
400 RADblendFunc dstFuncAlpha;
\r
401 RADblendEquation modeRGB;
\r
402 RADblendEquation modeAlpha;
\r
403 RADboolean maskRGBA[4];
\r
406 Blend blend[RAD_MAX_COLOR_TARGETS];
\r
408 RADuint numTargets;
\r
409 RADboolean logicOpEnable;
\r
410 RADlogicOp logicOp;
\r
411 RADboolean alphaToCoverageEnable;
\r
412 RADfloat blendColor[4];
\r
415 struct RasterState : public Object
\r
417 RasterState(Device *device) : Object(device)
\r
426 cullFace = RAD_FACE_NONE;
\r
427 frontFace = RAD_FRONT_FACE_CW;
\r
428 polygonMode = RAD_POLYGON_MODE_FILL;
\r
430 offsetFactor = 0.0f;
\r
431 offsetUnits = 0.0f;
\r
432 offsetClamp = 0.0f;
\r
434 polygonOffsetEnables = RAD_POLYGON_OFFSET_NONE;
\r
435 discardEnable = RAD_FALSE;
\r
436 multisampleEnable = RAD_TRUE;
\r
442 RADfloat pointSize;
\r
443 RADfloat lineWidth;
\r
444 RADfaceBitfield cullFace;
\r
445 RADfrontFace frontFace;
\r
446 RADpolygonMode polygonMode;
\r
448 RADfloat offsetFactor;
\r
449 RADfloat offsetUnits;
\r
450 RADfloat offsetClamp;
\r
452 RADpolygonOffsetEnables polygonOffsetEnables;
\r
453 RADboolean discardEnable;
\r
454 RADboolean multisampleEnable;
\r
457 RADuint sampleMask;
\r
460 struct DepthStencilState : public Object
\r
462 DepthStencilState(Device *device) : Object(device)
\r
469 depthTestEnable = RAD_FALSE;
\r
470 depthWriteEnable = RAD_FALSE;
\r
471 depthFunc = RAD_DEPTH_FUNC_LESS;
\r
472 stencilTestEnable = RAD_FALSE;
\r
474 stencilFuncFront = RAD_STENCIL_FUNC_ALWAYS;
\r
475 stencilRefFront = 0;
\r
476 stencilMaskFront = ~0;
\r
478 stencilFuncBack = RAD_STENCIL_FUNC_ALWAYS;
\r
479 stencilRefBack = 0;
\r
480 stencilMaskBack = ~0;
\r
482 stencilFailOpFront = RAD_STENCIL_OP_KEEP;
\r
483 depthFailOpFront = RAD_STENCIL_OP_KEEP;
\r
484 depthPassOpFront = RAD_STENCIL_OP_KEEP;
\r
486 stencilFailOpBack = RAD_STENCIL_OP_KEEP;
\r
487 depthFailOpBack = RAD_STENCIL_OP_KEEP;
\r
488 depthPassOpBack = RAD_STENCIL_OP_KEEP;
\r
490 stencilWriteMaskFront = ~0;
\r
491 stencilWriteMaskBack = ~0;
\r
494 RADboolean depthTestEnable;
\r
495 RADboolean depthWriteEnable;
\r
496 RADdepthFunc depthFunc;
\r
497 RADboolean stencilTestEnable;
\r
499 RADstencilFunc stencilFuncFront;
\r
500 RADint stencilRefFront;
\r
501 RADuint stencilMaskFront;
\r
503 RADstencilFunc stencilFuncBack;
\r
504 RADint stencilRefBack;
\r
505 RADuint stencilMaskBack;
\r
507 RADstencilOp stencilFailOpFront;
\r
508 RADstencilOp depthFailOpFront;
\r
509 RADstencilOp depthPassOpFront;
\r
511 RADstencilOp stencilFailOpBack;
\r
512 RADstencilOp depthFailOpBack;
\r
513 RADstencilOp depthPassOpBack;
\r
515 RADuint stencilWriteMaskFront;
\r
516 RADuint stencilWriteMaskBack;
\r
519 const int RAD_MAX_VERTEX_ATTRIB = 16;
\r
520 const int RAD_MAX_VERTEX_BINDING = 16;
\r
522 struct VertexState : public Object
\r
524 VertexState(Device *device) : Object(device)
\r
531 for(size_t i = 0; i < arraySize(attrib); i++)
\r
533 attrib[i].default();
\r
536 for(size_t i = 0; i < arraySize(binding); i++)
\r
538 binding[i].default();
\r
551 enable = RAD_FALSE;
\r
554 bytesPerComponent = 0;
\r
555 type = RAD_ATTRIB_TYPE_SNORM;
\r
556 relativeOffset = 0;
\r
561 RADint bindingIndex;
\r
563 RADint numComponents;
\r
564 RADint bytesPerComponent;
\r
565 RADattribType type;
\r
566 RADuint relativeOffset;
\r
569 Attribute attrib[RAD_MAX_VERTEX_ATTRIB];
\r
591 Binding binding[RAD_MAX_VERTEX_BINDING];
\r
594 struct FormatState : public Object
\r
596 FormatState(Device *device) : Object(device)
\r
603 for(size_t i = 0; i < arraySize(colorFormat); i++)
\r
605 colorFormat[i] = RAD_FORMAT_NONE;
\r
608 depthFormat = RAD_FORMAT_NONE;
\r
609 stencilFormat = RAD_FORMAT_NONE;
\r
611 depthStencilSamples = 0;
\r
614 RADinternalFormat colorFormat[RAD_MAX_COLOR_TARGETS];
\r
615 RADinternalFormat depthFormat;
\r
616 RADinternalFormat stencilFormat;
\r
617 RADuint colorSamples;
\r
618 RADuint depthStencilSamples;
\r
621 class Pipeline : public Object
\r
624 Pipeline(Device *device) : Object(device)
\r
626 vertexProgram = nullptr;
\r
627 fragmentProgram = nullptr;
\r
628 vertexState = nullptr;
\r
629 colorState = nullptr;
\r
630 rasterState = nullptr;
\r
631 depthStencilState = nullptr;
\r
632 formatState = nullptr;
\r
633 primitiveType = RAD_TRIANGLES;
\r
636 virtual ~Pipeline()
\r
638 Release(vertexProgram);
\r
639 Release(fragmentProgram);
\r
640 Release(vertexState);
\r
641 Release(colorState);
\r
642 Release(rasterState);
\r
643 Release(depthStencilState);
\r
644 Release(formatState);
\r
647 Program *vertexProgram;
\r
648 Program *fragmentProgram;
\r
649 VertexState *vertexState;
\r
650 ColorState *colorState;
\r
651 RasterState *rasterState;
\r
652 DepthStencilState *depthStencilState;
\r
653 FormatState *formatState;
\r
654 RADprimitiveType primitiveType;
\r
657 const int RAD_MAX_ATTACHMENTS = 1 /*depth*/ + 1 /*stencil*/ + RAD_MAX_COLOR_TARGETS;
\r
659 class Pass : public Object
\r
662 Pass(Device *device) : Object(device)
\r
669 for(size_t i = 0; i < arraySize(colorTarget); i++)
\r
673 colorTarget[i]->release();
\r
679 depthTarget->release();
\r
684 stencilTarget->release();
\r
692 for(size_t i = 0; i < arraySize(colorTarget); i++)
\r
694 colorTarget[i] = nullptr;
\r
697 depthTarget = nullptr;
\r
698 stencilTarget = nullptr;
\r
700 for(size_t i = 0; i < arraySize(preserveEnable); i++)
\r
702 preserveEnable[i] = RAD_TRUE;
\r
707 es2::Image *colorTarget[RAD_MAX_COLOR_TARGETS];
\r
708 es2::Image *depthTarget;
\r
709 es2::Image *stencilTarget;
\r
711 RADboolean preserveEnable[RAD_MAX_ATTACHMENTS];
\r
713 //RADuint numDiscardTextures;
\r
714 //const RADtexture *discardTextures;
\r
715 //const RADoffset2D *discardOffsets;
\r
717 //RADtexture resolveTexture[RAD_MAX_ATTACHMENTS];
\r
719 //RADuint numStoreTextures;
\r
720 //const RADtexture *storeTextures;
\r
721 //const RADoffset2D *storeOffsets;
\r
723 //const RADrect2D *clipRect;
\r
725 //RADuint numDependencies;
\r
726 //const RADpass *dependentPasses;
\r
727 //const RADbitfield *srcMask;
\r
728 //const RADbitfield *dstMask;
\r
729 //const RADbitfield *flushMask;
\r
730 //const RADbitfield *invalidateMask;
\r
732 //RADboolean tilingBoundary;
\r
734 //RADuint tileFilterWidth;
\r
735 //RADuint tileTilterHeight;
\r
737 //RADuint bytesPerPixel;
\r
738 //RADuint footprintFilterWidth;
\r
739 //RADuint footprintFilterHeight;
\r
747 //pipeline = nullptr;
\r
753 //Release(pipeline);
\r
757 virtual void execute(Pipeline *pipeline, Pass *pass) = 0; // FIXME: Just queue as parameter?
\r
759 virtual bool isPresent() const
\r
764 //void setPipeline(Pipeline *pipeline)
\r
768 // pipeline->reference();
\r
769 // this->pipeline = pipeline;
\r
773 //void setPass(Pass *pass)
\r
777 // pass->reference();
\r
778 // this->pass = pass;
\r
783 //Pipeline *pipeline; // FIXME: Command-specific state captured in their constructor?
\r
787 class CopyBufferToImage : public Command
\r
790 CopyBufferToImage(Buffer *buffer, RADintptr bufferOffset, Texture *texture, RADint level, RADuint xoffset, RADuint yoffset, RADuint zoffset, RADsizei width, RADsizei height, RADsizei depth)
\r
794 buffer->reference();
\r
795 this->buffer = buffer;
\r
796 this->bufferOffset = bufferOffset;
\r
797 texture->reference();
\r
798 this->texture = texture;
\r
799 this->level = level;
\r
800 this->xoffset = xoffset;
\r
801 this->yoffset = yoffset;
\r
802 this->zoffset = zoffset;
\r
803 this->width = width;
\r
804 this->height = height;
\r
805 this->depth = depth;
\r
808 virtual ~CopyBufferToImage()
\r
811 texture->release();
\r
814 virtual void execute(Pipeline *pipeline, Pass *pass)
\r
816 ASSERT(depth == 1); // FIXME: Unimplemented
\r
817 egl::Image *image = texture->texture->getRenderTarget(GL_TEXTURE_2D, level);
\r
818 uint8_t *output = static_cast<uint8_t*>(image->lock(xoffset, yoffset, sw::LOCK_WRITEONLY)); // FIXME: Discard if whole image
\r
819 unsigned int pitch = image->getPitch();
\r
820 const uint8_t *input = static_cast<const uint8_t*>(buffer->map()) + bufferOffset; // FIXME: Necessary to lock?
\r
822 ASSERT(texture->internalFormat == RAD_RGBA8); // FIXME: Unimplemented
\r
823 int bytesPerTexel = 4;
\r
825 for(int y = 0; y < height; y++)
\r
827 const uint8_t *source = input + y * (width * bytesPerTexel);
\r
828 uint8_t *dest = output + y * pitch;
\r
830 memcpy(dest, source, width * bytesPerTexel);
\r
837 RADintptr bufferOffset;
\r
848 class Scissor : public Command
\r
851 Scissor(RADint x, RADint y, RADint w, RADint h)
\r
863 virtual void execute(Pipeline *pipeline, Pass *pass)
\r
865 es2::Context *context = es2::getContext();
\r
866 context->setScissorParams(x, y, w, h);
\r
875 class Viewport : public Command
\r
878 Viewport(RADint x, RADint y, RADint w, RADint h)
\r
886 virtual ~Viewport()
\r
890 virtual void execute(Pipeline *pipeline, Pass *pass)
\r
892 es2::Context *context = es2::getContext();
\r
893 context->setViewportParams(x, y, w, h);
\r
902 class ClearColor : public Command
\r
905 ClearColor(RADuint index, const RADfloat *color)
\r
907 this->index = index;
\r
908 this->color[0] = color[0];
\r
909 this->color[1] = color[1];
\r
910 this->color[2] = color[2];
\r
911 this->color[3] = color[3];
\r
914 virtual ~ClearColor()
\r
918 virtual void execute(Pipeline *pipeline, Pass *pass)
\r
920 ASSERT(pass); // FIXME: Error if no beginPass
\r
921 ASSERT(index < pass->numColors);
\r
922 es2::Image *image = pass->colorTarget[index];
\r
924 GLenum format = image->getFormat();
\r
925 GLenum type = image->getType();
\r
926 ASSERT(format == GL_RGBA); // FIXME
\r
927 ASSERT(type == GL_UNSIGNED_BYTE); // FIXME
\r
929 es2::Context *context = es2::getContext();
\r
930 int x0 = context->mState.scissorX;
\r
931 int y0 = context->mState.scissorY;
\r
932 int width = context->mState.scissorWidth;
\r
933 int height = context->mState.scissorHeight;
\r
935 image->clearColorBuffer(sw::Color<float>(color[0], color[1], color[2], color[3]), 0xF, x0, y0, width, height);
\r
942 class ClearDepth : public Command
\r
945 ClearDepth(RADfloat depth)
\r
947 this->depth = depth;
\r
950 virtual ~ClearDepth()
\r
954 virtual void execute(Pipeline *pipeline, Pass *pass)
\r
956 ASSERT(pass); // FIXME: Error if no beginPass
\r
957 es2::Image *image = pass->depthTarget;
\r
959 es2::Context *context = es2::getContext();
\r
960 int x0 = context->mState.scissorX;
\r
961 int y0 = context->mState.scissorY;
\r
962 int width = context->mState.scissorWidth;
\r
963 int height = context->mState.scissorHeight;
\r
965 image->clearDepthBuffer(depth, x0, y0, width, height);
\r
971 class Present : public Command
\r
974 Present(Texture *texture)
\r
976 texture->reference();
\r
977 this->texture = texture;
\r
985 virtual void execute(Pipeline *pipeline, Pass *pass)
\r
987 es2::Context *context = es2::getContext();
\r
988 sw::FrameBuffer *frameBuffer = (*es2::getDisplay()->mSurfaceSet.begin())->frameBuffer;
\r
990 egl::Image *image = texture->texture->getRenderTarget(GL_TEXTURE_2D, 0);
\r
991 void *source = image->lockInternal(0, 0, 0, sw::LOCK_READONLY, sw::PUBLIC);
\r
992 frameBuffer->flip(source, image->getInternalFormat());
\r
993 image->unlockInternal();
\r
997 virtual bool isPresent() const
\r
1005 class DrawElements : public Command
\r
1008 DrawElements(RADprimitiveType mode, RADindexType type, RADsizei count, es2::Buffer *indexBuffer, RADuint offset)
\r
1010 this->mode = mode;
\r
1011 this->type = type;
\r
1012 this->count = count;
\r
1013 this->indexBuffer = indexBuffer;
\r
1014 this->offset = offset;
\r
1021 virtual void execute(Pipeline *pipeline, Pass *pass)
\r
1023 es2::Context *context = es2::getContext();
\r
1025 ASSERT(pipeline->vertexProgram == pipeline->fragmentProgram); // FIXME
\r
1026 context->mState.program = pipeline->vertexProgram->program;
\r
1028 GLenum glType = GL_UNSIGNED_SHORT;
\r
1031 case RAD_INDEX_UNSIGNED_BYTE: glType = GL_UNSIGNED_BYTE; break;
\r
1032 case RAD_INDEX_UNSIGNED_SHORT: glType = GL_UNSIGNED_SHORT; break;
\r
1033 case RAD_INDEX_UNSIGNED_INT: glType = GL_UNSIGNED_INT; break;
\r
1034 default: UNREACHABLE();
\r
1037 GLenum glMode = GL_TRIANGLES;
\r
1040 case RAD_TRIANGLES: glMode = GL_TRIANGLES; break;
\r
1041 default: UNREACHABLE();
\r
1044 context->mState.colorBuffer = pass->colorTarget[0];
\r
1045 context->mState.depthBuffer = pass->depthTarget;
\r
1047 context->mState.depthTest = pipeline->depthStencilState->depthTestEnable;
\r
1049 GLenum glDepth = GL_LESS;
\r
1050 switch(pipeline->depthStencilState->depthFunc)
\r
1052 case RAD_DEPTH_FUNC_NEVER: glDepth = GL_NEVER; break;
\r
1053 case RAD_DEPTH_FUNC_LESS: glDepth = GL_LESS; break;
\r
1054 case RAD_DEPTH_FUNC_EQUAL: glDepth = GL_EQUAL; break;
\r
1055 case RAD_DEPTH_FUNC_LEQUAL: glDepth = GL_LEQUAL; break;
\r
1056 case RAD_DEPTH_FUNC_GREATER: glDepth = GL_GREATER; break;
\r
1057 case RAD_DEPTH_FUNC_NOTEQUAL: glDepth = GL_NOTEQUAL; break;
\r
1058 case RAD_DEPTH_FUNC_GEQUAL: glDepth = GL_GEQUAL; break;
\r
1059 case RAD_DEPTH_FUNC_ALWAYS: glDepth = GL_ALWAYS; break;
\r
1060 default: UNREACHABLE();
\r
1063 context->mState.elementArrayBuffer.set(indexBuffer);
\r
1064 context->drawElements(glMode, count, glType, 0);
\r
1067 RADprimitiveType mode;
\r
1068 RADindexType type;
\r
1070 es2::Buffer *indexBuffer;
\r
1074 class BindGroup : public Command
\r
1077 BindGroup(RADbitfield stages, RADuint group, RADuint count, es2::Buffer *buffer, RADuint offset)
\r
1079 this->stages = stages;
\r
1080 this->group = group;
\r
1081 this->count = count;
\r
1082 this->buffer = buffer;
\r
1083 this->offset = offset;
\r
1086 virtual ~BindGroup()
\r
1090 virtual void execute(Pipeline *pipeline, Pass *pass)
\r
1092 es2::Context *context = es2::getContext();
\r
1094 const RADbindGroupElement *groupElements = static_cast<const RADbindGroupElement*>(buffer->data());
\r
1096 // FIXME: Should parse the layout out of the shaders
\r
1097 es2::Program *program = pipeline->vertexProgram->program;
\r
1099 es2::Buffer *element0 = reinterpret_cast<es2::Buffer*>(groupElements[0].handle);
\r
1100 void *offset0 = reinterpret_cast<void*>(static_cast<uintptr_t>(groupElements[0].offset));
\r
1101 int position = program->getAttributeLocation("position");
\r
1102 context->setVertexAttribState(position, element0, 3, GL_FLOAT, GL_TRUE, 0, offset0);
\r
1103 context->setEnableVertexAttribArray(position, true);
\r
1105 es2::Buffer *element1 = reinterpret_cast<es2::Buffer*>(groupElements[1].handle);
\r
1106 void *offset1 = reinterpret_cast<void*>(static_cast<uintptr_t>(groupElements[1].offset));
\r
1107 int tc = program->getAttributeLocation("tc");
\r
1108 context->setVertexAttribState(tc, element1, 4, GL_UNSIGNED_BYTE, GL_TRUE, 0, offset1);
\r
1109 context->setEnableVertexAttribArray(tc, true);
\r
1111 es2::Buffer *element2 = reinterpret_cast<es2::Buffer*>(groupElements[2].handle);
\r
1112 const void *uniform = static_cast<const uint8_t*>(element2->data()) + groupElements[2].offset;
\r
1113 int scale = program->getUniformLocation("scale");
\r
1114 program->setUniform4fv(scale, 1, (const GLfloat*)uniform);
\r
1116 rad::TextureSampler *element3 = reinterpret_cast<rad::TextureSampler*>(groupElements[3].handle);
\r
1117 int tex = program->getUniformLocation("tex");
\r
1119 program->setUniform1iv(tex, 1, &sampler);
\r
1120 context->applyTexture(sw::SAMPLER_PIXEL, sampler, element3->texture->texture);
\r
1123 RADbitfield stages;
\r
1126 es2::Buffer *buffer;
\r
1130 class Queue : public Object
\r
1133 Queue(Device *device) : Object(device)
\r
1135 graphicsPipeline = nullptr;
\r
1141 for(size_t i = 0; i < commands.size(); i++)
\r
1143 delete commands[i];
\r
1146 Release(graphicsPipeline);
\r
1148 ASSERT(!pass); // FIXME: No matching endPass
\r
1152 void submit(Command *command)
\r
1154 // FIXME: Make BeginPass/EndPass/BindPipeline commands too?
\r
1155 //command->setPipeline(graphicsPipeline);
\r
1156 //command->setPass(pass);
\r
1158 if(false) // Queued execution
\r
1160 commands.push_back(command);
\r
1162 if(command->isPresent())
\r
1167 else // Immediate execution
\r
1169 command->execute(graphicsPipeline, pass);
\r
1175 void bindPipeline(RADpipelineType pipelineType, Pipeline *pipeline)
\r
1177 if(pipelineType == RAD_PIPELINE_TYPE_GRAPHICS)
\r
1179 pipeline->reference();
\r
1181 if(graphicsPipeline)
\r
1183 graphicsPipeline->release();
\r
1186 graphicsPipeline = pipeline;
\r
1188 else UNREACHABLE();
\r
1191 void beginPass(rad::Pass *pass)
\r
1193 ASSERT(!this->pass); // FIXME: Can be nested?
\r
1194 pass->reference();
\r
1195 this->pass = pass;
\r
1198 void endPass(rad::Pass *pass)
\r
1200 ASSERT(this->pass == pass); // FIXME: Can be nested?
\r
1201 this->pass->release();
\r
1202 this->pass = nullptr;
\r
1206 std::deque<Command*> commands;
\r
1207 Pipeline *graphicsPipeline;
\r
1214 RADdevice RADAPIENTRY radCreateDevice(void)
\r
1216 static rad::Device *device = new rad::Device();
\r
1217 return reinterpret_cast<RADdevice>(device);
\r
1220 void RADAPIENTRY radReferenceDevice(RADdevice device)
\r
1222 rad::Device *radDevice = reinterpret_cast<rad::Device*>(device);
\r
1223 return radDevice->reference();
\r
1225 void RADAPIENTRY radReleaseDevice(RADdevice device)
\r
1227 rad::Device *radDevice = reinterpret_cast<rad::Device*>(device);
\r
1228 return radDevice->release();
\r
1231 RADuint RADAPIENTRY radGetTokenHeader(RADdevice device, RADtokenName name) {UNIMPLEMENTED(); return 0;}
\r
1233 RADqueue RADAPIENTRY radCreateQueue(RADdevice device, RADqueueType queuetype)
\r
1235 rad::Device *radDevice = reinterpret_cast<rad::Device*>(device);
\r
1236 rad::Queue *queue = new rad::Queue(radDevice);
\r
1237 return reinterpret_cast<RADqueue>(queue);
\r
1240 void RADAPIENTRY radReferenceQueue(RADqueue queue)
\r
1242 rad::Queue *radQueue = reinterpret_cast<rad::Queue*>(queue);
\r
1243 return radQueue->reference();
\r
1246 void RADAPIENTRY radReleaseQueue(RADqueue queue)
\r
1248 rad::Queue *radQueue = reinterpret_cast<rad::Queue*>(queue);
\r
1249 return radQueue->release();
\r
1252 void RADAPIENTRY radQueueTagBuffer(RADqueue queue, RADbuffer buffer) {UNIMPLEMENTED();}
\r
1253 void RADAPIENTRY radQueueTagTexture(RADqueue queue, RADtexture texture) {UNIMPLEMENTED();}
\r
1255 void RADAPIENTRY radQueueSubmitCommands(RADqueue queue, RADuint numCommands, const RADcommandHandle *handles)
\r
1260 void RADAPIENTRY radFlushQueue(RADqueue queue) {UNIMPLEMENTED();}
\r
1261 void RADAPIENTRY radFinishQueue(RADqueue queue) {UNIMPLEMENTED();}
\r
1263 void RADAPIENTRY radQueueViewport(RADqueue queue, RADint x, RADint y, RADint w, RADint h)
\r
1265 rad::Queue *radQueue = reinterpret_cast<rad::Queue*>(queue);
\r
1266 rad::Viewport *command = new rad::Viewport(x, y, w, h);
\r
1267 radQueue->submit(command);
\r
1270 void RADAPIENTRY radQueueScissor(RADqueue queue, RADint x, RADint y, RADint w, RADint h)
\r
1272 rad::Queue *radQueue = reinterpret_cast<rad::Queue*>(queue);
\r
1273 rad::Scissor *command = new rad::Scissor(x, y, w, h);
\r
1274 radQueue->submit(command);
\r
1277 void RADAPIENTRY radQueueCopyBufferToImage(RADqueue queue, RADbuffer buffer, RADintptr bufferOffset, RADtexture texture, RADint level, RADuint xoffset, RADuint yoffset, RADuint zoffset, RADsizei width, RADsizei height, RADsizei depth)
\r
1279 rad::Queue *radQueue = reinterpret_cast<rad::Queue*>(queue);
\r
1280 rad::Buffer *radBuffer = reinterpret_cast<rad::Buffer*>(buffer);
\r
1281 rad::Texture *radTexture = reinterpret_cast<rad::Texture*>(texture);
\r
1282 rad::CopyBufferToImage *command = new rad::CopyBufferToImage(radBuffer, bufferOffset, radTexture, level, xoffset, yoffset, zoffset, width, height, depth);
\r
1283 radQueue->submit(command);
\r
1286 void RADAPIENTRY radQueueCopyImageToBuffer(RADqueue queue, RADbuffer buffer, RADintptr bufferOffset, RADtexture texture, RADint level, RADuint xoffset, RADuint yoffset, RADuint zoffset, RADsizei width, RADsizei height, RADsizei depth) {UNIMPLEMENTED();}
\r
1288 void RADAPIENTRY radQueueCopyBuffer(RADqueue queue, RADbuffer srcBuffer, RADintptr srcOffset, RADbuffer dstBuffer, RADintptr dstOffset, RADsizei size)
\r
1293 void RADAPIENTRY radQueueClearColor(RADqueue queue, RADuint index, const RADfloat *color)
\r
1295 rad::Queue *radQueue = reinterpret_cast<rad::Queue*>(queue);
\r
1296 rad::ClearColor *command = new rad::ClearColor(index, color);
\r
1297 radQueue->submit(command);
\r
1300 void RADAPIENTRY radQueueClearDepth(RADqueue queue, RADfloat depth)
\r
1302 rad::Queue *radQueue = reinterpret_cast<rad::Queue*>(queue);
\r
1303 rad::ClearDepth *command = new rad::ClearDepth(depth);
\r
1304 radQueue->submit(command);
\r
1307 void RADAPIENTRY radQueueClearStencil(RADqueue queue, RADuint stencil) {UNIMPLEMENTED();}
\r
1309 void RADAPIENTRY radQueuePresent(RADqueue queue, RADtexture texture)
\r
1311 rad::Queue *radQueue = reinterpret_cast<rad::Queue*>(queue);
\r
1312 rad::Texture *radTexture = reinterpret_cast<rad::Texture*>(texture);
\r
1313 rad::Present *command = new rad::Present(radTexture);
\r
1314 radQueue->submit(command);
\r
1317 void RADAPIENTRY radQueueDrawArrays(RADqueue queue, RADprimitiveType mode, RADint first, RADsizei count) {UNIMPLEMENTED();}
\r
1319 void RADAPIENTRY radQueueDrawElements(RADqueue queue, RADprimitiveType mode, RADindexType type, RADsizei count, RADindexHandle indexHandle, RADuint offset)
\r
1321 rad::Queue *radQueue = reinterpret_cast<rad::Queue*>(queue);
\r
1322 es2::Buffer *indexBuffer = reinterpret_cast<es2::Buffer*>(indexHandle);
\r
1323 rad::DrawElements *command = new rad::DrawElements(mode, type, count, indexBuffer, offset);
\r
1324 radQueue->submit(command);
\r
1327 void RADAPIENTRY radQueueBindPipeline(RADqueue queue, RADpipelineType pipelineType, RADpipelineHandle pipelineHandle)
\r
1329 rad::Queue *radQueue = reinterpret_cast<rad::Queue*>(queue);
\r
1330 rad::Pipeline *radPipeline = reinterpret_cast<rad::Pipeline*>(pipelineHandle);
\r
1331 radQueue->bindPipeline(pipelineType, radPipeline);
\r
1334 void RADAPIENTRY radQueueBindGroup(RADqueue queue, RADbitfield stages, RADuint group, RADuint count, RADbindGroupHandle groupHandle, RADuint offset)
\r
1336 rad::Queue *radQueue = reinterpret_cast<rad::Queue*>(queue);
\r
1337 es2::Buffer *groupBuffer = reinterpret_cast<es2::Buffer*>(groupHandle);
\r
1338 rad::BindGroup *command = new rad::BindGroup(stages, group, count, groupBuffer, offset);
\r
1339 radQueue->submit(command);
\r
1342 void RADAPIENTRY radQueueBeginPass(RADqueue queue, RADpass pass)
\r
1344 rad::Queue *radQueue = reinterpret_cast<rad::Queue*>(queue);
\r
1345 rad::Pass *radPass = reinterpret_cast<rad::Pass*>(pass);
\r
1346 radQueue->beginPass(radPass);
\r
1349 void RADAPIENTRY radQueueEndPass(RADqueue queue, RADpass pass)
\r
1351 rad::Queue *radQueue = reinterpret_cast<rad::Queue*>(queue);
\r
1352 rad::Pass *radPass = reinterpret_cast<rad::Pass*>(pass);
\r
1353 radQueue->endPass(radPass);
\r
1356 void RADAPIENTRY radQueueSubmitDynamic(RADqueue queue, const void *dynamic, RADsizei length) {UNIMPLEMENTED();}
\r
1357 void RADAPIENTRY radQueueStencilValueMask(RADqueue queue, RADfaceBitfield faces, RADuint mask) {UNIMPLEMENTED();}
\r
1358 void RADAPIENTRY radQueueStencilMask(RADqueue queue, RADfaceBitfield faces, RADuint mask) {UNIMPLEMENTED();}
\r
1359 void RADAPIENTRY radQueueStencilRef(RADqueue queue, RADfaceBitfield faces, RADint ref) {UNIMPLEMENTED();}
\r
1360 void RADAPIENTRY radQueueBlendColor(RADqueue queue, const RADfloat *blendColor) {UNIMPLEMENTED();}
\r
1361 void RADAPIENTRY radQueuePointSize(RADqueue queue, RADfloat pointSize) {UNIMPLEMENTED();}
\r
1362 void RADAPIENTRY radQueueLineWidth(RADqueue queue, RADfloat lineWidth) {UNIMPLEMENTED();}
\r
1363 void RADAPIENTRY radQueuePolygonOffsetClamp(RADqueue queue, RADfloat factor, RADfloat units, RADfloat clamp) {UNIMPLEMENTED();}
\r
1364 void RADAPIENTRY radQueueSampleMask(RADqueue queue, RADuint mask) {UNIMPLEMENTED();}
\r
1366 RADprogram RADAPIENTRY radCreateProgram(RADdevice device)
\r
1368 rad::Device *radDevice = reinterpret_cast<rad::Device*>(device);
\r
1369 rad::Program *program = new rad::Program(radDevice);
\r
1370 return reinterpret_cast<RADprogram>(program);
\r
1373 void RADAPIENTRY radReferenceProgram(RADprogram program)
\r
1375 rad::Program *radProgram = reinterpret_cast<rad::Program*>(program);
\r
1376 radProgram->reference();
\r
1379 void RADAPIENTRY radReleaseProgram(RADprogram program)
\r
1381 rad::Program *radProgram = reinterpret_cast<rad::Program*>(program);
\r
1382 radProgram->release();
\r
1385 void RADAPIENTRY radProgramSource(RADprogram program, RADprogramFormat format, RADsizei length, const void *source)
\r
1387 rad::Program *radProgram = reinterpret_cast<rad::Program*>(program);
\r
1389 // FIXME: Assumes first source is vertex shader, second is fragment shader
\r
1390 ASSERT(length == 2);
\r
1391 const char *vertexSource = static_cast<const char* const*>(source)[0];
\r
1392 const char *fragmentSource = static_cast<const char* const*>(source)[1];
\r
1393 GLint vertexLength = strlen(vertexSource);
\r
1394 GLint fragmentLength = strlen(fragmentSource);
\r
1396 es2::VertexShader *vertexShader = new es2::VertexShader(nullptr, 0);
\r
1397 es2::FragmentShader *fragmentShader = new es2::FragmentShader(nullptr, 0);
\r
1399 vertexShader->setSource(1, &vertexSource, &vertexLength);
\r
1400 fragmentShader->setSource(1, &fragmentSource, &fragmentLength);
\r
1402 vertexShader->compile();
\r
1403 fragmentShader->compile();
\r
1405 radProgram->program->attachShader(vertexShader);
\r
1406 radProgram->program->attachShader(fragmentShader);
\r
1407 radProgram->program->link();
\r
1409 vertexShader->release(); // Still referenced by program
\r
1410 fragmentShader->release(); // Still referenced by program
\r
1413 RADbuffer RADAPIENTRY radCreateBuffer(RADdevice device)
\r
1415 rad::Device *radDevice = reinterpret_cast<rad::Device*>(device);
\r
1416 rad::Buffer *buffer = new rad::Buffer(radDevice);
\r
1417 return reinterpret_cast<RADbuffer>(buffer);
\r
1420 void RADAPIENTRY radReferenceBuffer(RADbuffer buffer)
\r
1422 rad::Buffer *radBuffer = reinterpret_cast<rad::Buffer*>(buffer);
\r
1423 radBuffer->reference();
\r
1426 void RADAPIENTRY radReleaseBuffer(RADbuffer buffer, RADtagMode tagMode)
\r
1428 rad::Buffer *radBuffer = reinterpret_cast<rad::Buffer*>(buffer);
\r
1429 radBuffer->release();
\r
1432 void RADAPIENTRY radBufferAccess(RADbuffer buffer, RADbitfield access)
\r
1434 rad::Buffer *radBuffer = reinterpret_cast<rad::Buffer*>(buffer);
\r
1435 radBuffer->access = access;
\r
1438 void RADAPIENTRY radBufferMapAccess(RADbuffer buffer, RADbitfield mapAccess)
\r
1440 rad::Buffer *radBuffer = reinterpret_cast<rad::Buffer*>(buffer);
\r
1441 radBuffer->mapAccess = mapAccess;
\r
1444 void RADAPIENTRY radBufferStorage(RADbuffer buffer, RADsizei size)
\r
1446 rad::Buffer *radBuffer = reinterpret_cast<rad::Buffer*>(buffer);
\r
1447 radBuffer->storage(size);
\r
1450 void* RADAPIENTRY radMapBuffer(RADbuffer buffer)
\r
1452 rad::Buffer *radBuffer = reinterpret_cast<rad::Buffer*>(buffer);
\r
1453 return radBuffer->map();
\r
1456 RADvertexHandle RADAPIENTRY radGetVertexHandle(RADbuffer buffer)
\r
1458 rad::Buffer *radBuffer = reinterpret_cast<rad::Buffer*>(buffer);
\r
1459 return reinterpret_cast<RADvertexHandle>(radBuffer->buffer);
\r
1462 RADindexHandle RADAPIENTRY radGetIndexHandle(RADbuffer buffer)
\r
1464 rad::Buffer *radBuffer = reinterpret_cast<rad::Buffer*>(buffer);
\r
1465 return reinterpret_cast<RADvertexHandle>(radBuffer->buffer);
\r
1468 RADuniformHandle RADAPIENTRY radGetUniformHandle(RADbuffer buffer)
\r
1470 rad::Buffer *radBuffer = reinterpret_cast<rad::Buffer*>(buffer);
\r
1471 return reinterpret_cast<RADuniformHandle>(radBuffer->buffer);
\r
1474 RADbindGroupHandle RADAPIENTRY radGetBindGroupHandle(RADbuffer buffer)
\r
1476 rad::Buffer *radBuffer = reinterpret_cast<rad::Buffer*>(buffer);
\r
1477 return reinterpret_cast<RADbindGroupHandle>(radBuffer->buffer);
\r
1480 RADtexture RADAPIENTRY radCreateTexture(RADdevice device)
\r
1482 rad::Device *radDevice = reinterpret_cast<rad::Device*>(device);
\r
1483 rad::Texture *colorState = new rad::Texture(radDevice);
\r
1484 return reinterpret_cast<RADtexture>(colorState);
\r
1487 void RADAPIENTRY radReferenceTexture(RADtexture texture)
\r
1489 rad::Texture *radTexture = reinterpret_cast<rad::Texture*>(texture);
\r
1490 radTexture->reference();
\r
1493 void RADAPIENTRY radReleaseTexture(RADtexture texture, RADtagMode tagMode)
\r
1495 rad::Texture *radTexture = reinterpret_cast<rad::Texture*>(texture);
\r
1496 radTexture->release();
\r
1499 void RADAPIENTRY radTextureAccess(RADtexture texture, RADbitfield access)
\r
1501 rad::Texture *radTexture = reinterpret_cast<rad::Texture*>(texture);
\r
1502 radTexture->access = access;
\r
1505 void RADAPIENTRY radTextureStorage(RADtexture texture, RADtextureTarget target, RADsizei levels, RADinternalFormat internalFormat, RADsizei width, RADsizei height, RADsizei depth, RADsizei samples)
\r
1507 rad::Texture *radTexture = reinterpret_cast<rad::Texture*>(texture);
\r
1508 ASSERT(!radTexture->texture);
\r
1510 radTexture->target = target;
\r
1511 radTexture->levels = levels;
\r
1512 radTexture->internalFormat = internalFormat;
\r
1513 radTexture->width = width;
\r
1514 radTexture->height = height;
\r
1515 radTexture->depth = depth;
\r
1516 radTexture->samples = samples;
\r
1518 GLenum format = GL_NONE;
\r
1519 GLenum type = GL_NONE;
\r
1520 switch(internalFormat)
\r
1524 type = GL_UNSIGNED_BYTE;
\r
1526 case RAD_DEPTH24_STENCIL8:
\r
1527 format = GL_DEPTH_STENCIL_OES;
\r
1528 type = GL_UNSIGNED_INT_24_8_OES;
\r
1531 UNIMPLEMENTED(); // FIXME
\r
1536 case RAD_TEXTURE_2D:
\r
1538 es2::Texture2D *tex = new es2::Texture2D(0);
\r
1539 for(int level = 0; level < levels; level++)
\r
1541 tex->setImage(level, width >> level, height >> level, format, type, 1, nullptr);
\r
1544 radTexture->texture = tex;
\r
1548 UNIMPLEMENTED(); // FIXME
\r
1552 RADtextureHandle RADAPIENTRY radGetTextureSamplerHandle(RADtexture texture, RADsampler sampler, RADtextureTarget target, RADinternalFormat internalFormat, RADuint minLevel, RADuint numLevels, RADuint minLayer, RADuint numLayers)
\r
1554 rad::Texture *radTexture = reinterpret_cast<rad::Texture*>(texture);
\r
1555 rad::Sampler *radSampler = reinterpret_cast<rad::Sampler*>(sampler);
\r
1556 rad::TextureSampler *textureSampler = new rad::TextureSampler(radTexture, radSampler, target, internalFormat, minLevel, numLevels, minLayer, numLayers);
\r
1557 radTexture->textureSamplers.push_back(textureSampler); // FIXME: Check for matching existing textureSampler
\r
1558 return reinterpret_cast<RADtextureHandle>(textureSampler);
\r
1561 RADrenderTargetHandle RADAPIENTRY radGetTextureRenderTargetHandle(RADtexture texture, RADtextureTarget target, RADinternalFormat internalFormat, RADuint level, RADuint minLayer, RADuint numLayers)
\r
1563 rad::Texture *radTexture = reinterpret_cast<rad::Texture*>(texture);
\r
1564 ASSERT(radTexture->texture);
\r
1565 ASSERT(radTexture->internalFormat == internalFormat);
\r
1566 ASSERT(minLayer == 0);
\r
1567 ASSERT(numLayers == 1);
\r
1568 GLenum glTarget = GL_NONE;
\r
1571 case RAD_TEXTURE_2D:
\r
1572 glTarget = GL_TEXTURE_2D;
\r
1577 return reinterpret_cast<RADrenderTargetHandle>(radTexture->texture->getRenderTarget(glTarget, level));
\r
1580 RADsampler RADAPIENTRY radCreateSampler(RADdevice device)
\r
1582 rad::Device *radDevice = reinterpret_cast<rad::Device*>(device);
\r
1583 rad::Sampler *sampler = new rad::Sampler(radDevice);
\r
1584 return reinterpret_cast<RADsampler>(sampler);
\r
1587 void RADAPIENTRY radReferenceSampler(RADsampler sampler)
\r
1589 rad::Sampler *radSampler = reinterpret_cast<rad::Sampler*>(sampler);
\r
1590 radSampler->reference();
\r
1593 void RADAPIENTRY radReleaseSampler(RADsampler sampler)
\r
1595 rad::Sampler *radSampler = reinterpret_cast<rad::Sampler*>(sampler);
\r
1596 radSampler->release();
\r
1599 void RADAPIENTRY radSamplerDefault(RADsampler sampler)
\r
1601 rad::Sampler *radSampler = reinterpret_cast<rad::Sampler*>(sampler);
\r
1602 radSampler->default();
\r
1605 void RADAPIENTRY radSamplerMinMagFilter(RADsampler sampler, RADminFilter min, RADmagFilter mag)
\r
1607 rad::Sampler *radSampler = reinterpret_cast<rad::Sampler*>(sampler);
\r
1608 radSampler->minFilter = min;
\r
1609 radSampler->magFilter = mag;
\r
1612 void RADAPIENTRY radSamplerWrapMode(RADsampler sampler, RADwrapMode s, RADwrapMode t, RADwrapMode r)
\r
1614 rad::Sampler *radSampler = reinterpret_cast<rad::Sampler*>(sampler);
\r
1615 radSampler->wrapModeS = s;
\r
1616 radSampler->wrapModeT = t;
\r
1617 radSampler->wrapModeR = r;
\r
1620 void RADAPIENTRY radSamplerLodClamp(RADsampler sampler, RADfloat min, RADfloat max)
\r
1622 rad::Sampler *radSampler = reinterpret_cast<rad::Sampler*>(sampler);
\r
1623 radSampler->minLod = min;
\r
1624 radSampler->maxLod = max;
\r
1627 void RADAPIENTRY radSamplerLodBias(RADsampler sampler, RADfloat bias)
\r
1629 rad::Sampler *radSampler = reinterpret_cast<rad::Sampler*>(sampler);
\r
1630 radSampler->lodBias = bias;
\r
1633 void RADAPIENTRY radSamplerCompare(RADsampler sampler, RADcompareMode mode, RADcompareFunc func)
\r
1635 rad::Sampler *radSampler = reinterpret_cast<rad::Sampler*>(sampler);
\r
1636 radSampler->compareMode = mode;
\r
1637 radSampler->compareFunc = func;
\r
1640 void RADAPIENTRY radSamplerBorderColorFloat(RADsampler sampler, const RADfloat *borderColor)
\r
1642 rad::Sampler *radSampler = reinterpret_cast<rad::Sampler*>(sampler);
\r
1643 radSampler->borderColor[0] = borderColor[0];
\r
1644 radSampler->borderColor[1] = borderColor[1];
\r
1645 radSampler->borderColor[2] = borderColor[2];
\r
1646 radSampler->borderColor[3] = borderColor[3];
\r
1649 void RADAPIENTRY radSamplerBorderColorInt(RADsampler sampler, const RADuint *borderColor)
\r
1651 rad::Sampler *radSampler = reinterpret_cast<rad::Sampler*>(sampler);
\r
1652 radSampler->borderColorInt[0] = borderColor[0];
\r
1653 radSampler->borderColorInt[1] = borderColor[1];
\r
1654 radSampler->borderColorInt[2] = borderColor[2];
\r
1655 radSampler->borderColorInt[3] = borderColor[3];
\r
1658 RADcolorState RADAPIENTRY radCreateColorState(RADdevice device)
\r
1660 rad::Device *radDevice = reinterpret_cast<rad::Device*>(device);
\r
1661 rad::ColorState *colorState = new rad::ColorState(radDevice);
\r
1662 return reinterpret_cast<RADcolorState>(colorState);
\r
1665 void RADAPIENTRY radReferenceColorState(RADcolorState color)
\r
1667 rad::ColorState *colorState = reinterpret_cast<rad::ColorState*>(color);
\r
1668 colorState->reference();
\r
1671 void RADAPIENTRY radReleaseColorState(RADcolorState color)
\r
1673 rad::ColorState *colorState = reinterpret_cast<rad::ColorState*>(color);
\r
1674 colorState->release();
\r
1677 void RADAPIENTRY radColorDefault(RADcolorState color)
\r
1679 rad::ColorState *colorState = reinterpret_cast<rad::ColorState*>(color);
\r
1680 colorState->default();
\r
1683 void RADAPIENTRY radColorBlendEnable(RADcolorState color, RADuint index, RADboolean enable)
\r
1685 rad::ColorState *colorState = reinterpret_cast<rad::ColorState*>(color);
\r
1686 colorState->blend[index].enable = enable;
\r
1689 void RADAPIENTRY radColorBlendFunc(RADcolorState color, RADuint index, RADblendFunc srcFunc, RADblendFunc dstFunc, RADblendFunc srcFuncAlpha, RADblendFunc dstFuncAlpha)
\r
1691 rad::ColorState *colorState = reinterpret_cast<rad::ColorState*>(color);
\r
1692 colorState->blend[index].srcFunc = srcFunc;
\r
1693 colorState->blend[index].dstFunc = dstFunc;
\r
1694 colorState->blend[index].srcFuncAlpha = srcFuncAlpha;
\r
1695 colorState->blend[index].dstFuncAlpha = dstFuncAlpha;
\r
1698 void RADAPIENTRY radColorBlendEquation(RADcolorState color, RADuint index, RADblendEquation modeRGB, RADblendEquation modeAlpha)
\r
1700 rad::ColorState *colorState = reinterpret_cast<rad::ColorState*>(color);
\r
1701 colorState->blend[index].modeRGB = modeRGB;
\r
1702 colorState->blend[index].modeAlpha = modeAlpha;
\r
1705 void RADAPIENTRY radColorMask(RADcolorState color, RADuint index, RADboolean r, RADboolean g, RADboolean b, RADboolean a)
\r
1707 rad::ColorState *colorState = reinterpret_cast<rad::ColorState*>(color);
\r
1708 colorState->blend[index].maskRGBA[0] = r;
\r
1709 colorState->blend[index].maskRGBA[1] = g;
\r
1710 colorState->blend[index].maskRGBA[2] = b;
\r
1711 colorState->blend[index].maskRGBA[3] = a;
\r
1714 void RADAPIENTRY radColorNumTargets(RADcolorState color, RADuint numTargets)
\r
1716 rad::ColorState *colorState = reinterpret_cast<rad::ColorState*>(color);
\r
1717 colorState->numTargets = numTargets;
\r
1720 void RADAPIENTRY radColorLogicOpEnable(RADcolorState color, RADboolean enable)
\r
1722 rad::ColorState *colorState = reinterpret_cast<rad::ColorState*>(color);
\r
1723 colorState->logicOpEnable = enable;
\r
1726 void RADAPIENTRY radColorLogicOp(RADcolorState color, RADlogicOp logicOp)
\r
1728 rad::ColorState *colorState = reinterpret_cast<rad::ColorState*>(color);
\r
1729 colorState->logicOp = logicOp;
\r
1732 void RADAPIENTRY radColorAlphaToCoverageEnable(RADcolorState color, RADboolean enable)
\r
1734 rad::ColorState *colorState = reinterpret_cast<rad::ColorState*>(color);
\r
1735 colorState->alphaToCoverageEnable = enable;
\r
1738 void RADAPIENTRY radColorBlendColor(RADcolorState color, const RADfloat *blendColor)
\r
1740 rad::ColorState *colorState = reinterpret_cast<rad::ColorState*>(color);
\r
1741 colorState->blendColor[0] = blendColor[0];
\r
1742 colorState->blendColor[1] = blendColor[1];
\r
1743 colorState->blendColor[2] = blendColor[2];
\r
1744 colorState->blendColor[3] = blendColor[3];
\r
1747 void RADAPIENTRY radColorDynamic(RADcolorState color, RADcolorDynamic dynamic, RADboolean enable) {UNIMPLEMENTED();}
\r
1749 RADrasterState RADAPIENTRY radCreateRasterState(RADdevice device)
\r
1751 rad::Device *radDevice = reinterpret_cast<rad::Device*>(device);
\r
1752 rad::RasterState *rasterState = new rad::RasterState(radDevice);
\r
1753 return reinterpret_cast<RADrasterState>(rasterState);
\r
1756 void RADAPIENTRY radReferenceRasterState(RADrasterState raster)
\r
1758 rad::RasterState *rasterState = reinterpret_cast<rad::RasterState*>(raster);
\r
1759 rasterState->reference();
\r
1762 void RADAPIENTRY radReleaseRasterState(RADrasterState raster)
\r
1764 rad::RasterState *rasterState = reinterpret_cast<rad::RasterState*>(raster);
\r
1765 rasterState->release();
\r
1768 void RADAPIENTRY radRasterDefault(RADrasterState raster)
\r
1770 rad::RasterState *rasterState = reinterpret_cast<rad::RasterState*>(raster);
\r
1771 rasterState->default();
\r
1774 void RADAPIENTRY radRasterPointSize(RADrasterState raster, RADfloat pointSize)
\r
1776 rad::RasterState *rasterState = reinterpret_cast<rad::RasterState*>(raster);
\r
1777 rasterState->pointSize = pointSize;
\r
1780 void RADAPIENTRY radRasterLineWidth(RADrasterState raster, RADfloat lineWidth)
\r
1782 rad::RasterState *rasterState = reinterpret_cast<rad::RasterState*>(raster);
\r
1783 rasterState->lineWidth = lineWidth;
\r
1786 void RADAPIENTRY radRasterCullFace(RADrasterState raster, RADfaceBitfield face)
\r
1788 rad::RasterState *rasterState = reinterpret_cast<rad::RasterState*>(raster);
\r
1789 rasterState->cullFace = face;
\r
1792 void RADAPIENTRY radRasterFrontFace(RADrasterState raster, RADfrontFace face)
\r
1794 rad::RasterState *rasterState = reinterpret_cast<rad::RasterState*>(raster);
\r
1795 rasterState->frontFace = face;
\r
1798 void RADAPIENTRY radRasterPolygonMode(RADrasterState raster, RADpolygonMode polygonMode)
\r
1800 rad::RasterState *rasterState = reinterpret_cast<rad::RasterState*>(raster);
\r
1801 rasterState->polygonMode = polygonMode;
\r
1804 void RADAPIENTRY radRasterPolygonOffsetClamp(RADrasterState raster, RADfloat factor, RADfloat units, RADfloat clamp)
\r
1806 rad::RasterState *rasterState = reinterpret_cast<rad::RasterState*>(raster);
\r
1807 rasterState->offsetFactor = factor;
\r
1808 rasterState->offsetUnits = units;
\r
1809 rasterState->offsetClamp = clamp;
\r
1812 void RADAPIENTRY radRasterPolygonOffsetEnables(RADrasterState raster, RADpolygonOffsetEnables enables)
\r
1814 rad::RasterState *rasterState = reinterpret_cast<rad::RasterState*>(raster);
\r
1815 rasterState->polygonOffsetEnables = enables;
\r
1818 void RADAPIENTRY radRasterDiscardEnable(RADrasterState raster, RADboolean enable)
\r
1820 rad::RasterState *rasterState = reinterpret_cast<rad::RasterState*>(raster);
\r
1821 rasterState->discardEnable = enable;
\r
1824 void RADAPIENTRY radRasterMultisampleEnable(RADrasterState raster, RADboolean enable)
\r
1826 rad::RasterState *rasterState = reinterpret_cast<rad::RasterState*>(raster);
\r
1827 rasterState->multisampleEnable = enable;
\r
1830 void RADAPIENTRY radRasterSamples(RADrasterState raster, RADuint samples)
\r
1832 rad::RasterState *rasterState = reinterpret_cast<rad::RasterState*>(raster);
\r
1833 rasterState->samples = samples;
\r
1836 void RADAPIENTRY radRasterSampleMask(RADrasterState raster, RADuint mask)
\r
1838 rad::RasterState *rasterState = reinterpret_cast<rad::RasterState*>(raster);
\r
1839 rasterState->sampleMask = mask;
\r
1842 void RADAPIENTRY radRasterDynamic(RADrasterState raster, RADrasterDynamic dynamic, RADboolean enable)
\r
1847 RADdepthStencilState RADAPIENTRY radCreateDepthStencilState(RADdevice device)
\r
1849 rad::Device *radDevice = reinterpret_cast<rad::Device*>(device);
\r
1850 rad::DepthStencilState *depthStencilState = new rad::DepthStencilState(radDevice);
\r
1851 return reinterpret_cast<RADdepthStencilState>(depthStencilState);
\r
1854 void RADAPIENTRY radReferenceDepthStencilState(RADdepthStencilState depthStencil)
\r
1856 rad::DepthStencilState *depthStencilState = reinterpret_cast<rad::DepthStencilState*>(depthStencil);
\r
1857 depthStencilState->reference();
\r
1860 void RADAPIENTRY radReleaseDepthStencilState(RADdepthStencilState depthStencil)
\r
1862 rad::DepthStencilState *depthStencilState = reinterpret_cast<rad::DepthStencilState*>(depthStencil);
\r
1863 depthStencilState->release();
\r
1866 void RADAPIENTRY radDepthStencilDefault(RADdepthStencilState depthStencil)
\r
1868 rad::DepthStencilState *depthStencilState = reinterpret_cast<rad::DepthStencilState*>(depthStencil);
\r
1869 depthStencilState->default();
\r
1872 void RADAPIENTRY radDepthStencilDepthTestEnable(RADdepthStencilState depthStencil, RADboolean enable)
\r
1874 rad::DepthStencilState *depthStencilState = reinterpret_cast<rad::DepthStencilState*>(depthStencil);
\r
1875 depthStencilState->depthTestEnable = enable;
\r
1878 void RADAPIENTRY radDepthStencilDepthWriteEnable(RADdepthStencilState depthStencil, RADboolean enable)
\r
1880 rad::DepthStencilState *depthStencilState = reinterpret_cast<rad::DepthStencilState*>(depthStencil);
\r
1881 depthStencilState->depthWriteEnable = enable;
\r
1884 void RADAPIENTRY radDepthStencilDepthFunc(RADdepthStencilState depthStencil, RADdepthFunc func)
\r
1886 rad::DepthStencilState *depthStencilState = reinterpret_cast<rad::DepthStencilState*>(depthStencil);
\r
1887 depthStencilState->depthFunc = func;
\r
1890 void RADAPIENTRY radDepthStencilStencilTestEnable(RADdepthStencilState depthStencil, RADboolean enable)
\r
1892 rad::DepthStencilState *depthStencilState = reinterpret_cast<rad::DepthStencilState*>(depthStencil);
\r
1893 depthStencilState->stencilTestEnable = enable;
\r
1896 void RADAPIENTRY radDepthStencilStencilFunc(RADdepthStencilState depthStencil, RADfaceBitfield faces, RADstencilFunc func, RADint ref, RADuint mask)
\r
1898 rad::DepthStencilState *depthStencilState = reinterpret_cast<rad::DepthStencilState*>(depthStencil);
\r
1900 if(faces & RAD_FACE_FRONT)
\r
1902 depthStencilState->stencilFuncFront = func;
\r
1903 depthStencilState->stencilRefFront = ref;
\r
1904 depthStencilState->stencilMaskFront = mask;
\r
1907 if(faces & RAD_FACE_BACK)
\r
1909 depthStencilState->stencilFuncBack = func;
\r
1910 depthStencilState->stencilRefBack = ref;
\r
1911 depthStencilState->stencilMaskBack = mask;
\r
1915 void RADAPIENTRY radDepthStencilStencilOp(RADdepthStencilState depthStencil, RADfaceBitfield faces, RADstencilOp fail, RADstencilOp depthFail, RADstencilOp depthPass)
\r
1917 rad::DepthStencilState *depthStencilState = reinterpret_cast<rad::DepthStencilState*>(depthStencil);
\r
1919 if(faces & RAD_FACE_FRONT)
\r
1921 depthStencilState->stencilFailOpFront = fail;
\r
1922 depthStencilState->depthFailOpFront = depthFail;
\r
1923 depthStencilState->depthPassOpFront = depthPass;
\r
1926 if(faces & RAD_FACE_BACK)
\r
1928 depthStencilState->stencilFailOpBack = fail;
\r
1929 depthStencilState->depthFailOpBack = depthFail;
\r
1930 depthStencilState->depthPassOpBack = depthPass;
\r
1934 void RADAPIENTRY radDepthStencilStencilMask(RADdepthStencilState depthStencil, RADfaceBitfield faces, RADuint mask)
\r
1936 rad::DepthStencilState *depthStencilState = reinterpret_cast<rad::DepthStencilState*>(depthStencil);
\r
1938 if(faces & RAD_FACE_FRONT)
\r
1940 depthStencilState->stencilMaskFront = mask;
\r
1944 if(faces & RAD_FACE_BACK)
\r
1946 depthStencilState->stencilMaskBack = mask;
\r
1950 void RADAPIENTRY radDepthStencilDynamic(RADdepthStencilState depthStencil, RADdepthStencilDynamic dynamic, RADboolean enable)
\r
1955 RADvertexState RADAPIENTRY radCreateVertexState(RADdevice device)
\r
1957 rad::Device *radDevice = reinterpret_cast<rad::Device*>(device);
\r
1958 rad::VertexState *vertexState = new rad::VertexState(radDevice);
\r
1959 return reinterpret_cast<RADvertexState>(vertexState);
\r
1962 void RADAPIENTRY radReferenceVertexState(RADvertexState vertex)
\r
1964 rad::VertexState *vertexState = reinterpret_cast<rad::VertexState*>(vertex);
\r
1965 vertexState->reference();
\r
1968 void RADAPIENTRY radReleaseVertexState(RADvertexState vertex)
\r
1970 rad::VertexState *vertexState = reinterpret_cast<rad::VertexState*>(vertex);
\r
1971 vertexState->release();
\r
1974 void RADAPIENTRY radVertexDefault(RADvertexState vertex) {UNIMPLEMENTED();}
\r
1976 void RADAPIENTRY radVertexAttribFormat(RADvertexState vertex, RADint attribIndex, RADint numComponents, RADint bytesPerComponent, RADattribType type, RADuint relativeOffset)
\r
1978 ASSERT(attribIndex >= 0 && attribIndex < GL_MAX_VERTEX_ATTRIBS);
\r
1979 rad::VertexState *vertexState = reinterpret_cast<rad::VertexState*>(vertex);
\r
1980 vertexState->attrib[attribIndex].numComponents = numComponents;
\r
1981 vertexState->attrib[attribIndex].bytesPerComponent = bytesPerComponent;
\r
1982 vertexState->attrib[attribIndex].type = type;
\r
1983 vertexState->attrib[attribIndex].relativeOffset = relativeOffset;
\r
1986 void RADAPIENTRY radVertexAttribBinding(RADvertexState vertex, RADint attribIndex, RADint bindingIndex)
\r
1988 ASSERT(attribIndex >= 0 && attribIndex < GL_MAX_VERTEX_ATTRIBS);
\r
1989 rad::VertexState *vertexState = reinterpret_cast<rad::VertexState*>(vertex);
\r
1990 vertexState->attrib[attribIndex].bindingIndex = bindingIndex;
\r
1993 void RADAPIENTRY radVertexBindingGroup(RADvertexState vertex, RADint bindingIndex, RADint group, RADint index)
\r
1995 ASSERT(bindingIndex >= 0 && bindingIndex < GL_MAX_VERTEX_ATTRIBS);
\r
1996 rad::VertexState *vertexState = reinterpret_cast<rad::VertexState*>(vertex);
\r
1997 vertexState->binding[bindingIndex].group = group;
\r
1998 vertexState->binding[bindingIndex].index = index;
\r
2001 void RADAPIENTRY radVertexAttribEnable(RADvertexState vertex, RADint attribIndex, RADboolean enable)
\r
2003 ASSERT(attribIndex >= 0 && attribIndex < GL_MAX_VERTEX_ATTRIBS);
\r
2004 rad::VertexState *vertexState = reinterpret_cast<rad::VertexState*>(vertex);
\r
2005 vertexState->attrib[attribIndex].bindingIndex = enable;
\r
2008 void RADAPIENTRY radVertexBindingStride(RADvertexState vertex, RADint bindingIndex, RADuint stride)
\r
2010 ASSERT(bindingIndex >= 0 && bindingIndex < GL_MAX_VERTEX_ATTRIBS);
\r
2011 rad::VertexState *vertexState = reinterpret_cast<rad::VertexState*>(vertex);
\r
2012 vertexState->binding[bindingIndex].stride = stride;
\r
2015 RADrtFormatState RADAPIENTRY radCreateRtFormatState(RADdevice device)
\r
2017 rad::Device *radDevice = reinterpret_cast<rad::Device*>(device);
\r
2018 rad::FormatState *formatState = new rad::FormatState(radDevice);
\r
2019 return reinterpret_cast<RADrtFormatState>(formatState);
\r
2022 void RADAPIENTRY radReferenceRtFormatState(RADrtFormatState rtFormat)
\r
2024 rad::FormatState *formatState = reinterpret_cast<rad::FormatState*>(rtFormat);
\r
2025 formatState->reference();
\r
2028 void RADAPIENTRY radReleaseRtFormatState(RADrtFormatState rtFormat)
\r
2030 rad::FormatState *formatState = reinterpret_cast<rad::FormatState*>(rtFormat);
\r
2031 formatState->release();
\r
2034 void RADAPIENTRY radRtFormatDefault(RADrtFormatState rtFormat)
\r
2036 rad::FormatState *formatState = reinterpret_cast<rad::FormatState*>(rtFormat);
\r
2037 formatState->default();
\r
2040 void RADAPIENTRY radRtFormatColorFormat(RADrtFormatState rtFormat, RADuint index, RADinternalFormat format)
\r
2042 rad::FormatState *formatState = reinterpret_cast<rad::FormatState*>(rtFormat);
\r
2043 formatState->colorFormat[index] = format;
\r
2046 void RADAPIENTRY radRtFormatDepthFormat(RADrtFormatState rtFormat, RADinternalFormat format)
\r
2048 rad::FormatState *formatState = reinterpret_cast<rad::FormatState*>(rtFormat);
\r
2049 formatState->depthFormat = format;
\r
2052 void RADAPIENTRY radRtFormatStencilFormat(RADrtFormatState rtFormat, RADinternalFormat format)
\r
2054 rad::FormatState *formatState = reinterpret_cast<rad::FormatState*>(rtFormat);
\r
2055 formatState->stencilFormat = format;
\r
2058 void RADAPIENTRY radRtFormatColorSamples(RADrtFormatState rtFormat, RADuint samples)
\r
2060 rad::FormatState *formatState = reinterpret_cast<rad::FormatState*>(rtFormat);
\r
2061 formatState->colorSamples = samples;
\r
2064 void RADAPIENTRY radRtFormatDepthStencilSamples(RADrtFormatState rtFormat, RADuint samples)
\r
2066 rad::FormatState *formatState = reinterpret_cast<rad::FormatState*>(rtFormat);
\r
2067 formatState->depthStencilSamples = samples;
\r
2070 RADpipeline RADAPIENTRY radCreatePipeline(RADdevice device, RADpipelineType pipelineType)
\r
2072 rad::Device *radDevice = reinterpret_cast<rad::Device*>(device);
\r
2073 rad::Pipeline *pipeline = new rad::Pipeline(radDevice);
\r
2074 return reinterpret_cast<RADpipeline>(pipeline);
\r
2077 void RADAPIENTRY radReferencePipeline(RADpipeline pipeline)
\r
2079 rad::Pipeline *radPipeline = reinterpret_cast<rad::Pipeline*>(pipeline);
\r
2080 radPipeline->reference();
\r
2083 void RADAPIENTRY radReleasePipeline(RADpipeline pipeline)
\r
2085 rad::Pipeline *radPipeline = reinterpret_cast<rad::Pipeline*>(pipeline);
\r
2086 radPipeline->release();
\r
2089 void RADAPIENTRY radPipelineProgramStages(RADpipeline pipeline, RADbitfield stages, RADprogram program)
\r
2091 rad::Pipeline *radPipeline = reinterpret_cast<rad::Pipeline*>(pipeline);
\r
2092 rad::Program *radProgram = reinterpret_cast<rad::Program*>(program);
\r
2094 if(stages & RAD_VERTEX_SHADER_BIT)
\r
2096 ASSERT(!radPipeline->vertexProgram);
\r
2097 radProgram->reference(); // FIXME: here or at compile?
\r
2098 radPipeline->vertexProgram = radProgram;
\r
2101 if(stages & RAD_FRAGMENT_SHADER_BIT)
\r
2103 ASSERT(!radPipeline->fragmentProgram);
\r
2104 radProgram->reference(); // FIXME: here or at compile?
\r
2105 radPipeline->fragmentProgram = radProgram;
\r
2109 void RADAPIENTRY radPipelineVertexState(RADpipeline pipeline, RADvertexState vertex)
\r
2111 rad::Pipeline *radPipeline = reinterpret_cast<rad::Pipeline*>(pipeline);
\r
2112 rad::VertexState *vertexState = reinterpret_cast<rad::VertexState*>(vertex);
\r
2113 ASSERT(!radPipeline->vertexState);
\r
2114 vertexState->reference(); // FIXME: here or at compile?
\r
2115 radPipeline->vertexState = vertexState;
\r
2118 void RADAPIENTRY radPipelineColorState(RADpipeline pipeline, RADcolorState color)
\r
2120 rad::Pipeline *radPipeline = reinterpret_cast<rad::Pipeline*>(pipeline);
\r
2121 rad::ColorState *colorState = reinterpret_cast<rad::ColorState*>(color);
\r
2122 ASSERT(!radPipeline->colorState);
\r
2123 colorState->reference(); // FIXME: here or at compile?
\r
2124 radPipeline->colorState = colorState;
\r
2127 void RADAPIENTRY radPipelineRasterState(RADpipeline pipeline, RADrasterState raster)
\r
2129 rad::Pipeline *radPipeline = reinterpret_cast<rad::Pipeline*>(pipeline);
\r
2130 rad::RasterState *rasterState = reinterpret_cast<rad::RasterState*>(raster);
\r
2131 ASSERT(!radPipeline->rasterState);
\r
2132 rasterState->reference(); // FIXME: here or at compile?
\r
2133 radPipeline->rasterState = rasterState;
\r
2136 void RADAPIENTRY radPipelineDepthStencilState(RADpipeline pipeline, RADdepthStencilState depthStencil)
\r
2138 rad::Pipeline *radPipeline = reinterpret_cast<rad::Pipeline*>(pipeline);
\r
2139 rad::DepthStencilState *depthStencilState = reinterpret_cast<rad::DepthStencilState*>(depthStencil);
\r
2140 ASSERT(!radPipeline->depthStencilState);
\r
2141 depthStencilState->reference(); // FIXME: here or at compile?
\r
2142 radPipeline->depthStencilState = depthStencilState;
\r
2145 void RADAPIENTRY radPipelineRtFormatState(RADpipeline pipeline, RADrtFormatState rtFormat)
\r
2147 rad::Pipeline *radPipeline = reinterpret_cast<rad::Pipeline*>(pipeline);
\r
2148 rad::FormatState *formatState = reinterpret_cast<rad::FormatState*>(rtFormat);
\r
2149 ASSERT(!radPipeline->formatState);
\r
2150 formatState->reference(); // FIXME: here or at compile?
\r
2151 radPipeline->formatState = formatState;
\r
2154 void RADAPIENTRY radPipelinePrimitiveType(RADpipeline pipeline, RADprimitiveType mode)
\r
2156 rad::Pipeline *radPipeline = reinterpret_cast<rad::Pipeline*>(pipeline);
\r
2157 radPipeline->primitiveType = mode;
\r
2160 void RADAPIENTRY radCompilePipeline(RADpipeline pipeline)
\r
2162 // FIXME: Reference state objects here or when set?
\r
2166 RADpipelineHandle RADAPIENTRY radGetPipelineHandle(RADpipeline pipeline)
\r
2168 return reinterpret_cast<RADpipelineHandle>(pipeline);
\r
2171 RADcommandBuffer RADAPIENTRY radCreateCommandBuffer(RADdevice device, RADqueueType queueType)
\r
2176 void RADAPIENTRY radReferenceCommandBuffer(RADcommandBuffer cmdBuf) {UNIMPLEMENTED();}
\r
2178 void RADAPIENTRY radReleaseCommandBuffer(RADcommandBuffer cmdBuf)
\r
2183 void RADAPIENTRY radCmdBindPipeline(RADcommandBuffer cmdBuf, RADpipelineType pipelineType, RADpipelineHandle pipelineHandle)
\r
2188 void RADAPIENTRY radCmdBindGroup(RADcommandBuffer cmdBuf, RADbitfield stages, RADuint group, RADuint count, RADbindGroupHandle groupHandle, RADuint offset)
\r
2193 void RADAPIENTRY radCmdDrawArrays(RADcommandBuffer cmdBuf, RADprimitiveType mode, RADint first, RADsizei count) {UNIMPLEMENTED();}
\r
2195 void RADAPIENTRY radCmdDrawElements(RADcommandBuffer cmdBuf, RADprimitiveType mode, RADindexType type, RADsizei count, RADindexHandle indexHandle, RADuint offset)
\r
2200 RADboolean RADAPIENTRY radCompileCommandBuffer(RADcommandBuffer cmdBuf)
\r
2205 RADcommandHandle RADAPIENTRY radGetCommandHandle(RADcommandBuffer cmdBuf)
\r
2210 void RADAPIENTRY radCmdStencilValueMask(RADcommandBuffer cmdBuf, RADfaceBitfield faces, RADuint mask) {UNIMPLEMENTED();}
\r
2211 void RADAPIENTRY radCmdStencilMask(RADcommandBuffer cmdBuf, RADfaceBitfield faces, RADuint mask) {UNIMPLEMENTED();}
\r
2212 void RADAPIENTRY radCmdStencilRef(RADcommandBuffer cmdBuf, RADfaceBitfield faces, RADint ref) {UNIMPLEMENTED();}
\r
2213 void RADAPIENTRY radCmdBlendColor(RADcommandBuffer cmdBuf, const RADfloat *blendColor) {UNIMPLEMENTED();}
\r
2214 void RADAPIENTRY radCmdPointSize(RADcommandBuffer cmdBuf, RADfloat pointSize) {UNIMPLEMENTED();}
\r
2215 void RADAPIENTRY radCmdLineWidth(RADcommandBuffer cmdBuf, RADfloat lineWidth) {UNIMPLEMENTED();}
\r
2216 void RADAPIENTRY radCmdPolygonOffsetClamp(RADcommandBuffer cmdBuf, RADfloat factor, RADfloat units, RADfloat clamp) {UNIMPLEMENTED();}
\r
2217 void RADAPIENTRY radCmdSampleMask(RADcommandBuffer cmdBuf, RADuint mask) {UNIMPLEMENTED();}
\r
2219 RADpass RADAPIENTRY radCreatePass(RADdevice device)
\r
2221 rad::Device *radDevice = reinterpret_cast<rad::Device*>(device);
\r
2222 rad::Pass *pass = new rad::Pass(radDevice);
\r
2223 return reinterpret_cast<RADpass>(pass);
\r
2226 void RADAPIENTRY radReferencePass(RADpass pass)
\r
2228 rad::Pass *radPass = reinterpret_cast<rad::Pass*>(pass);
\r
2229 radPass->reference();
\r
2232 void RADAPIENTRY radReleasePass(RADpass pass)
\r
2234 rad::Pass *radPass = reinterpret_cast<rad::Pass*>(pass);
\r
2235 radPass->release();
\r
2238 void RADAPIENTRY radPassDefault(RADpass pass)
\r
2240 rad::Pass *radPass = reinterpret_cast<rad::Pass*>(pass);
\r
2241 radPass->default();
\r
2244 void RADAPIENTRY radCompilePass(RADpass pass)
\r
2249 void RADAPIENTRY radPassRenderTargets(RADpass pass, RADuint numColors, const RADrenderTargetHandle *colors, RADrenderTargetHandle depth, RADrenderTargetHandle stencil)
\r
2251 rad::Pass *radPass = reinterpret_cast<rad::Pass*>(pass);
\r
2252 radPass->numColors = numColors;
\r
2253 for(unsigned int i = 0; i < numColors; i++)
\r
2255 ASSERT(colors[i]);
\r
2256 es2::Image *colorTarget = reinterpret_cast<es2::Image*>(colors[i]);
\r
2257 colorTarget->addRef(); // FIXME: here or at compile?
\r
2258 radPass->colorTarget[i] = colorTarget;
\r
2263 es2::Image *depthTarget = reinterpret_cast<es2::Image*>(depth);
\r
2264 depthTarget->addRef(); // FIXME: here or at compile?
\r
2265 radPass->depthTarget = depthTarget;
\r
2270 es2::Image *stencilTarget = reinterpret_cast<es2::Image*>(stencil);
\r
2271 stencilTarget->addRef(); // FIXME: here or at compile?
\r
2272 radPass->stencilTarget = stencilTarget;
\r
2276 void RADAPIENTRY radPassPreserveEnable(RADpass pass, RADrtAttachment attachment, RADboolean enable) {UNIMPLEMENTED();}
\r
2277 void RADAPIENTRY radPassDiscard(RADpass pass, RADuint numTextures, const RADtexture *textures, const RADoffset2D *offsets) {UNIMPLEMENTED();}
\r
2279 void RADAPIENTRY radPassResolve(RADpass pass, RADrtAttachment attachment, RADtexture texture)
\r
2284 void RADAPIENTRY radPassStore(RADpass pass, RADuint numTextures, const RADtexture *textures, const RADoffset2D *offsets) {UNIMPLEMENTED();}
\r
2285 void RADAPIENTRY radPassClip(RADpass pass, const RADrect2D *rect) {UNIMPLEMENTED();}
\r
2286 void RADAPIENTRY radPassDependencies(RADpass pass, RADuint numPasses, const RADpass *otherPasses, const RADbitfield *srcMask, const RADbitfield *dstMask, const RADbitfield *flushMask, const RADbitfield *invalidateMask) {UNIMPLEMENTED();}
\r
2287 void RADAPIENTRY radPassTilingBoundary(RADpass pass, RADboolean boundary) {UNIMPLEMENTED();}
\r
2288 void RADAPIENTRY radPassTileFilterWidth(RADpass pass, RADuint filterWidth, RADuint filterHeight) {UNIMPLEMENTED();}
\r
2289 void RADAPIENTRY radPassTileFootprint(RADpass pass, RADuint bytesPerPixel, RADuint maxFilterWidth, RADuint maxFilterHeight) {UNIMPLEMENTED();}
\r
2291 RADsync RADAPIENTRY radCreateSync(RADdevice device)
\r
2296 void RADAPIENTRY radReferenceSync(RADsync sync) {UNIMPLEMENTED();}
\r
2298 void RADAPIENTRY radReleaseSync(RADsync sync)
\r
2303 void RADAPIENTRY radQueueFenceSync(RADqueue queue, RADsync sync, RADsyncCondition condition, RADbitfield flags)
\r
2308 RADwaitSyncResult RADAPIENTRY radWaitSync(RADsync sync, RADuint64 timeout) {UNIMPLEMENTED(); return RAD_WAIT_SYNC_FAILED;}
\r
2310 RADboolean RADAPIENTRY radQueueWaitSync(RADqueue queue, RADsync sync)
\r
2315 RADPROC RADAPIENTRY radGetProcAddress(const RADchar *procname)
\r
2323 static const Extension glExtensions[] =
\r
2325 #define EXTENSION(name) {#name, (RADPROC)name}
\r
2327 EXTENSION(radGetProcAddress),
\r
2328 EXTENSION(radCreateDevice),
\r
2329 EXTENSION(radReferenceDevice),
\r
2330 EXTENSION(radReleaseDevice),
\r
2331 EXTENSION(radGetTokenHeader),
\r
2332 EXTENSION(radCreateQueue),
\r
2333 EXTENSION(radReferenceQueue),
\r
2334 EXTENSION(radReleaseQueue),
\r
2335 EXTENSION(radQueueTagBuffer),
\r
2336 EXTENSION(radQueueTagTexture),
\r
2337 EXTENSION(radQueueSubmitCommands),
\r
2338 EXTENSION(radFlushQueue),
\r
2339 EXTENSION(radFinishQueue),
\r
2340 EXTENSION(radQueueViewport),
\r
2341 EXTENSION(radQueueScissor),
\r
2342 EXTENSION(radQueueCopyBufferToImage),
\r
2343 EXTENSION(radQueueCopyImageToBuffer),
\r
2344 EXTENSION(radQueueCopyBuffer),
\r
2345 EXTENSION(radQueueClearColor),
\r
2346 EXTENSION(radQueueClearDepth),
\r
2347 EXTENSION(radQueueClearStencil),
\r
2348 EXTENSION(radQueuePresent),
\r
2349 EXTENSION(radQueueDrawArrays),
\r
2350 EXTENSION(radQueueDrawElements),
\r
2351 EXTENSION(radQueueBindPipeline),
\r
2352 EXTENSION(radQueueBindGroup),
\r
2353 EXTENSION(radQueueBeginPass),
\r
2354 EXTENSION(radQueueEndPass),
\r
2355 EXTENSION(radQueueSubmitDynamic),
\r
2356 EXTENSION(radQueueStencilValueMask),
\r
2357 EXTENSION(radQueueStencilMask),
\r
2358 EXTENSION(radQueueStencilRef),
\r
2359 EXTENSION(radQueueBlendColor),
\r
2360 EXTENSION(radQueuePointSize),
\r
2361 EXTENSION(radQueueLineWidth),
\r
2362 EXTENSION(radQueuePolygonOffsetClamp),
\r
2363 EXTENSION(radQueueSampleMask),
\r
2364 EXTENSION(radCreateProgram),
\r
2365 EXTENSION(radReferenceProgram),
\r
2366 EXTENSION(radReleaseProgram),
\r
2367 EXTENSION(radProgramSource),
\r
2368 EXTENSION(radCreateBuffer),
\r
2369 EXTENSION(radReferenceBuffer),
\r
2370 EXTENSION(radReleaseBuffer),
\r
2371 EXTENSION(radBufferAccess),
\r
2372 EXTENSION(radBufferMapAccess),
\r
2373 EXTENSION(radBufferStorage),
\r
2374 EXTENSION(radMapBuffer),
\r
2375 EXTENSION(radGetVertexHandle),
\r
2376 EXTENSION(radGetIndexHandle),
\r
2377 EXTENSION(radGetUniformHandle),
\r
2378 EXTENSION(radGetBindGroupHandle),
\r
2379 EXTENSION(radCreateTexture),
\r
2380 EXTENSION(radReferenceTexture),
\r
2381 EXTENSION(radReleaseTexture),
\r
2382 EXTENSION(radTextureAccess),
\r
2383 EXTENSION(radTextureStorage),
\r
2384 EXTENSION(radGetTextureSamplerHandle),
\r
2385 EXTENSION(radGetTextureRenderTargetHandle),
\r
2386 EXTENSION(radCreateSampler),
\r
2387 EXTENSION(radReferenceSampler),
\r
2388 EXTENSION(radReleaseSampler),
\r
2389 EXTENSION(radSamplerDefault),
\r
2390 EXTENSION(radSamplerMinMagFilter),
\r
2391 EXTENSION(radSamplerWrapMode),
\r
2392 EXTENSION(radSamplerLodClamp),
\r
2393 EXTENSION(radSamplerLodBias),
\r
2394 EXTENSION(radSamplerCompare),
\r
2395 EXTENSION(radSamplerBorderColorFloat),
\r
2396 EXTENSION(radSamplerBorderColorInt),
\r
2397 EXTENSION(radCreateColorState),
\r
2398 EXTENSION(radReferenceColorState),
\r
2399 EXTENSION(radReleaseColorState),
\r
2400 EXTENSION(radColorDefault),
\r
2401 EXTENSION(radColorBlendEnable),
\r
2402 EXTENSION(radColorBlendFunc),
\r
2403 EXTENSION(radColorBlendEquation),
\r
2404 EXTENSION(radColorMask),
\r
2405 EXTENSION(radColorNumTargets),
\r
2406 EXTENSION(radColorLogicOpEnable),
\r
2407 EXTENSION(radColorLogicOp),
\r
2408 EXTENSION(radColorAlphaToCoverageEnable),
\r
2409 EXTENSION(radColorBlendColor),
\r
2410 EXTENSION(radColorDynamic),
\r
2411 EXTENSION(radCreateRasterState),
\r
2412 EXTENSION(radReferenceRasterState),
\r
2413 EXTENSION(radReleaseRasterState),
\r
2414 EXTENSION(radRasterDefault),
\r
2415 EXTENSION(radRasterPointSize),
\r
2416 EXTENSION(radRasterLineWidth),
\r
2417 EXTENSION(radRasterCullFace),
\r
2418 EXTENSION(radRasterFrontFace),
\r
2419 EXTENSION(radRasterPolygonMode),
\r
2420 EXTENSION(radRasterPolygonOffsetClamp),
\r
2421 EXTENSION(radRasterPolygonOffsetEnables),
\r
2422 EXTENSION(radRasterDiscardEnable),
\r
2423 EXTENSION(radRasterMultisampleEnable),
\r
2424 EXTENSION(radRasterSamples),
\r
2425 EXTENSION(radRasterSampleMask),
\r
2426 EXTENSION(radRasterDynamic),
\r
2427 EXTENSION(radCreateDepthStencilState),
\r
2428 EXTENSION(radReferenceDepthStencilState),
\r
2429 EXTENSION(radReleaseDepthStencilState),
\r
2430 EXTENSION(radDepthStencilDefault),
\r
2431 EXTENSION(radDepthStencilDepthTestEnable),
\r
2432 EXTENSION(radDepthStencilDepthWriteEnable),
\r
2433 EXTENSION(radDepthStencilDepthFunc),
\r
2434 EXTENSION(radDepthStencilStencilTestEnable),
\r
2435 EXTENSION(radDepthStencilStencilFunc),
\r
2436 EXTENSION(radDepthStencilStencilOp),
\r
2437 EXTENSION(radDepthStencilStencilMask),
\r
2438 EXTENSION(radDepthStencilDynamic),
\r
2439 EXTENSION(radCreateVertexState),
\r
2440 EXTENSION(radReferenceVertexState),
\r
2441 EXTENSION(radReleaseVertexState),
\r
2442 EXTENSION(radVertexDefault),
\r
2443 EXTENSION(radVertexAttribFormat),
\r
2444 EXTENSION(radVertexAttribBinding),
\r
2445 EXTENSION(radVertexBindingGroup),
\r
2446 EXTENSION(radVertexAttribEnable),
\r
2447 EXTENSION(radVertexBindingStride),
\r
2448 EXTENSION(radCreateRtFormatState),
\r
2449 EXTENSION(radReferenceRtFormatState),
\r
2450 EXTENSION(radReleaseRtFormatState),
\r
2451 EXTENSION(radRtFormatDefault),
\r
2452 EXTENSION(radRtFormatColorFormat),
\r
2453 EXTENSION(radRtFormatDepthFormat),
\r
2454 EXTENSION(radRtFormatStencilFormat),
\r
2455 EXTENSION(radRtFormatColorSamples),
\r
2456 EXTENSION(radRtFormatDepthStencilSamples),
\r
2457 EXTENSION(radCreatePipeline),
\r
2458 EXTENSION(radReferencePipeline),
\r
2459 EXTENSION(radReleasePipeline),
\r
2460 EXTENSION(radPipelineProgramStages),
\r
2461 EXTENSION(radPipelineVertexState),
\r
2462 EXTENSION(radPipelineColorState),
\r
2463 EXTENSION(radPipelineRasterState),
\r
2464 EXTENSION(radPipelineDepthStencilState),
\r
2465 EXTENSION(radPipelineRtFormatState),
\r
2466 EXTENSION(radPipelinePrimitiveType),
\r
2467 EXTENSION(radCompilePipeline),
\r
2468 EXTENSION(radGetPipelineHandle),
\r
2469 EXTENSION(radCreateCommandBuffer),
\r
2470 EXTENSION(radReferenceCommandBuffer),
\r
2471 EXTENSION(radReleaseCommandBuffer),
\r
2472 EXTENSION(radCmdBindPipeline),
\r
2473 EXTENSION(radCmdBindGroup),
\r
2474 EXTENSION(radCmdDrawArrays),
\r
2475 EXTENSION(radCmdDrawElements),
\r
2476 EXTENSION(radCompileCommandBuffer),
\r
2477 EXTENSION(radGetCommandHandle),
\r
2478 EXTENSION(radCmdStencilValueMask),
\r
2479 EXTENSION(radCmdStencilMask),
\r
2480 EXTENSION(radCmdStencilRef),
\r
2481 EXTENSION(radCmdBlendColor),
\r
2482 EXTENSION(radCmdPointSize),
\r
2483 EXTENSION(radCmdLineWidth),
\r
2484 EXTENSION(radCmdPolygonOffsetClamp),
\r
2485 EXTENSION(radCmdSampleMask),
\r
2486 EXTENSION(radCreatePass),
\r
2487 EXTENSION(radReferencePass),
\r
2488 EXTENSION(radReleasePass),
\r
2489 EXTENSION(radPassDefault),
\r
2490 EXTENSION(radCompilePass),
\r
2491 EXTENSION(radPassRenderTargets),
\r
2492 EXTENSION(radPassPreserveEnable),
\r
2493 EXTENSION(radPassDiscard),
\r
2494 EXTENSION(radPassResolve),
\r
2495 EXTENSION(radPassStore),
\r
2496 EXTENSION(radPassClip),
\r
2497 EXTENSION(radPassDependencies),
\r
2498 EXTENSION(radPassTilingBoundary),
\r
2499 EXTENSION(radPassTileFilterWidth),
\r
2500 EXTENSION(radPassTileFootprint),
\r
2501 EXTENSION(radCreateSync),
\r
2502 EXTENSION(radReferenceSync),
\r
2503 EXTENSION(radReleaseSync),
\r
2504 EXTENSION(radQueueFenceSync),
\r
2505 EXTENSION(radWaitSync),
\r
2506 EXTENSION(radQueueWaitSync),
\r
2511 for(int ext = 0; ext < sizeof(glExtensions) / sizeof(Extension); ext++)
\r
2513 if(strcmp(procname, glExtensions[ext].name) == 0)
\r
2515 return (RADPROC)glExtensions[ext].address;
\r
2522 void GL_APIENTRY Register(const char *licenseKey)
\r
2524 RegisterLicenseKey(licenseKey);
\r