// Copyright 2016 The SwiftShader Authors. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "Unknown.hpp" #include "Debug.hpp" #include <assert.h> namespace D3D8 { Unknown::Unknown() { referenceCount = 0; bindCount = 0; } Unknown::~Unknown() { ASSERT(referenceCount == 0); ASSERT(bindCount == 0); } long Unknown::QueryInterface(const IID &iid, void **object) { if(iid == IID_IUnknown) { AddRef(); *object = this; return S_OK; } *object = 0; return NOINTERFACE(iid); } unsigned long Unknown::AddRef() { return InterlockedIncrement(&referenceCount); } unsigned long Unknown::Release() { int current = referenceCount; if(referenceCount > 0) { current = InterlockedDecrement(&referenceCount); } if(referenceCount == 0 && bindCount == 0) { delete this; } return current; } void Unknown::bind() { InterlockedIncrement(&bindCount); } void Unknown::unbind() { ASSERT(bindCount > 0); InterlockedDecrement(&bindCount); if(referenceCount == 0 && bindCount == 0) { delete this; } } }