# Copyright 2017 The Shaderc 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.

import expect
from glslc_test_framework import inside_glslc_testsuite
from placeholder import FileShader

# A GLSL shader with uniforms without explicit bindings.
GLSL_SHADER_WITH_UNIFORMS_WITHOUT_BINDINGS = """#version 450
  #extension GL_ARB_sparse_texture2 : enable
  uniform texture2D my_tex;
  uniform sampler my_sam;
  layout(rgba32f) uniform image2D my_img;
  layout(rgba32f) uniform imageBuffer my_imbuf;
  uniform block { float x; float y; } my_ubo;
  buffer B { float z; } my_ssbo;
  void main() {
    texture(sampler2D(my_tex,my_sam),vec2(1.0));
    vec4 t;
    sparseImageLoadARB(my_img,ivec2(0),t);
    imageLoad(my_imbuf,42);
    float x = my_ubo.x;
    my_ssbo.z = 1.1;
  }"""


# An HLSL shader with uniforms without explicit bindings.
HLSL_SHADER_WITHOUT_BINDINGS = """
SamplerState s1 : register(s1);
SamplerComparisonState s2 : register(s2);

Texture1D <float2> t1 : register(t11);
Texture2D <float2> t2 : register(t12);
Texture3D <float2> t3 : register(t13);
StructuredBuffer<float4> t4 : register(t14);
ByteAddressBuffer t5 : register(t15);
Buffer<float4> t6 : register(t16);

RWTexture1D <float4>  u1 : register(u21);
RWTexture1D <float4>  u2 : register(u22);
RWTexture1D <float4>  u3 : register(u23);
RWBuffer <float4> u4 : register(u24);
RWByteAddressBuffer u5 : register(u25);
RWStructuredBuffer<float> u6 : register(u26);
AppendStructuredBuffer<float> u7 : register(u27);
ConsumeStructuredBuffer<float> u8 : register(u28);

float4 main() : SV_Target0 {
   s1;
   s2;

   t1;
   t2;
   t3;
   t4[2];
   t5.Load(8);
   t6;

   u1;
   u2;
   u3;
   u4[1];
   u5.Load(15);
   u6[2];
   u7;
   u8;
   return float4(1.0);
}
"""

@inside_glslc_testsuite('OptionFAutoBindUniforms')
class UniformBindingsNotCreatedByDefault(expect.ValidAssemblyFileWithoutSubstr):
    """Tests that the compiler does not generate bindings for uniforms by default."""

    shader = FileShader(GLSL_SHADER_WITH_UNIFORMS_WITHOUT_BINDINGS, '.vert')
    glslc_args = ['-S', shader]
    # Sufficient to just check one of the uniforms.
    unexpected_assembly_substr = "OpDecorate %my_sam Binding"


@inside_glslc_testsuite('OptionFAutoBindUniforms')
class FAutoBindingUniformsGeneratesBindings(expect.ValidAssemblyFileWithSubstr):
    """Tests that the compiler generates bindings for uniforms upon request ."""

    shader = FileShader(GLSL_SHADER_WITH_UNIFORMS_WITHOUT_BINDINGS, '.vert')
    glslc_args = ['-S', shader, '-fauto-bind-uniforms']
    # Sufficient to just check one of the uniforms.
    expected_assembly_substr = "OpDecorate %my_sam Binding 1"


@inside_glslc_testsuite('OptionFAutoBindUniforms')
class FImageBindingBaseOptionRespectedOnImage(expect.ValidAssemblyFileWithSubstr):
    """Tests that -fimage-binding-base value is respected on images."""

    shader = FileShader(GLSL_SHADER_WITH_UNIFORMS_WITHOUT_BINDINGS, '.vert')
    glslc_args = ['-S', shader, '-fauto-bind-uniforms', '-fimage-binding-base', '44']
    expected_assembly_substr = "OpDecorate %my_img Binding 44"


@inside_glslc_testsuite('OptionFAutoBindUniforms')
class FImageBindingBaseOptionRespectedOnImageBuffer(expect.ValidAssemblyFileWithSubstr):
    """Tests that -fimage-binding-base value is respected on image buffers."""

    shader = FileShader(GLSL_SHADER_WITH_UNIFORMS_WITHOUT_BINDINGS, '.vert')
    glslc_args = ['-S', shader, '-fauto-bind-uniforms', '-fimage-binding-base', '44']
    expected_assembly_substr = "OpDecorate %my_imbuf Binding 45"


