class OpenXR::Extension

An OpenXR instance extension.

@see www.khronos.org/registry/OpenXR/specs/1.0/html/xrspec.html#extensions

Public Class Methods

count() click to toggle source

@return [Integer] @raise [Result::Error] if `:xrEnumerateInstanceExtensionProperties` failed

# File lib/openxr/extension.rb, line 19
def self.count
  response = FFI::MemoryPointer.new(:uint32)
  begin
    # https://www.khronos.org/registry/OpenXR/specs/1.0/man/html/openxr.html#_xrenumerateinstanceextensionproperties3
    case result = xrEnumerateInstanceExtensionProperties(nil, 0, response, nil)
      when XR_SUCCESS then response.read(:uint32)
      else raise OpenXR::Result.for(result).new(:xrEnumerateInstanceExtensionProperties)
    end
  ensure
    response&.free
  end
end
each(&block) click to toggle source

@yield [extension] @return [Enumerator]

# File lib/openxr/extension.rb, line 35
def self.each(&block)
  return self.to_enum(:each) unless block_given?
  self.list.each(&block)
end
list() click to toggle source

@return [Array<Extension>]

# File lib/openxr/extension.rb, line 42
def self.list
  self.query.values
end
query() click to toggle source

@return [Hash<Symbol, Extension>] @raise [Result::Error] if `:xrEnumerateInstanceExtensionProperties` failed

# File lib/openxr/extension.rb, line 49
def self.query
  request_count  = self.count
  response_count = FFI::MemoryPointer.new(:uint32)
  response_array = FFI::MemoryPointer.new(XrExtensionProperties, request_count)
  begin
    request_count.times do |i|
      XrExtensionProperties.new(response_array[i]).set_type!
    end

    # https://www.khronos.org/registry/OpenXR/specs/1.0/man/html/openxr.html#_xrenumerateinstanceextensionproperties3
    case result = xrEnumerateInstanceExtensionProperties(nil, request_count, response_count, response_array)
      when XR_SUCCESS
        response_count.read(:uint32).times.inject({}) do |available, i|
          response = XrExtensionProperties.new(response_array[i])
          extension_name = response[:extensionName].to_s.to_sym
          extension_version = response[:extensionVersion]
          available[extension_name] = self.new(extension_name, extension_version)
          available
        end
      else raise OpenXR::Result.for(result).new(:xrEnumerateInstanceExtensionProperties)
    end
  ensure
    response_array&.free
    response_count&.free
  end
end