589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync/*
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync * Copyright 2009 Henri Verbeet for CodeWeavers
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync *
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync * This library is free software; you can redistribute it and/or
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync * modify it under the terms of the GNU Lesser General Public
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync * License as published by the Free Software Foundation; either
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync * version 2.1 of the License, or (at your option) any later version.
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync *
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync * This library is distributed in the hope that it will be useful,
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync * but WITHOUT ANY WARRANTY; without even the implied warranty of
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync * Lesser General Public License for more details.
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync *
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync * You should have received a copy of the GNU Lesser General Public
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync * License along with this library; if not, write to the Free Software
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync *
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync */
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync/*
4b9d6701570cb98fd36e209314239d104ec584d3vboxsync * Oracle LGPL Disclaimer: For the avoidance of doubt, except that if any license choice
4b9d6701570cb98fd36e209314239d104ec584d3vboxsync * other than GPL or LGPL is available it will apply instead, Oracle elects to use only
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync * the Lesser General Public License version 2.1 (LGPLv2) at this time for any software where
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync * a choice of LGPL license versions is made available with the language indicating
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync * that LGPLv2 or any later version may be used, or where a choice of which version
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync * of the LGPL is applied is otherwise unspecified.
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync */
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync#include "config.h"
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync#include "wine/port.h"
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync#include "wined3d_private.h"
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsyncWINE_DEFAULT_DEBUG_CHANNEL(d3d);
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync/* IUnknown methods */
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsyncstatic HRESULT STDMETHODCALLTYPE rendertarget_view_QueryInterface(IWineD3DRendertargetView *iface,
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync REFIID riid, void **object)
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync{
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync TRACE("iface %p, riid %s, object %p\n", iface, debugstr_guid(riid), object);
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync if (IsEqualGUID(riid, &IID_IWineD3DRendertargetView)
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync || IsEqualGUID(riid, &IID_IWineD3DBase)
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync || IsEqualGUID(riid, &IID_IUnknown))
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync {
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync IUnknown_AddRef(iface);
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync *object = iface;
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync return S_OK;
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync }
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync WARN("%s not implemented, returning E_NOINTERFACE\n", debugstr_guid(riid));
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync *object = NULL;
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync return E_NOINTERFACE;
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync}
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsyncstatic ULONG STDMETHODCALLTYPE rendertarget_view_AddRef(IWineD3DRendertargetView *iface)
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync{
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync struct wined3d_rendertarget_view *This = (struct wined3d_rendertarget_view *)iface;
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync ULONG refcount = InterlockedIncrement(&This->refcount);
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync TRACE("%p increasing refcount to %u\n", This, refcount);
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync return refcount;
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync}
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsyncstatic ULONG STDMETHODCALLTYPE rendertarget_view_Release(IWineD3DRendertargetView *iface)
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync{
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync struct wined3d_rendertarget_view *This = (struct wined3d_rendertarget_view *)iface;
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync ULONG refcount = InterlockedDecrement(&This->refcount);
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync TRACE("%p decreasing refcount to %u\n", This, refcount);
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync if (!refcount)
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync {
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync IWineD3DResource_Release(This->resource);
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync HeapFree(GetProcessHeap(), 0, This);
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync }
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync return refcount;
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync}
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync/* IWineD3DBase methods */
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsyncstatic HRESULT STDMETHODCALLTYPE rendertarget_view_GetParent(IWineD3DRendertargetView *iface, IUnknown **parent)
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync{
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync struct wined3d_rendertarget_view *This = (struct wined3d_rendertarget_view *)iface;
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync IUnknown_AddRef(This->parent);
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync *parent = This->parent;
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync return WINED3D_OK;
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync}
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync/* IWineD3DRendertargetView methods */
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsyncstatic HRESULT STDMETHODCALLTYPE rendertarget_view_GetResource(IWineD3DRendertargetView *iface,
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync IWineD3DResource **resource)
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync{
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync struct wined3d_rendertarget_view *This = (struct wined3d_rendertarget_view *)iface;
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync IWineD3DResource_AddRef(This->resource);
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync *resource = This->resource;
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync return WINED3D_OK;
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync}
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync
ee6bcfc59fe3b0230aad85e2ef63d0402b7719b2vboxsyncstatic const struct IWineD3DRendertargetViewVtbl wined3d_rendertarget_view_vtbl =
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync{
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync /* IUnknown methods */
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync rendertarget_view_QueryInterface,
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync rendertarget_view_AddRef,
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync rendertarget_view_Release,
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync /* IWineD3DBase methods */
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync rendertarget_view_GetParent,
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync /* IWineD3DRendertargetView methods */
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync rendertarget_view_GetResource,
589fd26cedb2b4ebbed14f2964cad03cc8ebbca2vboxsync};
ee6bcfc59fe3b0230aad85e2ef63d0402b7719b2vboxsync
ee6bcfc59fe3b0230aad85e2ef63d0402b7719b2vboxsyncvoid wined3d_rendertarget_view_init(struct wined3d_rendertarget_view *view,
ee6bcfc59fe3b0230aad85e2ef63d0402b7719b2vboxsync IWineD3DResource *resource, IUnknown *parent)
ee6bcfc59fe3b0230aad85e2ef63d0402b7719b2vboxsync{
ee6bcfc59fe3b0230aad85e2ef63d0402b7719b2vboxsync view->vtbl = &wined3d_rendertarget_view_vtbl;
ee6bcfc59fe3b0230aad85e2ef63d0402b7719b2vboxsync view->refcount = 1;
ee6bcfc59fe3b0230aad85e2ef63d0402b7719b2vboxsync IWineD3DResource_AddRef(resource);
ee6bcfc59fe3b0230aad85e2ef63d0402b7719b2vboxsync view->resource = resource;
ee6bcfc59fe3b0230aad85e2ef63d0402b7719b2vboxsync view->parent = parent;
ee6bcfc59fe3b0230aad85e2ef63d0402b7719b2vboxsync}