@inside_glslc_testsuite('OptionFAutoBindUniforms')
class FTextureBindingBaseOptionRespected(expect.ValidAssemblyFileWithSubstr):
    """Tests that -ftexture-binding-base value is respected."""

    shader = FileShader(GLSL_SHADER_WITH_UNIFORMS_WITHOUT_BINDINGS, '.vert')
    glslc_args = ['-S', shader, '-fauto-bind-uniforms', '-ftexture-binding-base', '44']
    expected_assembly_substr = "OpDecorate %my_tex Binding 44"


@inside_glslc_testsuite('OptionFAutoBindUniforms')
class FSamplerBindingBaseOptionRespected(expect.ValidAssemblyFileWithSubstr):
    """Tests that -fsampler-binding-base value is respected."""

    shader = FileShader(GLSL_SHADER_WITH_UNIFORMS_WITHOUT_BINDINGS, '.vert')
    glslc_args = ['-S', shader, '-fauto-bind-uniforms', '-fsampler-binding-base', '44']
    expected_assembly_substr = "OpDecorate %my_sam Binding 44"


@inside_glslc_testsuite('OptionFAutoBindUniforms')
class FUboBindingBaseOptionRespectedOnBuffer(expect.ValidAssemblyFileWithSubstr):
    """Tests that -fubo-binding-base value is respected."""

    shader = FileShader(GLSL_SHADER_WITH_UNIFORMS_WITHOUT_BINDINGS, '.vert')
    glslc_args = ['-S', shader, '-fauto-bind-uniforms', '-fubo-binding-base', '44']
    expected_assembly_substr = "OpDecorate %my_ubo Binding 44"


@inside_glslc_testsuite('OptionFAutoBindUniforms')
class FCbufferBindingBaseOptionRespectedOnBuffer(expect.ValidAssemblyFileWithSubstr):
    """Tests that -fcbuffer-binding-base value is respected."""

    shader = FileShader(GLSL_SHADER_WITH_UNIFORMS_WITHOUT_BINDINGS, '.vert')
    glslc_args = ['-S', shader, '-fauto-bind-uniforms', '-fcbuffer-binding-base', '44']
    expected_assembly_substr = "OpDecorate %my_ubo Binding 44"


@inside_glslc_testsuite('OptionFAutoBindUniforms')
class FImageBindingBaseNeedsValue(expect.ErrorMessageSubstr):
    """Tests that -fimage-binding-base requires a value."""

    shader = FileShader(GLSL_SHADER_WITH_UNIFORMS_WITHOUT_BINDINGS, '.vert')
    glslc_args = ['-S', shader, '-fimage-binding-base']
    expected_error_substr = "error: Option -fimage-binding-base requires at least one argument"


@inside_glslc_testsuite('OptionFAutoBindUniforms')
class FTextureBindingBaseNeedsValue(expect.ErrorMessageSubstr):
    """Tests that -ftexture-binding-base requires a value."""

    shader = FileShader(GLSL_SHADER_WITH_UNIFORMS_WITHOUT_BINDINGS, '.vert')
    glslc_args = ['-S', shader, '-ftexture-binding-base']
    expected_error_substr = "error: Option -ftexture-binding-base requires at least one argument"


@inside_glslc_testsuite('OptionFAutoBindUniforms')
class FSamplerBindingBaseNeedsValue(expect.ErrorMessageSubstr):
    """Tests that -fsampler-binding-base requires a value."""

    shader = FileShader(GLSL_SHADER_WITH_UNIFORMS_WITHOUT_BINDINGS, '.vert')
    glslc_args = ['-S', shader, '-fsampler-binding-base']
    expected_error_substr = "error: Option -fsampler-binding-base requires at least one argument"


@inside_glslc_testsuite('OptionFAutoBindUniforms')
class FUboBindingBaseNeedsValue(expect.ErrorMessageSubstr):
    """Tests that -fubo-binding-base requires a value."""

    shader = FileShader(GLSL_SHADER_WITH_UNIFORMS_WITHOUT_BINDINGS, '.vert')
    glslc_args = ['-S', shader, '-fubo-binding-base']
    expected_error_substr = "error: Option -fubo-binding-base requires at least one argument"


@inside_glslc_testsuite('OptionFAutoBindUniforms')
class FImageBindingBaseNeedsNumberValueIfNotStage(expect.ErrorMessageSubstr):
    """Tests that -fimage-binding-base requires a number value."""

    shader = FileShader(GLSL_SHADER_WITH_UNIFORMS_WITHOUT_BINDINGS, '.vert')
    glslc_args = ['-S', shader, '-fimage-binding-base', '9x']
    expected_error_substr = "error: invalid offset value 9x for -fimage-binding-base"


@inside_glslc_testsuite('OptionFAutoBindUniforms')
class FTextureBindingBaseNeedsNumberValue(expect.ErrorMessageSubstr):
    """Tests that -ftexture-binding-base requires a number value."""

    shader = FileShader(GLSL_SHADER_WITH_UNIFORMS_WITHOUT_BINDINGS, '.vert')
    glslc_args = ['-S', shader, '-ftexture-binding-base', '9x']
    expected_error_substr = "error: invalid offset value 9x for -ftexture-binding-base"


@inside_glslc_testsuite('OptionFAutoBindUniforms')
class FSamplerBindingBaseNeedsNumberValue(expect.ErrorMessageSubstr):
    """Tests that -fsampler-binding-base requires a number value."""

    shader = FileShader(GLSL_SHADER_WITH_UNIFORMS_WITHOUT_BINDINGS, '.vert')
    glslc_args = ['-S', shader, '-fsampler-binding-base', '9x']
    expected_error_substr = "error: invalid offset value 9x for -fsampler-binding-base"


@inside_glslc_testsuite('OptionFAutoBindUniforms')
class FUboBindingBaseNeedsNumberValue(expect.ErrorMessageSubstr):
    """Tests that -fubo-binding-base requires a number value."""

    shader = FileShader(GLSL_SHADER_WITH_UNIFORMS_WITHOUT_BINDINGS, '.vert')
    glslc_args = ['-S', shader, '-fubo-binding-base', '9x']
    expected_error_substr = "error: invalid offset value 9x for -fubo-binding-base"


@inside_glslc_testsuite('OptionFAutoBindUniforms')
class FImageBindingBaseNeedsUnsignedNumberValue(expect.ErrorMessageSubstr):
    """Tests that -fimage-binding-base requires an unsigned number value."""

    shader = FileShader(GLSL_SHADER_WITH_UNIFORMS_WITHOUT_BINDINGS, '.vert')
    glslc_args = ['-S', shader, '-fimage-binding-base', '-6']
    expected_error_substr = "error: invalid offset value -6 for -fimage-binding-base"


@inside_glslc_testsuite('OptionFAutoBindUniforms')
class FTextureBindingBaseNeedsUnsignedNumberValue(expect.ErrorMessageSubstr):
    """Tests that -ftexture-binding-base requires an unsigned number value."""

    shader = FileShader(GLSL_SHADER_WITH_UNIFORMS_WITHOUT_BINDINGS, '.vert')
    glslc_args = ['-S', shader, '-ftexture-binding-base', '-6']
    expected_error_substr = "error: invalid offset value -6 for -ftexture-binding-base"


@inside_glslc_testsuite('OptionFAutoBindUniforms')
class FSamplerBindingBaseNeedsUnsignedNumberValue(expect.ErrorMessageSubstr):
    """Tests that -fsampler-binding-base requires an unsigned value."""

    shader = FileShader(GLSL_SHADER_WITH_UNIFORMS_WITHOUT_BINDINGS, '.vert')
    glslc_args = ['-S', shader, '-fsampler-binding-base', '-6']
    expected_error_substr = "error: invalid offset value -6 for -fsampler-binding-base"


@inside_glslc_testsuite('OptionFAutoBindUniforms')
class FUboBindingBaseNeedsUnsignedNumberValue(expect.ErrorMessageSubstr):
    """Tests that -fubo-binding-base requires an unsigned value."""

    shader = FileShader(GLSL_SHADER_WITH_UNIFORMS_WITHOUT_BINDINGS, '.vert')
    glslc_args = ['-S', shader, '-fubo-binding-base', '-6']
    expected_error_substr = "error: invalid offset value -6 for -fubo-binding-base"


@inside_glslc_testsuite('OptionFAutoBindUniforms')
class FImageBindingBaseForVertOptionRespectedOnImageCompileAsVert(expect.ValidAssemblyFileWithSubstr):
    """Tests that -fimage-binding-base with vert stage value is respected on images."""

    shader = FileShader(GLSL_SHADER_WITH_UNIFORMS_WITHOUT_BINDINGS, '.vert')
    glslc_args = ['-S', shader, '-fauto-bind-uniforms', '-fimage-binding-base', 'vert', '44']
    expected_assembly_substr = "OpDecorate %my_img Binding 44"


