mirror of
https://github.com/encounter/dawn-cmake.git
synced 2025-12-18 17:35:30 +00:00
Dawn: Refactor device toggles
This CL refactor the logic adapter creating device toggles set when creating device and the way device holding its toggles. This CL also introduce the concept "toggle stage", currently "device stage" only but in future will add "instance stage" and "adapter stage" for instance and adapter toggles. No changes on Dawn API. More details: 1. Introduce `TogglesState` objects that represent the complete toggles state of a device (and will used for instance and adapter in future). 2. When creating a device, adapter set up a TogglesState object for it in `AdapterBase::CreateDeviceInternal` and `Adapter::SetupBackendDeviceToggles`, no other place would change the device's toggles state. This change simplify the logic. 3. Introduce the `ToggleStage` enum for every toggle and `TogglesState` object. Currently we only have `Device` toggle stage, but in future will have `Instance` and `Adapter` for instance and adapter toggles. Bug: dawn:1495 Change-Id: Ifafac6a6a075b5b9a733159574ae5b6d4f3ebde9 Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/118030 Kokoro: Kokoro <noreply+kokoro@google.com> Reviewed-by: Austin Eng <enga@chromium.org> Commit-Queue: Zhaoming Jiang <zhaoming.jiang@intel.com>
This commit is contained in:
committed by
Dawn LUCI CQ
parent
4906b03963
commit
63b777b552
@@ -152,20 +152,76 @@ MaybeError Adapter::InitializeSupportedLimitsImpl(CombinedLimits* limits) {
|
||||
return {};
|
||||
}
|
||||
|
||||
ResultOrError<Ref<DeviceBase>> Adapter::CreateDeviceImpl(
|
||||
const DeviceDescriptor* descriptor,
|
||||
const TripleStateTogglesSet& userProvidedToggles) {
|
||||
void Adapter::SetupBackendDeviceToggles(TogglesState* deviceToggles) const {
|
||||
const OpenGLFunctions& gl = mFunctions;
|
||||
|
||||
bool supportsBaseVertex = gl.IsAtLeastGLES(3, 2) || gl.IsAtLeastGL(3, 2);
|
||||
|
||||
bool supportsBaseInstance = gl.IsAtLeastGLES(3, 2) || gl.IsAtLeastGL(4, 2);
|
||||
|
||||
// TODO(crbug.com/dawn/582): Use OES_draw_buffers_indexed where available.
|
||||
bool supportsIndexedDrawBuffers = gl.IsAtLeastGLES(3, 2) || gl.IsAtLeastGL(3, 0);
|
||||
|
||||
bool supportsSnormRead =
|
||||
gl.IsAtLeastGL(4, 4) || gl.IsGLExtensionSupported("GL_EXT_render_snorm");
|
||||
|
||||
bool supportsDepthRead = gl.IsAtLeastGL(3, 0) || gl.IsGLExtensionSupported("GL_NV_read_depth");
|
||||
|
||||
bool supportsStencilRead =
|
||||
gl.IsAtLeastGL(3, 0) || gl.IsGLExtensionSupported("GL_NV_read_stencil");
|
||||
|
||||
bool supportsDepthStencilRead =
|
||||
gl.IsAtLeastGL(3, 0) || gl.IsGLExtensionSupported("GL_NV_read_depth_stencil");
|
||||
|
||||
// Desktop GL supports BGRA textures via swizzling in the driver; ES requires an extension.
|
||||
bool supportsBGRARead =
|
||||
gl.GetVersion().IsDesktop() || gl.IsGLExtensionSupported("GL_EXT_read_format_bgra");
|
||||
|
||||
bool supportsSampleVariables = gl.IsAtLeastGL(4, 0) || gl.IsAtLeastGLES(3, 2) ||
|
||||
gl.IsGLExtensionSupported("GL_OES_sample_variables");
|
||||
|
||||
// TODO(crbug.com/dawn/343): We can support the extension variants, but need to load the EXT
|
||||
// procs without the extension suffix.
|
||||
// We'll also need emulation of shader builtins gl_BaseVertex and gl_BaseInstance.
|
||||
|
||||
// supportsBaseVertex |=
|
||||
// (gl.IsAtLeastGLES(2, 0) &&
|
||||
// (gl.IsGLExtensionSupported("OES_draw_elements_base_vertex") ||
|
||||
// gl.IsGLExtensionSupported("EXT_draw_elements_base_vertex"))) ||
|
||||
// (gl.IsAtLeastGL(3, 1) && gl.IsGLExtensionSupported("ARB_draw_elements_base_vertex"));
|
||||
|
||||
// supportsBaseInstance |=
|
||||
// (gl.IsAtLeastGLES(3, 1) && gl.IsGLExtensionSupported("EXT_base_instance")) ||
|
||||
// (gl.IsAtLeastGL(3, 1) && gl.IsGLExtensionSupported("ARB_base_instance"));
|
||||
|
||||
// TODO(crbug.com/dawn/343): Investigate emulation.
|
||||
deviceToggles->Default(Toggle::DisableBaseVertex, !supportsBaseVertex);
|
||||
deviceToggles->Default(Toggle::DisableBaseInstance, !supportsBaseInstance);
|
||||
deviceToggles->Default(Toggle::DisableIndexedDrawBuffers, !supportsIndexedDrawBuffers);
|
||||
deviceToggles->Default(Toggle::DisableSnormRead, !supportsSnormRead);
|
||||
deviceToggles->Default(Toggle::DisableDepthRead, !supportsDepthRead);
|
||||
deviceToggles->Default(Toggle::DisableStencilRead, !supportsStencilRead);
|
||||
deviceToggles->Default(Toggle::DisableDepthStencilRead, !supportsDepthStencilRead);
|
||||
deviceToggles->Default(Toggle::DisableBGRARead, !supportsBGRARead);
|
||||
deviceToggles->Default(Toggle::DisableSampleVariables, !supportsSampleVariables);
|
||||
deviceToggles->Default(Toggle::FlushBeforeClientWaitSync, gl.GetVersion().IsES());
|
||||
// For OpenGL ES, we must use a placeholder fragment shader for vertex-only render pipeline.
|
||||
deviceToggles->Default(Toggle::UsePlaceholderFragmentInVertexOnlyPipeline,
|
||||
gl.GetVersion().IsES());
|
||||
}
|
||||
|
||||
ResultOrError<Ref<DeviceBase>> Adapter::CreateDeviceImpl(const DeviceDescriptor* descriptor,
|
||||
const TogglesState& deviceToggles) {
|
||||
EGLenum api =
|
||||
GetBackendType() == wgpu::BackendType::OpenGL ? EGL_OPENGL_API : EGL_OPENGL_ES_API;
|
||||
std::unique_ptr<Device::Context> context;
|
||||
DAWN_TRY_ASSIGN(context, ContextEGL::Create(mEGLFunctions, api));
|
||||
return Device::Create(this, descriptor, mFunctions, std::move(context), userProvidedToggles);
|
||||
return Device::Create(this, descriptor, mFunctions, std::move(context), deviceToggles);
|
||||
}
|
||||
|
||||
MaybeError Adapter::ValidateFeatureSupportedWithTogglesImpl(
|
||||
MaybeError Adapter::ValidateFeatureSupportedWithDeviceTogglesImpl(
|
||||
wgpu::FeatureName feature,
|
||||
const TripleStateTogglesSet& userProvidedToggles) {
|
||||
const TogglesState& deviceToggles) {
|
||||
return {};
|
||||
}
|
||||
|
||||
} // namespace dawn::native::opengl
|
||||
|
||||
@@ -36,13 +36,14 @@ class Adapter : public AdapterBase {
|
||||
MaybeError InitializeImpl() override;
|
||||
void InitializeSupportedFeaturesImpl() override;
|
||||
MaybeError InitializeSupportedLimitsImpl(CombinedLimits* limits) override;
|
||||
ResultOrError<Ref<DeviceBase>> CreateDeviceImpl(
|
||||
const DeviceDescriptor* descriptor,
|
||||
const TripleStateTogglesSet& userProvidedToggles) override;
|
||||
|
||||
MaybeError ValidateFeatureSupportedWithTogglesImpl(
|
||||
MaybeError ValidateFeatureSupportedWithDeviceTogglesImpl(
|
||||
wgpu::FeatureName feature,
|
||||
const TripleStateTogglesSet& userProvidedToggles) override;
|
||||
const TogglesState& deviceTogglesState) override;
|
||||
|
||||
void SetupBackendDeviceToggles(TogglesState* deviceToggles) const override;
|
||||
ResultOrError<Ref<DeviceBase>> CreateDeviceImpl(const DeviceDescriptor* descriptor,
|
||||
const TogglesState& deviceToggles) override;
|
||||
|
||||
OpenGLFunctions mFunctions;
|
||||
EGLFunctions mEGLFunctions;
|
||||
|
||||
@@ -108,9 +108,9 @@ ResultOrError<Ref<Device>> Device::Create(AdapterBase* adapter,
|
||||
const DeviceDescriptor* descriptor,
|
||||
const OpenGLFunctions& functions,
|
||||
std::unique_ptr<Context> context,
|
||||
const TripleStateTogglesSet& userProvidedToggles) {
|
||||
Ref<Device> device = AcquireRef(
|
||||
new Device(adapter, descriptor, functions, std::move(context), userProvidedToggles));
|
||||
const TogglesState& deviceToggles) {
|
||||
Ref<Device> device =
|
||||
AcquireRef(new Device(adapter, descriptor, functions, std::move(context), deviceToggles));
|
||||
DAWN_TRY(device->Initialize(descriptor));
|
||||
return device;
|
||||
}
|
||||
@@ -119,8 +119,8 @@ Device::Device(AdapterBase* adapter,
|
||||
const DeviceDescriptor* descriptor,
|
||||
const OpenGLFunctions& functions,
|
||||
std::unique_ptr<Context> context,
|
||||
const TripleStateTogglesSet& userProvidedToggles)
|
||||
: DeviceBase(adapter, descriptor, userProvidedToggles),
|
||||
const TogglesState& deviceToggles)
|
||||
: DeviceBase(adapter, descriptor, deviceToggles),
|
||||
mGL(functions),
|
||||
mContext(std::move(context)) {}
|
||||
|
||||
@@ -130,7 +130,7 @@ Device::~Device() {
|
||||
|
||||
MaybeError Device::Initialize(const DeviceDescriptor* descriptor) {
|
||||
const OpenGLFunctions& gl = GetGL();
|
||||
InitTogglesFromDriver();
|
||||
|
||||
mFormatTable = BuildGLFormatTable(GetBGRAInternalFormat());
|
||||
|
||||
// Use the debug output functionality to get notified about GL errors
|
||||
@@ -177,62 +177,6 @@ MaybeError Device::Initialize(const DeviceDescriptor* descriptor) {
|
||||
return DeviceBase::Initialize(AcquireRef(new Queue(this, &descriptor->defaultQueue)));
|
||||
}
|
||||
|
||||
void Device::InitTogglesFromDriver() {
|
||||
const OpenGLFunctions& gl = GetGL();
|
||||
bool supportsBaseVertex = gl.IsAtLeastGLES(3, 2) || gl.IsAtLeastGL(3, 2);
|
||||
|
||||
bool supportsBaseInstance = gl.IsAtLeastGLES(3, 2) || gl.IsAtLeastGL(4, 2);
|
||||
|
||||
// TODO(crbug.com/dawn/582): Use OES_draw_buffers_indexed where available.
|
||||
bool supportsIndexedDrawBuffers = gl.IsAtLeastGLES(3, 2) || gl.IsAtLeastGL(3, 0);
|
||||
|
||||
bool supportsSnormRead =
|
||||
gl.IsAtLeastGL(4, 4) || gl.IsGLExtensionSupported("GL_EXT_render_snorm");
|
||||
|
||||
bool supportsDepthRead = gl.IsAtLeastGL(3, 0) || gl.IsGLExtensionSupported("GL_NV_read_depth");
|
||||
|
||||
bool supportsStencilRead =
|
||||
gl.IsAtLeastGL(3, 0) || gl.IsGLExtensionSupported("GL_NV_read_stencil");
|
||||
|
||||
bool supportsDepthStencilRead =
|
||||
gl.IsAtLeastGL(3, 0) || gl.IsGLExtensionSupported("GL_NV_read_depth_stencil");
|
||||
|
||||
// Desktop GL supports BGRA textures via swizzling in the driver; ES requires an extension.
|
||||
bool supportsBGRARead =
|
||||
gl.GetVersion().IsDesktop() || gl.IsGLExtensionSupported("GL_EXT_read_format_bgra");
|
||||
|
||||
bool supportsSampleVariables = gl.IsAtLeastGL(4, 0) || gl.IsAtLeastGLES(3, 2) ||
|
||||
gl.IsGLExtensionSupported("GL_OES_sample_variables");
|
||||
|
||||
// TODO(crbug.com/dawn/343): We can support the extension variants, but need to load the EXT
|
||||
// procs without the extension suffix.
|
||||
// We'll also need emulation of shader builtins gl_BaseVertex and gl_BaseInstance.
|
||||
|
||||
// supportsBaseVertex |=
|
||||
// (gl.IsAtLeastGLES(2, 0) &&
|
||||
// (gl.IsGLExtensionSupported("OES_draw_elements_base_vertex") ||
|
||||
// gl.IsGLExtensionSupported("EXT_draw_elements_base_vertex"))) ||
|
||||
// (gl.IsAtLeastGL(3, 1) && gl.IsGLExtensionSupported("ARB_draw_elements_base_vertex"));
|
||||
|
||||
// supportsBaseInstance |=
|
||||
// (gl.IsAtLeastGLES(3, 1) && gl.IsGLExtensionSupported("EXT_base_instance")) ||
|
||||
// (gl.IsAtLeastGL(3, 1) && gl.IsGLExtensionSupported("ARB_base_instance"));
|
||||
|
||||
// TODO(crbug.com/dawn/343): Investigate emulation.
|
||||
SetToggle(Toggle::DisableBaseVertex, !supportsBaseVertex);
|
||||
SetToggle(Toggle::DisableBaseInstance, !supportsBaseInstance);
|
||||
SetToggle(Toggle::DisableIndexedDrawBuffers, !supportsIndexedDrawBuffers);
|
||||
SetToggle(Toggle::DisableSnormRead, !supportsSnormRead);
|
||||
SetToggle(Toggle::DisableDepthRead, !supportsDepthRead);
|
||||
SetToggle(Toggle::DisableStencilRead, !supportsStencilRead);
|
||||
SetToggle(Toggle::DisableDepthStencilRead, !supportsDepthStencilRead);
|
||||
SetToggle(Toggle::DisableBGRARead, !supportsBGRARead);
|
||||
SetToggle(Toggle::DisableSampleVariables, !supportsSampleVariables);
|
||||
SetToggle(Toggle::FlushBeforeClientWaitSync, gl.GetVersion().IsES());
|
||||
// For OpenGL ES, we must use a placeholder fragment shader for vertex-only render pipeline.
|
||||
SetToggle(Toggle::UsePlaceholderFragmentInVertexOnlyPipeline, gl.GetVersion().IsES());
|
||||
}
|
||||
|
||||
const GLFormat& Device::GetGLFormat(const Format& format) {
|
||||
ASSERT(format.isSupported);
|
||||
ASSERT(format.GetIndex() < mFormatTable.size());
|
||||
|
||||
@@ -44,7 +44,7 @@ class Device final : public DeviceBase {
|
||||
const DeviceDescriptor* descriptor,
|
||||
const OpenGLFunctions& functions,
|
||||
std::unique_ptr<Context> context,
|
||||
const TripleStateTogglesSet& userProvidedToggles);
|
||||
const TogglesState& deviceToggles);
|
||||
~Device() override;
|
||||
|
||||
MaybeError Initialize(const DeviceDescriptor* descriptor);
|
||||
@@ -95,7 +95,7 @@ class Device final : public DeviceBase {
|
||||
const DeviceDescriptor* descriptor,
|
||||
const OpenGLFunctions& functions,
|
||||
std::unique_ptr<Context> context,
|
||||
const TripleStateTogglesSet& userProvidedToggles);
|
||||
const TogglesState& deviceToggless);
|
||||
|
||||
ResultOrError<Ref<BindGroupBase>> CreateBindGroupImpl(
|
||||
const BindGroupDescriptor* descriptor) override;
|
||||
@@ -127,7 +127,6 @@ class Device final : public DeviceBase {
|
||||
Ref<RenderPipelineBase> CreateUninitializedRenderPipelineImpl(
|
||||
const RenderPipelineDescriptor* descriptor) override;
|
||||
|
||||
void InitTogglesFromDriver();
|
||||
GLenum GetBGRAInternalFormat() const;
|
||||
ResultOrError<ExecutionSerial> CheckAndUpdateCompletedSerials() override;
|
||||
void DestroyImpl() override;
|
||||
|
||||
Reference in New Issue
Block a user