shader: Fix disabled and unwritten attributes and varyings
This commit is contained in:
		@@ -179,8 +179,12 @@ void EmitGetAttribute(EmitContext& ctx, IR::Inst& inst, IR::Attribute attr,
 | 
			
		||||
    const char swizzle{"xyzw"[element]};
 | 
			
		||||
    if (IR::IsGeneric(attr)) {
 | 
			
		||||
        const u32 index{IR::GenericAttributeIndex(attr)};
 | 
			
		||||
        if (!ctx.runtime_info.previous_stage_stores.Generic(index)) {
 | 
			
		||||
            ctx.AddF32("{}=0.f;", inst, attr);
 | 
			
		||||
        if (!ctx.runtime_info.previous_stage_stores.Generic(index, element)) {
 | 
			
		||||
            if (element == 3) {
 | 
			
		||||
                ctx.AddF32("{}=1.f;", inst, attr);
 | 
			
		||||
            } else {
 | 
			
		||||
                ctx.AddF32("{}=0.f;", inst, attr);
 | 
			
		||||
            }
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
        ctx.AddF32("{}=in_attr{}{}.{};", inst, index, InputVertexIndex(ctx, vertex), swizzle);
 | 
			
		||||
 
 | 
			
		||||
@@ -298,10 +298,14 @@ Id EmitGetAttribute(EmitContext& ctx, IR::Attribute attr, Id vertex) {
 | 
			
		||||
    if (IR::IsGeneric(attr)) {
 | 
			
		||||
        const u32 index{IR::GenericAttributeIndex(attr)};
 | 
			
		||||
        const std::optional<AttrInfo> type{AttrTypes(ctx, index)};
 | 
			
		||||
        if (!type || !ctx.runtime_info.previous_stage_stores.Generic(index)) {
 | 
			
		||||
        if (!type) {
 | 
			
		||||
            // Attribute is disabled
 | 
			
		||||
            return ctx.Const(0.0f);
 | 
			
		||||
        }
 | 
			
		||||
        if (!ctx.runtime_info.previous_stage_stores.Generic(index, element)) {
 | 
			
		||||
            // Varying component is not written
 | 
			
		||||
            return ctx.Const(type && element == 3 ? 1.0f : 0.0f);
 | 
			
		||||
        }
 | 
			
		||||
        const Id generic_id{ctx.input_generics.at(index)};
 | 
			
		||||
        const Id pointer{AttrPointer(ctx, type->pointer, vertex, generic_id, ctx.Const(element))};
 | 
			
		||||
        const Id value{ctx.OpLoad(type->id, pointer)};
 | 
			
		||||
 
 | 
			
		||||
@@ -140,6 +140,26 @@ RendererOpenGL::RendererOpenGL(Core::TelemetrySession& telemetry_session_,
 | 
			
		||||
    }
 | 
			
		||||
    AddTelemetryFields();
 | 
			
		||||
    InitOpenGLObjects();
 | 
			
		||||
 | 
			
		||||
    // Initialize default attributes to match hardware's disabled attributes
 | 
			
		||||
    GLint max_attribs{};
 | 
			
		||||
    glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &max_attribs);
 | 
			
		||||
    for (GLint attrib = 0; attrib < max_attribs; ++attrib) {
 | 
			
		||||
        glVertexAttrib4f(attrib, 0.0f, 0.0f, 0.0f, 0.0f);
 | 
			
		||||
    }
 | 
			
		||||
    // Enable seamless cubemaps when per texture parameters are not available
 | 
			
		||||
    if (!GLAD_GL_ARB_seamless_cubemap_per_texture && !GLAD_GL_AMD_seamless_cubemap_per_texture) {
 | 
			
		||||
        glEnable(GL_TEXTURE_CUBE_MAP_SEAMLESS);
 | 
			
		||||
    }
 | 
			
		||||
    // Enable unified vertex attributes and query vertex buffer address when the driver supports it
 | 
			
		||||
    if (device.HasVertexBufferUnifiedMemory()) {
 | 
			
		||||
        glEnableClientState(GL_VERTEX_ATTRIB_ARRAY_UNIFIED_NV);
 | 
			
		||||
        glEnableClientState(GL_ELEMENT_ARRAY_UNIFIED_NV);
 | 
			
		||||
 | 
			
		||||
        glMakeNamedBufferResidentNV(vertex_buffer.handle, GL_READ_ONLY);
 | 
			
		||||
        glGetNamedBufferParameterui64vNV(vertex_buffer.handle, GL_BUFFER_GPU_ADDRESS_NV,
 | 
			
		||||
                                         &vertex_buffer_address);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
RendererOpenGL::~RendererOpenGL() = default;
 | 
			
		||||
@@ -256,21 +276,6 @@ void RendererOpenGL::InitOpenGLObjects() {
 | 
			
		||||
 | 
			
		||||
    // Clear screen to black
 | 
			
		||||
    LoadColorToActiveGLTexture(0, 0, 0, 0, screen_info.texture);
 | 
			
		||||
 | 
			
		||||
    // Enable seamless cubemaps when per texture parameters are not available
 | 
			
		||||
    if (!GLAD_GL_ARB_seamless_cubemap_per_texture && !GLAD_GL_AMD_seamless_cubemap_per_texture) {
 | 
			
		||||
        glEnable(GL_TEXTURE_CUBE_MAP_SEAMLESS);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Enable unified vertex attributes and query vertex buffer address when the driver supports it
 | 
			
		||||
    if (device.HasVertexBufferUnifiedMemory()) {
 | 
			
		||||
        glEnableClientState(GL_VERTEX_ATTRIB_ARRAY_UNIFIED_NV);
 | 
			
		||||
        glEnableClientState(GL_ELEMENT_ARRAY_UNIFIED_NV);
 | 
			
		||||
 | 
			
		||||
        glMakeNamedBufferResidentNV(vertex_buffer.handle, GL_READ_ONLY);
 | 
			
		||||
        glGetNamedBufferParameterui64vNV(vertex_buffer.handle, GL_BUFFER_GPU_ADDRESS_NV,
 | 
			
		||||
                                         &vertex_buffer_address);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void RendererOpenGL::AddTelemetryFields() {
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user