Commit 3fb0ca02 by Jamie Madill Committed by Commit Bot

Move LazyResource::resolveImpl to the cpp.

This avoids a compile error where GCC is not compatible with MSVS and Clang, who can both handle calls to forward declared functions in templates. It explicitly specializes LazyResource for the used template types. BUG=angleproject:2182 Change-Id: Iedb1f157d0662b0ea4472c9b4e85828217be577e Reviewed-on: https://chromium-review.googlesource.com/757758Reviewed-by: 's avatarJeff Gilbert <jgilbert@mozilla.com> Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org> Commit-Queue: Jamie Madill <jmadill@chromium.org>
parent 6db1c2e8
...@@ -2079,6 +2079,50 @@ HRESULT SetDebugName(ID3D11DeviceChild *resource, const char *name) ...@@ -2079,6 +2079,50 @@ HRESULT SetDebugName(ID3D11DeviceChild *resource, const char *name)
#endif #endif
} }
// Keep this in cpp file where it has visibility of Renderer11.h, otherwise calling
// allocateResource is only compatible with Clang and MSVS, which support calling a
// method on a forward declared class in a template.
template <ResourceType ResourceT>
gl::Error LazyResource<ResourceT>::resolveImpl(Renderer11 *renderer,
const GetDescType<ResourceT> &desc,
GetInitDataType<ResourceT> *initData,
const char *name)
{
if (!mResource.valid())
{
ANGLE_TRY(renderer->allocateResource(desc, initData, &mResource));
mResource.setDebugName(name);
}
return gl::NoError();
}
template gl::Error LazyResource<ResourceType::BlendState>::resolveImpl(Renderer11 *renderer,
const D3D11_BLEND_DESC &desc,
void *initData,
const char *name);
template gl::Error LazyResource<ResourceType::ComputeShader>::resolveImpl(Renderer11 *renderer,
const ShaderData &desc,
void *initData,
const char *name);
template gl::Error LazyResource<ResourceType::GeometryShader>::resolveImpl(
Renderer11 *renderer,
const ShaderData &desc,
const std::vector<D3D11_SO_DECLARATION_ENTRY> *initData,
const char *name);
template gl::Error LazyResource<ResourceType::InputLayout>::resolveImpl(
Renderer11 *renderer,
const InputElementArray &desc,
const ShaderData *initData,
const char *name);
template gl::Error LazyResource<ResourceType::PixelShader>::resolveImpl(Renderer11 *renderer,
const ShaderData &desc,
void *initData,
const char *name);
template gl::Error LazyResource<ResourceType::VertexShader>::resolveImpl(Renderer11 *renderer,
const ShaderData &desc,
void *initData,
const char *name);
gl::Error LazyInputLayout::resolve(Renderer11 *renderer) gl::Error LazyInputLayout::resolve(Renderer11 *renderer)
{ {
return resolveImpl(renderer, mInputDesc, &mByteCode, mDebugName); return resolveImpl(renderer, mInputDesc, &mByteCode, mDebugName);
......
...@@ -197,18 +197,12 @@ class LazyResource : angle::NonCopyable ...@@ -197,18 +197,12 @@ class LazyResource : angle::NonCopyable
protected: protected:
LazyResource(LazyResource &&other) : mResource(std::move(other.mResource)) {} LazyResource(LazyResource &&other) : mResource(std::move(other.mResource)) {}
// Specialized in the cpp file to avoid MSVS/Clang specific code.
gl::Error resolveImpl(Renderer11 *renderer, gl::Error resolveImpl(Renderer11 *renderer,
const GetDescType<ResourceT> &desc, const GetDescType<ResourceT> &desc,
GetInitDataType<ResourceT> *initData, GetInitDataType<ResourceT> *initData,
const char *name) const char *name);
{
if (!mResource.valid())
{
ANGLE_TRY(renderer->allocateResource(desc, initData, &mResource));
mResource.setDebugName(name);
}
return gl::NoError();
}
Resource11<GetD3D11Type<ResourceT>> mResource; Resource11<GetD3D11Type<ResourceT>> mResource;
}; };
......
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