1
0
Fork 0
forked from wry/wry

autocommit 2022-03-11 18:15:21 CET

This commit is contained in:
Julian Orth 2022-03-11 18:15:21 +01:00
parent 0399772467
commit b1890894b2
30 changed files with 2909 additions and 504 deletions

View file

@ -1,4 +1,4 @@
use crate::drm::drm::DrmDevice;
use crate::drm::drm::NodeType;
use crate::render::egl::device::EglDevice;
use crate::render::egl::sys::{
eglBindAPI, EGLAttrib, EGLLabelKHR, EGLenum, EGLint, EGL_DEBUG_MSG_CRITICAL_KHR,
@ -8,10 +8,11 @@ use crate::render::egl::sys::{
use crate::render::ext::{get_client_ext, get_device_ext, ClientExt, DeviceExt};
use crate::render::proc::ExtProc;
use crate::render::RenderError;
use ahash::AHashMap;
use bstr::ByteSlice;
use log::Level;
use once_cell::sync::Lazy;
use std::ffi::CStr;
use std::ffi::{CStr, CString};
use std::ptr;
use sys::{
EGL_BAD_ACCESS, EGL_BAD_ALLOC, EGL_BAD_ATTRIBUTE, EGL_BAD_CONFIG, EGL_BAD_CONTEXT,
@ -63,12 +64,14 @@ pub fn init() -> Result<(), RenderError> {
Ok(())
}
pub fn find_drm_device(drm_dev: &DrmDevice) -> Result<Option<EglDevice>, RenderError> {
pub fn find_drm_device(
drm_dev: &AHashMap<NodeType, CString>,
) -> Result<Option<EglDevice>, RenderError> {
for device in query_devices()? {
if device.exts.contains(DeviceExt::EXT_DEVICE_DRM) {
let device_file = device.query_string(EGL_DRM_DEVICE_FILE_EXT)?;
for (_, name) in drm_dev.nodes() {
if device_file == name {
for name in drm_dev.values() {
if device_file == &**name {
return Ok(Some(device));
}
}

View file

@ -1,5 +1,5 @@
use crate::drm::dma::DmaBuf;
use crate::drm::drm::{Drm, DRM_NODE_RENDER};
use crate::drm::drm::{Drm, NodeType};
use crate::format::{Format, XRGB8888};
use crate::render::egl::context::EglContext;
use crate::render::egl::find_drm_device;
@ -15,6 +15,7 @@ use ahash::AHashMap;
use renderdoc::{RenderDoc, V100};
use std::cell::{Cell, RefCell};
use std::ffi::CString;
use std::fmt::{Debug, Formatter};
use std::rc::Rc;
use uapi::ustr;
@ -51,14 +52,20 @@ pub struct RenderContext {
pub(super) fill_prog_color: GLint,
}
impl Debug for RenderContext {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
f.debug_struct("RenderContext").finish_non_exhaustive()
}
}
impl RenderContext {
pub fn from_drm_device(drm: &Drm) -> Result<Self, RenderError> {
let drm_dev = drm.get_device()?;
let node = match drm_dev.nodes().find(|(ty, _)| *ty == DRM_NODE_RENDER) {
let nodes = drm.get_nodes()?;
let node = match nodes.get(&NodeType::Render) {
None => return Err(RenderError::NoRenderNode),
Some((_, n)) => Rc::new(n.to_owned()),
Some(path) => Rc::new(path.to_owned()),
};
let egl_dev = match find_drm_device(&drm_dev)? {
let egl_dev = match find_drm_device(&nodes)? {
Some(d) => d,
None => return Err(RenderError::UnknownDrmDevice),
};

View file

@ -8,6 +8,7 @@ use crate::render::renderer::renderer::Renderer;
use crate::render::sys::{glBlendFunc, GL_ONE, GL_ONE_MINUS_SRC_ALPHA};
use crate::tree::Node;
use crate::State;
use std::fmt::{Debug, Formatter};
use std::ptr;
use std::rc::Rc;
@ -16,6 +17,12 @@ pub struct Framebuffer {
pub(super) gl: GlFrameBuffer,
}
impl Debug for Framebuffer {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
f.debug_struct("Framebuffer").finish_non_exhaustive()
}
}
impl Framebuffer {
pub fn render(&self, node: &dyn Node, state: &State, cursor_rect: Option<Rect>) {
let _ = self.ctx.ctx.with_current(|| {