Skip to content

[vrcompositor]Tracked Camera: Failed to create static GPU resources. #1881

Open
@fww0071215

Description

@fww0071215

Greetings, I am presently engaged in the development of a VR driver operating in extended mode. I have successfully managed to display the VR imagery onto the correct monitor; however, I have encountered several issues whilst undertaking the development related to the camera functionalities.

My driver, referencing the implementation of openvr-customhmd, has incorporated the IVRCameraComponent. I have instrumented each interface with logging and set breakpoints, yet it seems that SteamVR has not invoked the IVRCameraComponent interface that I have implemented. Within the vrcompositor.txt, I discovered the following log entries:

Tue Jan 14 2025 14:30:16.273 [Info] - Initializing camera
Tue Jan 14 2025 14:30:16.273 [Info] - Creating static resources for tracked camera
Tue Jan 14 2025 14:30:16.274 [Info] - Tracked Camera: Failed to create static GPU resources.
Tue Jan 14 2025 14:30:16.274 [Info] - D3D11 Camera Initialization failure.
Is there something incorrect in my implementation? Below is the relevant portion of my code:

void* Cuco_TrackedDeviceServerDriver::GetComponent(const char* pchComponentNameAndVersion)
{
	if (strcmp(pchComponentNameAndVersion, vr::IVRDisplayComponent_Version) == 0)
	{
		return (vr::IVRDisplayComponent*)this;
	}
	if (strcmp(pchComponentNameAndVersion, vr::IVRCameraComponent_Version) == 0)
	{
		return (vr::IVRCameraComponent*)this;
	}
	return nullptr;
}
ret = vr::VRProperties()->SetBoolProperty(container, vr::Prop_CameraSupportsCompatibilityModes_Bool, false);
ret = vr::VRProperties()->SetInt32Property(container, vr::Prop_NumCameras_Int32, 1);
ret = vr::VRProperties()->SetInt32Property(container, vr::Prop_CameraCompatibilityMode_Int32, vr::CAMERA_COMPAT_MODE_ISO_30FPS);
ret = vr::VRProperties()->SetInt32Property(container, vr::Prop_CameraFirmwareVersion_Uint64, 20250114);
ret = vr::VRProperties()->SetInt32Property(container, vr::Prop_CameraFrameLayout_Int32, vr::EVRTrackedCameraFrameLayout_Mono);
ret = vr::VRProperties()->SetInt32Property(container, vr::Prop_CameraStreamFormat_Int32, vr::CVS_FORMAT_RGB24);
ret = vr::VRProperties()->SetInt32Property(container, vr::Prop_DisplayMCImageWidth_Int32, 1920);
ret = vr::VRProperties()->SetInt32Property(container, vr::Prop_DisplayMCImageHeight_Int32, 1080);
ret = vr::VRProperties()->SetInt32Property(container, vr::Prop_DisplayMCImageNumChannels_Int32, 3);
ret = vr::VRProperties()->SetStringProperty(container, vr::Prop_CameraFirmwareDescription_String, "camera--");
ret = vr::VRProperties()->SetFloatProperty(container, vr::Prop_CameraExposureTime_Float, 0.12);
ret = vr::VRProperties()->SetFloatProperty(container, vr::Prop_CameraGlobalGain_Float, 0.12);

auto cameraToHeadTransfor = vr::HmdMatrix34_t();
Quaternion::HmdMatrix_SetIdentity(&cameraToHeadTransfor);
ret = vr::VRProperties()->SetProperty(container, vr::Prop_CameraToHeadTransform_Matrix34, &cameraToHeadTransfor, sizeof(cameraToHeadTransfor), vr::k_unHmdMatrix34PropertyTag);
ret = vr::VRProperties()->SetProperty(container, vr::Prop_CameraToHeadTransforms_Matrix34_Array, &cameraToHeadTransfor, sizeof(cameraToHeadTransfor), vr::k_unHmdMatrix34PropertyTag);
int df = vr::VRDistortionFunctionType_FTheta;
ret = vr::VRProperties()->SetProperty(container, vr::Prop_CameraDistortionFunction_Int32_Array, &df, sizeof(df), vr::k_unInt32PropertyTag);
float dc = 1;
ret = vr::VRProperties()->SetProperty(container, vr::Prop_CameraDistortionCoefficients_Float_Array, &dc, sizeof(dc), vr::k_unFloatPropertyTag);
int wb[4] = { 1,1,1,1 };
ret = vr::VRProperties()->SetProperty(container, vr::Prop_CameraWhiteBalance_Vector4_Array, &wb[0], sizeof(wb), vr::k_unInt32PropertyTag);
ret = vr::VRProperties()->SetBoolProperty(container, vr::Prop_HasCamera_Bool, true);
ret = vr::VRProperties()->SetBoolProperty(container, vr::Prop_HasCameraComponent_Bool, true);

Please disregard my implementation of IVRCameraComponent for now; currently, I only wish to test the interface calls.

bool Cuco_TrackedDeviceServerDriver::GetCameraFrameBufferingRequirements(int* pDefaultFrameQueueSize, uint32_t* pFrameBufferDataSize)
{
	FCA_LOG(e_FCA_Log_Level_INFO, "GetCameraFrameDimensions");
	DriverLog(__FUNCTION__);
	*pDefaultFrameQueueSize = 1;
	*pFrameBufferDataSize = 16777216;
	return true;
}
bool Cuco_TrackedDeviceServerDriver::SetCameraFrameBuffering(int nFrameBufferCount, void** ppFrameBuffers, uint32_t nFrameBufferDataSize)
{
	FCA_LOG(e_FCA_Log_Level_INFO, "GetCameraFrameDimensions");
	DriverLog(__FUNCTION__);
	return true;
}
bool Cuco_TrackedDeviceServerDriver::SetCameraVideoStreamFormat(vr::ECameraVideoStreamFormat nVideoStreamFormat)
{
	FCA_LOG(e_FCA_Log_Level_INFO, "GetCameraFrameDimensions");
	DriverLog(__FUNCTION__);


	if (vr::CVS_FORMAT_RGB24 != nVideoStreamFormat)
		return false;
	return true;
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions