summaryrefslogtreecommitdiff
path: root/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Renderer9.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Renderer9.cpp')
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Renderer9.cpp305
1 files changed, 165 insertions, 140 deletions
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Renderer9.cpp b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Renderer9.cpp
index 4d0d284841e..b8b75c857aa 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Renderer9.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Renderer9.cpp
@@ -13,6 +13,7 @@
#include "common/utilities.h"
#include "libANGLE/Buffer.h"
+#include "libANGLE/Context.h"
#include "libANGLE/Display.h"
#include "libANGLE/Framebuffer.h"
#include "libANGLE/FramebufferAttachment.h"
@@ -183,7 +184,7 @@ egl::Error Renderer9::initialize()
if (mD3d9Module == nullptr)
{
- return egl::Error(EGL_NOT_INITIALIZED, D3D9_INIT_MISSING_DEP, "No D3D9 module found.");
+ return egl::EglNotInitialized(D3D9_INIT_MISSING_DEP) << "No D3D9 module found.";
}
typedef HRESULT(WINAPI * Direct3DCreate9ExFunc)(UINT, IDirect3D9Ex **);
@@ -210,8 +211,7 @@ egl::Error Renderer9::initialize()
if (!mD3d9)
{
- return egl::Error(EGL_NOT_INITIALIZED, D3D9_INIT_MISSING_DEP,
- "Could not create D3D9 device.");
+ return egl::EglNotInitialized(D3D9_INIT_MISSING_DEP) << "Could not create D3D9 device.";
}
if (mDisplay->getNativeDisplayId() != nullptr)
@@ -240,8 +240,8 @@ egl::Error Renderer9::initialize()
// D3DERR_INVALIDDEVICE, or another error we can't recover
// from
{
- return egl::Error(EGL_NOT_INITIALIZED, D3D9_INIT_OTHER_ERROR,
- "Failed to get device caps: Error code 0x%x\n", result);
+ return egl::EglNotInitialized(D3D9_INIT_OTHER_ERROR)
+ << "Failed to get device caps, " << gl::FmtHR(result);
}
}
}
@@ -254,8 +254,8 @@ egl::Error Renderer9::initialize()
if (mDeviceCaps.PixelShaderVersion < D3DPS_VERSION(minShaderModel, 0))
{
- return egl::Error(EGL_NOT_INITIALIZED, D3D9_INIT_UNSUPPORTED_VERSION,
- "Renderer does not support PS %u.%u.aborting!", minShaderModel, 0);
+ return egl::EglNotInitialized(D3D9_INIT_UNSUPPORTED_VERSION)
+ << "Renderer does not support PS " << minShaderModel << ".0, aborting!";
}
// When DirectX9 is running with an older DirectX8 driver, a StretchRect from a regular texture
@@ -263,8 +263,8 @@ egl::Error Renderer9::initialize()
// Texture2D::ensureRenderTarget.
if ((mDeviceCaps.DevCaps2 & D3DDEVCAPS2_CAN_STRETCHRECT_FROM_TEXTURES) == 0)
{
- return egl::Error(EGL_NOT_INITIALIZED, D3D9_INIT_UNSUPPORTED_STRETCHRECT,
- "Renderer does not support StretctRect from textures.");
+ return egl::EglNotInitialized(D3D9_INIT_UNSUPPORTED_STRETCHRECT)
+ << "Renderer does not support StretctRect from textures.";
}
{
@@ -295,8 +295,8 @@ egl::Error Renderer9::initialize()
}
if (result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY || result == D3DERR_DEVICELOST)
{
- return egl::Error(EGL_BAD_ALLOC, D3D9_INIT_OUT_OF_MEMORY,
- "CreateDevice failed: device lost of out of memory");
+ return egl::EglBadAlloc(D3D9_INIT_OUT_OF_MEMORY)
+ << "CreateDevice failed: device lost of out of memory";
}
if (FAILED(result))
@@ -310,9 +310,8 @@ egl::Error Renderer9::initialize()
{
ASSERT(result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY ||
result == D3DERR_NOTAVAILABLE || result == D3DERR_DEVICELOST);
- return egl::Error(
- EGL_BAD_ALLOC, D3D9_INIT_OUT_OF_MEMORY,
- "CreateDevice2 failed: device lost, not available, or of out of memory");
+ return egl::EglBadAlloc(D3D9_INIT_OUT_OF_MEMORY)
+ << "CreateDevice2 failed: device lost, not available, or of out of memory";
}
}
@@ -342,7 +341,7 @@ egl::Error Renderer9::initialize()
initializeDevice();
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
// do any one-time device initialization
@@ -568,6 +567,9 @@ void Renderer9::generateDisplayExtensions(egl::DisplayExtensions *outExtensions)
// Contexts are virtualized so textures can be shared globally
outExtensions->displayTextureShareGroup = true;
+
+ // D3D9 can be used without an output surface
+ outExtensions->surfacelessContext = true;
}
void Renderer9::startScene()
@@ -608,7 +610,7 @@ gl::Error Renderer9::flush()
if (FAILED(result))
{
ASSERT(result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY);
- return gl::Error(GL_OUT_OF_MEMORY, "Failed to issue event query, result: 0x%X.", result);
+ return gl::OutOfMemory() << "Failed to issue event query, " << gl::FmtHR(result);
}
// Grab the query data once
@@ -621,7 +623,7 @@ gl::Error Renderer9::flush()
notifyDeviceLost();
}
- return gl::Error(GL_OUT_OF_MEMORY, "Failed to get event query data, result: 0x%X.", result);
+ return gl::OutOfMemory() << "Failed to get event query data, " << gl::FmtHR(result);
}
return gl::NoError();
@@ -640,7 +642,7 @@ gl::Error Renderer9::finish()
if (FAILED(result))
{
ASSERT(result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY);
- return gl::Error(GL_OUT_OF_MEMORY, "Failed to issue event query, result: 0x%X.", result);
+ return gl::OutOfMemory() << "Failed to issue event query, " << gl::FmtHR(result);
}
// Grab the query data once
@@ -653,7 +655,7 @@ gl::Error Renderer9::finish()
}
freeEventQuery(query);
- return gl::Error(GL_OUT_OF_MEMORY, "Failed to get event query data, result: 0x%X.", result);
+ return gl::OutOfMemory() << "Failed to get event query data, " << gl::FmtHR(result);
}
// Loop until the query completes
@@ -680,8 +682,7 @@ gl::Error Renderer9::finish()
}
freeEventQuery(query);
- return gl::Error(GL_OUT_OF_MEMORY, "Failed to get event query data, result: 0x%X.",
- result);
+ return gl::OutOfMemory() << "Failed to get event query data, " << gl::FmtHR(result);
}
}
@@ -723,7 +724,7 @@ egl::Error Renderer9::getD3DTextureInfo(const egl::Config *config,
IDirect3DTexture9 *texture = nullptr;
if (FAILED(d3dTexture->QueryInterface(&texture)))
{
- return egl::Error(EGL_BAD_PARAMETER, "client buffer is not a IDirect3DTexture9");
+ return egl::EglBadParameter() << "Client buffer is not a IDirect3DTexture9";
}
IDirect3DDevice9 *textureDevice = nullptr;
@@ -731,7 +732,7 @@ egl::Error Renderer9::getD3DTextureInfo(const egl::Config *config,
if (textureDevice != mDevice)
{
SafeRelease(texture);
- return egl::Error(EGL_BAD_PARAMETER, "Texture's device does not match.");
+ return egl::EglBadParameter() << "Texture's device does not match.";
}
SafeRelease(textureDevice);
@@ -758,8 +759,8 @@ egl::Error Renderer9::getD3DTextureInfo(const egl::Config *config,
break;
default:
- return egl::Error(EGL_BAD_PARAMETER, "Unknown client buffer texture format: %u.",
- desc.Format);
+ return egl::EglBadParameter()
+ << "Unknown client buffer texture format: " << desc.Format;
}
if (fboFormat)
@@ -769,7 +770,7 @@ egl::Error Renderer9::getD3DTextureInfo(const egl::Config *config,
*fboFormat = d3dFormatInfo.info().fboImplementationInternalFormat;
}
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
egl::Error Renderer9::validateShareHandle(const egl::Config *config,
@@ -778,7 +779,7 @@ egl::Error Renderer9::validateShareHandle(const egl::Config *config,
{
if (shareHandle == nullptr)
{
- return egl::Error(EGL_BAD_PARAMETER, "NULL share handle.");
+ return egl::EglBadParameter() << "NULL share handle.";
}
EGLint width = attribs.getAsInt(EGL_WIDTH, 0);
@@ -794,7 +795,7 @@ egl::Error Renderer9::validateShareHandle(const egl::Config *config,
&texture, &shareHandle);
if (FAILED(result))
{
- return egl::Error(EGL_BAD_PARAMETER, "Failed to open share handle, result: 0x%X.", result);
+ return egl::EglBadParameter() << "Failed to open share handle, " << gl::FmtHR(result);
}
DWORD levelCount = texture->GetLevelCount();
@@ -807,10 +808,10 @@ egl::Error Renderer9::validateShareHandle(const egl::Config *config,
desc.Height != static_cast<UINT>(height) ||
desc.Format != backBufferd3dFormatInfo.texFormat)
{
- return egl::Error(EGL_BAD_PARAMETER, "Invalid texture parameters in share handle texture.");
+ return egl::EglBadParameter() << "Invalid texture parameters in share handle texture.";
}
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
ContextImpl *Renderer9::createContext(const gl::ContextState &state)
@@ -831,8 +832,7 @@ gl::Error Renderer9::allocateEventQuery(IDirect3DQuery9 **outQuery)
if (FAILED(result))
{
ASSERT(result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY);
- return gl::Error(GL_OUT_OF_MEMORY, "Failed to allocate event query, result: 0x%X.",
- result);
+ return gl::OutOfMemory() << "Failed to allocate event query, " << gl::FmtHR(result);
}
}
else
@@ -912,7 +912,8 @@ bool Renderer9::supportsFastCopyBufferToTexture(GLenum internalFormat) const
return false;
}
-gl::Error Renderer9::fastCopyBufferToTexture(const gl::PixelUnpackState &unpack,
+gl::Error Renderer9::fastCopyBufferToTexture(const gl::Context *context,
+ const gl::PixelUnpackState &unpack,
unsigned int offset,
RenderTargetD3D *destRenderTarget,
GLenum destinationFormat,
@@ -921,10 +922,11 @@ gl::Error Renderer9::fastCopyBufferToTexture(const gl::PixelUnpackState &unpack,
{
// Pixel buffer objects are not supported in D3D9, since D3D9 is ES2-only and PBOs are ES3.
UNREACHABLE();
- return gl::Error(GL_INVALID_OPERATION);
+ return gl::InternalError();
}
-gl::Error Renderer9::setSamplerState(gl::SamplerType type,
+gl::Error Renderer9::setSamplerState(const gl::Context *context,
+ gl::SamplerType type,
int index,
gl::Texture *texture,
const gl::SamplerState &samplerState)
@@ -936,11 +938,7 @@ gl::Error Renderer9::setSamplerState(gl::SamplerType type,
TextureD3D *textureD3D = GetImplAs<TextureD3D>(texture);
TextureStorage *storage = nullptr;
- gl::Error error = textureD3D->getNativeTexture(&storage);
- if (error.isError())
- {
- return error;
- }
+ ANGLE_TRY(textureD3D->getNativeTexture(context, &storage));
// Storage should exist, texture should be complete
ASSERT(storage);
@@ -985,7 +983,10 @@ gl::Error Renderer9::setSamplerState(gl::SamplerType type,
return gl::NoError();
}
-gl::Error Renderer9::setTexture(gl::SamplerType type, int index, gl::Texture *texture)
+gl::Error Renderer9::setTexture(const gl::Context *context,
+ gl::SamplerType type,
+ int index,
+ gl::Texture *texture)
{
int d3dSamplerOffset = (type == gl::SAMPLER_PIXEL) ? 0 : D3DVERTEXTEXTURESAMPLER0;
int d3dSampler = index + d3dSamplerOffset;
@@ -1000,21 +1001,13 @@ gl::Error Renderer9::setTexture(gl::SamplerType type, int index, gl::Texture *te
TextureD3D *textureImpl = GetImplAs<TextureD3D>(texture);
TextureStorage *texStorage = nullptr;
- gl::Error error = textureImpl->getNativeTexture(&texStorage);
- if (error.isError())
- {
- return error;
- }
+ ANGLE_TRY(textureImpl->getNativeTexture(context, &texStorage));
// Texture should be complete and have a storage
ASSERT(texStorage);
TextureStorage9 *storage9 = GetAs<TextureStorage9>(texStorage);
- error = storage9->getBaseTexture(&d3dTexture);
- if (error.isError())
- {
- return error;
- }
+ ANGLE_TRY(storage9->getBaseTexture(context, &d3dTexture));
// If we get NULL back from getBaseTexture here, something went wrong
// in the texture class and we're unexpectedly missing the d3d texture
@@ -1042,7 +1035,7 @@ gl::Error Renderer9::setUniformBuffers(const gl::ContextState & /*data*/,
return gl::NoError();
}
-gl::Error Renderer9::updateState(Context9 *context, GLenum drawMode)
+gl::Error Renderer9::updateState(const gl::Context *context, GLenum drawMode)
{
const auto &data = context->getContextState();
const auto &glState = data.getState();
@@ -1071,7 +1064,7 @@ gl::Error Renderer9::updateState(Context9 *context, GLenum drawMode)
{
ASSERT(firstColorAttachment->isAttached());
RenderTarget9 *renderTarget = nullptr;
- ANGLE_TRY(firstColorAttachment->getRenderTarget(&renderTarget));
+ ANGLE_TRY(firstColorAttachment->getRenderTarget(context, &renderTarget));
samples = renderTarget->getSamples();
}
gl::RasterizerState rasterizer = glState.getRasterizerState();
@@ -1079,7 +1072,7 @@ gl::Error Renderer9::updateState(Context9 *context, GLenum drawMode)
rasterizer.multiSample = (samples != 0);
unsigned int mask = GetBlendSampleMask(data, samples);
- ANGLE_TRY(setBlendDepthRasterStates(data, mask));
+ ANGLE_TRY(setBlendDepthRasterStates(context, mask));
mStateManager.resetDirtyBits();
@@ -1091,9 +1084,9 @@ void Renderer9::setScissorRectangle(const gl::Rectangle &scissor, bool enabled)
mStateManager.setScissorState(scissor, enabled);
}
-gl::Error Renderer9::setBlendDepthRasterStates(const gl::ContextState &glData, GLenum drawMode)
+gl::Error Renderer9::setBlendDepthRasterStates(const gl::Context *context, GLenum drawMode)
{
- const auto &glState = glData.getState();
+ const auto &glState = context->getGLState();
auto drawFramebuffer = glState.getDrawFramebuffer();
ASSERT(!drawFramebuffer->hasAnyDirtyBit());
// Since framebuffer->getSamples will return the original samples which may be different with
@@ -1105,14 +1098,14 @@ gl::Error Renderer9::setBlendDepthRasterStates(const gl::ContextState &glData, G
{
ASSERT(firstColorAttachment->isAttached());
RenderTarget9 *renderTarget = nullptr;
- ANGLE_TRY(firstColorAttachment->getRenderTarget(&renderTarget));
+ ANGLE_TRY(firstColorAttachment->getRenderTarget(context, &renderTarget));
samples = renderTarget->getSamples();
}
gl::RasterizerState rasterizer = glState.getRasterizerState();
rasterizer.pointDrawMode = (drawMode == GL_POINTS);
rasterizer.multiSample = (samples != 0);
- unsigned int mask = GetBlendSampleMask(glData, samples);
+ unsigned int mask = GetBlendSampleMask(context->getContextState(), samples);
return mStateManager.setBlendDepthRasterStates(glState, mask);
}
@@ -1167,7 +1160,7 @@ bool Renderer9::applyPrimitiveType(GLenum mode, GLsizei count, bool usesPointSiz
return mPrimitiveCount > 0;
}
-gl::Error Renderer9::getNullColorbuffer(GLImplFactory *implFactory,
+gl::Error Renderer9::getNullColorbuffer(const gl::Context *context,
const gl::FramebufferAttachment *depthbuffer,
const gl::FramebufferAttachment **outColorBuffer)
{
@@ -1188,8 +1181,10 @@ gl::Error Renderer9::getNullColorbuffer(GLImplFactory *implFactory,
}
}
+ auto *implFactory = context->getImplementation();
+
gl::Renderbuffer *nullRenderbuffer = new gl::Renderbuffer(implFactory->createRenderbuffer(), 0);
- gl::Error error = nullRenderbuffer->setStorage(GL_NONE, size.width, size.height);
+ gl::Error error = nullRenderbuffer->setStorage(context, GL_NONE, size.width, size.height);
if (error.isError())
{
SafeDelete(nullRenderbuffer);
@@ -1197,7 +1192,7 @@ gl::Error Renderer9::getNullColorbuffer(GLImplFactory *implFactory,
}
gl::FramebufferAttachment *nullbuffer = new gl::FramebufferAttachment(
- GL_RENDERBUFFER, GL_NONE, gl::ImageIndex::MakeInvalid(), nullRenderbuffer);
+ context, GL_RENDERBUFFER, GL_NONE, gl::ImageIndex::MakeInvalid(), nullRenderbuffer);
// add nullbuffer to the cache
NullColorbufferCacheEntry *oldest = &mNullColorbufferCache[0];
@@ -1219,22 +1214,17 @@ gl::Error Renderer9::getNullColorbuffer(GLImplFactory *implFactory,
return gl::NoError();
}
-gl::Error Renderer9::applyRenderTarget(GLImplFactory *implFactory,
+gl::Error Renderer9::applyRenderTarget(const gl::Context *context,
const gl::FramebufferAttachment *colorAttachment,
const gl::FramebufferAttachment *depthStencilAttachment)
{
const gl::FramebufferAttachment *renderAttachment = colorAttachment;
- gl::Error error(GL_NO_ERROR);
// if there is no color attachment we must synthesize a NULL colorattachment
// to keep the D3D runtime happy. This should only be possible if depth texturing.
if (renderAttachment == nullptr)
{
- error = getNullColorbuffer(implFactory, depthStencilAttachment, &renderAttachment);
- if (error.isError())
- {
- return error;
- }
+ ANGLE_TRY(getNullColorbuffer(context, depthStencilAttachment, &renderAttachment));
}
ASSERT(renderAttachment != nullptr);
@@ -1243,11 +1233,7 @@ gl::Error Renderer9::applyRenderTarget(GLImplFactory *implFactory,
D3DFORMAT renderTargetFormat = D3DFMT_UNKNOWN;
RenderTarget9 *renderTarget = nullptr;
- error = renderAttachment->getRenderTarget(&renderTarget);
- if (error.isError())
- {
- return error;
- }
+ ANGLE_TRY(renderAttachment->getRenderTarget(context, &renderTarget));
ASSERT(renderTarget);
bool renderTargetChanged = false;
@@ -1274,11 +1260,7 @@ gl::Error Renderer9::applyRenderTarget(GLImplFactory *implFactory,
if (depthStencilAttachment != nullptr)
{
- error = depthStencilAttachment->getRenderTarget(&depthStencilRenderTarget);
- if (error.isError())
- {
- return error;
- }
+ ANGLE_TRY(depthStencilAttachment->getRenderTarget(context, &depthStencilRenderTarget));
ASSERT(depthStencilRenderTarget);
depthStencilSerial = depthStencilRenderTarget->getSerial();
@@ -1324,10 +1306,10 @@ gl::Error Renderer9::applyRenderTarget(GLImplFactory *implFactory,
return gl::NoError();
}
-gl::Error Renderer9::applyRenderTarget(GLImplFactory *implFactory,
+gl::Error Renderer9::applyRenderTarget(const gl::Context *context,
const gl::Framebuffer *framebuffer)
{
- return applyRenderTarget(implFactory, framebuffer->getColorbuffer(0),
+ return applyRenderTarget(context, framebuffer->getColorbuffer(0),
framebuffer->getDepthOrStencilbuffer());
}
@@ -1509,9 +1491,8 @@ gl::Error Renderer9::drawLineLoop(GLsizei count,
if (static_cast<unsigned int>(count) + 1 >
(std::numeric_limits<unsigned int>::max() / sizeof(unsigned int)))
{
- return gl::Error(GL_OUT_OF_MEMORY,
- "Failed to create a 32-bit looping index buffer for GL_LINE_LOOP, too "
- "many indices required.");
+ return gl::OutOfMemory() << "Failed to create a 32-bit looping index buffer for "
+ "GL_LINE_LOOP, too many indices required.";
}
const unsigned int spaceNeeded =
@@ -1593,9 +1574,8 @@ gl::Error Renderer9::drawLineLoop(GLsizei count,
if (static_cast<unsigned int>(count) + 1 >
(std::numeric_limits<unsigned short>::max() / sizeof(unsigned short)))
{
- return gl::Error(GL_OUT_OF_MEMORY,
- "Failed to create a 16-bit looping index buffer for GL_LINE_LOOP, too "
- "many indices required.");
+ return gl::OutOfMemory() << "Failed to create a 16-bit looping index buffer for "
+ "GL_LINE_LOOP, too many indices required.";
}
const unsigned int spaceNeeded =
@@ -1721,7 +1701,7 @@ gl::Error Renderer9::drawIndexedPoints(GLsizei count,
return drawPoints<GLuint>(mDevice, count, indices, minIndex);
default:
UNREACHABLE();
- return gl::Error(GL_INVALID_OPERATION);
+ return gl::InternalError();
}
}
@@ -1790,30 +1770,31 @@ gl::Error Renderer9::getCountingIB(size_t count, StaticIndexBufferInterface **ou
}
else
{
- return gl::Error(GL_OUT_OF_MEMORY,
- "Could not create a counting index buffer for glDrawArraysInstanced.");
+ return gl::OutOfMemory()
+ << "Could not create a counting index buffer for glDrawArraysInstanced.";
}
*outIB = mCountingIB;
return gl::NoError();
}
-gl::Error Renderer9::applyShaders(const gl::ContextState &data, GLenum drawMode)
+gl::Error Renderer9::applyShaders(const gl::Context *context, GLenum drawMode)
{
+ const gl::State &state = context->getContextState().getState();
// This method is called single-threaded.
ANGLE_TRY(ensureHLSLCompilerInitialized());
- ProgramD3D *programD3D = GetImplAs<ProgramD3D>(data.getState().getProgram());
- programD3D->updateCachedInputLayout(data.getState());
+ ProgramD3D *programD3D = GetImplAs<ProgramD3D>(state.getProgram());
+ programD3D->updateCachedInputLayout(state);
const auto &inputLayout = programD3D->getCachedInputLayout();
ShaderExecutableD3D *vertexExe = nullptr;
ANGLE_TRY(programD3D->getVertexExecutableForInputLayout(inputLayout, &vertexExe, nullptr));
- const gl::Framebuffer *drawFramebuffer = data.getState().getDrawFramebuffer();
+ const gl::Framebuffer *drawFramebuffer = state.getDrawFramebuffer();
ShaderExecutableD3D *pixelExe = nullptr;
- ANGLE_TRY(programD3D->getPixelExecutableForFramebuffer(drawFramebuffer, &pixelExe));
+ ANGLE_TRY(programD3D->getPixelExecutableForFramebuffer(context, drawFramebuffer, &pixelExe));
IDirect3DVertexShader9 *vertexShader =
(vertexExe ? GetAs<ShaderExecutable9>(vertexExe)->getVertexShader() : nullptr);
@@ -1945,7 +1926,8 @@ void Renderer9::applyUniformnbv(const D3DUniform *targetUniform, const GLint *v)
applyUniformnfv(targetUniform, (GLfloat *)vector);
}
-gl::Error Renderer9::clear(const ClearParameters &clearParams,
+gl::Error Renderer9::clear(const gl::Context *context,
+ const ClearParameters &clearParams,
const gl::FramebufferAttachment *colorBuffer,
const gl::FramebufferAttachment *depthStencilBuffer)
{
@@ -1953,7 +1935,7 @@ gl::Error Renderer9::clear(const ClearParameters &clearParams,
{
// Clearing buffers with non-float values is not supported by Renderer9 and ES 2.0
UNREACHABLE();
- return gl::Error(GL_INVALID_OPERATION);
+ return gl::InternalError();
}
bool clearColor = clearParams.clearColor[0];
@@ -1964,7 +1946,7 @@ gl::Error Renderer9::clear(const ClearParameters &clearParams,
// Clearing individual buffers other than buffer zero is not supported by Renderer9 and
// ES 2.0
UNREACHABLE();
- return gl::Error(GL_INVALID_OPERATION);
+ return gl::InternalError();
}
}
@@ -1977,7 +1959,7 @@ gl::Error Renderer9::clear(const ClearParameters &clearParams,
ASSERT(depthStencilBuffer != nullptr);
RenderTargetD3D *stencilRenderTarget = nullptr;
- gl::Error error = depthStencilBuffer->getRenderTarget(&stencilRenderTarget);
+ gl::Error error = depthStencilBuffer->getRenderTarget(context, &stencilRenderTarget);
if (error.isError())
{
return error;
@@ -2002,7 +1984,7 @@ gl::Error Renderer9::clear(const ClearParameters &clearParams,
ASSERT(colorBuffer != nullptr);
RenderTargetD3D *colorRenderTarget = nullptr;
- gl::Error error = colorBuffer->getRenderTarget(&colorRenderTarget);
+ gl::Error error = colorBuffer->getRenderTarget(context, &colorRenderTarget);
if (error.isError())
{
return error;
@@ -2259,6 +2241,10 @@ void Renderer9::releaseDeviceResources()
for (int i = 0; i < NUM_NULL_COLORBUFFER_CACHE_ENTRIES; i++)
{
+ if (mNullColorbufferCache[i].buffer)
+ {
+ mNullColorbufferCache[i].buffer->detach(mDisplay->getProxyContext());
+ }
SafeDelete(mNullColorbufferCache[i].buffer);
}
}
@@ -2510,7 +2496,8 @@ D3DPOOL Renderer9::getBufferPool(DWORD usage) const
return D3DPOOL_DEFAULT;
}
-gl::Error Renderer9::copyImage2D(const gl::Framebuffer *framebuffer,
+gl::Error Renderer9::copyImage2D(const gl::Context *context,
+ const gl::Framebuffer *framebuffer,
const gl::Rectangle &sourceRect,
GLenum destFormat,
const gl::Offset &destOffset,
@@ -2523,10 +2510,11 @@ gl::Error Renderer9::copyImage2D(const gl::Framebuffer *framebuffer,
rect.right = sourceRect.x + sourceRect.width;
rect.bottom = sourceRect.y + sourceRect.height;
- return mBlit->copy2D(framebuffer, rect, destFormat, destOffset, storage, level);
+ return mBlit->copy2D(context, framebuffer, rect, destFormat, destOffset, storage, level);
}
-gl::Error Renderer9::copyImageCube(const gl::Framebuffer *framebuffer,
+gl::Error Renderer9::copyImageCube(const gl::Context *context,
+ const gl::Framebuffer *framebuffer,
const gl::Rectangle &sourceRect,
GLenum destFormat,
const gl::Offset &destOffset,
@@ -2540,10 +2528,12 @@ gl::Error Renderer9::copyImageCube(const gl::Framebuffer *framebuffer,
rect.right = sourceRect.x + sourceRect.width;
rect.bottom = sourceRect.y + sourceRect.height;
- return mBlit->copyCube(framebuffer, rect, destFormat, destOffset, storage, target, level);
+ return mBlit->copyCube(context, framebuffer, rect, destFormat, destOffset, storage, target,
+ level);
}
-gl::Error Renderer9::copyImage3D(const gl::Framebuffer *framebuffer,
+gl::Error Renderer9::copyImage3D(const gl::Context *context,
+ const gl::Framebuffer *framebuffer,
const gl::Rectangle &sourceRect,
GLenum destFormat,
const gl::Offset &destOffset,
@@ -2552,10 +2542,11 @@ gl::Error Renderer9::copyImage3D(const gl::Framebuffer *framebuffer,
{
// 3D textures are not available in the D3D9 backend.
UNREACHABLE();
- return gl::Error(GL_INVALID_OPERATION);
+ return gl::InternalError();
}
-gl::Error Renderer9::copyImage2DArray(const gl::Framebuffer *framebuffer,
+gl::Error Renderer9::copyImage2DArray(const gl::Context *context,
+ const gl::Framebuffer *framebuffer,
const gl::Rectangle &sourceRect,
GLenum destFormat,
const gl::Offset &destOffset,
@@ -2564,10 +2555,11 @@ gl::Error Renderer9::copyImage2DArray(const gl::Framebuffer *framebuffer,
{
// 2D array textures are not available in the D3D9 backend.
UNREACHABLE();
- return gl::Error(GL_INVALID_OPERATION);
+ return gl::InternalError();
}
-gl::Error Renderer9::copyTexture(const gl::Texture *source,
+gl::Error Renderer9::copyTexture(const gl::Context *context,
+ const gl::Texture *source,
GLint sourceLevel,
const gl::Rectangle &sourceRect,
GLenum destFormat,
@@ -2585,18 +2577,19 @@ gl::Error Renderer9::copyTexture(const gl::Texture *source,
rect.right = sourceRect.x + sourceRect.width;
rect.bottom = sourceRect.y + sourceRect.height;
- return mBlit->copyTexture(source, sourceLevel, rect, destFormat, destOffset, storage,
+ return mBlit->copyTexture(context, source, sourceLevel, rect, destFormat, destOffset, storage,
destTarget, destLevel, unpackFlipY, unpackPremultiplyAlpha,
unpackUnmultiplyAlpha);
}
-gl::Error Renderer9::copyCompressedTexture(const gl::Texture *source,
+gl::Error Renderer9::copyCompressedTexture(const gl::Context *context,
+ const gl::Texture *source,
GLint sourceLevel,
TextureStorage *storage,
GLint destLevel)
{
UNIMPLEMENTED();
- return gl::Error(GL_INVALID_OPERATION);
+ return gl::InternalError();
}
gl::Error Renderer9::createRenderTarget(int width,
@@ -2648,8 +2641,7 @@ gl::Error Renderer9::createRenderTarget(int width,
if (FAILED(result))
{
ASSERT(result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY);
- return gl::Error(GL_OUT_OF_MEMORY, "Failed to create render target, result: 0x%X.",
- result);
+ return gl::OutOfMemory() << "Failed to create render target, " << gl::FmtHR(result);
}
if (requiresInitialization)
@@ -2690,14 +2682,14 @@ gl::Error Renderer9::createRenderTargetCopy(RenderTargetD3D *source, RenderTarge
if (FAILED(result))
{
ASSERT(result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY);
- return gl::Error(GL_OUT_OF_MEMORY, "Failed to copy render target, result: 0x%X.", result);
+ return gl::OutOfMemory() << "Failed to copy render target, " << gl::FmtHR(result);
}
*outRT = newRT;
return gl::NoError();
}
-gl::Error Renderer9::loadExecutable(const void *function,
+gl::Error Renderer9::loadExecutable(const uint8_t *function,
size_t length,
ShaderType type,
const std::vector<D3DVarying> &streamOutVaryings,
@@ -2733,7 +2725,7 @@ gl::Error Renderer9::loadExecutable(const void *function,
break;
default:
UNREACHABLE();
- return gl::Error(GL_INVALID_OPERATION);
+ return gl::InternalError();
}
return gl::NoError();
@@ -2762,7 +2754,7 @@ gl::Error Renderer9::compileToExecutable(gl::InfoLog &infoLog,
break;
default:
UNREACHABLE();
- return gl::Error(GL_INVALID_OPERATION);
+ return gl::InternalError();
}
profileStream << "_" << ((getMajorShaderModel() >= 3) ? 3 : 2);
@@ -2817,8 +2809,9 @@ gl::Error Renderer9::compileToExecutable(gl::InfoLog &infoLog,
return gl::NoError();
}
- error = loadExecutable(binary->GetBufferPointer(), binary->GetBufferSize(), type,
- streamOutVaryings, separatedOutputBuffers, outExectuable);
+ error = loadExecutable(reinterpret_cast<const uint8_t *>(binary->GetBufferPointer()),
+ binary->GetBufferSize(), type, streamOutVaryings, separatedOutputBuffers,
+ outExectuable);
SafeRelease(binary);
if (error.isError())
@@ -2899,8 +2892,7 @@ gl::Error Renderer9::copyToRenderTarget(IDirect3DSurface9 *dest,
if (FAILED(result))
{
ASSERT(result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY);
- return gl::Error(GL_OUT_OF_MEMORY, "Failed to blit internal texture, result: 0x%X.",
- result);
+ return gl::OutOfMemory() << "Failed to blit internal texture, " << gl::FmtHR(result);
}
return gl::NoError();
@@ -2911,20 +2903,34 @@ ImageD3D *Renderer9::createImage()
return new Image9(this);
}
-gl::Error Renderer9::generateMipmap(ImageD3D *dest, ImageD3D *src)
+gl::Error Renderer9::generateMipmap(const gl::Context *context, ImageD3D *dest, ImageD3D *src)
{
Image9 *src9 = GetAs<Image9>(src);
Image9 *dst9 = GetAs<Image9>(dest);
return Image9::generateMipmap(dst9, src9);
}
-gl::Error Renderer9::generateMipmapUsingD3D(TextureStorage *storage,
+gl::Error Renderer9::generateMipmapUsingD3D(const gl::Context *context,
+ TextureStorage *storage,
const gl::TextureState &textureState)
{
UNREACHABLE();
return gl::NoError();
}
+gl::Error Renderer9::copyImage(const gl::Context *context,
+ ImageD3D *dest,
+ ImageD3D *source,
+ const gl::Rectangle &sourceRect,
+ const gl::Offset &destOffset,
+ bool unpackFlipY,
+ bool unpackPremultiplyAlpha,
+ bool unpackUnmultiplyAlpha)
+{
+ UNREACHABLE();
+ return gl::NoError();
+}
+
TextureStorage *Renderer9::createTextureStorage2D(SwapChainD3D *swapChain)
{
SwapChain9 *swapChain9 = GetAs<SwapChain9>(swapChain);
@@ -2991,6 +2997,19 @@ TextureStorage *Renderer9::createTextureStorage2DArray(GLenum internalformat,
return nullptr;
}
+TextureStorage *Renderer9::createTextureStorage2DMultisample(GLenum internalformat,
+ GLsizei width,
+ GLsizei height,
+ int levels,
+ int samples,
+ GLboolean fixedSampleLocations)
+{
+ // 2D multisampled textures are not supported by the D3D9 backend.
+ UNREACHABLE();
+
+ return NULL;
+}
+
bool Renderer9::getLUID(LUID *adapterLuid) const
{
adapterLuid->HighPart = 0;
@@ -3029,20 +3048,21 @@ gl::ErrorOrResult<unsigned int> Renderer9::getVertexSpaceRequired(const gl::Vert
const d3d9::VertexFormat &d3d9VertexInfo =
d3d9::GetVertexFormatInfo(getCapsDeclTypes(), vertexFormatType);
- unsigned int elementCount = 0;
- if (instances == 0 || binding.divisor == 0)
+ unsigned int elementCount = 0;
+ const unsigned int divisor = binding.getDivisor();
+ if (instances == 0 || divisor == 0)
{
elementCount = static_cast<unsigned int>(count);
}
else
{
// Round up to divisor, if possible
- elementCount = UnsignedCeilDivide(static_cast<unsigned int>(instances), binding.divisor);
+ elementCount = UnsignedCeilDivide(static_cast<unsigned int>(instances), divisor);
}
if (d3d9VertexInfo.outputElementSize > std::numeric_limits<unsigned int>::max() / elementCount)
{
- return gl::Error(GL_OUT_OF_MEMORY, "New vertex buffer size would result in an overflow.");
+ return gl::OutOfMemory() << "New vertex buffer size would result in an overflow.";
}
return static_cast<unsigned int>(d3d9VertexInfo.outputElementSize) * elementCount;
@@ -3062,16 +3082,15 @@ angle::WorkaroundsD3D Renderer9::generateWorkarounds() const
return d3d9::GenerateWorkarounds();
}
-gl::Error Renderer9::clearTextures(gl::SamplerType samplerType, size_t rangeStart, size_t rangeEnd)
+gl::Error Renderer9::clearTextures(const gl::Context *context,
+ gl::SamplerType samplerType,
+ size_t rangeStart,
+ size_t rangeEnd)
{
// TODO(jmadill): faster way?
for (size_t samplerIndex = rangeStart; samplerIndex < rangeEnd; samplerIndex++)
{
- gl::Error error = setTexture(samplerType, static_cast<int>(samplerIndex), nullptr);
- if (error.isError())
- {
- return error;
- }
+ ANGLE_TRY(setTexture(context, samplerType, static_cast<int>(samplerIndex), nullptr));
}
return gl::NoError();
@@ -3094,7 +3113,7 @@ egl::Error Renderer9::getEGLDevice(DeviceImpl **device)
}
*device = static_cast<DeviceImpl *>(mEGLDevice);
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
Renderer9::CurSamplerState::CurSamplerState()
@@ -3102,7 +3121,7 @@ Renderer9::CurSamplerState::CurSamplerState()
{
}
-gl::Error Renderer9::genericDrawElements(Context9 *context,
+gl::Error Renderer9::genericDrawElements(const gl::Context *context,
GLenum mode,
GLsizei count,
GLenum type,
@@ -3140,8 +3159,8 @@ gl::Error Renderer9::genericDrawElements(Context9 *context,
ANGLE_TRY(applyVertexBuffer(data.getState(), mode,
static_cast<GLsizei>(indexInfo.indexRange.start),
static_cast<GLsizei>(vertexCount), instances, &indexInfo));
- ANGLE_TRY(applyTextures(context, data));
- ANGLE_TRY(applyShaders(data, mode));
+ ANGLE_TRY(applyTextures(context));
+ ANGLE_TRY(applyShaders(context, mode));
ANGLE_TRY(programD3D->applyUniformBuffers(data));
if (!skipDraw(data, mode))
@@ -3152,7 +3171,7 @@ gl::Error Renderer9::genericDrawElements(Context9 *context,
return gl::NoError();
}
-gl::Error Renderer9::genericDrawArrays(Context9 *context,
+gl::Error Renderer9::genericDrawArrays(const gl::Context *context,
GLenum mode,
GLint first,
GLsizei count,
@@ -3174,8 +3193,8 @@ gl::Error Renderer9::genericDrawArrays(Context9 *context,
ANGLE_TRY(updateState(context, mode));
ANGLE_TRY(applyTransformFeedbackBuffers(data.getState()));
ANGLE_TRY(applyVertexBuffer(data.getState(), mode, first, count, instances, nullptr));
- ANGLE_TRY(applyTextures(context, data));
- ANGLE_TRY(applyShaders(data, mode));
+ ANGLE_TRY(applyTextures(context));
+ ANGLE_TRY(applyShaders(context, mode));
ANGLE_TRY(programD3D->applyUniformBuffers(data));
if (!skipDraw(data, mode))
@@ -3208,4 +3227,10 @@ gl::Error Renderer9::applyComputeUniforms(const ProgramD3D &programD3D,
return gl::InternalError() << "Compute shader is not implemented on D3D9";
}
+gl::Error Renderer9::clearRenderTarget(RenderTargetD3D *renderTarget, const gl::ColorF &clearValues)
+{
+ UNIMPLEMENTED();
+ return gl::InternalError() << "clearRenderTarget is not implemented on D3D9";
+}
+
} // namespace rx