mirror of
https://github.com/slint-ui/slint.git
synced 2025-09-30 13:51:13 +00:00
GL buffer handling cleanup
Move the buffer handling code into a separate file.
This commit is contained in:
parent
4834de04f9
commit
f29aa0a302
2 changed files with 91 additions and 86 deletions
88
sixtyfps_runtime/rendering_backends/gl/buffers.rs
Normal file
88
sixtyfps_runtime/rendering_backends/gl/buffers.rs
Normal file
|
@ -0,0 +1,88 @@
|
||||||
|
use super::GLContext;
|
||||||
|
use glow::HasContext;
|
||||||
|
use std::marker::PhantomData;
|
||||||
|
use std::mem;
|
||||||
|
|
||||||
|
pub struct GLArrayBuffer<ArrayMemberType> {
|
||||||
|
buffer_id: <GLContext as HasContext>::Buffer,
|
||||||
|
_type_marker: PhantomData<ArrayMemberType>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<ArrayMemberType> GLArrayBuffer<ArrayMemberType> {
|
||||||
|
pub fn new(gl: &glow::Context, data: &[ArrayMemberType]) -> Self {
|
||||||
|
let buffer_id = unsafe { gl.create_buffer().expect("vertex buffer") };
|
||||||
|
|
||||||
|
unsafe {
|
||||||
|
gl.bind_buffer(glow::ARRAY_BUFFER, Some(buffer_id));
|
||||||
|
|
||||||
|
let byte_len = mem::size_of_val(&data[0]) * data.len() / mem::size_of::<u8>();
|
||||||
|
let byte_slice = std::slice::from_raw_parts(data.as_ptr() as *const u8, byte_len);
|
||||||
|
gl.buffer_data_u8_slice(glow::ARRAY_BUFFER, byte_slice, glow::STATIC_DRAW);
|
||||||
|
}
|
||||||
|
|
||||||
|
Self { buffer_id, _type_marker: PhantomData }
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn bind(&self, gl: &glow::Context, attribute_location: u32) {
|
||||||
|
unsafe {
|
||||||
|
gl.bind_buffer(glow::ARRAY_BUFFER, Some(self.buffer_id));
|
||||||
|
|
||||||
|
// TODO #5: generalize GL array buffer size/data_type handling beyond f32
|
||||||
|
gl.vertex_attrib_pointer_f32(
|
||||||
|
attribute_location,
|
||||||
|
(mem::size_of::<ArrayMemberType>() / mem::size_of::<f32>()) as i32,
|
||||||
|
glow::FLOAT,
|
||||||
|
false,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
);
|
||||||
|
gl.enable_vertex_attrib_array(attribute_location);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO #3: make sure we release GL resources
|
||||||
|
/*
|
||||||
|
fn drop(&mut self, gl: &glow::Context) {
|
||||||
|
unsafe {
|
||||||
|
gl.delete_buffer(self.buffer_id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct GLIndexBuffer<IndexType> {
|
||||||
|
buffer_id: <GLContext as HasContext>::Buffer,
|
||||||
|
pub len: i32,
|
||||||
|
_vertex_marker: PhantomData<IndexType>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<IndexType> GLIndexBuffer<IndexType> {
|
||||||
|
pub fn new(gl: &glow::Context, data: &[IndexType]) -> Self {
|
||||||
|
let buffer_id = unsafe { gl.create_buffer().expect("vertex buffer") };
|
||||||
|
|
||||||
|
unsafe {
|
||||||
|
gl.bind_buffer(glow::ELEMENT_ARRAY_BUFFER, Some(buffer_id));
|
||||||
|
|
||||||
|
let byte_len = mem::size_of_val(&data[0]) * data.len() / mem::size_of::<u8>();
|
||||||
|
let byte_slice = std::slice::from_raw_parts(data.as_ptr() as *const u8, byte_len);
|
||||||
|
gl.buffer_data_u8_slice(glow::ELEMENT_ARRAY_BUFFER, byte_slice, glow::STATIC_DRAW);
|
||||||
|
}
|
||||||
|
|
||||||
|
Self { buffer_id, len: data.len() as i32, _vertex_marker: PhantomData }
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn bind(&self, gl: &glow::Context) {
|
||||||
|
unsafe {
|
||||||
|
gl.bind_buffer(glow::ELEMENT_ARRAY_BUFFER, Some(self.buffer_id));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO #3: make sure we release GL resources
|
||||||
|
/*
|
||||||
|
fn drop(&mut self, gl: &glow::Context) {
|
||||||
|
unsafe {
|
||||||
|
gl.delete_buffer(self.buffer_id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
}
|
|
@ -10,8 +10,6 @@ use sixtyfps_corelib::graphics::{
|
||||||
Color, FillStyle, Frame as GraphicsFrame, GraphicsBackend, RenderingPrimitivesBuilder,
|
Color, FillStyle, Frame as GraphicsFrame, GraphicsBackend, RenderingPrimitivesBuilder,
|
||||||
};
|
};
|
||||||
use std::cell::RefCell;
|
use std::cell::RefCell;
|
||||||
use std::marker;
|
|
||||||
use std::mem;
|
|
||||||
|
|
||||||
extern crate alloc;
|
extern crate alloc;
|
||||||
use alloc::rc::Rc;
|
use alloc::rc::Rc;
|
||||||
|
@ -22,6 +20,9 @@ use texture::{AtlasAllocation, GLTexture, TextureAtlas};
|
||||||
mod shader;
|
mod shader;
|
||||||
use shader::Shader;
|
use shader::Shader;
|
||||||
|
|
||||||
|
mod buffers;
|
||||||
|
use buffers::{GLArrayBuffer, GLIndexBuffer};
|
||||||
|
|
||||||
#[derive(Copy, Clone)]
|
#[derive(Copy, Clone)]
|
||||||
pub(crate) struct Vertex {
|
pub(crate) struct Vertex {
|
||||||
_pos: [f32; 2],
|
_pos: [f32; 2],
|
||||||
|
@ -47,90 +48,6 @@ enum GLRenderingPrimitive {
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
struct GLArrayBuffer<ArrayMemberType> {
|
|
||||||
buffer_id: <GLContext as HasContext>::Buffer,
|
|
||||||
_type_marker: marker::PhantomData<ArrayMemberType>,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<ArrayMemberType> GLArrayBuffer<ArrayMemberType> {
|
|
||||||
fn new(gl: &glow::Context, data: &[ArrayMemberType]) -> Self {
|
|
||||||
let buffer_id = unsafe { gl.create_buffer().expect("vertex buffer") };
|
|
||||||
|
|
||||||
unsafe {
|
|
||||||
gl.bind_buffer(glow::ARRAY_BUFFER, Some(buffer_id));
|
|
||||||
|
|
||||||
let byte_len = mem::size_of_val(&data[0]) * data.len() / mem::size_of::<u8>();
|
|
||||||
let byte_slice = std::slice::from_raw_parts(data.as_ptr() as *const u8, byte_len);
|
|
||||||
gl.buffer_data_u8_slice(glow::ARRAY_BUFFER, byte_slice, glow::STATIC_DRAW);
|
|
||||||
}
|
|
||||||
|
|
||||||
Self { buffer_id, _type_marker: marker::PhantomData }
|
|
||||||
}
|
|
||||||
|
|
||||||
fn bind(&self, gl: &glow::Context, attribute_location: u32) {
|
|
||||||
unsafe {
|
|
||||||
gl.bind_buffer(glow::ARRAY_BUFFER, Some(self.buffer_id));
|
|
||||||
|
|
||||||
// TODO #5: generalize GL array buffer size/data_type handling beyond f32
|
|
||||||
gl.vertex_attrib_pointer_f32(
|
|
||||||
attribute_location,
|
|
||||||
(mem::size_of::<ArrayMemberType>() / mem::size_of::<f32>()) as i32,
|
|
||||||
glow::FLOAT,
|
|
||||||
false,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
);
|
|
||||||
gl.enable_vertex_attrib_array(attribute_location);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO #3: make sure we release GL resources
|
|
||||||
/*
|
|
||||||
fn drop(&mut self, gl: &glow::Context) {
|
|
||||||
unsafe {
|
|
||||||
gl.delete_buffer(self.buffer_id);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
|
|
||||||
struct GLIndexBuffer<IndexType> {
|
|
||||||
buffer_id: <GLContext as HasContext>::Buffer,
|
|
||||||
len: i32,
|
|
||||||
_vertex_marker: marker::PhantomData<IndexType>,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<IndexType> GLIndexBuffer<IndexType> {
|
|
||||||
fn new(gl: &glow::Context, data: &[IndexType]) -> Self {
|
|
||||||
let buffer_id = unsafe { gl.create_buffer().expect("vertex buffer") };
|
|
||||||
|
|
||||||
unsafe {
|
|
||||||
gl.bind_buffer(glow::ELEMENT_ARRAY_BUFFER, Some(buffer_id));
|
|
||||||
|
|
||||||
let byte_len = mem::size_of_val(&data[0]) * data.len() / mem::size_of::<u8>();
|
|
||||||
let byte_slice = std::slice::from_raw_parts(data.as_ptr() as *const u8, byte_len);
|
|
||||||
gl.buffer_data_u8_slice(glow::ELEMENT_ARRAY_BUFFER, byte_slice, glow::STATIC_DRAW);
|
|
||||||
}
|
|
||||||
|
|
||||||
Self { buffer_id, len: data.len() as i32, _vertex_marker: marker::PhantomData }
|
|
||||||
}
|
|
||||||
|
|
||||||
fn bind(&self, gl: &glow::Context) {
|
|
||||||
unsafe {
|
|
||||||
gl.bind_buffer(glow::ELEMENT_ARRAY_BUFFER, Some(self.buffer_id));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO #3: make sure we release GL resources
|
|
||||||
/*
|
|
||||||
fn drop(&mut self, gl: &glow::Context) {
|
|
||||||
unsafe {
|
|
||||||
gl.delete_buffer(self.buffer_id);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
|
|
||||||
struct PreRenderedGlyph {
|
struct PreRenderedGlyph {
|
||||||
glyph_allocation: AtlasAllocation,
|
glyph_allocation: AtlasAllocation,
|
||||||
advance: f32,
|
advance: f32,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue