lib/openxr/session.rb in openxr-0.3.0 vs lib/openxr/session.rb in openxr-0.4.0
- old
+ new
@@ -1,12 +1,60 @@
# This is free and unencumbered software released into the public domain.
require_relative 'api'
require_relative 'handle'
+require_relative 'result'
##
# An OpenXR session handle.
#
# @see https://www.khronos.org/registry/OpenXR/specs/1.0/html/xrspec.html#session
class OpenXR::Session < OpenXR::Handle
- # TODO
+ extend OpenXR::API
+ include OpenXR::API
+
+ # @return [Instance]
+ attr_reader :instance
+
+ # @return [System]
+ attr_reader :system
+
+ ##
+ # @param [System]
+ # @param [XrGraphicsBinding] graphics_binding
+ # @raise [Result::Error] if `xrCreateSession` failed
+ def initialize(system, graphics_binding = nil)
+ @instance = system.instance
+ @system = system
+ @struct = XrSession.new
+
+ # https://www.khronos.org/registry/OpenXR/specs/1.0/man/html/openxr.html#_xrsessioncreateinfo3
+ request = XrSessionCreateInfo.new
+ request[:base][:next] = graphics_binding
+ request[:createFlags] = 0
+ request[:systemId] = system.id
+
+ # https://www.khronos.org/registry/OpenXR/specs/1.0/man/html/openxr.html#_xrcreatesession3
+ case result = xrCreateSession(instance.handle, request, @struct)
+ when XR_SUCCESS
+ else raise OpenXR::Result.for(result).new(:xrCreateSession)
+ end
+ end
+
+ #
+ # @return [FFI::Pointer]
+ def handle
+ @struct[:handle]
+ end
+
+ ##
+ # @return [void]
+ # @raise [Result::Error] if `xrDestroySession` failed
+ def destroy!
+ return if @struct.nil?
+ # https://www.khronos.org/registry/OpenXR/specs/1.0/man/html/openxr.html#_xrdestroysession3
+ case result = xrDestroySession(@struct[:handle])
+ when XR_SUCCESS then @struct = nil
+ else raise OpenXR::Result.for(result).new(:xrDestroySession) # unreachable
+ end
+ end
end # OpenXR::Session