forked from mirrors/gecko-dev
		
	 dcf75e7f03
			
		
	
	
		dcf75e7f03
		
	
	
	
	
		
			
			Previously, we kept the object IDs managed on content side only. The GPU side would work with given indices. When an object is destroyed, we'd free the ID on the content side and signal the GPU to delete the object. Problem is that on the GPU process the object may still be kept alive for as long as any dependants are alive. What this change is doing - hooking up the callbacks to the *actual* freeing of IDs on the GPU side. These callbacks end up in messages from WebGPUParent to WebGPUChild, and only then the IDs are freed on the content side and able to be reused. Differential Revision: https://phabricator.services.mozilla.com/D67211 --HG-- extra : moz-landing-system : lando
		
			
				
	
	
		
			51 lines
		
	
	
	
		
			1.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			51 lines
		
	
	
	
		
			1.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
 | |
| /* This Source Code Form is subject to the terms of the Mozilla Public
 | |
|  * License, v. 2.0. If a copy of the MPL was not distributed with this
 | |
|  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 | |
| 
 | |
| #include "mozilla/dom/WebGPUBinding.h"
 | |
| #include "Adapter.h"
 | |
| 
 | |
| #include "Device.h"
 | |
| #include "Instance.h"
 | |
| #include "ipc/WebGPUChild.h"
 | |
| #include "mozilla/dom/Promise.h"
 | |
| 
 | |
| namespace mozilla {
 | |
| namespace webgpu {
 | |
| 
 | |
| GPU_IMPL_CYCLE_COLLECTION(Adapter, mParent, mBridge)
 | |
| GPU_IMPL_JS_WRAP(Adapter)
 | |
| 
 | |
| Adapter::Adapter(Instance* const aParent, RawId aId)
 | |
|     : ChildOf(aParent), mBridge(aParent->mBridge), mId(aId) {}
 | |
| 
 | |
| Adapter::~Adapter() { Cleanup(); }
 | |
| 
 | |
| void Adapter::Cleanup() {
 | |
|   if (mValid && mBridge && mBridge->IsOpen()) {
 | |
|     mValid = false;
 | |
|     mBridge->SendAdapterDestroy(mId);
 | |
|   }
 | |
| }
 | |
| 
 | |
| already_AddRefed<dom::Promise> Adapter::RequestDevice(
 | |
|     const dom::GPUDeviceDescriptor& aDesc, ErrorResult& aRv) {
 | |
|   RefPtr<dom::Promise> promise = dom::Promise::Create(GetParentObject(), aRv);
 | |
|   if (NS_WARN_IF(aRv.Failed())) {
 | |
|     return nullptr;
 | |
|   }
 | |
| 
 | |
|   Maybe<RawId> id = mBridge->AdapterRequestDevice(mId, aDesc);
 | |
|   if (id.isSome()) {
 | |
|     RefPtr<Device> device = new Device(this, id.value());
 | |
|     promise->MaybeResolve(device);
 | |
|   } else {
 | |
|     promise->MaybeRejectWithNotSupportedError("Unable to instanciate a Device");
 | |
|   }
 | |
| 
 | |
|   return promise.forget();
 | |
| }
 | |
| 
 | |
| }  // namespace webgpu
 | |
| }  // namespace mozilla
 |