Commit b0a838bf by Jamie Madill Committed by Commit Bot

Program: Make LinkResult use gl::ErrorOrResult.

This simplifies the error handling code, and allows the use of the ANGLE_TRY macro (and friends). BUG=angleproject:1576 Change-Id: I3142388b10d0dd67a7f49a5c8c3d11102996be93 Reviewed-on: https://chromium-review.googlesource.com/411201 Commit-Queue: Jamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarCorentin Wallez <cwallez@chromium.org> Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org>
parent 9863a3ef
...@@ -141,7 +141,7 @@ def generate_impl_definition(impl_stub, typed_impl): ...@@ -141,7 +141,7 @@ def generate_impl_definition(impl_stub, typed_impl):
elif return_type == 'egl::Error': elif return_type == 'egl::Error':
return_statement = ' return egl::Error(EGL_BAD_ACCESS);\n' return_statement = ' return egl::Error(EGL_BAD_ACCESS);\n'
elif return_type == 'LinkResult': elif return_type == 'LinkResult':
return_statement = ' return LinkResult(false, gl::Error(GL_INVALID_OPERATION));\n' return_statement = ' return gl::Error(GL_INVALID_OPERATION);\n'
elif re.search(r'\*$', return_type): elif re.search(r'\*$', return_type):
return_statement = ' return static_cast<' + return_type + '>(0);\n' return_statement = ' return static_cast<' + return_type + '>(0);\n'
elif re.search(r'const ([^ \&]+) \&$', return_type): elif re.search(r'const ([^ \&]+) \&$', return_type):
......
...@@ -597,11 +597,10 @@ Error Program::link(const ContextState &data) ...@@ -597,11 +597,10 @@ Error Program::link(const ContextState &data)
return NoError(); return NoError();
} }
rx::LinkResult result = mProgram->link(data, mInfoLog); ANGLE_TRY_RESULT(mProgram->link(data, mInfoLog), mLinked);
if (!mLinked)
if (result.error.isError() || !result.linkSuccess)
{ {
return result.error; return NoError();
} }
} }
else else
...@@ -654,10 +653,10 @@ Error Program::link(const ContextState &data) ...@@ -654,10 +653,10 @@ Error Program::link(const ContextState &data)
linkOutputVariables(); linkOutputVariables();
rx::LinkResult result = mProgram->link(data, mInfoLog); ANGLE_TRY_RESULT(mProgram->link(data, mInfoLog), mLinked);
if (result.error.isError() || !result.linkSuccess) if (!mLinked)
{ {
return result.error; return NoError();
} }
gatherTransformFeedbackVaryings(mergedVaryings); gatherTransformFeedbackVaryings(mergedVaryings);
...@@ -665,7 +664,6 @@ Error Program::link(const ContextState &data) ...@@ -665,7 +664,6 @@ Error Program::link(const ContextState &data)
gatherInterfaceBlockInfo(); gatherInterfaceBlockInfo();
mLinked = true;
return NoError(); return NoError();
} }
...@@ -845,14 +843,9 @@ Error Program::loadBinary(GLenum binaryFormat, const void *binary, GLsizei lengt ...@@ -845,14 +843,9 @@ Error Program::loadBinary(GLenum binaryFormat, const void *binary, GLsizei lengt
stream.readInt(&mSamplerUniformRange.start); stream.readInt(&mSamplerUniformRange.start);
stream.readInt(&mSamplerUniformRange.end); stream.readInt(&mSamplerUniformRange.end);
rx::LinkResult result = mProgram->load(mInfoLog, &stream); ANGLE_TRY_RESULT(mProgram->load(mInfoLog, &stream), mLinked);
if (result.error.isError() || !result.linkSuccess)
{
return result.error;
}
mLinked = true; return NoError();
return Error(GL_NO_ERROR);
#endif // #if ANGLE_PROGRAM_BINARY_LOAD == ANGLE_ENABLED #endif // #if ANGLE_PROGRAM_BINARY_LOAD == ANGLE_ENABLED
} }
......
...@@ -24,14 +24,7 @@ struct BlockMemberInfo; ...@@ -24,14 +24,7 @@ struct BlockMemberInfo;
namespace rx namespace rx
{ {
using LinkResult = gl::ErrorOrResult<bool>;
struct LinkResult
{
LinkResult(bool linkSuccess, const gl::Error &error) : linkSuccess(linkSuccess), error(error) {}
bool linkSuccess;
gl::Error error;
};
class ProgramImpl : angle::NonCopyable class ProgramImpl : angle::NonCopyable
{ {
......
...@@ -739,14 +739,14 @@ LinkResult ProgramD3D::load(gl::InfoLog &infoLog, gl::BinaryInputStream *stream) ...@@ -739,14 +739,14 @@ LinkResult ProgramD3D::load(gl::InfoLog &infoLog, gl::BinaryInputStream *stream)
if (memcmp(&identifier, &binaryDeviceIdentifier, sizeof(DeviceIdentifier)) != 0) if (memcmp(&identifier, &binaryDeviceIdentifier, sizeof(DeviceIdentifier)) != 0)
{ {
infoLog << "Invalid program binary, device configuration has changed."; infoLog << "Invalid program binary, device configuration has changed.";
return LinkResult(false, gl::Error(GL_NO_ERROR)); return false;
} }
int compileFlags = stream->readInt<int>(); int compileFlags = stream->readInt<int>();
if (compileFlags != ANGLE_COMPILE_OPTIMIZATION_LEVEL) if (compileFlags != ANGLE_COMPILE_OPTIMIZATION_LEVEL)
{ {
infoLog << "Mismatched compilation flags."; infoLog << "Mismatched compilation flags.";
return LinkResult(false, gl::Error(GL_NO_ERROR)); return false;
} }
for (int &index : mAttribLocationToD3DSemantic) for (int &index : mAttribLocationToD3DSemantic)
...@@ -780,7 +780,7 @@ LinkResult ProgramD3D::load(gl::InfoLog &infoLog, gl::BinaryInputStream *stream) ...@@ -780,7 +780,7 @@ LinkResult ProgramD3D::load(gl::InfoLog &infoLog, gl::BinaryInputStream *stream)
if (stream->error()) if (stream->error())
{ {
infoLog << "Invalid program binary."; infoLog << "Invalid program binary.";
return LinkResult(false, gl::Error(GL_NO_ERROR)); return false;
} }
const auto &linkedUniforms = mState.getUniforms(); const auto &linkedUniforms = mState.getUniforms();
...@@ -804,7 +804,7 @@ LinkResult ProgramD3D::load(gl::InfoLog &infoLog, gl::BinaryInputStream *stream) ...@@ -804,7 +804,7 @@ LinkResult ProgramD3D::load(gl::InfoLog &infoLog, gl::BinaryInputStream *stream)
if (stream->error()) if (stream->error())
{ {
infoLog << "Invalid program binary."; infoLog << "Invalid program binary.";
return LinkResult(false, gl::Error(GL_NO_ERROR)); return false;
} }
ASSERT(mD3DUniformBlocks.empty()); ASSERT(mD3DUniformBlocks.empty());
...@@ -853,6 +853,8 @@ LinkResult ProgramD3D::load(gl::InfoLog &infoLog, gl::BinaryInputStream *stream) ...@@ -853,6 +853,8 @@ LinkResult ProgramD3D::load(gl::InfoLog &infoLog, gl::BinaryInputStream *stream)
const unsigned char *binary = reinterpret_cast<const unsigned char *>(stream->data()); const unsigned char *binary = reinterpret_cast<const unsigned char *>(stream->data());
bool separateAttribs = (mState.getTransformFeedbackBufferMode() == GL_SEPARATE_ATTRIBS);
const unsigned int vertexShaderCount = stream->readInt<unsigned int>(); const unsigned int vertexShaderCount = stream->readInt<unsigned int>();
for (unsigned int vertexShaderIndex = 0; vertexShaderIndex < vertexShaderCount; for (unsigned int vertexShaderIndex = 0; vertexShaderIndex < vertexShaderCount;
vertexShaderIndex++) vertexShaderIndex++)
...@@ -870,18 +872,14 @@ LinkResult ProgramD3D::load(gl::InfoLog &infoLog, gl::BinaryInputStream *stream) ...@@ -870,18 +872,14 @@ LinkResult ProgramD3D::load(gl::InfoLog &infoLog, gl::BinaryInputStream *stream)
ShaderExecutableD3D *shaderExecutable = nullptr; ShaderExecutableD3D *shaderExecutable = nullptr;
gl::Error error = mRenderer->loadExecutable( ANGLE_TRY(mRenderer->loadExecutable(vertexShaderFunction, vertexShaderSize, SHADER_VERTEX,
vertexShaderFunction, vertexShaderSize, SHADER_VERTEX, mStreamOutVaryings, mStreamOutVaryings, separateAttribs,
(mState.getTransformFeedbackBufferMode() == GL_SEPARATE_ATTRIBS), &shaderExecutable); &shaderExecutable));
if (error.isError())
{
return LinkResult(false, error);
}
if (!shaderExecutable) if (!shaderExecutable)
{ {
infoLog << "Could not create vertex shader."; infoLog << "Could not create vertex shader.";
return LinkResult(false, gl::Error(GL_NO_ERROR)); return false;
} }
// generated converted input layout // generated converted input layout
...@@ -909,18 +907,14 @@ LinkResult ProgramD3D::load(gl::InfoLog &infoLog, gl::BinaryInputStream *stream) ...@@ -909,18 +907,14 @@ LinkResult ProgramD3D::load(gl::InfoLog &infoLog, gl::BinaryInputStream *stream)
const unsigned char *pixelShaderFunction = binary + stream->offset(); const unsigned char *pixelShaderFunction = binary + stream->offset();
ShaderExecutableD3D *shaderExecutable = nullptr; ShaderExecutableD3D *shaderExecutable = nullptr;
gl::Error error = mRenderer->loadExecutable( ANGLE_TRY(mRenderer->loadExecutable(pixelShaderFunction, pixelShaderSize, SHADER_PIXEL,
pixelShaderFunction, pixelShaderSize, SHADER_PIXEL, mStreamOutVaryings, mStreamOutVaryings, separateAttribs,
(mState.getTransformFeedbackBufferMode() == GL_SEPARATE_ATTRIBS), &shaderExecutable); &shaderExecutable));
if (error.isError())
{
return LinkResult(false, error);
}
if (!shaderExecutable) if (!shaderExecutable)
{ {
infoLog << "Could not create pixel shader."; infoLog << "Could not create pixel shader.";
return LinkResult(false, gl::Error(GL_NO_ERROR)); return false;
} }
// add new binary // add new binary
...@@ -940,27 +934,22 @@ LinkResult ProgramD3D::load(gl::InfoLog &infoLog, gl::BinaryInputStream *stream) ...@@ -940,27 +934,22 @@ LinkResult ProgramD3D::load(gl::InfoLog &infoLog, gl::BinaryInputStream *stream)
} }
const unsigned char *geometryShaderFunction = binary + stream->offset(); const unsigned char *geometryShaderFunction = binary + stream->offset();
bool splitAttribs = (mState.getTransformFeedbackBufferMode() == GL_SEPARATE_ATTRIBS);
gl::Error error = mRenderer->loadExecutable( ANGLE_TRY(mRenderer->loadExecutable(geometryShaderFunction, geometryShaderSize,
geometryShaderFunction, geometryShaderSize, SHADER_GEOMETRY, mStreamOutVaryings, SHADER_GEOMETRY, mStreamOutVaryings, separateAttribs,
splitAttribs, &mGeometryExecutables[geometryExeIndex]); &mGeometryExecutables[geometryExeIndex]));
if (error.isError())
{
return LinkResult(false, error);
}
if (!mGeometryExecutables[geometryExeIndex]) if (!mGeometryExecutables[geometryExeIndex])
{ {
infoLog << "Could not create geometry shader."; infoLog << "Could not create geometry shader.";
return LinkResult(false, gl::Error(GL_NO_ERROR)); return false;
} }
stream->skip(geometryShaderSize); stream->skip(geometryShaderSize);
} }
initializeUniformStorage(); initializeUniformStorage();
return LinkResult(true, gl::Error(GL_NO_ERROR)); return true;
} }
gl::Error ProgramD3D::save(gl::BinaryOutputStream *stream) gl::Error ProgramD3D::save(gl::BinaryOutputStream *stream)
...@@ -1289,22 +1278,14 @@ LinkResult ProgramD3D::compileProgramExecutables(const gl::ContextState &data, g ...@@ -1289,22 +1278,14 @@ LinkResult ProgramD3D::compileProgramExecutables(const gl::ContextState &data, g
{ {
const gl::InputLayout &defaultInputLayout = const gl::InputLayout &defaultInputLayout =
GetDefaultInputLayoutFromShader(mState.getAttachedVertexShader()); GetDefaultInputLayoutFromShader(mState.getAttachedVertexShader());
ShaderExecutableD3D *defaultVertexExecutable = NULL; ShaderExecutableD3D *defaultVertexExecutable = nullptr;
gl::Error error = ANGLE_TRY(
getVertexExecutableForInputLayout(defaultInputLayout, &defaultVertexExecutable, &infoLog); getVertexExecutableForInputLayout(defaultInputLayout, &defaultVertexExecutable, &infoLog));
if (error.isError())
{
return LinkResult(false, error);
}
std::vector<GLenum> defaultPixelOutput = GetDefaultOutputLayoutFromShader(getPixelShaderKey()); std::vector<GLenum> defaultPixelOutput = GetDefaultOutputLayoutFromShader(getPixelShaderKey());
ShaderExecutableD3D *defaultPixelExecutable = NULL; ShaderExecutableD3D *defaultPixelExecutable = nullptr;
error = ANGLE_TRY(
getPixelExecutableForOutputLayout(defaultPixelOutput, &defaultPixelExecutable, &infoLog); getPixelExecutableForOutputLayout(defaultPixelOutput, &defaultPixelExecutable, &infoLog));
if (error.isError())
{
return LinkResult(false, error);
}
// Auto-generate the geometry shader here, if we expect to be using point rendering in D3D11. // Auto-generate the geometry shader here, if we expect to be using point rendering in D3D11.
ShaderExecutableD3D *pointGS = nullptr; ShaderExecutableD3D *pointGS = nullptr;
...@@ -1337,9 +1318,8 @@ LinkResult ProgramD3D::compileProgramExecutables(const gl::ContextState &data, g ...@@ -1337,9 +1318,8 @@ LinkResult ProgramD3D::compileProgramExecutables(const gl::ContextState &data, g
fragmentShaderD3D->appendDebugInfo(defaultPixelExecutable->getDebugInfo()); fragmentShaderD3D->appendDebugInfo(defaultPixelExecutable->getDebugInfo());
} }
bool linkSuccess = (defaultVertexExecutable && defaultPixelExecutable && return (defaultVertexExecutable && defaultPixelExecutable &&
(!usesGeometryShader(GL_POINTS) || pointGS)); (!usesGeometryShader(GL_POINTS) || pointGS));
return LinkResult(linkSuccess, gl::Error(GL_NO_ERROR));
} }
LinkResult ProgramD3D::link(const gl::ContextState &data, gl::InfoLog &infoLog) LinkResult ProgramD3D::link(const gl::ContextState &data, gl::InfoLog &infoLog)
...@@ -1363,7 +1343,7 @@ LinkResult ProgramD3D::link(const gl::ContextState &data, gl::InfoLog &infoLog) ...@@ -1363,7 +1343,7 @@ LinkResult ProgramD3D::link(const gl::ContextState &data, gl::InfoLog &infoLog)
if (fragmentShaderD3D->usesFrontFacing()) if (fragmentShaderD3D->usesFrontFacing())
{ {
infoLog << "The current renderer doesn't support gl_FrontFacing"; infoLog << "The current renderer doesn't support gl_FrontFacing";
return LinkResult(false, gl::Error(GL_NO_ERROR)); return false;
} }
} }
...@@ -1375,7 +1355,7 @@ LinkResult ProgramD3D::link(const gl::ContextState &data, gl::InfoLog &infoLog) ...@@ -1375,7 +1355,7 @@ LinkResult ProgramD3D::link(const gl::ContextState &data, gl::InfoLog &infoLog)
if (!varyingPacking.packVaryings(infoLog, packedVaryings, if (!varyingPacking.packVaryings(infoLog, packedVaryings,
mState.getTransformFeedbackVaryingNames())) mState.getTransformFeedbackVaryingNames()))
{ {
return LinkResult(false, gl::Error(GL_NO_ERROR)); return false;
} }
ProgramD3DMetadata metadata(mRenderer, vertexShaderD3D, fragmentShaderD3D); ProgramD3DMetadata metadata(mRenderer, vertexShaderD3D, fragmentShaderD3D);
...@@ -1386,7 +1366,7 @@ LinkResult ProgramD3D::link(const gl::ContextState &data, gl::InfoLog &infoLog) ...@@ -1386,7 +1366,7 @@ LinkResult ProgramD3D::link(const gl::ContextState &data, gl::InfoLog &infoLog)
if (static_cast<GLuint>(varyingPacking.getRegisterCount()) > data.getCaps().maxVaryingVectors) if (static_cast<GLuint>(varyingPacking.getRegisterCount()) > data.getCaps().maxVaryingVectors)
{ {
infoLog << "No varying registers left to support gl_FragCoord/gl_PointCoord"; infoLog << "No varying registers left to support gl_FragCoord/gl_PointCoord";
return LinkResult(false, gl::Error(GL_NO_ERROR)); return false;
} }
// TODO(jmadill): Implement more sophisticated component packing in D3D9. // TODO(jmadill): Implement more sophisticated component packing in D3D9.
...@@ -1396,13 +1376,13 @@ LinkResult ProgramD3D::link(const gl::ContextState &data, gl::InfoLog &infoLog) ...@@ -1396,13 +1376,13 @@ LinkResult ProgramD3D::link(const gl::ContextState &data, gl::InfoLog &infoLog)
varyingPacking.getMaxSemanticIndex() > data.getCaps().maxVaryingVectors) varyingPacking.getMaxSemanticIndex() > data.getCaps().maxVaryingVectors)
{ {
infoLog << "Cannot pack these varyings on D3D9."; infoLog << "Cannot pack these varyings on D3D9.";
return LinkResult(false, gl::Error(GL_NO_ERROR)); return false;
} }
if (!mDynamicHLSL->generateShaderLinkHLSL(data, mState, metadata, varyingPacking, &mPixelHLSL, if (!mDynamicHLSL->generateShaderLinkHLSL(data, mState, metadata, varyingPacking, &mPixelHLSL,
&mVertexHLSL)) &mVertexHLSL))
{ {
return LinkResult(false, gl::Error(GL_NO_ERROR)); return false;
} }
mUsesPointSize = vertexShaderD3D->usesPointSize(); mUsesPointSize = vertexShaderD3D->usesPointSize();
...@@ -1433,12 +1413,12 @@ LinkResult ProgramD3D::link(const gl::ContextState &data, gl::InfoLog &infoLog) ...@@ -1433,12 +1413,12 @@ LinkResult ProgramD3D::link(const gl::ContextState &data, gl::InfoLog &infoLog)
gatherTransformFeedbackVaryings(varyingPacking); gatherTransformFeedbackVaryings(varyingPacking);
LinkResult result = compileProgramExecutables(data, infoLog); LinkResult result = compileProgramExecutables(data, infoLog);
if (result.error.isError()) if (result.isError())
{ {
infoLog << result.error.getMessage(); infoLog << result.getError().getMessage();
return result; return result;
} }
else if (!result.linkSuccess) else if (!result.getResult())
{ {
infoLog << "Failed to create D3D shaders."; infoLog << "Failed to create D3D shaders.";
return result; return result;
...@@ -1446,7 +1426,7 @@ LinkResult ProgramD3D::link(const gl::ContextState &data, gl::InfoLog &infoLog) ...@@ -1446,7 +1426,7 @@ LinkResult ProgramD3D::link(const gl::ContextState &data, gl::InfoLog &infoLog)
initUniformBlockInfo(); initUniformBlockInfo();
return LinkResult(true, gl::Error(GL_NO_ERROR)); return true;
} }
GLboolean ProgramD3D::validate(const gl::Caps & /*caps*/, gl::InfoLog * /*infoLog*/) GLboolean ProgramD3D::validate(const gl::Caps & /*caps*/, gl::InfoLog * /*infoLog*/)
......
...@@ -62,12 +62,12 @@ LinkResult ProgramGL::load(gl::InfoLog &infoLog, gl::BinaryInputStream *stream) ...@@ -62,12 +62,12 @@ LinkResult ProgramGL::load(gl::InfoLog &infoLog, gl::BinaryInputStream *stream)
// Verify that the program linked // Verify that the program linked
if (!checkLinkStatus(infoLog)) if (!checkLinkStatus(infoLog))
{ {
return LinkResult(false, gl::Error(GL_NO_ERROR)); return false;
} }
postLink(); postLink();
return LinkResult(true, gl::Error(GL_NO_ERROR)); return true;
} }
gl::Error ProgramGL::save(gl::BinaryOutputStream *stream) gl::Error ProgramGL::save(gl::BinaryOutputStream *stream)
...@@ -167,7 +167,7 @@ LinkResult ProgramGL::link(const gl::ContextState &data, gl::InfoLog &infoLog) ...@@ -167,7 +167,7 @@ LinkResult ProgramGL::link(const gl::ContextState &data, gl::InfoLog &infoLog)
// Verify the link // Verify the link
if (!checkLinkStatus(infoLog)) if (!checkLinkStatus(infoLog))
{ {
return LinkResult(false, gl::Error(GL_NO_ERROR)); return false;
} }
if (mWorkarounds.alwaysCallUseProgramAfterLink) if (mWorkarounds.alwaysCallUseProgramAfterLink)
...@@ -177,7 +177,7 @@ LinkResult ProgramGL::link(const gl::ContextState &data, gl::InfoLog &infoLog) ...@@ -177,7 +177,7 @@ LinkResult ProgramGL::link(const gl::ContextState &data, gl::InfoLog &infoLog)
postLink(); postLink();
return LinkResult(true, gl::Error(GL_NO_ERROR)); return true;
} }
GLboolean ProgramGL::validate(const gl::Caps & /*caps*/, gl::InfoLog * /*infoLog*/) GLboolean ProgramGL::validate(const gl::Caps & /*caps*/, gl::InfoLog * /*infoLog*/)
......
...@@ -25,7 +25,7 @@ ProgramNULL::~ProgramNULL() ...@@ -25,7 +25,7 @@ ProgramNULL::~ProgramNULL()
LinkResult ProgramNULL::load(gl::InfoLog &infoLog, gl::BinaryInputStream *stream) LinkResult ProgramNULL::load(gl::InfoLog &infoLog, gl::BinaryInputStream *stream)
{ {
UNIMPLEMENTED(); UNIMPLEMENTED();
return LinkResult(false, gl::Error(GL_INVALID_OPERATION)); return gl::Error(GL_INVALID_OPERATION);
} }
gl::Error ProgramNULL::save(gl::BinaryOutputStream *stream) gl::Error ProgramNULL::save(gl::BinaryOutputStream *stream)
...@@ -42,7 +42,7 @@ void ProgramNULL::setBinaryRetrievableHint(bool retrievable) ...@@ -42,7 +42,7 @@ void ProgramNULL::setBinaryRetrievableHint(bool retrievable)
LinkResult ProgramNULL::link(const gl::ContextState &data, gl::InfoLog &infoLog) LinkResult ProgramNULL::link(const gl::ContextState &data, gl::InfoLog &infoLog)
{ {
UNIMPLEMENTED(); UNIMPLEMENTED();
return LinkResult(false, gl::Error(GL_INVALID_OPERATION)); return gl::Error(GL_INVALID_OPERATION);
} }
GLboolean ProgramNULL::validate(const gl::Caps &caps, gl::InfoLog *infoLog) GLboolean ProgramNULL::validate(const gl::Caps &caps, gl::InfoLog *infoLog)
......
...@@ -25,7 +25,7 @@ ProgramVk::~ProgramVk() ...@@ -25,7 +25,7 @@ ProgramVk::~ProgramVk()
LinkResult ProgramVk::load(gl::InfoLog &infoLog, gl::BinaryInputStream *stream) LinkResult ProgramVk::load(gl::InfoLog &infoLog, gl::BinaryInputStream *stream)
{ {
UNIMPLEMENTED(); UNIMPLEMENTED();
return LinkResult(false, gl::Error(GL_INVALID_OPERATION)); return gl::Error(GL_INVALID_OPERATION);
} }
gl::Error ProgramVk::save(gl::BinaryOutputStream *stream) gl::Error ProgramVk::save(gl::BinaryOutputStream *stream)
...@@ -42,7 +42,7 @@ void ProgramVk::setBinaryRetrievableHint(bool retrievable) ...@@ -42,7 +42,7 @@ void ProgramVk::setBinaryRetrievableHint(bool retrievable)
LinkResult ProgramVk::link(const gl::ContextState &data, gl::InfoLog &infoLog) LinkResult ProgramVk::link(const gl::ContextState &data, gl::InfoLog &infoLog)
{ {
UNIMPLEMENTED(); UNIMPLEMENTED();
return LinkResult(false, gl::Error(GL_INVALID_OPERATION)); return gl::Error(GL_INVALID_OPERATION);
} }
GLboolean ProgramVk::validate(const gl::Caps &caps, gl::InfoLog *infoLog) GLboolean ProgramVk::validate(const gl::Caps &caps, gl::InfoLog *infoLog)
......
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