Commit 067cdb4a by Geoff Lang Committed by Commit Bot

Create depth stencils for D3D texture EGL surfaces.

BUG=angleproject:1144 Change-Id: I42d80293c06e40197fe100bcac31a5c6bd414edf Reviewed-on: https://chromium-review.googlesource.com/469106 Commit-Queue: Geoff Lang <geofflang@chromium.org> Reviewed-by: 's avatarCorentin Wallez <cwallez@chromium.org>
parent fa416b18
...@@ -61,7 +61,6 @@ SurfaceD3D::SurfaceD3D(const egl::SurfaceState &state, ...@@ -61,7 +61,6 @@ SurfaceD3D::SurfaceD3D(const egl::SurfaceState &state,
ASSERT(mD3DTexture != nullptr); ASSERT(mD3DTexture != nullptr);
mD3DTexture->AddRef(); mD3DTexture->AddRef();
mRenderer->getD3DTextureInfo(mD3DTexture, &mWidth, &mHeight, &mRenderTargetFormat); mRenderer->getD3DTextureInfo(mD3DTexture, &mWidth, &mHeight, &mRenderTargetFormat);
mDepthStencilFormat = GL_NONE;
break; break;
default: default:
......
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
#include "libANGLE/renderer/gl/wgl/D3DTextureSurfaceWGL.h" #include "libANGLE/renderer/gl/wgl/D3DTextureSurfaceWGL.h"
#include "libANGLE/Surface.h"
#include "libANGLE/renderer/gl/FramebufferGL.h" #include "libANGLE/renderer/gl/FramebufferGL.h"
#include "libANGLE/renderer/gl/TextureGL.h" #include "libANGLE/renderer/gl/TextureGL.h"
#include "libANGLE/renderer/gl/RendererGL.h" #include "libANGLE/renderer/gl/RendererGL.h"
...@@ -241,7 +242,8 @@ D3DTextureSurfaceWGL::D3DTextureSurfaceWGL(const egl::SurfaceState &state, ...@@ -241,7 +242,8 @@ D3DTextureSurfaceWGL::D3DTextureSurfaceWGL(const egl::SurfaceState &state,
mKeyedMutex(nullptr), mKeyedMutex(nullptr),
mBoundObjectTextureHandle(nullptr), mBoundObjectTextureHandle(nullptr),
mBoundObjectRenderbufferHandle(nullptr), mBoundObjectRenderbufferHandle(nullptr),
mRenderbufferID(0), mColorRenderbufferID(0),
mDepthStencilRenderbufferID(0),
mFramebufferID(0) mFramebufferID(0)
{ {
} }
...@@ -260,7 +262,8 @@ D3DTextureSurfaceWGL::~D3DTextureSurfaceWGL() ...@@ -260,7 +262,8 @@ D3DTextureSurfaceWGL::~D3DTextureSurfaceWGL()
mFunctionsWGL->dxUnregisterObjectNV(mDeviceHandle, mBoundObjectRenderbufferHandle); mFunctionsWGL->dxUnregisterObjectNV(mDeviceHandle, mBoundObjectRenderbufferHandle);
mBoundObjectRenderbufferHandle = nullptr; mBoundObjectRenderbufferHandle = nullptr;
} }
mStateManager->deleteRenderbuffer(mRenderbufferID); mStateManager->deleteRenderbuffer(mColorRenderbufferID);
mStateManager->deleteRenderbuffer(mDepthStencilRenderbufferID);
if (mBoundObjectTextureHandle) if (mBoundObjectTextureHandle)
{ {
...@@ -301,20 +304,40 @@ egl::Error D3DTextureSurfaceWGL::initialize(const DisplayImpl *displayImpl) ...@@ -301,20 +304,40 @@ egl::Error D3DTextureSurfaceWGL::initialize(const DisplayImpl *displayImpl)
return error; return error;
} }
mFunctionsGL->genRenderbuffers(1, &mRenderbufferID); mFunctionsGL->genRenderbuffers(1, &mColorRenderbufferID);
mStateManager->bindRenderbuffer(GL_RENDERBUFFER, mRenderbufferID); mStateManager->bindRenderbuffer(GL_RENDERBUFFER, mColorRenderbufferID);
mBoundObjectRenderbufferHandle = mFunctionsWGL->dxRegisterObjectNV( mBoundObjectRenderbufferHandle = mFunctionsWGL->dxRegisterObjectNV(
mDeviceHandle, mObject, mRenderbufferID, GL_RENDERBUFFER, WGL_ACCESS_READ_WRITE_NV); mDeviceHandle, mObject, mColorRenderbufferID, GL_RENDERBUFFER, WGL_ACCESS_READ_WRITE_NV);
if (mBoundObjectRenderbufferHandle == nullptr) if (mBoundObjectRenderbufferHandle == nullptr)
{ {
return egl::Error(EGL_BAD_ALLOC, "Failed to register D3D object, error: 0x%08x.", return egl::Error(EGL_BAD_ALLOC, "Failed to register D3D object, error: 0x%08x.",
HRESULT_CODE(GetLastError())); HRESULT_CODE(GetLastError()));
} }
const egl::Config *config = mState.config;
if (config->depthStencilFormat != GL_NONE)
{
mFunctionsGL->genRenderbuffers(1, &mDepthStencilRenderbufferID);
mStateManager->bindRenderbuffer(GL_RENDERBUFFER, mDepthStencilRenderbufferID);
mFunctionsGL->renderbufferStorage(GL_RENDERBUFFER, config->depthStencilFormat,
static_cast<GLsizei>(mWidth),
static_cast<GLsizei>(mHeight));
}
mFunctionsGL->genFramebuffers(1, &mFramebufferID); mFunctionsGL->genFramebuffers(1, &mFramebufferID);
mStateManager->bindFramebuffer(GL_FRAMEBUFFER, mFramebufferID); mStateManager->bindFramebuffer(GL_FRAMEBUFFER, mFramebufferID);
mFunctionsGL->framebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, mFunctionsGL->framebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER,
mRenderbufferID); mColorRenderbufferID);
if (config->depthSize > 0)
{
mFunctionsGL->framebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER,
mDepthStencilRenderbufferID);
}
if (config->stencilSize > 0)
{
mFunctionsGL->framebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT,
GL_RENDERBUFFER, mDepthStencilRenderbufferID);
}
return egl::Error(EGL_SUCCESS); return egl::Error(EGL_SUCCESS);
} }
......
...@@ -86,7 +86,8 @@ class D3DTextureSurfaceWGL : public SurfaceGL ...@@ -86,7 +86,8 @@ class D3DTextureSurfaceWGL : public SurfaceGL
HANDLE mBoundObjectTextureHandle; HANDLE mBoundObjectTextureHandle;
HANDLE mBoundObjectRenderbufferHandle; HANDLE mBoundObjectRenderbufferHandle;
GLuint mRenderbufferID; GLuint mColorRenderbufferID;
GLuint mDepthStencilRenderbufferID;
GLuint mFramebufferID; GLuint mFramebufferID;
}; };
} // namespace rx } // namespace rx
......
...@@ -27,6 +27,8 @@ class D3DTextureTest : public ANGLETest ...@@ -27,6 +27,8 @@ class D3DTextureTest : public ANGLETest
setConfigGreenBits(8); setConfigGreenBits(8);
setConfigBlueBits(8); setConfigBlueBits(8);
setConfigAlphaBits(8); setConfigAlphaBits(8);
setConfigDepthBits(24);
setConfigStencilBits(8);
} }
void SetUp() override void SetUp() override
...@@ -258,6 +260,57 @@ TEST_P(D3DTextureTest, Clear) ...@@ -258,6 +260,57 @@ TEST_P(D3DTextureTest, Clear)
eglDestroySurface(display, pbuffer); eglDestroySurface(display, pbuffer);
} }
// Test creating a pbuffer with a D3D texture and depth stencil bits in the EGL config creates keeps
// its depth stencil buffer
TEST_P(D3DTextureTest, DepthStencil)
{
if (!valid())
{
return;
}
EGLWindow *window = getEGLWindow();
EGLDisplay display = window->getDisplay();
const size_t bufferSize = 32;
EGLSurface pbuffer = createPBuffer(bufferSize, bufferSize, EGL_NO_TEXTURE, EGL_NO_TEXTURE);
ASSERT_EGL_SUCCESS();
ASSERT_NE(pbuffer, EGL_NO_SURFACE);
// Apply the Pbuffer and clear it to purple and verify
eglMakeCurrent(display, pbuffer, pbuffer, window->getContext());
ASSERT_EGL_SUCCESS();
glViewport(0, 0, static_cast<GLsizei>(bufferSize), static_cast<GLsizei>(bufferSize));
glClearColor(0.0f, 1.0f, 1.0f, 1.0f);
glClearDepthf(0.5f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
ASSERT_GL_NO_ERROR();
glEnable(GL_DEPTH_TEST);
glDepthMask(GL_FALSE);
glUseProgram(mTextureProgram);
glUniform1i(mTextureUniformLocation, 0);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, &GLColor::green);
// Draw a quad that will fail the depth test and verify that the buffer is unchanged
drawQuad(mTextureProgram, "position", 1.0f);
EXPECT_PIXEL_COLOR_EQ(static_cast<GLint>(bufferSize) / 2, static_cast<GLint>(bufferSize) / 2,
GLColor::cyan);
// Draw a quad that will pass the depth test and verify that the buffer is green
drawQuad(mTextureProgram, "position", -1.0f);
EXPECT_PIXEL_COLOR_EQ(static_cast<GLint>(bufferSize) / 2, static_cast<GLint>(bufferSize) / 2,
GLColor::green);
// Make current with null to ensure the Surface can be released immediately.
eglMakeCurrent(display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
eglDestroySurface(display, pbuffer);
}
// Test creating a pbuffer from a d3d surface and binding it to a texture // Test creating a pbuffer from a d3d surface and binding it to a texture
TEST_P(D3DTextureTest, BindTexImage) TEST_P(D3DTextureTest, BindTexImage)
{ {
......
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