/** * Upload SAMPLER_BORDER_COLOR_STATE. */ void upload_default_color(struct brw_context *brw, struct gl_sampler_object *sampler, int unit, int ss_index) { struct intel_context *intel = &brw->intel; struct gl_context *ctx = &intel->ctx; struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit]; struct gl_texture_object *texObj = texUnit->_Current; struct gl_texture_image *firstImage = texObj->Image[0][texObj->BaseLevel]; float color[4]; if (firstImage->_BaseFormat == GL_DEPTH_COMPONENT) { /* GL specs that border color for depth textures is taken from the * R channel, while the hardware uses A. Spam R into all the * channels for safety. */ color[0] = sampler->BorderColor.f[0]; color[1] = sampler->BorderColor.f[0]; color[2] = sampler->BorderColor.f[0]; color[3] = sampler->BorderColor.f[0]; } else { color[0] = sampler->BorderColor.f[0]; color[1] = sampler->BorderColor.f[1]; color[2] = sampler->BorderColor.f[2]; color[3] = sampler->BorderColor.f[3]; } /* In some cases we use an RGBA surface format for GL RGB textures, * where we've initialized the A channel to 1.0. We also have to set * the border color alpha to 1.0 in that case. */ if (firstImage->_BaseFormat == GL_RGB) color[3] = 1.0; if (intel->gen == 5 || intel->gen == 6) { struct gen5_sampler_default_color *sdc; sdc = brw_state_batch(brw, AUB_TRACE_SAMPLER_DEFAULT_COLOR, sizeof(*sdc), 32, &brw->wm.sdc_offset[ss_index]); memset(sdc, 0, sizeof(*sdc)); UNCLAMPED_FLOAT_TO_UBYTE(sdc->ub[0], color[0]); UNCLAMPED_FLOAT_TO_UBYTE(sdc->ub[1], color[1]); UNCLAMPED_FLOAT_TO_UBYTE(sdc->ub[2], color[2]); UNCLAMPED_FLOAT_TO_UBYTE(sdc->ub[3], color[3]); UNCLAMPED_FLOAT_TO_USHORT(sdc->us[0], color[0]); UNCLAMPED_FLOAT_TO_USHORT(sdc->us[1], color[1]); UNCLAMPED_FLOAT_TO_USHORT(sdc->us[2], color[2]); UNCLAMPED_FLOAT_TO_USHORT(sdc->us[3], color[3]); UNCLAMPED_FLOAT_TO_SHORT(sdc->s[0], color[0]); UNCLAMPED_FLOAT_TO_SHORT(sdc->s[1], color[1]); UNCLAMPED_FLOAT_TO_SHORT(sdc->s[2], color[2]); UNCLAMPED_FLOAT_TO_SHORT(sdc->s[3], color[3]); sdc->hf[0] = _mesa_float_to_half(color[0]); sdc->hf[1] = _mesa_float_to_half(color[1]); sdc->hf[2] = _mesa_float_to_half(color[2]); sdc->hf[3] = _mesa_float_to_half(color[3]); sdc->b[0] = sdc->s[0] >> 8; sdc->b[1] = sdc->s[1] >> 8; sdc->b[2] = sdc->s[2] >> 8; sdc->b[3] = sdc->s[3] >> 8; sdc->f[0] = color[0]; sdc->f[1] = color[1]; sdc->f[2] = color[2]; sdc->f[3] = color[3]; } else {
/** * Upload SAMPLER_BORDER_COLOR_STATE. */ void upload_default_color(struct brw_context *brw, struct gl_sampler_object *sampler, int unit, uint32_t *sdc_offset) { struct gl_context *ctx = &brw->ctx; struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit]; struct gl_texture_object *texObj = texUnit->_Current; struct gl_texture_image *firstImage = texObj->Image[0][texObj->BaseLevel]; float color[4]; switch (firstImage->_BaseFormat) { case GL_DEPTH_COMPONENT: /* GL specs that border color for depth textures is taken from the * R channel, while the hardware uses A. Spam R into all the * channels for safety. */ color[0] = sampler->BorderColor.f[0]; color[1] = sampler->BorderColor.f[0]; color[2] = sampler->BorderColor.f[0]; color[3] = sampler->BorderColor.f[0]; break; case GL_ALPHA: color[0] = 0.0; color[1] = 0.0; color[2] = 0.0; color[3] = sampler->BorderColor.f[3]; break; case GL_INTENSITY: color[0] = sampler->BorderColor.f[0]; color[1] = sampler->BorderColor.f[0]; color[2] = sampler->BorderColor.f[0]; color[3] = sampler->BorderColor.f[0]; break; case GL_LUMINANCE: color[0] = sampler->BorderColor.f[0]; color[1] = sampler->BorderColor.f[0]; color[2] = sampler->BorderColor.f[0]; color[3] = 1.0; break; case GL_LUMINANCE_ALPHA: color[0] = sampler->BorderColor.f[0]; color[1] = sampler->BorderColor.f[0]; color[2] = sampler->BorderColor.f[0]; color[3] = sampler->BorderColor.f[3]; break; default: color[0] = sampler->BorderColor.f[0]; color[1] = sampler->BorderColor.f[1]; color[2] = sampler->BorderColor.f[2]; color[3] = sampler->BorderColor.f[3]; break; } /* In some cases we use an RGBA surface format for GL RGB textures, * where we've initialized the A channel to 1.0. We also have to set * the border color alpha to 1.0 in that case. */ if (firstImage->_BaseFormat == GL_RGB) color[3] = 1.0; if (brw->gen >= 8) { /* On Broadwell, the border color is represented as four 32-bit floats, * integers, or unsigned values, interpreted according to the surface * format. This matches the sampler->BorderColor union exactly. Since * we use floats both here and in the above reswizzling code, we preserve * the original bit pattern. So we actually handle all three formats. */ float *sdc = brw_state_batch(brw, AUB_TRACE_SAMPLER_DEFAULT_COLOR, 4 * 4, 64, sdc_offset); COPY_4FV(sdc, color); } else if (brw->gen == 5 || brw->gen == 6) { struct gen5_sampler_default_color *sdc; sdc = brw_state_batch(brw, AUB_TRACE_SAMPLER_DEFAULT_COLOR, sizeof(*sdc), 32, sdc_offset); memset(sdc, 0, sizeof(*sdc)); UNCLAMPED_FLOAT_TO_UBYTE(sdc->ub[0], color[0]); UNCLAMPED_FLOAT_TO_UBYTE(sdc->ub[1], color[1]); UNCLAMPED_FLOAT_TO_UBYTE(sdc->ub[2], color[2]); UNCLAMPED_FLOAT_TO_UBYTE(sdc->ub[3], color[3]); UNCLAMPED_FLOAT_TO_USHORT(sdc->us[0], color[0]); UNCLAMPED_FLOAT_TO_USHORT(sdc->us[1], color[1]); UNCLAMPED_FLOAT_TO_USHORT(sdc->us[2], color[2]); UNCLAMPED_FLOAT_TO_USHORT(sdc->us[3], color[3]); UNCLAMPED_FLOAT_TO_SHORT(sdc->s[0], color[0]); UNCLAMPED_FLOAT_TO_SHORT(sdc->s[1], color[1]); UNCLAMPED_FLOAT_TO_SHORT(sdc->s[2], color[2]); UNCLAMPED_FLOAT_TO_SHORT(sdc->s[3], color[3]); sdc->hf[0] = _mesa_float_to_half(color[0]); sdc->hf[1] = _mesa_float_to_half(color[1]); sdc->hf[2] = _mesa_float_to_half(color[2]); sdc->hf[3] = _mesa_float_to_half(color[3]); sdc->b[0] = sdc->s[0] >> 8; sdc->b[1] = sdc->s[1] >> 8; sdc->b[2] = sdc->s[2] >> 8; sdc->b[3] = sdc->s[3] >> 8; sdc->f[0] = color[0]; sdc->f[1] = color[1]; sdc->f[2] = color[2]; sdc->f[3] = color[3]; } else {