| 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<string, GPUPipelineConstantValue>; |
| } = {} |
| ): 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<string, GPUPipelineConstantValue>; |
| } = {} |
| ): GPURenderPipelineDescriptor { |
| return getDescriptorForCreateRenderPipelineValidationTest(this.device, options); |
| } |
| |
| getPipelineLayout(): GPUPipelineLayout { |
| return this.device.createPipelineLayout({ bindGroupLayouts: [] }); |
| } |
| } |