@inside_glslc_testsuite('OptionFAutoBindUniforms')
class FImageBindingBaseForVertOptionIgnoredOnImageCompileAsFrag(expect.ValidAssemblyFileWithSubstr):
    """Tests that -fimage-binding-base with vert stage value is ignored when cmopiled as
    fragment."""

    shader = FileShader(GLSL_SHADER_WITH_UNIFORMS_WITHOUT_BINDINGS, '.frag')
    glslc_args = ['-S', shader, '-fauto-bind-uniforms', '-fimage-binding-base', 'vert', '44']
    expected_assembly_substr = "OpDecorate %my_img Binding 2"


@inside_glslc_testsuite('OptionFAutoBindUniforms')
class FImageBindingBaseForFragOptionRespectedOnImageCompileAsFrag(expect.ValidAssemblyFileWithSubstr):
    """Tests that -fimage-binding-base with frag stage value is respected on images."""

    shader = FileShader(GLSL_SHADER_WITH_UNIFORMS_WITHOUT_BINDINGS, '.frag')
    glslc_args = ['-S', shader, '-fauto-bind-uniforms', '-fimage-binding-base', 'frag', '44']
    expected_assembly_substr = "OpDecorate %my_img Binding 44"


@inside_glslc_testsuite('OptionFAutoBindUniforms')
class FSsboBindingBaseRespectedOnSsboCompileAsFrag(expect.ValidAssemblyFileWithSubstr):
    """Tests that -fssbo-binding-base with frag stage value is respected on SSBOs."""

    shader = FileShader(GLSL_SHADER_WITH_UNIFORMS_WITHOUT_BINDINGS, '.frag')
    glslc_args = ['-S', shader, '-fauto-bind-uniforms', '-fssbo-binding-base', '100']
    expected_assembly_substr = "OpDecorate %my_ssbo Binding 100"


@inside_glslc_testsuite('OptionFAutoBindUniforms')
class FSsboBindingBaseForFragOptionRespectedOnSsboCompileAsFrag(expect.ValidAssemblyFileWithSubstr):
    """Tests that -fssbo-binding-base with frag stage value is respected on SSBOs."""

    shader = FileShader(GLSL_SHADER_WITH_UNIFORMS_WITHOUT_BINDINGS, '.frag')
    glslc_args = ['-S', shader, '-fauto-bind-uniforms', '-fssbo-binding-base', 'frag', '100']
    expected_assembly_substr = "OpDecorate %my_ssbo Binding 100"


@inside_glslc_testsuite('OptionFAutoBindUniforms')
class FSsboBindingBaseForFragOptionIgnoredOnSsboCompileAsVert(expect.ValidAssemblyFileWithSubstr):
    """Tests that -fssbo-binding-base with frag stage value is ignored on SSBOs
    when compiling as a vertex shader."""

    shader = FileShader(GLSL_SHADER_WITH_UNIFORMS_WITHOUT_BINDINGS, '.vert')
    glslc_args = ['-S', shader, '-fauto-bind-uniforms', '-fssbo-binding-base', 'frag', '100']
    expected_assembly_substr = "OpDecorate %my_ssbo Binding 5"


@inside_glslc_testsuite('OptionFAutoBindUniforms')
class AutomaticaHlslIoMapping(expect.ValidAssemblyFileWithSubstr):
    """Tests that HLSL IO Mapping uses the register values in the source code."""

    shader = FileShader(HLSL_SHADER_WITHOUT_BINDINGS, '.frag')
    glslc_args = ['-S', '-x', 'hlsl', '-fhlsl-iomap', shader]
    expected_assembly_substr = "OpDecorate %u8 Binding 28"


@inside_glslc_testsuite('OptionFAutoBindUniforms')
class HlslFSamplerBindingBaseOptionRespected(expect.ValidAssemblyFileWithSubstr):
    """Tests that -fsampler-binding-base sets binding base for samplers in HLSL
    compilation."""

    shader = FileShader(HLSL_SHADER_WITHOUT_BINDINGS, '.frag')
    glslc_args = ['-S', '-x', 'hlsl', '-fhlsl-iomap', shader,
                  '-fsampler-binding-base', '100']
    expected_assembly_substr = "OpDecorate %s2 Binding 102"


@inside_glslc_testsuite('OptionFAutoBindUniforms')
class HlslFSamplerBindingBaseForFragOptionRespected(expect.ValidAssemblyFileWithSubstr):
    """Tests that -fsampler-binding-base for frag sets binding base for samplers
    in HLSL compilation."""

    shader = FileShader(HLSL_SHADER_WITHOUT_BINDINGS, '.frag')
    glslc_args = ['-S', '-x', 'hlsl', '-fhlsl-iomap', shader,
                  '-fsampler-binding-base', 'frag', '100']
    expected_assembly_substr = "OpDecorate %s2 Binding 102"


