import { ColorTextureFormat, getTextureFormatType } from '../../../format_info.js'; import { AllFeaturesMaxLimitsGPUTest } from '../../../gpu_test.js'; import { getFragmentShaderCodeWithOutput, getPlainTypeInfo, kDefaultVertexShaderCode, } from '../../../util/shader.js'; export type ColorTargetState = GPUColorTargetState & { format: ColorTextureFormat }; const values = [0, 1, 0, 1]; export function getDescriptorForCreateRenderPipelineValidationTest( device: GPUDevice, options: { primitive?: GPUPrimitiveState; targets?: ColorTargetState[]; multisample?: GPUMultisampleState; depthStencil?: GPUDepthStencilState; fragmentShaderCode?: string; noFragment?: boolean; fragmentConstants?: Record; } = {} ): GPURenderPipelineDescriptor { const { primitive = {}, targets = [{ format: 'rgba8unorm' }] as const, multisample = {}, depthStencil, fragmentShaderCode = getFragmentShaderCodeWithOutput([ { values, plainType: getPlainTypeInfo( getTextureFormatType(targets[0] ? targets[0].format : 'rgba8unorm') ), componentCount: 4, }, ]), noFragment = false, fragmentConstants = {}, } = options; return { vertex: { module: device.createShaderModule({ code: kDefaultVertexShaderCode, }), entryPoint: 'main', }, fragment: noFragment ? undefined : { module: device.createShaderModule({ code: fragmentShaderCode, }), entryPoint: 'main', targets, constants: fragmentConstants, }, layout: device.createPipelineLayout({ bindGroupLayouts: [] }), primitive, multisample, depthStencil, }; } export class CreateRenderPipelineValidationTest extends AllFeaturesMaxLimitsGPUTest { getDescriptor( options: { primitive?: GPUPrimitiveState; targets?: ColorTargetState[]; multisample?: GPUMultisampleState; depthStencil?: GPUDepthStencilState; fragmentShaderCode?: string; noFragment?: boolean; fragmentConstants?: Record; } = {} ): GPURenderPipelineDescriptor { return getDescriptorForCreateRenderPipelineValidationTest(this.device, options); } getPipelineLayout(): GPUPipelineLayout { return this.device.createPipelineLayout({ bindGroupLayouts: [] }); } }