/*
 * MTLRenderPassDepthAttachmentDescriptor+MoltenVK.m
 *
 * Copyright (c) 2020 Chip Davis for CodeWeavers
 *
 * 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 "MTLRenderPassDepthAttachmentDescriptor+MoltenVK.h"
#include "MVKEnvironment.h"

@implementation MTLRenderPassDepthAttachmentDescriptor (MoltenVK)

-(MTLMultisampleDepthResolveFilter) depthResolveFilterMVK {

	if ( [self respondsToSelector: @selector(depthResolveFilter)] ) {
		return self.depthResolveFilter;
	}
	return MTLMultisampleDepthResolveFilterSample0;

}

-(void) setDepthResolveFilterMVK: (MTLMultisampleDepthResolveFilter) filter {

	if ( [self respondsToSelector: @selector(setDepthResolveFilter:)] ) {
		self.depthResolveFilter = filter;
	}

}

@end