@inside_glslc_testsuite('OptionFAutoBindUniforms')
class HlslFSamplerBindingBaseForComputeOptionIgnoredWhenCompilingAsFrag(expect.ValidAssemblyFileWithSubstr):
    """Tests that -fsampler-binding-base for compute is ignored when compiling
    as a fragment shader."""

    shader = FileShader(HLSL_SHADER_WITHOUT_BINDINGS, '.frag')
    glslc_args = ['-S', '-x', 'hlsl', '-fhlsl-iomap', shader,
                  '-fsampler-binding-base', 'compute', '100']
    expected_assembly_substr = "OpDecorate %s2 Binding 2"


@inside_glslc_testsuite('OptionFAutoBindUniforms')
class HlslFTextureBindingBaseOptionRespected(expect.ValidAssemblyFileWithSubstr):
    """Tests that -ftexture-binding-base sets binding base for textures in HLSL
    compilation."""

    shader = FileShader(HLSL_SHADER_WITHOUT_BINDINGS, '.frag')
    glslc_args = ['-S', '-x', 'hlsl', '-fhlsl-iomap', shader,
                  '-ftexture-binding-base', '100']
    expected_assembly_substr = "OpDecorate %t6 Binding 116"


@inside_glslc_testsuite('OptionFAutoBindUniforms')
class HlslFTextureBindingBaseForFragOptionRespected(expect.ValidAssemblyFileWithSubstr):
    """Tests that -ftexture-binding-base for frag sets binding base for textures
    in HLSL compilation."""

    shader = FileShader(HLSL_SHADER_WITHOUT_BINDINGS, '.frag')
    glslc_args = ['-S', '-x', 'hlsl', '-fhlsl-iomap', shader,
                  '-ftexture-binding-base', 'frag', '100']
    expected_assembly_substr = "OpDecorate %t6 Binding 116"


@inside_glslc_testsuite('OptionFAutoBindUniforms')
class HlslFTextureBindingBaseForComputeOptionIgnoredWhenCompilingAsFrag(expect.ValidAssemblyFileWithSubstr):
    """Tests that -ftexture-binding-base for compute is ignored when compiling
    as a fragment shader."""

    shader = FileShader(HLSL_SHADER_WITHOUT_BINDINGS, '.frag')
    glslc_args = ['-S', '-x', 'hlsl', '-fhlsl-iomap', shader,
                  '-ftexture-binding-base', 'compute', '100']
    expected_assembly_substr = "OpDecorate %t6 Binding 16"


@inside_glslc_testsuite('OptionFAutoBindUniforms')
class HlslFUavBindingBaseOptionRespected(expect.ValidAssemblyFileWithSubstr):
    """Tests that -fuav-binding-base sets binding base for UAVs in HLSL
    compilation."""

    shader = FileShader(HLSL_SHADER_WITHOUT_BINDINGS, '.frag')
    glslc_args = ['-S', '-x', 'hlsl', '-fhlsl-iomap', shader,
                  '-fuav-binding-base', '100']
    expected_assembly_substr = "OpDecorate %u8 Binding 128"


@inside_glslc_testsuite('OptionFAutoBindUniforms')
class HlslFUavBindingBaseForFragOptionRespected(expect.ValidAssemblyFileWithSubstr):
    """Tests that -fuav-binding-base for frag sets binding base for UAVs in HLSL
    compilation."""

    shader = FileShader(HLSL_SHADER_WITHOUT_BINDINGS, '.frag')
    glslc_args = ['-S', '-x', 'hlsl', '-fhlsl-iomap', shader,
                  '-fuav-binding-base', 'frag', '100']
    expected_assembly_substr = "OpDecorate %u8 Binding 128"


@inside_glslc_testsuite('OptionFAutoBindUniforms')
class HlslFUavBindingBaseForComputeOptionIgnoredWhenCompilingAsFrag(expect.ValidAssemblyFileWithSubstr):
    """Tests that -fuav-binding-base for compute is ignored when compiling
    as a fragment shader."""

    shader = FileShader(HLSL_SHADER_WITHOUT_BINDINGS, '.frag')
    glslc_args = ['-S', '-x', 'hlsl', '-fhlsl-iomap', shader,
                  '-fuav-binding-base', 'compute', '100']
    expected_assembly_substr = "OpDecorate %u8 Binding 28"
