diff --git a/Project.toml b/Project.toml index cec03bd..bed8099 100644 --- a/Project.toml +++ b/Project.toml @@ -1,20 +1,22 @@ name = "NVTX" uuid = "5da4648a-3479-48b8-97b9-01cb529c0a1f" -version = "1.0.3" authors = ["Simon Byrne "] +version = "1.0.3" [deps] +CEnum = "fa961155-64e5-5f13-b03f-caf6b980ea82" JuliaNVTXCallbacks_jll = "9c1d0b0a-7046-5b2e-a33f-ea22f176ac7e" Libdl = "8f399da3-3557-5675-b5ff-fb832c97cbdb" NVTX_jll = "e98f9f5b-d649-5603-91fd-7774390e6439" -[extensions] -NVTXColorsExt = "Colors" - [weakdeps] Colors = "5ae59095-9a9b-59fe-a467-6f913c188581" +[extensions] +NVTXColorsExt = "Colors" + [compat] +CEnum = "0.5.0" Colors = "0.12, 0.13" JuliaNVTXCallbacks_jll = "0.2" NVTX_jll = "3.1.1" diff --git a/src/api.jl b/src/api.jl index f200c93..e3f8893 100644 --- a/src/api.jl +++ b/src/api.jl @@ -1,3 +1,4 @@ +using CEnum """ initialize() @@ -76,36 +77,60 @@ function init!(sh::StringHandle) return sh end +@cenum nvtxColorType_t::Int32 begin + NVTX_COLOR_UNKNOWN = 0 + NVTX_COLOR_ARGB = 1 +end + +@cenum nvtxMessageType_t::Int32 begin + NVTX_MESSAGE_UNKNOWN = 0 + NVTX_MESSAGE_TYPE_ASCII = 1 + NVTX_MESSAGE_TYPE_UNICODE = 2 + #= NVTX_VERSION_2 =# + NVTX_MESSAGE_TYPE_REGISTERED = 3 +end + +@cenum nvtxPayloadType_t::Int32 begin + NVTX_PAYLOAD_UNKNOWN = 0 + NVTX_PAYLOAD_TYPE_UNSIGNED_INT64 = 1 + NVTX_PAYLOAD_TYPE_INT64 = 2 + NVTX_PAYLOAD_TYPE_DOUBLE = 3 + #= NVTX_VERSION_2 =# + NVTX_PAYLOAD_TYPE_UNSIGNED_INT32 = 4 + NVTX_PAYLOAD_TYPE_INT32 = 5 + NVTX_PAYLOAD_TYPE_FLOAT = 6 +end + struct EventAttributes version::UInt16 size::UInt16 category::UInt32 - colortype::Int32 + colortype::nvtxColorType_t color::UInt32 - payloadtype::Int32 + payloadtype::nvtxPayloadType_t reserved0::Int32 payload::UInt64 - messagetype::Int32 + messagetype::nvtxMessageType_t message::Ptr{Cvoid} end -payloadtype(::Nothing) = 0 -payloadtype(::UInt64) = 1 -payloadtype(::Int64) = 2 -payloadtype(::Float64) = 3 -payloadtype(::UInt32) = 4 -payloadtype(::Int32) = 5 -payloadtype(::Float32) = 6 +payloadtype(::Nothing) = NVTX_PAYLOAD_UNKNOWN +payloadtype(::UInt64) = NVTX_PAYLOAD_TYPE_UNSIGNED_INT64 +payloadtype(::Int64) = NVTX_PAYLOAD_TYPE_INT64 +payloadtype(::Float64) = NVTX_PAYLOAD_TYPE_DOUBLE +payloadtype(::UInt32) = NVTX_PAYLOAD_TYPE_UNSIGNED_INT32 +payloadtype(::Int32) = NVTX_PAYLOAD_TYPE_INT32 +payloadtype(::Float32) = NVTX_PAYLOAD_TYPE_FLOAT payloadtype(_) = error("Unsupported payload type") payloadval(::Nothing) = UInt64(0) payloadval(payload::UInt64) = payload -payloadval(payload::Int64) = reinterpret(UInt64,payload) -payloadval(payload::Float64) = reinterpret(UInt64,payload) +payloadval(payload::Int64) = reinterpret(UInt64, payload) +payloadval(payload::Float64) = reinterpret(UInt64, payload) # assumes little-endian payloadval(payload::UInt32) = UInt64(payload) -payloadval(payload::Int32) = UInt64(reinterpret(UInt32,payload)) -payloadval(payload::Float32) = UInt64(reinterpret(UInt32,payload)) +payloadval(payload::Int32) = UInt64(reinterpret(UInt32, payload)) +payloadval(payload::Float32) = UInt64(reinterpret(UInt32, payload)) # This is extended in the Colors extension for Colorant support _normalize_color(x) = x @@ -121,19 +146,32 @@ function event_attributes(; if message isa AbstractString message = Base.cconvert(Cstring, message) end + # This will be GC.preserved by the caller + msgref = message + + if isnothing(message) + message_type = NVTX_MESSAGE_UNKNOWN + message = C_NULL + elseif message isa StringHandle + message_type = NVTX_MESSAGE_TYPE_REGISTERED + message = message.ptr + else + message_type = NVTX_MESSAGE_TYPE_ASCII + message = Base.unsafe_convert(Cstring, message) + end EventAttributes( 3, # version sizeof(EventAttributes), # size something(category, 0), # category - isnothing(color) ? 0 : 1, # colortype (1 = ARGB) + isnothing(color) ? NVTX_COLOR_UNKNOWN : NVTX_COLOR_ARGB, something(color, 0), # color payloadtype(payload), # payloadtype 0, # reserved0 payloadval(payload), # payload - isnothing(message) ? 0 : message isa StringHandle ? 3 : 1, # messagetype - isnothing(message) ? C_NULL : message isa StringHandle ? message.ptr : Base.unsafe_convert(Cstring, message), # message - ), message + message_type, # messagetype + message, # message + ), msgref end """