//===-- metal_graphics -----------------------------------------------------===//
// Copyright (c) 2014 Apple Inc. All rights reserved
//===----------------------------------------------------------------------===//

#ifndef __METAL_GRAPHICS
#define __METAL_GRAPHICS

namespace metal {
  // 5.9 Graphics Functions

  // 5.9.1 Fragment Functions
  // 5.9.1.1 Fragment Functions – Derivatives
  METAL_ASM float dfdx(float p) __asm("air.dfdx.f32");
  METAL_ASM float dfdy(float p) __asm("air.dfdy.f32");
  METAL_ASM float fwidth(float p) __asm("air.fwidth.f32");
  // 5.9.1.1 Fragment Functions – Derivatives
  METAL_ASM vec<float,2> dfdx(vec<float,2> p) __asm("air.dfdx.v2f32");
  METAL_ASM vec<float,2> dfdy(vec<float,2> p) __asm("air.dfdy.v2f32");
  METAL_ASM vec<float,2> fwidth(vec<float,2> p) __asm("air.fwidth.v2f32");
  // 5.9.1.1 Fragment Functions – Derivatives
  METAL_ASM vec<float,3> dfdx(vec<float,3> p) __asm("air.dfdx.v3f32");
  METAL_ASM vec<float,3> dfdy(vec<float,3> p) __asm("air.dfdy.v3f32");
  METAL_ASM vec<float,3> fwidth(vec<float,3> p) __asm("air.fwidth.v3f32");
  // 5.9.1.1 Fragment Functions – Derivatives
  METAL_ASM vec<float,4> dfdx(vec<float,4> p) __asm("air.dfdx.v4f32");
  METAL_ASM vec<float,4> dfdy(vec<float,4> p) __asm("air.dfdy.v4f32");
  METAL_ASM vec<float,4> fwidth(vec<float,4> p) __asm("air.fwidth.v4f32");
  // 5.9.1.1 Fragment Functions – Derivatives
  METAL_ASM half dfdx(half p) __asm("air.dfdx.f16");
  METAL_ASM half dfdy(half p) __asm("air.dfdy.f16");
  METAL_ASM half fwidth(half p) __asm("air.fwidth.f16");
  // 5.9.1.1 Fragment Functions – Derivatives
  METAL_ASM vec<half,2> dfdx(vec<half,2> p) __asm("air.dfdx.v2f16");
  METAL_ASM vec<half,2> dfdy(vec<half,2> p) __asm("air.dfdy.v2f16");
  METAL_ASM vec<half,2> fwidth(vec<half,2> p) __asm("air.fwidth.v2f16");
  // 5.9.1.1 Fragment Functions – Derivatives
  METAL_ASM vec<half,3> dfdx(vec<half,3> p) __asm("air.dfdx.v3f16");
  METAL_ASM vec<half,3> dfdy(vec<half,3> p) __asm("air.dfdy.v3f16");
  METAL_ASM vec<half,3> fwidth(vec<half,3> p) __asm("air.fwidth.v3f16");
  // 5.9.1.1 Fragment Functions – Derivatives
  METAL_ASM vec<half,4> dfdx(vec<half,4> p) __asm("air.dfdx.v4f16");
  METAL_ASM vec<half,4> dfdy(vec<half,4> p) __asm("air.dfdy.v4f16");
  METAL_ASM vec<half,4> fwidth(vec<half,4> p) __asm("air.fwidth.v4f16");

  // 5.9.1.2 Fragment Functions – Samples
  METAL_ASM uint get_num_samples() __asm("air.get_num_samples.i32");
  METAL_ASM vec<float,2> get_sample_position(uint indx) __asm("air.get_sample_position.v2f32");

  // 5.9.1.3 Fragment Functions – Flow Control
  METAL_ASM void discard_fragment(void) __asm("air.discard_fragment");
} // namespace metal

#endif // __METAL_GRAPHICS
