Implement new WebGL interfaces and methods

This commit implements:
* WebGLFramebuffer
* WebGLRenderbuffer
* WebGLTexture

And adds the following methods to `WebGLRenderingContext`:
* create{Texture,Framebuffer,Renderbuffer}
* bind{Texture,Framebuffer,Renderbuffer}
* destroy{Buffer,Texture,Framebuffer,Renderbuffer}

Fixes:
* WebGLUniform location shouldn't inherit from WebGLObject.

Known Issues:
* WebGL objects have to be destroyed on drop, we may want to keep a reference to the context, or maybe a clone of the renderer to achieve this

Also refactors a huge part of the current implementation, to allow
failing on creation of different WebGL objects.

Blocked on https://github.com/servo/gleam/pull/22

A reftest for most of the added functionality is not doable right now,
we need a few more functions in order to upload a texture, for example.
This commit is contained in:
ecoal95 2015-06-05 15:44:03 +02:00
parent ad5846f2e1
commit 9f94d39c9e
14 changed files with 469 additions and 102 deletions

View file

@ -0,0 +1,7 @@
//
// WebGL IDL definitions scraped from the Khronos specification:
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.7
//
interface WebGLFramebuffer : WebGLObject {
};

View file

@ -0,0 +1,7 @@
//
// WebGL IDL definitions scraped from the Khronos specification:
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.5
//
interface WebGLRenderbuffer : WebGLObject {
};

View file

@ -485,15 +485,15 @@ interface WebGLRenderingContextBase
//[WebGLHandlesContextLoss] boolean isContextLost();
//sequence<DOMString>? getSupportedExtensions();
//object? getExtension(DOMString name);
object? getExtension(DOMString name);
//void activeTexture(GLenum texture);
void attachShader(WebGLProgram? program, WebGLShader? shader);
//void bindAttribLocation(WebGLProgram? program, GLuint index, DOMString name);
void bindBuffer(GLenum target, WebGLBuffer? buffer);
//void bindFramebuffer(GLenum target, WebGLFramebuffer? framebuffer);
//void bindRenderbuffer(GLenum target, WebGLRenderbuffer? renderbuffer);
//void bindTexture(GLenum target, WebGLTexture? texture);
void bindFramebuffer(GLenum target, WebGLFramebuffer? framebuffer);
void bindRenderbuffer(GLenum target, WebGLRenderbuffer? renderbuffer);
void bindTexture(GLenum target, WebGLTexture? texture);
//void blendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);
//void blendEquation(GLenum mode);
//void blendEquationSeparate(GLenum modeRGB, GLenum modeAlpha);
@ -533,20 +533,20 @@ interface WebGLRenderingContextBase
// GLint x, GLint y, GLsizei width, GLsizei height);
WebGLBuffer? createBuffer();
//WebGLFramebuffer? createFramebuffer();
WebGLFramebuffer? createFramebuffer();
WebGLProgram? createProgram();
//WebGLRenderbuffer? createRenderbuffer();
WebGLRenderbuffer? createRenderbuffer();
WebGLShader? createShader(GLenum type);
//WebGLTexture? createTexture();
WebGLTexture? createTexture();
//void cullFace(GLenum mode);
//void deleteBuffer(WebGLBuffer? buffer);
//void deleteFramebuffer(WebGLFramebuffer? framebuffer);
//void deleteProgram(WebGLProgram? program);
//void deleteRenderbuffer(WebGLRenderbuffer? renderbuffer);
//void deleteShader(WebGLShader? shader);
//void deleteTexture(WebGLTexture? texture);
void deleteBuffer(WebGLBuffer? buffer);
void deleteFramebuffer(WebGLFramebuffer? framebuffer);
void deleteProgram(WebGLProgram? program);
void deleteRenderbuffer(WebGLRenderbuffer? renderbuffer);
void deleteShader(WebGLShader? shader);
void deleteTexture(WebGLTexture? texture);
//void depthFunc(GLenum func);
//void depthMask(GLboolean flag);

View file

@ -0,0 +1,7 @@
//
// WebGL IDL definitions scraped from the Khronos specification:
// https://www.khronos.org/registry/webgl/specs/latest/#5.9
//
interface WebGLTexture : WebGLObject {
};