summaryrefslogtreecommitdiff
path: root/src/mesa/pipe/i915simple/i915_state_sampler.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mesa/pipe/i915simple/i915_state_sampler.c')
-rw-r--r--src/mesa/pipe/i915simple/i915_state_sampler.c134
1 files changed, 134 insertions, 0 deletions
diff --git a/src/mesa/pipe/i915simple/i915_state_sampler.c b/src/mesa/pipe/i915simple/i915_state_sampler.c
index 591e3684da..e23e4bdcf7 100644
--- a/src/mesa/pipe/i915simple/i915_state_sampler.c
+++ b/src/mesa/pipe/i915simple/i915_state_sampler.c
@@ -39,6 +39,7 @@
#include "i915_state_inlines.h"
#include "i915_context.h"
#include "i915_reg.h"
+#include "i915_state.h"
//#include "i915_cache.h"
@@ -283,3 +284,136 @@ void i915_update_samplers( struct i915_context *i915 )
i915->hardware_dirty |= I915_HW_SAMPLER;
}
+
+
+
+
+static uint
+translate_texture_format(uint pipeFormat)
+{
+ switch (pipeFormat) {
+ case PIPE_FORMAT_U_L8:
+ return MAPSURF_8BIT | MT_8BIT_L8;
+ case PIPE_FORMAT_U_I8:
+ return MAPSURF_8BIT | MT_8BIT_I8;
+ case PIPE_FORMAT_U_A8:
+ return MAPSURF_8BIT | MT_8BIT_A8;
+ case PIPE_FORMAT_U_L8_A8:
+ return MAPSURF_16BIT | MT_16BIT_AY88;
+ case PIPE_FORMAT_U_R5_G6_B5:
+ return MAPSURF_16BIT | MT_16BIT_RGB565;
+ case PIPE_FORMAT_U_A1_R5_G5_B5:
+ return MAPSURF_16BIT | MT_16BIT_ARGB1555;
+ case PIPE_FORMAT_U_A4_R4_G4_B4:
+ return MAPSURF_16BIT | MT_16BIT_ARGB4444;
+ case PIPE_FORMAT_U_A8_R8_G8_B8:
+ return MAPSURF_32BIT | MT_32BIT_ARGB8888;
+ case PIPE_FORMAT_YCBCR_REV:
+ return (MAPSURF_422 | MT_422_YCRCB_NORMAL);
+ case PIPE_FORMAT_YCBCR:
+ return (MAPSURF_422 | MT_422_YCRCB_SWAPY);
+#if 0
+ case PIPE_FORMAT_RGB_FXT1:
+ case PIPE_FORMAT_RGBA_FXT1:
+ return (MAPSURF_COMPRESSED | MT_COMPRESS_FXT1);
+#endif
+ case PIPE_FORMAT_U_Z16:
+ return (MAPSURF_16BIT | MT_16BIT_L16);
+#if 0
+ case PIPE_FORMAT_RGBA_DXT1:
+ case PIPE_FORMAT_RGB_DXT1:
+ return (MAPSURF_COMPRESSED | MT_COMPRESS_DXT1);
+ case PIPE_FORMAT_RGBA_DXT3:
+ return (MAPSURF_COMPRESSED | MT_COMPRESS_DXT2_3);
+ case PIPE_FORMAT_RGBA_DXT5:
+ return (MAPSURF_COMPRESSED | MT_COMPRESS_DXT4_5);
+#endif
+ case PIPE_FORMAT_S8_Z24:
+ return (MAPSURF_32BIT | MT_32BIT_xL824);
+ default:
+ fprintf(stderr, "i915: translate_texture_format() bad image format %x\n",
+ pipeFormat);
+ assert(0);
+ return 0;
+ }
+}
+
+
+#define I915_TEXREG_MS3 1
+#define I915_TEXREG_MS4 2
+
+
+static void
+i915_update_texture(struct i915_context *i915, uint unit,
+ uint state[6])
+{
+ const struct pipe_mipmap_tree *mt = i915->texture[unit];
+ uint format, pitch;
+ const uint width = mt->width0, height = mt->height0, depth = mt->depth0;
+ const uint num_levels = mt->last_level - mt->first_level;
+
+ assert(mt);
+ assert(width);
+ assert(height);
+ assert(depth);
+
+#if 0
+ if (i915->state.tex_buffer[unit] != NULL) {
+ driBOUnReference(i915->state.tex_buffer[unit]);
+ i915->state.tex_buffer[unit] = NULL;
+ }
+#endif
+
+
+ {
+ struct pipe_buffer_handle *p = driBOReference(mt->region->buffer);
+ }
+
+#if 0
+ i915->state.tex_buffer[unit] = driBOReference(intelObj->mt->region->
+ buffer);
+ i915->state.tex_offset[unit] = intel_miptree_image_offset(intelObj->mt,
+ 0, intelObj->
+ firstLevel);
+#endif
+
+ format = translate_texture_format(mt->format);
+ pitch = mt->pitch * mt->cpp;
+
+ assert(format);
+ assert(pitch);
+
+ printf("texture format = 0x%x\n", format);
+
+ /* MS3 state */
+ state[0] =
+ (((height - 1) << MS3_HEIGHT_SHIFT)
+ | ((width - 1) << MS3_WIDTH_SHIFT)
+ | format
+ | MS3_USE_FENCE_REGS);
+
+ /* MS4 state */
+ state[1] =
+ ((((pitch / 4) - 1) << MS4_PITCH_SHIFT)
+ | MS4_CUBE_FACE_ENA_MASK
+ | ((num_levels * 4) << MS4_MAX_LOD_SHIFT)
+ | ((depth - 1) << MS4_VOLUME_DEPTH_SHIFT));
+}
+
+
+
+void
+i915_update_textures(struct i915_context *i915)
+{
+ uint unit;
+
+ for (unit = 0; unit < I915_TEX_UNITS; unit++) {
+ /* determine unit enable/disable by looking for a bound mipmap tree */
+ /* could also examine the fragment program? */
+ if (i915->texture[unit]) {
+ i915_update_texture(i915, unit, i915->current.texbuffer[unit]);
+ }
+ }
+
+ i915->hardware_dirty |= I915_HW_MAP;
+}