Skip to content

Commit

Permalink
Fix bad stride in serialization
Browse files Browse the repository at this point in the history
  • Loading branch information
serenity4 committed Jan 25, 2025
1 parent e64c5ad commit 15aa570
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 2 deletions.
11 changes: 10 additions & 1 deletion src/serialization.jl
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,16 @@ function serialize_array!(bytes, data::AbstractVecOrMat, layout::LayoutStrategy,
pad!(bytes, padding)
end
end
function serialize!(bytes, data::VecOrMat, layout::LayoutStrategy)

function serialize!(bytes, data::Vector, layout::LayoutStrategy)
T = typeof(data)
isbitstype(eltype(data)) &&
stride(NativeLayout(), T) == stride(layout, T) &&
return append!(bytes, reinterpret(UInt8, data))
serialize_array!(bytes, data, layout, padding(layout, data))
end

function serialize!(bytes, data::Matrix, layout::LayoutStrategy)
pad = padding(layout, data)
iszero(pad) && isbitstype(eltype(data)) && return append!(bytes, reinterpret(UInt8, data))
serialize_array!(bytes, data, layout, pad)
Expand Down
14 changes: 13 additions & 1 deletion test/layouts.jl
Original file line number Diff line number Diff line change
Expand Up @@ -101,10 +101,16 @@ struct Align12
attenuation::Float32
end

struct Align13
range::UnitRange{UInt32}
font_size::Float32
color::Vec4
end

primitive type WeirdType 24 end
WeirdType(bytes = [0x01, 0x02, 0x03]) = reinterpret(WeirdType, bytes)[]

align_types = [Align1, Align2, Align3, Align4, Align5, Align6, Align7, Align8, Align9, Align10, Align11, Align12]
align_types = [Align1, Align2, Align3, Align4, Align5, Align6, Align7, Align8, Align9, Align10, Align11, Align12, Align13]
alltypes = [align_types; WeirdType]
layout = VulkanLayout(align_types)

Expand Down Expand Up @@ -241,6 +247,12 @@ layout = VulkanLayout(align_types)
add_type_layouts!(tmeta, layout)
test_has_offset(tmeta, Align11, 1, 0)
test_has_offset(tmeta, Align11, 2, 16)

tmeta = TypeMetadata([Align13])
add_type_layouts!(tmeta, layout)
test_has_offset(tmeta, Align13, 1, 0)
test_has_offset(tmeta, Align13, 2, 8)
test_has_offset(tmeta, Align13, 3, 16)
end

@testset "Array/Matrix layouts" begin
Expand Down
1 change: 1 addition & 0 deletions test/serialization.jl
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ end
((Vec3(4, 5, 6), (Vec3(7, 8, 9),)),),
(1F, 2F, 3F, (Vec3(4, 5, 6), ((Vec3(7, 8, 9), Vec3(10, 11, 12)), 13F), Vec3(14, 15, 16))),
[Align12((0.1, 0.2, 0.3), (0.4, 0.5, 0.6), 0.7, 0.8)],
[Align13(1:3, 4.0, (5.0, 6.0, 7.0, 8.0)), Align13(10:30, 40.0, (50.0, 60.0, 70.0, 80.0))],
]
matrices = [
[1 2; 3 4; 5 6],
Expand Down

0 comments on commit 15aa570

Please sign in to comment.