From 8c69cf96f0e79d550038e8bb8538409ebf4aed78 Mon Sep 17 00:00:00 2001 From: Lee Salzman Date: Tue, 11 Aug 2020 23:11:33 +0000 Subject: [PATCH] Bug 1652894 - add SWGL utility bindings for managing textures. r=jimb Differential Revision: https://phabricator.services.mozilla.com/D86338 --- gfx/webrender_bindings/src/swgl_bindings.rs | 44 +++++++++++++++++++++ gfx/wr/swgl/src/gl.cc | 8 +++- gfx/wr/swgl/src/swgl_fns.rs | 7 ++++ 3 files changed, 57 insertions(+), 2 deletions(-) diff --git a/gfx/webrender_bindings/src/swgl_bindings.rs b/gfx/webrender_bindings/src/swgl_bindings.rs index eb02b72e1a99..0ee99720229b 100644 --- a/gfx/webrender_bindings/src/swgl_bindings.rs +++ b/gfx/webrender_bindings/src/swgl_bindings.rs @@ -47,6 +47,50 @@ pub extern "C" fn wr_swgl_init_default_framebuffer( swgl::Context::from(ctx).init_default_framebuffer(width, height, stride, buf); } +#[no_mangle] +pub extern "C" fn wr_swgl_gen_texture(ctx: *mut c_void) -> u32 { + swgl::Context::from(ctx).gen_textures(1)[0] +} + +#[no_mangle] +pub extern "C" fn wr_swgl_delete_texture(ctx: *mut c_void, tex: u32) { + swgl::Context::from(ctx).delete_textures(&[tex]); +} + +#[no_mangle] +pub extern "C" fn wr_swgl_set_texture_parameter( + ctx: *mut c_void, + tex: u32, + pname: u32, + param: i32, +) { + swgl::Context::from(ctx).set_texture_parameter(tex, pname, param); +} + +#[no_mangle] +pub extern "C" fn wr_swgl_set_texture_buffer( + ctx: *mut c_void, + tex: u32, + internal_format: u32, + width: i32, + height: i32, + stride: i32, + buf: *mut c_void, + min_width: i32, + min_height: i32, +) { + swgl::Context::from(ctx).set_texture_buffer( + tex, + internal_format, + width, + height, + stride, + buf, + min_width, + min_height, + ); +} + pub struct SwTile { x: i32, y: i32, diff --git a/gfx/wr/swgl/src/gl.cc b/gfx/wr/swgl/src/gl.cc index 030cc15a24db..958db2acce78 100644 --- a/gfx/wr/swgl/src/gl.cc +++ b/gfx/wr/swgl/src/gl.cc @@ -1539,8 +1539,8 @@ void GenerateMipmap(UNUSED GLenum target) { // TODO: support mipmaps } -void TexParameteri(GLenum target, GLenum pname, GLint param) { - Texture& t = ctx->textures[ctx->get_binding(target)]; +void SetTextureParameter(GLuint texid, GLenum pname, GLint param) { + Texture& t = ctx->textures[texid]; switch (pname) { case GL_TEXTURE_WRAP_S: assert(param == GL_CLAMP_TO_EDGE); @@ -1559,6 +1559,10 @@ void TexParameteri(GLenum target, GLenum pname, GLint param) { } } +void TexParameteri(GLenum target, GLenum pname, GLint param) { + SetTextureParameter(ctx->get_binding(target), pname, param); +} + void GenTextures(int n, GLuint* result) { for (int i = 0; i < n; i++) { Texture t; diff --git a/gfx/wr/swgl/src/swgl_fns.rs b/gfx/wr/swgl/src/swgl_fns.rs index b43b3df928b7..4b7d9ad00404 100644 --- a/gfx/wr/swgl/src/swgl_fns.rs +++ b/gfx/wr/swgl/src/swgl_fns.rs @@ -273,6 +273,7 @@ extern "C" { min_width: GLsizei, min_height: GLsizei, ); + fn SetTextureParameter(tex: GLuint, pname: GLenum, param: GLint); fn DeleteTexture(n: GLuint); fn DeleteRenderbuffer(n: GLuint); fn DeleteFramebuffer(n: GLuint); @@ -372,6 +373,12 @@ impl Context { } } + pub fn set_texture_parameter(&self, tex: GLuint, pname: GLenum, param: GLint) { + unsafe { + SetTextureParameter(tex, pname, param); + } + } + pub fn lock_framebuffer(&self, fbo: GLuint) -> Option { unsafe { let resource = LockFramebuffer(fbo);