Avoid casting view ids to u32
Also, it looks like using a u64 directly doesn't work well with Metal shaders, so we unpack the u64 into two u32s.
This commit is contained in:
parent
a4ef1bc096
commit
142a8b68c8
3 changed files with 55 additions and 31 deletions
|
@ -26,11 +26,11 @@ use git::diff::DiffHunkStatus;
|
||||||
use gpui::{
|
use gpui::{
|
||||||
div, fill, outline, overlay, point, px, quad, relative, size, transparent_black, Action,
|
div, fill, outline, overlay, point, px, quad, relative, size, transparent_black, Action,
|
||||||
AnchorCorner, AnyElement, AvailableSpace, BorrowWindow, Bounds, ContentMask, Corners,
|
AnchorCorner, AnyElement, AvailableSpace, BorrowWindow, Bounds, ContentMask, Corners,
|
||||||
CursorStyle, DispatchPhase, Edges, Element, ElementInputHandler, Hsla, InteractiveBounds,
|
CursorStyle, DispatchPhase, Edges, Element, ElementInputHandler, Entity, Hsla,
|
||||||
InteractiveElement, IntoElement, ModifiersChangedEvent, MouseButton, MouseDownEvent,
|
InteractiveBounds, InteractiveElement, IntoElement, ModifiersChangedEvent, MouseButton,
|
||||||
MouseMoveEvent, MouseUpEvent, ParentElement, Pixels, ScrollDelta, ScrollWheelEvent, ShapedLine,
|
MouseDownEvent, MouseMoveEvent, MouseUpEvent, ParentElement, Pixels, ScrollDelta,
|
||||||
SharedString, Size, StackingOrder, StatefulInteractiveElement, Style, Styled, TextRun,
|
ScrollWheelEvent, ShapedLine, SharedString, Size, StackingOrder, StatefulInteractiveElement,
|
||||||
TextStyle, View, ViewContext, WindowContext,
|
Style, Styled, TextRun, TextStyle, View, ViewContext, WindowContext,
|
||||||
};
|
};
|
||||||
use itertools::Itertools;
|
use itertools::Itertools;
|
||||||
use language::language_settings::ShowWhitespaceSetting;
|
use language::language_settings::ShowWhitespaceSetting;
|
||||||
|
|
|
@ -13,6 +13,30 @@ pub(crate) type PathVertex_ScaledPixels = PathVertex<ScaledPixels>;
|
||||||
pub type LayerId = u32;
|
pub type LayerId = u32;
|
||||||
pub type DrawOrder = u32;
|
pub type DrawOrder = u32;
|
||||||
|
|
||||||
|
#[derive(Default, Copy, Clone, Debug, Eq, PartialEq, Hash)]
|
||||||
|
#[repr(C)]
|
||||||
|
pub struct ViewId {
|
||||||
|
low_bits: u32,
|
||||||
|
high_bits: u32,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<EntityId> for ViewId {
|
||||||
|
fn from(value: EntityId) -> Self {
|
||||||
|
let value = value.as_u64();
|
||||||
|
Self {
|
||||||
|
low_bits: value as u32,
|
||||||
|
high_bits: (value >> 32) as u32,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<ViewId> for EntityId {
|
||||||
|
fn from(value: ViewId) -> Self {
|
||||||
|
let value = (value.low_bits as u64) | ((value.high_bits as u64) << 32);
|
||||||
|
value.into()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Default)]
|
#[derive(Default)]
|
||||||
pub struct Scene {
|
pub struct Scene {
|
||||||
layers_by_order: BTreeMap<StackingOrder, LayerId>,
|
layers_by_order: BTreeMap<StackingOrder, LayerId>,
|
||||||
|
@ -127,49 +151,49 @@ impl Scene {
|
||||||
|
|
||||||
pub fn reuse_views(&mut self, views: &FxHashSet<EntityId>, prev_scene: &mut Self) {
|
pub fn reuse_views(&mut self, views: &FxHashSet<EntityId>, prev_scene: &mut Self) {
|
||||||
for shadow in prev_scene.shadows.drain(..) {
|
for shadow in prev_scene.shadows.drain(..) {
|
||||||
if views.contains(&EntityId::from(shadow.view_id as u64)) {
|
if views.contains(&shadow.view_id.into()) {
|
||||||
let order = &prev_scene.orders_by_layer[&shadow.layer_id];
|
let order = &prev_scene.orders_by_layer[&shadow.layer_id];
|
||||||
self.insert(&order, shadow);
|
self.insert(&order, shadow);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for quad in prev_scene.quads.drain(..) {
|
for quad in prev_scene.quads.drain(..) {
|
||||||
if views.contains(&EntityId::from(quad.view_id as u64)) {
|
if views.contains(&quad.view_id.into()) {
|
||||||
let order = &prev_scene.orders_by_layer[&quad.layer_id];
|
let order = &prev_scene.orders_by_layer[&quad.layer_id];
|
||||||
self.insert(&order, quad);
|
self.insert(&order, quad);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for path in prev_scene.paths.drain(..) {
|
for path in prev_scene.paths.drain(..) {
|
||||||
if views.contains(&EntityId::from(path.view_id as u64)) {
|
if views.contains(&path.view_id.into()) {
|
||||||
let order = &prev_scene.orders_by_layer[&path.layer_id];
|
let order = &prev_scene.orders_by_layer[&path.layer_id];
|
||||||
self.insert(&order, path);
|
self.insert(&order, path);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for underline in prev_scene.underlines.drain(..) {
|
for underline in prev_scene.underlines.drain(..) {
|
||||||
if views.contains(&EntityId::from(underline.view_id as u64)) {
|
if views.contains(&underline.view_id.into()) {
|
||||||
let order = &prev_scene.orders_by_layer[&underline.layer_id];
|
let order = &prev_scene.orders_by_layer[&underline.layer_id];
|
||||||
self.insert(&order, underline);
|
self.insert(&order, underline);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for sprite in prev_scene.monochrome_sprites.drain(..) {
|
for sprite in prev_scene.monochrome_sprites.drain(..) {
|
||||||
if views.contains(&EntityId::from(sprite.view_id as u64)) {
|
if views.contains(&sprite.view_id.into()) {
|
||||||
let order = &prev_scene.orders_by_layer[&sprite.layer_id];
|
let order = &prev_scene.orders_by_layer[&sprite.layer_id];
|
||||||
self.insert(&order, sprite);
|
self.insert(&order, sprite);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for sprite in prev_scene.polychrome_sprites.drain(..) {
|
for sprite in prev_scene.polychrome_sprites.drain(..) {
|
||||||
if views.contains(&EntityId::from(sprite.view_id as u64)) {
|
if views.contains(&sprite.view_id.into()) {
|
||||||
let order = &prev_scene.orders_by_layer[&sprite.layer_id];
|
let order = &prev_scene.orders_by_layer[&sprite.layer_id];
|
||||||
self.insert(&order, sprite);
|
self.insert(&order, sprite);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for surface in prev_scene.surfaces.drain(..) {
|
for surface in prev_scene.surfaces.drain(..) {
|
||||||
if views.contains(&EntityId::from(surface.view_id as u64)) {
|
if views.contains(&surface.view_id.into()) {
|
||||||
let order = &prev_scene.orders_by_layer[&surface.layer_id];
|
let order = &prev_scene.orders_by_layer[&surface.layer_id];
|
||||||
self.insert(&order, surface);
|
self.insert(&order, surface);
|
||||||
}
|
}
|
||||||
|
@ -470,7 +494,7 @@ pub(crate) enum PrimitiveBatch<'a> {
|
||||||
#[derive(Default, Debug, Clone, Eq, PartialEq)]
|
#[derive(Default, Debug, Clone, Eq, PartialEq)]
|
||||||
#[repr(C)]
|
#[repr(C)]
|
||||||
pub struct Quad {
|
pub struct Quad {
|
||||||
pub view_id: u32,
|
pub view_id: ViewId,
|
||||||
pub layer_id: LayerId,
|
pub layer_id: LayerId,
|
||||||
pub order: DrawOrder,
|
pub order: DrawOrder,
|
||||||
pub bounds: Bounds<ScaledPixels>,
|
pub bounds: Bounds<ScaledPixels>,
|
||||||
|
@ -502,7 +526,7 @@ impl From<Quad> for Primitive {
|
||||||
#[derive(Debug, Clone, Eq, PartialEq)]
|
#[derive(Debug, Clone, Eq, PartialEq)]
|
||||||
#[repr(C)]
|
#[repr(C)]
|
||||||
pub struct Underline {
|
pub struct Underline {
|
||||||
pub view_id: u32,
|
pub view_id: ViewId,
|
||||||
pub layer_id: LayerId,
|
pub layer_id: LayerId,
|
||||||
pub order: DrawOrder,
|
pub order: DrawOrder,
|
||||||
pub bounds: Bounds<ScaledPixels>,
|
pub bounds: Bounds<ScaledPixels>,
|
||||||
|
@ -533,7 +557,7 @@ impl From<Underline> for Primitive {
|
||||||
#[derive(Debug, Clone, Eq, PartialEq)]
|
#[derive(Debug, Clone, Eq, PartialEq)]
|
||||||
#[repr(C)]
|
#[repr(C)]
|
||||||
pub struct Shadow {
|
pub struct Shadow {
|
||||||
pub view_id: u32,
|
pub view_id: ViewId,
|
||||||
pub layer_id: LayerId,
|
pub layer_id: LayerId,
|
||||||
pub order: DrawOrder,
|
pub order: DrawOrder,
|
||||||
pub bounds: Bounds<ScaledPixels>,
|
pub bounds: Bounds<ScaledPixels>,
|
||||||
|
@ -564,7 +588,7 @@ impl From<Shadow> for Primitive {
|
||||||
#[derive(Clone, Debug, Eq, PartialEq)]
|
#[derive(Clone, Debug, Eq, PartialEq)]
|
||||||
#[repr(C)]
|
#[repr(C)]
|
||||||
pub struct MonochromeSprite {
|
pub struct MonochromeSprite {
|
||||||
pub view_id: u32,
|
pub view_id: ViewId,
|
||||||
pub layer_id: LayerId,
|
pub layer_id: LayerId,
|
||||||
pub order: DrawOrder,
|
pub order: DrawOrder,
|
||||||
pub bounds: Bounds<ScaledPixels>,
|
pub bounds: Bounds<ScaledPixels>,
|
||||||
|
@ -597,7 +621,7 @@ impl From<MonochromeSprite> for Primitive {
|
||||||
#[derive(Clone, Debug, Eq, PartialEq)]
|
#[derive(Clone, Debug, Eq, PartialEq)]
|
||||||
#[repr(C)]
|
#[repr(C)]
|
||||||
pub struct PolychromeSprite {
|
pub struct PolychromeSprite {
|
||||||
pub view_id: u32,
|
pub view_id: ViewId,
|
||||||
pub layer_id: LayerId,
|
pub layer_id: LayerId,
|
||||||
pub order: DrawOrder,
|
pub order: DrawOrder,
|
||||||
pub bounds: Bounds<ScaledPixels>,
|
pub bounds: Bounds<ScaledPixels>,
|
||||||
|
@ -630,7 +654,7 @@ impl From<PolychromeSprite> for Primitive {
|
||||||
|
|
||||||
#[derive(Clone, Debug, Eq, PartialEq)]
|
#[derive(Clone, Debug, Eq, PartialEq)]
|
||||||
pub struct Surface {
|
pub struct Surface {
|
||||||
pub view_id: u32,
|
pub view_id: ViewId,
|
||||||
pub layer_id: LayerId,
|
pub layer_id: LayerId,
|
||||||
pub order: DrawOrder,
|
pub order: DrawOrder,
|
||||||
pub bounds: Bounds<ScaledPixels>,
|
pub bounds: Bounds<ScaledPixels>,
|
||||||
|
@ -662,7 +686,7 @@ pub(crate) struct PathId(pub(crate) usize);
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct Path<P: Clone + Default + Debug> {
|
pub struct Path<P: Clone + Default + Debug> {
|
||||||
pub(crate) id: PathId,
|
pub(crate) id: PathId,
|
||||||
pub(crate) view_id: u32,
|
pub(crate) view_id: ViewId,
|
||||||
layer_id: LayerId,
|
layer_id: LayerId,
|
||||||
order: DrawOrder,
|
order: DrawOrder,
|
||||||
pub(crate) bounds: Bounds<P>,
|
pub(crate) bounds: Bounds<P>,
|
||||||
|
@ -678,9 +702,9 @@ impl Path<Pixels> {
|
||||||
pub fn new(start: Point<Pixels>) -> Self {
|
pub fn new(start: Point<Pixels>) -> Self {
|
||||||
Self {
|
Self {
|
||||||
id: PathId(0),
|
id: PathId(0),
|
||||||
view_id: 0,
|
view_id: ViewId::default(),
|
||||||
layer_id: 0,
|
layer_id: LayerId::default(),
|
||||||
order: 0,
|
order: DrawOrder::default(),
|
||||||
vertices: Vec::new(),
|
vertices: Vec::new(),
|
||||||
start,
|
start,
|
||||||
current: start,
|
current: start,
|
||||||
|
|
|
@ -1102,7 +1102,7 @@ impl<'a> WindowContext<'a> {
|
||||||
window.next_frame.scene.insert(
|
window.next_frame.scene.insert(
|
||||||
&window.next_frame.z_index_stack,
|
&window.next_frame.z_index_stack,
|
||||||
Shadow {
|
Shadow {
|
||||||
view_id: view_id.as_u64() as u32,
|
view_id: view_id.into(),
|
||||||
layer_id: 0,
|
layer_id: 0,
|
||||||
order: 0,
|
order: 0,
|
||||||
bounds: shadow_bounds.scale(scale_factor),
|
bounds: shadow_bounds.scale(scale_factor),
|
||||||
|
@ -1127,7 +1127,7 @@ impl<'a> WindowContext<'a> {
|
||||||
window.next_frame.scene.insert(
|
window.next_frame.scene.insert(
|
||||||
&window.next_frame.z_index_stack,
|
&window.next_frame.z_index_stack,
|
||||||
Quad {
|
Quad {
|
||||||
view_id: view_id.as_u64() as u32,
|
view_id: view_id.into(),
|
||||||
layer_id: 0,
|
layer_id: 0,
|
||||||
order: 0,
|
order: 0,
|
||||||
bounds: quad.bounds.scale(scale_factor),
|
bounds: quad.bounds.scale(scale_factor),
|
||||||
|
@ -1148,7 +1148,7 @@ impl<'a> WindowContext<'a> {
|
||||||
|
|
||||||
path.content_mask = content_mask;
|
path.content_mask = content_mask;
|
||||||
path.color = color.into();
|
path.color = color.into();
|
||||||
path.view_id = view_id.as_u64() as u32;
|
path.view_id = view_id.into();
|
||||||
let window = &mut *self.window;
|
let window = &mut *self.window;
|
||||||
window
|
window
|
||||||
.next_frame
|
.next_frame
|
||||||
|
@ -1180,7 +1180,7 @@ impl<'a> WindowContext<'a> {
|
||||||
window.next_frame.scene.insert(
|
window.next_frame.scene.insert(
|
||||||
&window.next_frame.z_index_stack,
|
&window.next_frame.z_index_stack,
|
||||||
Underline {
|
Underline {
|
||||||
view_id: view_id.as_u64() as u32,
|
view_id: view_id.into(),
|
||||||
layer_id: 0,
|
layer_id: 0,
|
||||||
order: 0,
|
order: 0,
|
||||||
bounds: bounds.scale(scale_factor),
|
bounds: bounds.scale(scale_factor),
|
||||||
|
@ -1236,7 +1236,7 @@ impl<'a> WindowContext<'a> {
|
||||||
window.next_frame.scene.insert(
|
window.next_frame.scene.insert(
|
||||||
&window.next_frame.z_index_stack,
|
&window.next_frame.z_index_stack,
|
||||||
MonochromeSprite {
|
MonochromeSprite {
|
||||||
view_id: view_id.as_u64() as u32,
|
view_id: view_id.into(),
|
||||||
layer_id: 0,
|
layer_id: 0,
|
||||||
order: 0,
|
order: 0,
|
||||||
bounds,
|
bounds,
|
||||||
|
@ -1290,7 +1290,7 @@ impl<'a> WindowContext<'a> {
|
||||||
window.next_frame.scene.insert(
|
window.next_frame.scene.insert(
|
||||||
&window.next_frame.z_index_stack,
|
&window.next_frame.z_index_stack,
|
||||||
PolychromeSprite {
|
PolychromeSprite {
|
||||||
view_id: view_id.as_u64() as u32,
|
view_id: view_id.into(),
|
||||||
layer_id: 0,
|
layer_id: 0,
|
||||||
order: 0,
|
order: 0,
|
||||||
bounds,
|
bounds,
|
||||||
|
@ -1335,7 +1335,7 @@ impl<'a> WindowContext<'a> {
|
||||||
window.next_frame.scene.insert(
|
window.next_frame.scene.insert(
|
||||||
&window.next_frame.z_index_stack,
|
&window.next_frame.z_index_stack,
|
||||||
MonochromeSprite {
|
MonochromeSprite {
|
||||||
view_id: view_id.as_u64() as u32,
|
view_id: view_id.into(),
|
||||||
layer_id: 0,
|
layer_id: 0,
|
||||||
order: 0,
|
order: 0,
|
||||||
bounds,
|
bounds,
|
||||||
|
@ -1374,7 +1374,7 @@ impl<'a> WindowContext<'a> {
|
||||||
window.next_frame.scene.insert(
|
window.next_frame.scene.insert(
|
||||||
&window.next_frame.z_index_stack,
|
&window.next_frame.z_index_stack,
|
||||||
PolychromeSprite {
|
PolychromeSprite {
|
||||||
view_id: view_id.as_u64() as u32,
|
view_id: view_id.into(),
|
||||||
layer_id: 0,
|
layer_id: 0,
|
||||||
order: 0,
|
order: 0,
|
||||||
bounds,
|
bounds,
|
||||||
|
@ -1397,7 +1397,7 @@ impl<'a> WindowContext<'a> {
|
||||||
window.next_frame.scene.insert(
|
window.next_frame.scene.insert(
|
||||||
&window.next_frame.z_index_stack,
|
&window.next_frame.z_index_stack,
|
||||||
Surface {
|
Surface {
|
||||||
view_id: view_id.as_u64() as u32,
|
view_id: view_id.into(),
|
||||||
layer_id: 0,
|
layer_id: 0,
|
||||||
order: 0,
|
order: 0,
|
||||||
bounds,
|
bounds,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue