Commit 59820dfe authored by Bill Orr's avatar Bill Orr Committed by Commit Bot

Correctly handle Oculus SRGB

Oculus wants submitted textures to be in SRGB format. WebGL is rendering
linear color space, so we need to convert.

Bug: 812408
Change-Id: I25fc2ca95a62ec95ef7773c17ad2001910a845e5
Reviewed-on: https://chromium-review.googlesource.com/935494Reviewed-by: default avatarBrandon Jones <bajones@chromium.org>
Commit-Queue: Bill Orr <billorr@chromium.org>
Cr-Commit-Position: refs/heads/master@{#538967}
parent d44669af
......@@ -16,7 +16,10 @@ OculusVRDeviceProvider::OculusVRDeviceProvider() : initialized_(false) {}
OculusVRDeviceProvider::~OculusVRDeviceProvider() {
device::GamepadDataFetcherManager::GetInstance()->RemoveSourceFactory(
device::GAMEPAD_SOURCE_OCULUS);
// TODO(billorr): Shut down VR.
if (session_)
ovr_Destroy(session_);
ovr_Shutdown();
}
void OculusVRDeviceProvider::Initialize(
......
......@@ -34,7 +34,7 @@ class DEVICE_VR_EXPORT OculusVRDeviceProvider : public VRDeviceProvider {
void CreateDevice();
bool initialized_;
ovrSession session_;
ovrSession session_ = nullptr;
std::unique_ptr<OculusDevice> device_;
DISALLOW_COPY_AND_ASSIGN(OculusVRDeviceProvider);
......
......@@ -24,7 +24,14 @@ OculusRenderLoop::OculusRenderLoop(ovrSession session, ovrGraphicsLuid luid)
DCHECK(main_thread_task_runner_);
}
OculusRenderLoop::~OculusRenderLoop() {}
OculusRenderLoop::~OculusRenderLoop() {
Stop();
}
void OculusRenderLoop::CleanUp() {
submit_client_ = nullptr;
binding_.Close();
}
void OculusRenderLoop::SubmitFrame(int16_t frame_index,
const gpu::MailboxHolder& mailbox,
......@@ -56,14 +63,13 @@ void OculusRenderLoop::SubmitFrameWithTextureHandle(
ovrTextureSwapChainDesc desc = {};
desc.Type = ovrTexture_2D;
desc.ArraySize = 1;
// TODO(billorr): Use SRGB, and do color conversion when we copy.
desc.Format = OVR_FORMAT_R8G8B8A8_UNORM;
desc.Format = OVR_FORMAT_R8G8B8A8_UNORM_SRGB;
desc.Width = source_size_.width();
desc.Height = source_size_.height();
desc.MipLevels = 1;
desc.SampleCount = 1;
desc.StaticImage = ovrFalse;
desc.MiscFlags = ovrTextureMisc_None;
desc.MiscFlags = ovrTextureMisc_DX_Typeless;
desc.BindFlags = ovrTextureBind_DX_RenderTarget;
ovr_CreateTextureSwapChainDX(session_, texture_helper_.GetDevice().Get(),
&desc, &texture_swap_chain_);
......@@ -76,11 +82,12 @@ void OculusRenderLoop::SubmitFrameWithTextureHandle(
session_, texture_swap_chain_, -1,
IID_PPV_ARGS(texture.ReleaseAndGetAddressOf()));
texture_helper_.SetBackbuffer(texture);
if (texture_helper_.CopyTextureToBackBuffer(false)) {
if (texture_helper_.CopyTextureToBackBuffer(true)) {
copy_succeeded = true;
ovrLayerEyeFov layer = {};
layer.Header.Type = ovrLayerType_EyeFov;
layer.Header.Flags = ovrLayerFlag_TextureOriginAtBottomLeft;
layer.Header.Flags = 0;
layer.ColorTexture[0] = texture_swap_chain_;
DCHECK(source_size_.width() % 2 == 0);
layer.Viewport[0] = {
......
......@@ -48,6 +48,7 @@ class OculusRenderLoop : public base::Thread, mojom::VRPresentationProvider {
private:
// base::Thread overrides:
void Init() override;
void CleanUp() override;
mojom::VRPosePtr GetPose();
......
......@@ -241,6 +241,9 @@ D3D11TextureHelper::GetBackbuffer() {
void D3D11TextureHelper::SetBackbuffer(
Microsoft::WRL::ComPtr<ID3D11Texture2D> back_buffer) {
if (render_state_.target_texture_ != back_buffer) {
render_state_.render_target_view_ = nullptr;
}
render_state_.target_texture_ = back_buffer;
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment